拡張機能
拡張は pgmem のビルドに静的にリンクしています。下の表にある名前は、何もインストールせずに CREATE EXTENSION できます。
同梱している拡張
Section titled “同梱している拡張”| 分類 | 拡張 |
|---|---|
| 手続き言語 | plpgsql |
| 型と演算子 | citext、hstore、ltree、cube、seg、isn、intarray、lo、earthdistance |
| 全文検索とあいまい一致 | pg_trgm、fuzzystrmatch、unaccent、dict_int、dict_xsyn |
| インデックス | btree_gist、btree_gin、bloom |
| ベクトル | vector(pgvector 0.8.6) |
| 暗号と ID | pgcrypto、uuid-ossp |
| テーブル関数とサンプリング | tablefunc、tsm_system_rows、tsm_system_time |
| 調査と統計 | pg_stat_statements、pgstattuple、pageinspect、pg_buffercache、pg_freespacemap、pg_visibility、amcheck、pg_prewarm |
| ロード可能モジュール | auto_explain(CREATE EXTENSION ではなく LOAD 'auto_explain') |
Snowball のステミング辞書と、すべてのエンコーディング変換もリンク済みです。
OpenSSL なしの pgcrypto。 pgcrypto の OpenSSL 層と zlib 層は、Go の crypto、math/big、compress パッケージの呼び出しに置き換えています。ダイジェスト、AES、Blowfish、DES、3DES、CAST5、RSA や ElGamal 鍵による OpenPGP 暗号化、OpenPGP の圧縮まで動き、GnuPG で作ったメッセージも復号できます。fips_mode() は常に false で、bzip2 圧縮の OpenPGP パケットは上流と同じく未対応です。
同梱していない拡張
Section titled “同梱していない拡張”表にない拡張は module is not linked into this pgmem build というエラーになります。次のものは設計上の対象外です。
pg_cronやpg_partmanのワーカーのようなバックグラウンドワーカー。シングルユーザーモードには起動役のポストマスターがいないためです。dblinkやpostgres_fdwのような外部ネットワークへの接続。plv8、plperl、plpythonのような別言語のランタイム。- PostGIS。サイズと依存関係の重さのためです。
これらが必要なテストにはコンテナを使ってください。
拡張の追加手順
Section titled “拡張の追加手順”選定基準は単純です。主要なマネージドサービス(Amazon RDS、Google Cloud SQL)と PGlite の多くが提供している拡張を、ORM から使われるものを優先して入れます。
wasm/build.shのCONTRIB_MODULESに contrib の名前を追加します。control ファイル、SQL、データファイルは、モジュールと一緒に配布される share ツリーにコピーされます。- PostgreSQL のソースツリー外の拡張は、pgvector と同じように、リポジトリ・バージョン・チェックサムを書いたロックファイルと、
build.shのコンパイル手順を追加します。 ./wasm/build.shでリビルドし、./wasm/gen-aot.shで Go を再生成します。- 拡張の上流の回帰テストファイルを
testdata/regress/<name>に取り込み、regress_test.goに並べます。テストスイートがそれを pgmem に対して再生します。 - 1 コミットにつき 1 拡張でコミットします。
各モジュールは _PG_init とマジックブロックのシンボル名を変えてコンパイルし、生成したテーブルを通して、静的な dlopen の代替実装がそれを見つけます。動的リンクなしで CREATE EXTENSION が動くのはこの仕組みのおかげです。