- pgrustはPostgres 18.3互換を目指すRustによる再実装プロジェクトで、46,000件以上の回帰クエリでPostgresの期待出力と一致
- 既存のPostgres 18.3データディレクトリから起動できるディスク互換性を備え、実際のPostgresテストを動作基準としている
- 現時点では本番環境向けの準備はできておらず、性能最適化もまだ行われていない。既存のPostgres拡張や、PL/Python・PL/Perl・PL/Tclなどの手続き言語拡張とは一般に互換性がない
- WebAssemblyデモとDockerイメージ
malisper/pgrust:v0.1 で試せる。latest は現在同じリリースを指しているが、固定実行イメージは v0.1
- ロードマップには、マルチスレッドのPostgres内部構造、組み込み接続プーリング、JSON中心ワークロードの改善、no-vacuumストレージ実験、AI生成SQL向けのランタイムガードレールが含まれる
pgrustの目標と互換性
- pgrustはPostgresをRustで再実装するプロジェクト
- 対象目標はPostgres 18.3で、46,000件以上の回帰クエリでPostgresの期待出力と一致
- 既存のPostgres 18.3データディレクトリから起動できるディスク互換性を提供
- プロジェクトの目標は、Postgresの内部をより変更しやすくすること
- 挙動はPostgres形式のまま維持
- 実際のPostgresテストを基準として使用
- RustとAI支援プログラミングにより、より深いサーバー変更を探る
現在の状態と制限
- pgrustはまだ本番環境向けの準備ができていない
- まだ性能最適化されていない
- 既存のPostgres拡張と手続き言語拡張は、一般にはまだ互換性がない
- 一部の同梱contribモジュールはすでに移植されており、時間とともにより多くの互換性が得られる可能性がある
実行方法
- WebAssemblyデモは https://pgrust.com で実行して試せる
- Dockerでの実行には
malisper/pgrust:v0.1 イメージを使用する
- イメージ内の
psql クライアントを使用する
malisper/pgrust:latest は現在同じリリースを指している
- 固定されたリリースイメージは
v0.1
docker run -d --name pgrust -e POSTGRES_PASSWORD=secret malisper/pgrust:v0.1 && until docker exec -e PGPASSWORD=secret pgrust psql -h 127.0.0.1 -U postgres -c '\q' >/dev/null 2>&1; do sleep 1; done && docker exec -it -e PGPASSWORD=secret pgrust psql -h 127.0.0.1 -U postgres; docker rm -f pgrust
ソースからのビルドと実行
- macOSでは
icu4c、openssl@3、libpq が必要
brew install icu4c openssl@3 libpq
export LIBRARY_PATH="$(brew --prefix openssl@3)/lib:${LIBRARY_PATH:-}"
export PKG_CONFIG_PATH="$(brew --prefix openssl@3)/lib/pkgconfig:$(brew --prefix icu4c)/lib/pkgconfig:${PKG_CONFIG_PATH:-}"
export PATH="$(brew --prefix libpq)/bin:$PATH"
- Debian/UbuntuではビルドツールとICU、OpenSSL、LDAP、PAM、Postgres 18クライアントをインストールする
sudo apt-get update
sudo apt-get install -y build-essential pkg-config libicu-dev libssl-dev libldap2-dev libpam0g-dev postgresql-client-18
- ビルドはvendoredのPostgres 18.3共有ディレクトリを指定して
cargo build で行う
PGRUST_PGSHAREDIR="$PWD/vendor/postgres-18.3/share" \
cargo build --release --locked --bin postgres
- データディレクトリはpgrustの
--initdb で作成する
target/release/postgres --initdb \
-D /tmp/pgrust-data \
-L "$PWD/vendor/postgres-18.3/share" \
--no-locale \
--encoding UTF8 \
-U postgres
- 実行時はスタック関連設定と同期I/O設定を併用する
ulimit -s 65520
RUST_MIN_STACK=33554432 target/release/postgres \
-D /tmp/pgrust-data \
-F \
-c listen_addresses= \
-k /tmp \
-p 5432 \
-c io_method=sync \
-c max_stack_depth=60000
回帰テストと検証結果
- Postgresの回帰テストは
scripts/run-regression で実行する
PGRUST_BIN="$PWD/target/release/postgres" \
scripts/run-regression
- テストランナーはpgrust独自の
--initdb と、リポジトリに含まれるPostgres 18.3テストファイルを使用する
PATH にPostgres 18の psql クライアントが必要
- 別の場所にある場合は
PGRUST_PSQL=/path/to/psql を設定する
- 検証済みのリリース結果は、pgrustが46,000件以上の回帰クエリでPostgresの期待出力と一致したというもの
ロードマップとプロジェクト履歴
1件のコメント
Hacker Newsの意見
原作者です。ここに上がるとは思いませんでした。要約すると、LLMでより良いPostgresを作ってみる実験をしてきました。Postgresは30年ものなので、その間にデータベースについて学んだことも多いと考えています。
書き直しに有用な手法のかなり多くは、再設計にも有用です。まだ公開していない新しいpgrustのバージョンは、現在Postgresのリグレッションテストを100%通過しており、Postgresのプロセスごとの接続モデルの代わりに接続ごとのスレッドモデルを実装しています。トランザクション系ワークロードではPostgresより50%速く、分析系ワークロードでは約300倍速いです。
現時点ではclickbenchでClickHouseより2倍遅いですが、ClickHouseより速くできると思っています。質問があれば答えます。
どこかでMVCCを壊していて、本番には入れられないトレードオフをしている可能性もあります。リグレッションテストに通っているのは見ました。ちなみに
fsyncは有効ですか?リグレッションテストは悪いI/Oパターンをうまく捕まえられないと理解しています。それでも面白いプロジェクトに見えます。似ているけれど別の取り組みとして、δxを作っています。通常のPostgresテーブル内に列指向圧縮データを保存するPostgres拡張なので、レプリケーション、障害復旧、
pg_dumpなどがそのまま動作します: https://github.com/xataio/deltax現在、単一ノードではClickHouseより30〜40%遅いです。clickbenchに追加するPRがちょうど受け入れられたので、ここで比較を見られます: https://benchmark.clickhouse.com/#system=+liH|_etx|gQ|saB&ty...
こういう書き直しはよく理解できません。たいてい一人が主導するので単一障害点になりやすく、非常に短期間で作られるため、プロジェクトを継続的に作っていく規律を身につけたとは見なしにくいです。
中長期的に維持される可能性も低そうです。貢献したい人もトークン費用を払わなければなりません。AIなしでこうしたプロジェクトを維持するのがだんだん難しくなるからです。これを本番に入れたい人がいるでしょうか?あまり筋が通らないと思います。
本番には入れませんが、データベース内部について多くを学びました。LLM時代でも頭を楽しませるために、私たちの本番データベースにもLLMなしでデータベース機能を実装しています。今はFlexible Paxosで苦労しています。たぶん古くて安定していて単純なRaftを使い続けるでしょうが、それでも興味深いです。
LLMはプロトタイプをものすごく速く作るのが得意で、動くプロトタイプは多くの推測に決着をつけられます。元のチーム、またはそれに準じる相当な人数が支えておらず、元のコード品質と保守性に追いついた、あるいは上回ったという信頼できる説明がないなら、こうした巨大プロジェクトの書き直し版は使わないと思います。
一般論として、LLMでライセンスロンダリングをするのは法的にも道義的にも擁護しにくいと思います。ただしこの場合は、より制限の強いライセンスを選んでいる点で異なります。弁護士ではありませんが、PostgreSQLをダウンロードして
s/MIT/AGPL/したうえで配布することは法的に可能だと理解しています。元のMITライセンス版はそのまま存在するので、説得力のある新機能が出るまでは、あえてそのバージョンを好む理由はありません。これをテストする最良の方法は、忙しい本番データベースの前にPgBouncerのようなプロキシを置き、クエリを既存のPostgresとRust版に同時にミラーリングすることだと思います。
そうすれば実際の負荷で出力と性能を比較できます。しばらく動かしたあと、通常のPostgresインスタンスとテーブルを一つずつ比較してもよいでしょう。
こういうコードはどうレビューすべきなのだろう? 普通はコミット履歴をざっと見て、人々が何をどう作業したのかを見るが、LLM が1か月足らずで 7101件のコミットを作ると不可能になる
1日分だけ見ても多すぎる [1]。どうせコミット内容も、それほど多くを教えてくれないかもしれない。GitHub でリポジトリの最初のコミットへ簡単に行く方法も気になる。コミット履歴の探索はかなり面倒に感じる
[1] - https://github.com/malisper/pgrust/commits/main/?since=2026-...
Postgres のリグレッション、分離、障害テストよりも、はるかに先まで行く必要がある。関連する danluu の記事: https://danluu.com/ai-coding/
github cliには、昇順/降順のソートフラグ付きでコミットを問い合わせるコマンドがある: https://cli.github.com/manual/gh_search_commitsbefore x dateのような構文のドキュメントはここにある: https://docs.github.com/en/search-github/searching-on-github...高度な検索ページもあるが、日付フィルタでコミットはサポートしていない: https://github.com/search/advanced
検索ウィジェットで日付を二分探索することもでき、コミットがある最初の日はここ: https://github.com/malisper/pgrust/commits/main/?since=2026-...
最初のコミット: https://github.com/malisper/pgrust/commit/22113dc36b02973060...
逆に、コミットメッセージを除けば人間の開発者の内部の思考過程にもアクセスできたことはなかったので、秘密のプロンプトが即ち非公開ソースだと言うのも完全に同じではないかもしれない
github.com/user/repo/commits/?after=last_commit_hash+number_of_commits-2という構文を使える。最新コミットと最後のコミットのために-1、-1するという形例: https://github.com/malisper/pgrust/commits/?after=3646a73515...
印象的ではあるが、PostgreSQL ライセンス [0] から AGPL [1] へのライセンス変更だ
AGPL は好きだし、真に自由なオープンソースライセンスの中で最高だと思っているが、互換性があるのか心配だ。元のソースから再実装したなら、元のライセンスが適用されるべきではないか? そう思う。Rust の coretools のように、オープンソースソフトウェアをより制限の強いライセンスで再実装する流れがあった。AGPL を選んだという点ではずっと倫理的に見えるが、そもそも変更しないほうが安全ではなかったのだろうか?
[0] https://www.postgresql.org/about/licence/
[1] https://github.com/malisper/pgrust?tab=AGPL-3.0-1-ov-file
再実装版をより制限の強いライセンスで配布しても、PostgreSQL ライセンスには違反しない。MIT 系ライセンスが GPL や AGPL より制限が少ない理由は、まさにより制限の強い再ライセンスを認めているからだ
こう理解すればいい。空の (A)GPL プロジェクトを作り、アップストリームの BSD コードベースを取り込む。元のアップストリームファイルは元の許容的ライセンスの下に残るが、プロジェクト全体はアップストリームライセンスの著作権表示要件を含めて (A)GPL の支配を受ける。GPL はそのような要件を許容している。その後、自分のコードを AGPL として追加し、結合著作物を AGPL で配布できる
誰かがあなたのコードのうち、あなたが書いた部分だけを持っていくなら、AGPL だけに従えばよい。しかしアップストリームのソースまで含めるなら、アップストリームライセンスの著作権表示要件も引き続き満たす必要がある
unsafe {が2664個、unsafe fnが1835個ある。これはまったく安全ではない。実際に何が起きているのか、Rustの利点を活かすにはアーキテクチャをどう再設計すべきかを理解したうえでの書き直しには見えないむしろ、生ポインタを広範に使うAI生成の変換のように見える
unsafeの大半は、Postgresのパーサにc2rustをかけて生成したパーサの中に閉じ込められている。Postgresのパーサ自体もyacc/bisonから生成されるので、慣用的なRustに移すより機械的に移植することにした特に深刻だと思う
unsafeがあれば教えてほしいunsafe=denyに設定している。なぜ皆がこういう反応を予想していないのか分からない書き直しとAIによる書き直しは、はっきり区別すべきだと思う
では、AIの使用量がどの程度なら「AIによる書き直し」になるのだろうか?
こうした書き直しプロジェクトが、テストに依存して動作すると主張している例をよく見る。しかしPostgresやSQLiteのようなソフトウェアを信頼できるものにしているのは、テストそのものというより、運用環境で積み重なった傷跡に近い
信頼性は、何年も運用で回される中で積み上がる
SQLiteは良い例だ。SQLiteの膨大な非公開テストは、人々がフォークしにくい要素としてよく挙げられる。Tursoはそれをやってのけたが、同等の誠実さを保証するには会社が必要だ。もちろん何年もの運用も必要になる
既存の未変更のテストスイートを使って何かが動くと言うのは、完全に合理的だ。プロジェクトが大きいほど、なおさらそうだと思う。運用で得た傷跡はテストスイートに文書化され、保護されるべきで、そうでなければその教訓は失われる
SQLiteは巨大なテストスイートと広範なファジングで知られている。通常のコードよりテストコードとスクリプトが590倍多い。出典: https://sqlite.org/testing.html
今このようなLLM変換版でできる最も有用なことは、変換版が元のテストをすべて通るなら、自分のアプリケーションのテストスイートをその上で走らせて、元のテストカバレッジ不足を見つけることだ
変換版がクラッシュしたり、観測可能な誤動作をしたりするなら、実際のプロジェクトに何らかのリグレッションテストが欠けていたという意味になる。こうした変換プロジェクトを日常的な統合テストマトリックスの1行として安全かつ簡単に実行できれば、アップストリームが将来の更新でうっかり何かを壊すことを、はるかにうまく防げる
ただ、こうした書き直しで見えないのは、書き直しによって新たに導入されたバグをどうするのかという点だ。結局、自分たちで現実世界のシナリオにさらされて試練を受ける必要があるのではないか?
エッジケースを知っているならそれも走らせればよいし、知らないならファザーや自動化ツールで興味深い入力を探せばよい。不一致を見つけたら、その入力/出力ペアがそのままテストケースになる。そういうツールがあるのかは分からないが、あるならClaudeに渡して開発ループに組み込ませればよい
ブラウザで動くWebAssemblyデモが本当にすっきりしている: https://pgrust.com
なぜこんなに否定的なのか分からない。こういうプロジェクトは学習目的や新しいやり方の探索として興味深いと思う。それの何が問題なのか?
特にタイトルに Postgres のようなシグナルの強い名前が入り、それを前面に出しているのに、短期・長期の実用性、社会的信頼、ネットワーク効果といった理由から明らかに非実用的だと、反感を買いやすいように思う
理解はできるが、生産的でもなければ、そこまで合理的でもない否定的感情だ。このスレッドには、これが良いはずがない、良くあってはならない、最終的には破局に終わるに違いないと主張しようとする投稿であふれている。だが、このものが何十年もかけて蓄積された数万件の精巧なテストを通過したという事実は、その反対を示唆している。反論するのは難しい
もちろん新たな問題が生じる可能性は高いが、それでも印象的な成果だ
https://github.com/malisper/pgrust/blob/3646a73515a5e4ac7d0b...
https://github.com/malisper/pgrust/blob/3646a73515a5e4ac7d0b...