PostgreSQL8.3.7にLudia1.5.2をインストールする

2009/04/07時点の最新版であるPostgreSQL8.3.7+Ludia1.5.2をRHEL5.2にインストールしていたところ、
Ludiaのmake時に以下のようなエラーが発生した。

pgsenna2.c: In function 'pgs2build0':
pgsenna2.c:613: warning: passing argument 4 of 'IndexBuildHeapScan' makes integer from pointer without a cast
pgsenna2.c:613: error: too few arguments to function 'IndexBuildHeapScan'
make[1]: *** [pgsenna2.lo] エラー 1

PostgreSQL8.3.3+Ludia1.5.1+RHEL5.2の環境では問題なくインストールできていたので、
PostgreSQLかLudiaのマイナーバージョンアップの影響の可能性が高い。


試しに、Ludiaを1.5.1に戻してみたが状況は変わらず。原因はほぼPostgreSQL側にあるようだ。


エラーの内容を見ると、IndexBuildHeapScanの4番目の引数がまずいよと言っているっぽいので、
src/backend/catalog/index.cの該当箇所を見てみると・・・・

  • PostgreSQL8.3.5
double IndexBuildHeapScan(Relation heapRelation,
                          Relation indexRelation,
                          IndexInfo *indexInfo,
                          IndexBuildCallback callback,
                          void *callback_state)
  • PostgreSQL8.3.6
double IndexBuildHeapScan(Relation heapRelation,
                          Relation indexRelation,
                          IndexInfo *indexInfo,
                          bool allow_sync,
                          IndexBuildCallback callback,
                          void *callback_state)

確かに、4番目の引数にallow_syncが追加されています・・・。
ということは、PostgreSQLのバージョンアップにLudiaがまだ対応できていない状況。

とりあえず、Ludiaを使用する予定がある方は、PostgreSQL8.3.5以降のバージョンを使うと危険ということです。
Ludia1.5.3以降で対応して頂けることに期待しましょう。




それでも、俺はPostgreSQL8.3.7+Ludia1.5.2を使いたいぜ!!って言う人はLudiaのソースちょっとだけ弄ると
うまくコンパイルが通るようになります。

  • pgsenna2.c
reltuples = IndexBuildHeapScan(heap, index, indexInfo,
                                 buildCallback, (void *) &bs);

reltuples = IndexBuildHeapScan(heap, index, indexInfo,true
                                 buildCallback, (void *) &bs);


新しく追加された4番目のallow_sync引数にbooleanの値を与えて上げればよいだけですが、問題はこの引数を変更すると
どんな影響があるのか?ということで、ちょっと調べてみると8.3.6の変更点の下記に該当するっぽいです。

GIN インデックスを構築する間は、同期スキャンを行なわないようになりました。(Tom)

これは、GIN は TID の昇順での行を挿入するように最適化されているため、同期スキャンによって
インデックス構築が3倍以上遅くなる可能性があるためです。

allow_syncにtrueを指定すると前バージョンと同じ動作になり、falseを指定するとGINインデックス構築中に同期スキャンを
行わないような設定になるようです。

今回は、あくまでも暫定対応ということでallow_syncにfalseを指定することにしました。
これ以上、変更点に躓いても仕方が無いので・・・。



重要なので2度言いますが、Ludiaを使用する予定がある方は、PostgreSQL8.3.5以降のバージョンを使うと危険です。
大人しく8.3.5を使用しましょう。