[Ludia-users 247] PostgreSQL 8.4 対応パッチ

Back to archive index

Tomoaki Sato sato****@sraos*****
2010年 3月 8日 (月) 22:42:15 JST


佐藤です。

以前に Ludia の PostgreSQL 8.4 対応パッチを作成したのですが、事情があっ
て公開できませんでした。ここにきて問題がなくなったので、とりあえず ML
に投稿しておきます。

以下の手順でパッチを適用してインストールできます。

$ tar -xzf ludia-1.5.2.tar.gz
$ cd ludia-1.5.2
$ patch -p1 < /path/to/ludia-1.5.2_pgsql-8.4.1.patch
patching file pgs2_common.c
patching file pgs2_filter.c
patching file pgs2_recovery.c
patching file pgs2_sync.c
patching file pgs2_util.c
patching file pgsenna2.c
patching file pgsenna2.h.in
patching file pgsenna2_84.sql.in
patching file uninstall_pgsenna2_84.sql.in
$ aclocal
$ libtoolize --force --copy
$ autoheader
$ automake --add-missing --foreign --copy
$ autoconf
$ ./configure (環境に応じてオプションを指定)
$ make
$ su
# make install

以下、パッチの作成時に作成したメモを残しておきます。

======================================================================
Ludia を PostgreSQL 8.4 でビルドできるように修正したところは以下のとお
りです。

- PostgreSQL のバージョンを切り替えるのに POSTGRESXX マクロではなく、
  PG_VERSION_NUM マクロを使用するように修正
- PostgreSQL 8.4.0、8.3.6 以降でシグネチャが変更された関数の呼び出しを
  バージョンによって切り替えるように修正

シグネチャが変更された関数については以下のように対応しました。

----------------------------------------------------------------------
char *
relpath(RelFileNode rnode, ForkNumber forknum)

(src/backend/catalog/catalog.c)

関数 relpath は指定したファイルノードからリレーションのパスを取得する
関数です。バージョン 8.4.0 以降ではリレーション自体を格納するメインファ
イル (メインフォーク) 以外に空き領域マップとビジビリティマップを格納す
るファイルが追加されました。そのため、関数 relpath にはフォーク番号を
指定する引数 forknum が追加されました。

そこで、8.4.0 より前のバージョンと同様にメインフォークのパスを取得する
ため、メインフォーク番号を表す MAIN_FORKNUM を引数 forknum に指定して
関数 relpath を呼び出すように修正しました。

----------------------------------------------------------------------
double
IndexBuildHeapScan(Relation heapRelation,
                   Relation indexRelation,
                   IndexInfo *indexInfo,
                   bool allow_sync,
                   IndexBuildCallback callback,
                   void *callback_state)

(src/backend/catalog/index.c)

関数 IndexBuildHeapScan はインデックス構築の対象となるタプルをヒープ上
のリレーションからスキャンする関数です。GIN インデックスの場合には同期
スキャンを行うと逆に時間がかかってしまうことが判明したため、バージョン
8.3.6 以降では同期スキャンを有効にするかを指定する引数 allow_sync が追
加されました。

Ludia では、GIN インデックスではなく独自のインデックスを使用しており、
同期スキャンを有効にしたほうが性能がよくなるものと考え、8.3.6 より前
のバージョンと同様に同期スキャンを有効にするため、引数 allow_sync に
true を指定して関数 IndexBuildHeapScan を呼び出すように修正しました。

----------------------------------------------------------------------
Selectivity
clauselist_selectivity(PlannerInfo *root,
                       List *clauses,
                       int varRelid,
                       JoinType jointype,
                       SpecialJoinInfo *sjinfo)

(src/backend/optimizer/path/clausesel.c)

関数 clauselist_selectivity は AND 演算子で結合された boolean 型の値を
返す式のリストの選択度を算出する関数です。バージョン 8.4 以降では内部
結合以外の特殊な結合に関する付加的なコンテキスト情報を指定する引数
sjinfo が追加されました。

Ludia では、結合ではなく %% 演算子のコストを見積もるために呼び出してい
るため、引数 sjinfo には NULL を指定して関数 clauselist_selectivity を
呼び出すように修正しました。

----------------------------------------------------------------------
Senna 1.1.4 と Mecab 0.98、以下のバージョンの PostgreSQL との組み合わ
せで、アクセスメソッドに fulltext と fulltextb を指定した場合にインデッ
クスを使用して検索できることを簡単に確認しています。

  8.1.13
  8.1.18
  8.2.9
  8.2.14
  8.3.3
  8.3.8
  8.4.1

======================================================================


----
Tomoaki Sato <sato****@sraos*****>
SRA OSS, Inc. Japan
-------------- next part --------------
diff -r -uN ludia-1.5.2.orig/Makefile.am ludia-1.5.2/Makefile.am
--- ludia-1.5.2.orig/Makefile.am	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/Makefile.am	2009-11-16 22:56:54.000000000 +0900
@@ -5,13 +5,15 @@
 pgsenna2_la_LDFLAGS = -module
 pgsenna2_la_SOURCES = pgsenna2.c pgs2_common.c pgs2_util.c pgs2_filter.c pgs2_tp.c pgs2_recovery.c pgs2_sync.c
 data_DATA = pgsenna2.sql uninstall_pgsenna2.sql
-INSTALL_SQL_IN = pgsenna2_81.sql.in pgsenna2_82.sql.in pgsenna2_83.sql.in pgsenna2_tp.sql.in
-UNINSTALL_SQL_IN = uninstall_pgsenna2_81.sql.in uninstall_pgsenna2_82.sql.in uninstall_pgsenna2_83.sql.in
+INSTALL_SQL_IN = pgsenna2_81.sql.in pgsenna2_82.sql.in pgsenna2_83.sql.in pgsenna2_84.sql.in pgsenna2_tp.sql.in
+UNINSTALL_SQL_IN = uninstall_pgsenna2_81.sql.in uninstall_pgsenna2_82.sql.in uninstall_pgsenna2_83.sql.in uninstall_pgsenna2_84.sql.in
 DOCUMENT = README.htm INSTALL.htm README.advanced README.win32 README.pgs2recovery README.pgs2sync
 EXTRA_DIST = $(INSTALL_SQL_IN) $(UNINSTALL_SQL_IN) $(DOCUMENT) xlog.c Makefile.w32 # deps
 
 pgsenna2.sql: $(top_builddir)/config.status $(INSTALL_SQL_IN)
-	if   [ `expr -- "${CPPFLAGS}" : .*POSTGRES83.*` -gt 0 ]; then \
+	if   [ `expr -- "${CPPFLAGS}" : .*POSTGRES84.*` -gt 0 ]; then \
+	  cp -f ${srcdir}/pgsenna2_84.sql.in ${srcdir}/pgsenna2.sql; \
+	elif [ `expr -- "${CPPFLAGS}" : .*POSTGRES83.*` -gt 0 ]; then \
 	  cp -f ${srcdir}/pgsenna2_83.sql.in ${srcdir}/pgsenna2.sql; \
 	elif [ `expr -- "${CPPFLAGS}" : .*POSTGRES82.*` -gt 0 ]; then \
 	  cp -f ${srcdir}/pgsenna2_82.sql.in ${srcdir}/pgsenna2.sql; \
@@ -23,7 +25,9 @@
 	fi
 
 uninstall_pgsenna2.sql: $(top_builddir)/config.status $(UNINSTALL_SQL_IN)
-	if   [ `expr -- "${CPPFLAGS}" : .*POSTGRES83.*` -gt 0 ]; then\
+	if   [ `expr -- "${CPPFLAGS}" : .*POSTGRES84.*` -gt 0 ]; then\
+	  cp -f ${srcdir}/uninstall_pgsenna2_84.sql.in ${srcdir}/uninstall_pgsenna2.sql;\
+	elif [ `expr -- "${CPPFLAGS}" : .*POSTGRES83.*` -gt 0 ]; then\
 	  cp -f ${srcdir}/uninstall_pgsenna2_83.sql.in ${srcdir}/uninstall_pgsenna2.sql;\
 	elif [ `expr -- "${CPPFLAGS}" : .*POSTGRES82.*` -gt 0 ]; then\
 	  cp -f ${srcdir}/uninstall_pgsenna2_82.sql.in ${srcdir}/uninstall_pgsenna2.sql;\
diff -r -uN ludia-1.5.2.orig/pgs2_common.c ludia-1.5.2/pgs2_common.c
--- ludia-1.5.2.orig/pgs2_common.c	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/pgs2_common.c	2009-11-16 22:56:54.000000000 +0900
@@ -150,7 +150,7 @@
 void
 reset_currentid(CurrentId* currentid) {
   currentid->xid = GetCurrentTransactionId();
-#if defined(POSTGRES81) || defined(POSTGRES82)
+#if PG_VERSION_NUM < 80300
   currentid->cid = GetCurrentCommandId();
 #else
   currentid->cid = GetCurrentCommandId(false);
@@ -161,7 +161,7 @@
 bool
 comp_currentid(CurrentId* currentid) {
   if (currentid->xid == GetCurrentTransactionId() &&
-#if defined(POSTGRES81) || defined(POSTGRES82)
+#if PG_VERSION_NUM < 80300
       currentid->cid == GetCurrentCommandId()) {
 #else
       currentid->cid == GetCurrentCommandId(false)) {
@@ -277,7 +277,7 @@
     }
   }
   SET_LOCKTAG_RELATION(locktag, MyDatabaseId, ii->relid);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   res = LockAcquire(&locktag, ShareUpdateExclusiveLock, 0, 0);
 #endif
   if(res == LOCKACQUIRE_OK) {
@@ -285,7 +285,7 @@
   } else {
     elog(ERROR, "pgsenna2: cannot LockAcquire while update_index (%d)", res);
   }
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   LockRelease(&locktag, ShareUpdateExclusiveLock, 0);
 #endif
   if (rc != sen_success) {
@@ -336,7 +336,7 @@
       ArrayType* atype = DatumGetArrayTypeP(oldv);
       char* v_ptr = ARR_DATA_PTR(atype);
       int i;
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
       bits8 *bitmap = NULL;
 #else
       bits8 *bitmap = ARR_NULLBITMAP(atype);
@@ -348,7 +348,7 @@
           char *c = datum2cstr(fetch_att(v_ptr, false, -1));
           update_index_with_char(ii, key, i, c, NULL);
           null_flag = 1;
-#if defined(POSTGRES81) || defined(POSTGRES82)
+#if PG_VERSION_NUM < 80300
           v_ptr = att_addlength(v_ptr, -1, PointerGetDatum(v_ptr));
           v_ptr = (char *) att_align(v_ptr, 'i');
 #else
@@ -377,7 +377,7 @@
       ArrayType* atype = DatumGetArrayTypeP(newv);
       char* v_ptr = ARR_DATA_PTR(atype);
       int i;
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
       bits8 *bitmap = NULL;
 #else
       bits8 *bitmap = ARR_NULLBITMAP(atype);
@@ -388,7 +388,7 @@
         if (!bitmap || (*bitmap & bitmask)) {
           char *c = datum2cstr(fetch_att(v_ptr, false, -1));
           update_index_with_char(ii, key, i, NULL, c);
-#if defined(POSTGRES81) || defined(POSTGRES82)
+#if PG_VERSION_NUM < 80300
           v_ptr = att_addlength(v_ptr, -1, PointerGetDatum(v_ptr));
           v_ptr = (char *) att_align(v_ptr, 'i');
 #else
diff -r -uN ludia-1.5.2.orig/pgs2_filter.c ludia-1.5.2/pgs2_filter.c
--- ludia-1.5.2.orig/pgs2_filter.c	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/pgs2_filter.c	2009-11-16 22:56:54.000000000 +0900
@@ -72,7 +72,7 @@
     elog(ERROR, "pgsenna2: failed pdftotext 1 (%s)", strerror(errno));
   }
   /* varatt_size include the size of itself */
-#ifdef POSTGRES83
+#if PG_VERSION_NUM >= 80300
   SET_VARSIZE_4B(filtered, VARHDRSZ + buf_read_total);
 #else
   VARATT_SIZEP(filtered) = VARHDRSZ + buf_read_total;
@@ -153,7 +153,7 @@
     elog(ERROR, "pgsenna2: failed pdftotext 2 (%s)", strerror(errno));
   }
   /* varatt_size include the size of itself */
-#ifdef POSTGRES83
+#if PG_VERSION_NUM >= 80300
   SET_VARSIZE_4B(filtered, VARHDRSZ + buf_read_total);
 #else
   VARATT_SIZEP(filtered) = VARHDRSZ + buf_read_total;
@@ -222,7 +222,7 @@
   pfree(keywords);
   pfree(document);
   max_tagged_len --; /* cutting null-end */
-#ifdef POSTGRES83
+#if PG_VERSION_NUM >= 80300
   SET_VARSIZE_4B(result, VARHDRSZ + max_tagged_len);
 #else
   VARATT_SIZEP(result) = VARHDRSZ + max_tagged_len;
@@ -249,7 +249,7 @@
     elog(ERROR, "pgsenna2: sen_nstr_open failed during pgs2norm");
   }
   pfree((char *)source);
-#ifdef POSTGRES83
+#if PG_VERSION_NUM >= 80300
   SET_VARSIZE_4B(filtered, VARHDRSZ + filtered_len);
 #else
   VARATT_SIZEP(filtered) = VARHDRSZ + filtered_len;
diff -r -uN ludia-1.5.2.orig/pgs2_recovery.c ludia-1.5.2/pgs2_recovery.c
--- ludia-1.5.2.orig/pgs2_recovery.c	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/pgs2_recovery.c	2009-11-16 22:56:54.000000000 +0900
@@ -11,7 +11,7 @@
 #include "utils/fmgroids.h"
 #include "pgsenna2.h"
 
-#ifdef POSTGRES82
+#if PG_VERSION_NUM >= 80200 && PG_VERSION_NUM < 80300
 
 #include "xlog.c"
 
@@ -382,4 +382,4 @@
   heap_close(reln, AccessShareLock);
   ReleaseBuffer(buffer);
 }
-#endif /* POSTGRES82 */
+#endif
diff -r -uN ludia-1.5.2.orig/pgs2_sync.c ludia-1.5.2/pgs2_sync.c
--- ludia-1.5.2.orig/pgs2_sync.c	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/pgs2_sync.c	2009-11-16 22:56:54.000000000 +0900
@@ -85,13 +85,13 @@
 pgs2_lock(PG_FUNCTION_ARGS)
 {
   Oid indexrelid = PG_GETARG_OID(0);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   LockAcquireResult res = LOCKACQUIRE_OK;
 #endif
   LOCKTAG tmptag;
   LOCKTAG *locktag = NULL;
   bool found = false;
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   ResourceOwner currentOwner;
 #endif
 
@@ -114,7 +114,7 @@
                                    HASH_ENTER,
                                    &found);
   SET_LOCKTAG_RELATION(*locktag, MyDatabaseId, indexrelid);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   currentOwner = CurrentResourceOwner;
   PG_TRY();
   {
@@ -183,7 +183,7 @@
 
 static void lock_release(LOCKTAG *ltag)
 {
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   bool res = false;
   ResourceOwner currentOwner = CurrentResourceOwner;
   PG_TRY();
@@ -218,7 +218,7 @@
       while ((hentry = (LOCKTAG *) hash_seq_search(&status)) != NULL)
         {
           Oid indexrelid = (Oid)(hentry->locktag_field2);
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
           Relation indrel = index_open(indexrelid);
 #else
           Relation indrel = index_open(indexrelid, AccessShareLock);
@@ -226,11 +226,15 @@
           char idxpath[MAXPGPATH];
           char *rpath;
           RelationOpenSmgr(indrel);
+#if PG_VERSION_NUM >= 80400
+          rpath = relpath(indrel->rd_smgr->smgr_rnode, MAIN_FORKNUM);
+#else
           rpath = relpath(indrel->rd_smgr->smgr_rnode);
+#endif
           snprintf(idxpath, MAXPGPATH, "%s/%s", DataDir, rpath);
           pfree(rpath);
           RelationCloseSmgr(indrel);
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
           index_close(indrel);
 #else
           index_close(indrel, AccessShareLock);
diff -r -uN ludia-1.5.2.orig/pgs2_util.c ludia-1.5.2/pgs2_util.c
--- ludia-1.5.2.orig/pgs2_util.c	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/pgs2_util.c	2009-11-16 22:56:54.000000000 +0900
@@ -23,13 +23,12 @@
 Datum _pgs2indexinfo(FunctionCallInfo fcinfo, char *path);
 
 #ifdef WIN32
-#if defined(POSTGRES81)
+#if PG_VERSION_NUM < 80200
 extern DLLIMPORT char *DataDir;
 extern DLLIMPORT char *DatabasePath;
-#endif /* POSTGRES81 */
-#if defined(POSTGRES82)
+#elif PG_VERSION_NUM < 80300
 extern DLLIMPORT char *DatabasePath;
-#endif /* POSTGRES82 */
+#endif
 #endif /* WIN32 */
 
 typedef struct {
@@ -274,7 +273,7 @@
 
 Datum
 pgs2indexinfodb(PG_FUNCTION_ARGS) {
-#if WIN32 && defined(POSTGRES83)
+#if defined(WIN32) && PG_VERSION_NUM >= 80300
   elog(ERROR, "pgsenna2: cannot use pgs2indexinfodb at PG83Windows");
 #endif
   PG_RETURN_DATUM(_pgs2indexinfo(fcinfo, DatabasePath));
@@ -453,7 +452,7 @@
   text *buffer;
 
   buffer = (text *) PGS2_PALLOC(VARHDRSZ + strlen(PGS2_PACKAGE_STRING));
-#ifdef POSTGRES83
+#if PG_VERSION_NUM >= 80300
   SET_VARSIZE_4B(buffer, VARHDRSZ + strlen(PGS2_PACKAGE_STRING));
 #else
   VARATT_SIZEP(buffer) = VARHDRSZ + strlen(PGS2_PACKAGE_STRING);
diff -r -uN ludia-1.5.2.orig/pgsenna2.c ludia-1.5.2/pgsenna2.c
--- ludia-1.5.2.orig/pgsenna2.c	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/pgsenna2.c	2009-11-18 02:44:37.000000000 +0900
@@ -87,16 +87,15 @@
 #include "pgsenna2.h"
 
 #ifdef WIN32
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
 extern DLLIMPORT char *DataDir;
 extern DLLIMPORT double cpu_operator_cost;
-#endif /* POSTGRES81 */
-#ifdef POSTGRES82
+#elif PG_VERSION_NUM < 80300
 extern DLLIMPORT bool pgstat_collect_tuplelevel;
-#endif /* POSTGRES82 */
+#endif
 #endif /* WIN32 */
 
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
 #include "access/reloptions.h"
 PG_MODULE_MAGIC;
 #endif
@@ -105,7 +104,11 @@
 PG_FUNCTION_INFO_V1(_pgs2insert);
 PG_FUNCTION_INFO_V1(pgs2beginscan);
 PG_FUNCTION_INFO_V1(pgs2gettuple);
+#if PG_VERSION_NUM >= 80400
+PG_FUNCTION_INFO_V1(pgs2getbitmap);
+#else
 PG_FUNCTION_INFO_V1(pgs2getmulti);
+#endif
 PG_FUNCTION_INFO_V1(pgs2rescan);
 PG_FUNCTION_INFO_V1(pgs2endscan);
 PG_FUNCTION_INFO_V1(pgs2markpos);
@@ -126,7 +129,7 @@
 PG_FUNCTION_INFO_V1(pgs2getscore);
 PG_FUNCTION_INFO_V1(pgs2getscore_simple);
 PG_FUNCTION_INFO_V1(pgs2getnhits);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
 PG_FUNCTION_INFO_V1(pgs2options);
 #endif
 PG_FUNCTION_INFO_V1(pgs2indexcache);
@@ -250,9 +253,9 @@
 
   if (initialized) { return ; }
 
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
   _PG_init ();
-#endif /* POSTGRES81 */
+#endif
 
   option = getludiaoption("ludia.max_n_index_cache");
   if (option) {
@@ -375,7 +378,11 @@
   {
     char *pathname;
     RelationOpenSmgr(r);
+#if PG_VERSION_NUM >= 80400
+    pathname = relpath(r->rd_smgr->smgr_rnode, MAIN_FORKNUM);
+#else
     pathname = relpath(r->rd_smgr->smgr_rnode);
+#endif
     snprintf(path, MAXPGPATH, "%s/%s", DataDir, pathname);
     RelationCloseSmgr(r);
     pfree(pathname);
@@ -394,11 +401,11 @@
     }
     {
       RelFileNode *rels;
-#ifdef POSTGRES83
+#if PG_VERSION_NUM >= 80300
       int num = smgrGetPendingDeletes(true, &rels, false);
 #else
       int num = smgrGetPendingDeletes(true, &rels);
-#endif /* POSTGRES83 */
+#endif
       char *pathname = (char *)PGS2_PALLOC(sizeof(char) * MAXPGPATH);
       for (i = 0; i < num; i++) {
         sen_index *sindex = NULL;
@@ -535,7 +542,7 @@
       char *c = datum2cstr(value);
       if (c && *c) {
         LockAcquireResult res = LOCKACQUIRE_OK;
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
         LOCKTAG locktag;
         SET_LOCKTAG_RELATION(locktag, MyDatabaseId, ii->relid);
         res = LockAcquire(DEFAULT_LOCKMETHOD, &locktag, r->rd_istemp,
@@ -546,7 +553,7 @@
         } else {
           elog(ERROR, "pgsenna2: cannot LockAcquire while do_insert (%d)", res);
         }
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
         LockRelease(DEFAULT_LOCKMETHOD, &locktag,
                     ShareUpdateExclusiveLock, 0);
 #endif
@@ -599,7 +606,7 @@
 Datum
 pgs2build0(Relation heap, Relation index, IndexInfo *indexInfo, int flags, Oid oid_type)
 {
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   IndexBuildResult *result;
 #endif
   build_stat bs;
@@ -609,9 +616,14 @@
   bs.indtuples = 0;
   bs.index = index_info_open(index, 1, flags);
   bs.oid_type = oid_type;
+#if PG_VERSION_NUM >= 80306
+  reltuples = IndexBuildHeapScan(heap, index, indexInfo, true,
+                                 buildCallback, (void *) &bs);
+#else
   reltuples = IndexBuildHeapScan(heap, index, indexInfo,
                                  buildCallback, (void *) &bs);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#endif
+#if PG_VERSION_NUM >= 80200
   result = (IndexBuildResult *) PGS2_PALLOC(sizeof(IndexBuildResult));
   result->heap_tuples = reltuples;
   result->index_tuples = bs.indtuples;
@@ -816,7 +828,7 @@
         }
         tuples_removed += 1;
       } else {
-#if defined(POSTGRES81) || defined(POSTGRES82)
+#if PG_VERSION_NUM < 80300
         elog(ERROR, "pgsenna2: heap tuple not found");
 #else
         elog(WARNING, "pgsenna2: Ludia doesn't support VACUU****@Postg*****, you should REINDEX ludia-index");
@@ -847,7 +859,7 @@
 Datum
 pgs2bulkdelete(PG_FUNCTION_ARGS)
 {
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   IndexVacuumInfo *info = (IndexVacuumInfo *) PG_GETARG_POINTER(0);
   IndexBulkDeleteResult *stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1);
   IndexBulkDeleteCallback callback = (IndexBulkDeleteCallback) PG_GETARG_POINTER(2);
@@ -870,7 +882,7 @@
 Datum
 _pgs2bulkdelete(PG_FUNCTION_ARGS)
 {
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   IndexVacuumInfo *info = (IndexVacuumInfo *) PG_GETARG_POINTER(0);
   IndexBulkDeleteResult *stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1);
   IndexBulkDeleteCallback callback = (IndexBulkDeleteCallback) PG_GETARG_POINTER(2);
@@ -889,11 +901,11 @@
 Datum
 pgs2vacuumcleanup(PG_FUNCTION_ARGS)
 {
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   IndexVacuumInfo *info = (IndexVacuumInfo *) PG_GETARG_POINTER(0);
 #endif
   IndexBulkDeleteResult *stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   index_info *ii = index_info_open(info->index, 0, 0);
 
   if (stats == NULL) {
@@ -946,8 +958,7 @@
     currentid = start_currentid();
   }
   if (!comp_currentid(currentid)) {
-#ifdef POSTGRES83
-#else
+#if PG_VERSION_NUM < 80300
     pgstat_count_index_scan(&s->xs_pgstat_info);
 #endif
     reset_currentid(currentid);
@@ -963,7 +974,7 @@
     elog(ERROR, "pgsenna2: inconsistent scan");
   }
   if (s->kill_prior_tuple) {
-#ifndef POSTGRES83
+#if PG_VERSION_NUM < 80300
     rc = sen_index_del(ss->index->index, &(s->currentItemData));
 #endif
     if (rc) {
@@ -971,13 +982,48 @@
     }
   }
   res = sen_records_next(ss->records, &s->xs_ctup.t_self, KEY_SIZE, NULL);
-#ifndef POSTGRES83
+#if PG_VERSION_NUM < 80300
   if (res) { memcpy(&s->currentItemData, &s->xs_ctup.t_self, KEY_SIZE); }
 #endif
   PG_RETURN_BOOL(res ? true : false);
 }
 
 
+#if PG_VERSION_NUM >= 80400
+
+Datum
+pgs2getbitmap(PG_FUNCTION_ARGS)
+{
+  IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
+  TIDBitmap *tbm = (TIDBitmap *) PG_GETARG_POINTER(1);
+  scan_stat *ss = s->opaque;
+  int64 ntids = 0;
+  ItemPointerData heapTid;
+  static CurrentId* currentid = NULL;
+
+  if (!currentid) {
+    currentid = start_currentid();
+  }
+  if (!comp_currentid(currentid)) {
+    reset_currentid(currentid);
+  }
+  if (!ss) {
+    elog(ERROR, "pgsenna2: inconsistent scan, or max_n_index_cache is too small");
+  }
+  if (!ss->records) {
+    elog(ERROR, "pgsenna2: inconsistent scan");
+  }
+  while (sen_records_next(ss->records, &heapTid, KEY_SIZE, NULL)) {
+    //tbm_add_tuples(tbm, &heapTid, 1, ss->recheck);
+    tbm_add_tuples(tbm, &heapTid, 1, false);
+    ntids++;
+  }
+
+  PG_RETURN_INT64(ntids);
+}
+
+#else
+
 /*
  * pgs2getmulti is called when SELECT(index-scan) is executed.
  * pgs2getmulti is similar to pgs2gettuple.
@@ -999,8 +1045,7 @@
     currentid = start_currentid();
   }
   if (!comp_currentid(currentid)) {
-#ifdef POSTGRES83
-#else
+#if PG_VERSION_NUM < 80300
     pgstat_count_index_scan(&s->xs_pgstat_info);
 #endif
     reset_currentid(currentid);
@@ -1016,7 +1061,7 @@
       more = false;
       break;
     }
-#ifndef POSTGRES83
+#if PG_VERSION_NUM < 80300
     memcpy(&s->currentItemData, &tids[i], KEY_SIZE);
 #endif
   }
@@ -1024,6 +1069,8 @@
   PG_RETURN_BOOL(more);
 }
 
+#endif
+
 
 /*
  * pgs2rescan is called when SELECT(index-scan) is executed.
@@ -1044,7 +1091,7 @@
 
   elog(DEBUG1, "pgsenna2: pgs2rescan");
   if (!key) { elog(ERROR, "pgsenna2: access method does not support scan without scankey."); }
-#ifndef POSTGRES83
+#if PG_VERSION_NUM < 80300
   ItemPointerSetInvalid(&s->currentItemData);
   ItemPointerSetInvalid(&s->currentMarkData);
 #endif
@@ -1150,9 +1197,9 @@
 
   elog(DEBUG1, "pgsenna2: pgs2markpos");
   ss->mark = ss->records->curr_rec;
-#ifndef POSTGRES83
+#if PG_VERSION_NUM < 80300
   s->currentMarkData = s->currentItemData;
-#endif /* POSTGRES83 */
+#endif
 #endif /* 0 */
   PG_RETURN_VOID();
 }
@@ -1170,9 +1217,9 @@
 
   elog(DEBUG1, "pgsenna2: pgs2restrpos");
   ss->records->curr_rec = ss->mark;
-#ifndef POSTGRES83
+#if PG_VERSION_NUM < 80300
   s->currentItemData = s->currentMarkData;
-#endif /* POSTGRES83 */
+#endif
 #endif /* 0 */
   elog(ERROR, "pgsenna2: Ludia doesn't support Merge-Join");
   PG_RETURN_VOID();
@@ -1191,13 +1238,13 @@
   PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
   IndexOptInfo *index = (IndexOptInfo *) PG_GETARG_POINTER(1);
   List *indexQuals = (List *) PG_GETARG_POINTER(2);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   RelOptInfo *outer_rel = (RelOptInfo *) PG_GETARG_POINTER(3);
   Cost *indexStartupCost = (Cost *) PG_GETARG_POINTER(4);
   Cost *indexTotalCost = (Cost *) PG_GETARG_POINTER(5);
   Selectivity *indexSelectivity = (Selectivity *) PG_GETARG_POINTER(6);
   double *indexCorrelation = (double *) PG_GETARG_POINTER(7);
-#elif defined(POSTGRES81)
+#else
   Cost *indexStartupCost = (Cost *) PG_GETARG_POINTER(3);
   Cost *indexTotalCost = (Cost *) PG_GETARG_POINTER(4);
   Selectivity *indexSelectivity = (Selectivity *) PG_GETARG_POINTER(5);
@@ -1233,28 +1280,28 @@
   }
 
   if (segpagefactor > 0.0) {
-#if defined(POSTGRES81)
+#if PG_VERSION_NUM < 80200
     Relation indrel = index_open(index->indexoid);
-#elif defined(POSTGRES82) || defined(POSTGRES83)
+#else
     Relation indrel = index_open(index->indexoid, AccessShareLock);
 #endif
     index_info *ii = index_info_open(indrel, 0, 0);
-#if defined(POSTGRES81)
+#if PG_VERSION_NUM < 80200
     index_close(indrel);
-#elif defined(POSTGRES82) || defined(POSTGRES83)
+#else
     index_close(indrel, AccessShareLock);
 #endif
     index->pages = (BlockNumber)(get_pseudo_pagesize(ii->index) * segpagefactor);
   }
 
   if (usegenericcost) {
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
     return DirectFunctionCall8(gincostestimate, PG_GETARG_DATUM(0),
                                PG_GETARG_DATUM(1), PG_GETARG_DATUM(2),
                                PG_GETARG_DATUM(3), PG_GETARG_DATUM(4),
                                PG_GETARG_DATUM(5), PG_GETARG_DATUM(6),
                                PG_GETARG_DATUM(7));
-#elif defined(POSTGRES81)
+#else
     return DirectFunctionCall7(hashcostestimate, PG_GETARG_DATUM(0),
                                PG_GETARG_DATUM(1), PG_GETARG_DATUM(2),
                                PG_GETARG_DATUM(3), PG_GETARG_DATUM(4),
@@ -1272,16 +1319,22 @@
     }
   else
     selectivityQuals = indexQuals;
+#if PG_VERSION_NUM >= 80400
+  *indexSelectivity = clauselist_selectivity(root, selectivityQuals,
+                                             index->rel->relid,
+                                             JOIN_INNER, NULL);
+#else
   *indexSelectivity = clauselist_selectivity(root, selectivityQuals,
                                              index->rel->relid,
                                              JOIN_INNER);
+#endif
   /* if (*indexSelectivity <= 1.0) { *indexSelectivity = 0.0; } */
   if (numIndexTuples <= 0.0)
     numIndexTuples = *indexSelectivity * index->rel->tuples;
   if (numIndexTuples > index->tuples)
     numIndexTuples = index->tuples;
   *indexTotalCost = numIndexPages;
-#ifdef POSTGRES83
+#if PG_VERSION_NUM >= 80300
   cost_qual_eval(&index_qual_cost, indexQuals, NULL);
 #else
   cost_qual_eval(&index_qual_cost, indexQuals);
@@ -1292,7 +1345,7 @@
   *indexStartupCost = qual_arg_cost;
   *indexTotalCost += qual_arg_cost;
   *indexTotalCost += numIndexTuples * (cpu_index_tuple_cost + qual_op_cost);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
   if (outer_rel != NULL && outer_rel->rows > 1) {
     *indexTotalCost -= random_page_cost / ((double)outer_rel->rows);
   } else {
@@ -1365,7 +1418,7 @@
     char* v_ptr = ARR_DATA_PTR(vttype);
     ct_strlen_n = *ARR_DIMS(vttype);
     ct = (char **) PGS2_PALLOC(ct_strlen_n * sizeof(char *));
-#ifdef POSTGRES81
+#if PG_VERSION_NUM < 80200
     bitmap = NULL;
 #else
     bitmap = ARR_NULLBITMAP(vttype);
@@ -1373,7 +1426,7 @@
     for(i = 0  ; i < ct_strlen_n; i++) {
       if (!bitmap || (*bitmap & bitmask)) {
         ct[i] = datum2cstr(fetch_att(v_ptr, false, -1));
-#if defined(POSTGRES81) || defined(POSTGRES82)
+#if PG_VERSION_NUM < 80300
         v_ptr = att_addlength(v_ptr, -1, PointerGetDatum(v_ptr));
         v_ptr = (char *) att_align(v_ptr, 'i');
 #else
@@ -1509,7 +1562,7 @@
 /*
  * pgs2options isn't used...
  */
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
 Datum
 pgs2options(PG_FUNCTION_ARGS)
 {
diff -r -uN ludia-1.5.2.orig/pgsenna2.h.in ludia-1.5.2/pgsenna2.h.in
--- ludia-1.5.2.orig/pgsenna2.h.in	2009-03-26 21:43:47.000000000 +0900
+++ ludia-1.5.2/pgsenna2.h.in	2009-11-18 02:07:16.000000000 +0900
@@ -55,12 +55,15 @@
 #ifndef  __PGSENNA2_H__
 #define  __PGSENNA2_H__
 
+#include "access/genam.h"
 #include "access/itup.h"
+#include "access/relscan.h"
 #include "access/sdir.h"
 #include "access/skey.h"
 #include "access/xlog.h"
 #include "access/xact.h"
 #include "utils/rel.h"
+#include "utils/tqual.h"
 #include "nodes/execnodes.h"
 #include "catalog/pg_type.h"
 
@@ -110,7 +113,7 @@
 #define _TEXTOID     1009
 
 /*
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
 #define PGS2_MIN_FILLFACTOR             10
 #define PGS2_DEFAULT_FILLFACTOR         75
 #endif
@@ -123,7 +126,11 @@
 extern Datum _pgs2insert(PG_FUNCTION_ARGS);
 extern Datum pgs2beginscan(PG_FUNCTION_ARGS);
 extern Datum pgs2gettuple(PG_FUNCTION_ARGS);
+#if PG_VERSION_NUM >= 80400
+extern Datum pgs2getbitmap(PG_FUNCTION_ARGS);
+#else
 extern Datum pgs2getmulti(PG_FUNCTION_ARGS);
+#endif
 extern Datum pgs2rescan(PG_FUNCTION_ARGS);
 extern Datum pgs2endscan(PG_FUNCTION_ARGS);
 extern Datum pgs2markpos(PG_FUNCTION_ARGS);
@@ -144,7 +151,7 @@
 extern Datum pgs2getscore(PG_FUNCTION_ARGS);
 extern Datum pgs2getscore_simple(PG_FUNCTION_ARGS);
 extern Datum pgs2getnhits(PG_FUNCTION_ARGS);
-#if defined(POSTGRES82) || defined(POSTGRES83)
+#if PG_VERSION_NUM >= 80200
 extern Datum pgs2options(PG_FUNCTION_ARGS);
 #endif
 extern Datum pgs2indexcache(PG_FUNCTION_ARGS);
diff -r -uN ludia-1.5.2.orig/pgsenna2_84.sql.in ludia-1.5.2/pgsenna2_84.sql.in
--- ludia-1.5.2.orig/pgsenna2_84.sql.in	1970-01-01 09:00:00.000000000 +0900
+++ ludia-1.5.2/pgsenna2_84.sql.in	2009-11-18 01:45:55.000000000 +0900
@@ -0,0 +1,295 @@
+-- install ludia for PostgreSQL8.4
+CREATE OR REPLACE FUNCTION
+    pgs2insert(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2insert'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    _pgs2insert(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', '_pgs2insert'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2beginscan(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2beginscan'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2gettuple(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2gettuple'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2getbitmap(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2getbitmap'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2rescan(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2rescan'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2endscan(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2endscan'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2markpos(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2markpos'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2restrpos(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2restrpos'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2build(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2build'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    _pgs2build(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', '_pgs2build'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2buildb(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2buildb'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    _pgs2buildb(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', '_pgs2buildb'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2buildu(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2buildu'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    _pgs2buildu(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', '_pgs2buildu'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2bulkdelete(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2bulkdelete'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    _pgs2bulkdelete(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', '_pgs2bulkdelete'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2vacuumcleanup(INTERNAL, INTERNAL) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2vacuumcleanup'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2costestimate(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2costestimate'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2contain(TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', 'pgs2contain'
+LANGUAGE 'C' STRICT COST 100;
+
+CREATE OR REPLACE FUNCTION
+    _pgs2contain(_TEXT, TEXT) RETURNS BOOLEAN
+    AS '$libdir/pgsenna2', '_pgs2contain'
+LANGUAGE 'C' STRICT COST 100;
+
+CREATE OR REPLACE FUNCTION
+    pgs2nop(TEXT) RETURNS TEXT
+    AS '$libdir/pgsenna2', 'pgs2nop'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2getscore(tid, TEXT) RETURNS INT
+    AS '$libdir/pgsenna2', 'pgs2getscore'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2getscore(tid) RETURNS INT
+    AS '$libdir/pgsenna2', 'pgs2getscore_simple'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2getnhits() RETURNS INT
+    AS '$libdir/pgsenna2', 'pgs2getnhits'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2options() RETURNS INT
+    AS '$libdir/pgsenna2', 'pgs2options'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2indexcache(OUT relid TEXT, OUT namespace TEXT, OUT name TEXT,
+     OUT previous TEXT, OUT this TEXT, OUT next TEXT)
+    RETURNS SETOF RECORD
+    AS '$libdir/pgsenna2', 'pgs2indexcache'
+LANGUAGE 'C' STRICT ROWS 100;
+
+CREATE OR REPLACE FUNCTION
+    pgs2destroy() RETURNS INT
+    AS '$libdir/pgsenna2', 'pgs2destroy'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2indexinfo(OUT filename TEXT, OUT dead_flag integer,
+    OUT key_size integer, OUT flags integer,
+    OUT initial_n_segments integer, OUT encoding integer,
+    OUT nrecords_keys bigint, OUT file_size_keys bigint,
+    OUT nrecords_lexicon bigint, OUT file_size_lexicon bigint,
+    OUT inv_seg_size bigint , OUT inv_chunk_size bigint)
+    RETURNS SETOF record
+    AS '$libdir/pgsenna2', 'pgs2indexinfo'
+LANGUAGE 'C' STRICT ROWS 100;
+
+CREATE OR REPLACE FUNCTION
+    pgs2indexinfodb(OUT filename TEXT, OUT dead_flag integer,
+    OUT key_size integer, OUT flags integer,
+    OUT initial_n_segments integer, OUT encoding integer,
+    OUT nrecords_keys bigint, OUT file_size_keys bigint,
+    OUT nrecords_lexicon bigint, OUT file_size_lexicon bigint,
+    OUT inv_seg_size bigint , OUT inv_chunk_size bigint)
+    RETURNS SETOF record
+    AS '$libdir/pgsenna2', 'pgs2indexinfodb'
+LANGUAGE 'C' STRICT ROWS 100;
+
+CREATE OR REPLACE FUNCTION
+    pgs2getlexicon(IN filename TEXT,
+    OUT id TEXT, OUT lexicon TEXT, OUT flag integer)
+    RETURNS SETOF record
+    AS '$libdir/pgsenna2', 'pgs2getlexicon'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2version() RETURNS TEXT
+    AS '$libdir/pgsenna2', 'pgs2version'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2seninfo(OUT version TEXT, OUT configure_option TEXT,
+    OUT config_path TEXT, OUT default_encoding TEXT,
+    OUT initial_n_segments TEXT, OUT partial_match_threshold TEXT)
+    RETURNS record
+    AS '$libdir/pgsenna2', 'pgs2seninfo'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2getoption(OUT max_n_sort_result TEXT,
+    OUT enable_seqscan TEXT, OUT seqscan_flags TEXT, OUT sen_index_flags TEXT,
+    OUT max_n_index_cache TEXT, OUT initial_n_segments TEXT)
+    RETURNS record
+    AS '$libdir/pgsenna2', 'pgs2getoption'
+LANGUAGE 'C' STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2pdftotext1(TEXT) RETURNS TEXT
+    AS '$libdir/pgsenna2', 'pgs2pdftotext1'
+LANGUAGE 'C' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2pdftotext2(BYTEA) RETURNS TEXT
+    AS '$libdir/pgsenna2', 'pgs2pdftotext2'
+LANGUAGE 'C' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2snippet1(INT, INT, INT, TEXT, TEXT, INT, TEXT, TEXT)
+    RETURNS TEXT
+    AS '$libdir/pgsenna2', 'pgs2snippet1'
+LANGUAGE 'C' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION
+    pgs2norm(TEXT, INT)
+    RETURNS TEXT
+    AS '$libdir/pgsenna2', 'pgs2norm'
+LANGUAGE 'C' IMMUTABLE STRICT;
+
+INSERT INTO pg_am VALUES('fulltext','1','1','f','f','f','t','t','t','f','f','f','0','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2build','pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltextb','1','1','f','f','f','t','t','t','f','f','f','0','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2buildb','pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltextu','1','1','f','f','f','t','t','t','f','f','f','0','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2buildu','pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltexta','1','1','f','f','f','t','t','t','f','f','f','0','_pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','_pgs2build','_pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltextab','1','1','f','f','f','t','t','t','f','f','f','0','_pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','_pgs2buildb','_pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltextau','1','1','f','f','f','t','t','t','f','f','f','0','_pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','_pgs2buildu','_pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltextr','1','1','f','f','f','t','t','t','f','f','f','0','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2build','pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltextrb','1','1','f','f','f','t','t','t','f','f','f','0','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2buildb','pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+INSERT INTO pg_am VALUES('fulltextru','1','1','f','f','f','t','t','t','f','f','f','0','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getbitmap','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2buildu','pgs2bulkdelete','pgs2vacuumcleanup','pgs2costestimate','pgs2options');
+
+CREATE OPERATOR %% (
+        LEFTARG = text,
+        RIGHTARG = text,
+        PROCEDURE = pgs2contain,
+        COMMUTATOR = '%%',
+        RESTRICT = contsel,
+        JOIN = contjoinsel
+);
+
+CREATE OPERATOR %% (
+        LEFTARG = _text,
+        RIGHTARG = text,
+        PROCEDURE = _pgs2contain,
+        COMMUTATOR = '%%',
+        RESTRICT = contsel,
+        JOIN = contjoinsel
+);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE text USING fulltext AS
+        OPERATOR 1 %%,
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE text USING fulltextb AS
+        OPERATOR 1 %%,
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE text USING fulltextu AS
+        OPERATOR 1 %%,
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE _text USING fulltexta AS
+        OPERATOR 1 %% (_text, text),
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE _text USING fulltextab AS
+        OPERATOR 1 %% (_text, text),
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE _text USING fulltextau AS
+        OPERATOR 1 %% (_text, text),
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE text USING fulltextr AS
+        OPERATOR 1 %%,
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE text USING fulltextrb AS
+        OPERATOR 1 %%,
+        FUNCTION 1 pgs2nop (text);
+
+CREATE OPERATOR CLASS text_ops
+    DEFAULT FOR TYPE text USING fulltextru AS
+        OPERATOR 1 %%,
+        FUNCTION 1 pgs2nop (text);
diff -r -uN ludia-1.5.2.orig/uninstall_pgsenna2_84.sql.in ludia-1.5.2/uninstall_pgsenna2_84.sql.in
--- ludia-1.5.2.orig/uninstall_pgsenna2_84.sql.in	1970-01-01 09:00:00.000000000 +0900
+++ ludia-1.5.2/uninstall_pgsenna2_84.sql.in	2009-11-18 01:51:56.000000000 +0900
@@ -0,0 +1,57 @@
+-- uninstall ludia for PostgreSQL8.4
+DROP OPERATOR CLASS text_ops USING fulltext CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltextb CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltextu CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltexta CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltextab CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltextau CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltextr CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltextrb CASCADE;
+DROP OPERATOR CLASS text_ops USING fulltextru CASCADE;
+
+DROP OPERATOR %% (TEXT, TEXT);
+DROP OPERATOR %% (_TEXT, TEXT);
+DROP OPERATOR %% (TEXT, _TEXT);
+
+DELETE FROM pg_am WHERE amname LIKE 'fulltext%';
+
+DROP FUNCTION pgs2insert(TEXT, TEXT);
+DROP FUNCTION _pgs2insert(TEXT, TEXT);
+DROP FUNCTION pgs2beginscan(TEXT, TEXT);
+DROP FUNCTION pgs2gettuple(TEXT, TEXT);
+DROP FUNCTION pgs2getbitmap(TEXT, TEXT);
+DROP FUNCTION pgs2rescan(TEXT, TEXT);
+DROP FUNCTION pgs2endscan(TEXT, TEXT);
+DROP FUNCTION pgs2markpos(TEXT, TEXT);
+DROP FUNCTION pgs2restrpos(TEXT, TEXT);
+DROP FUNCTION pgs2build(TEXT, TEXT);
+DROP FUNCTION pgs2buildb(TEXT, TEXT);
+DROP FUNCTION pgs2buildu(TEXT, TEXT);
+DROP FUNCTION _pgs2build(TEXT, TEXT);
+DROP FUNCTION _pgs2buildb(TEXT, TEXT);
+DROP FUNCTION _pgs2buildu(TEXT, TEXT);
+DROP FUNCTION pgs2bulkdelete(TEXT, TEXT);
+DROP FUNCTION _pgs2bulkdelete(TEXT, TEXT);
+DROP FUNCTION pgs2vacuumcleanup(INTERNAL, INTERNAL);
+DROP FUNCTION pgs2costestimate(TEXT, TEXT);
+DROP FUNCTION pgs2contain(TEXT, TEXT);
+DROP FUNCTION _pgs2contain(_TEXT, TEXT);
+DROP FUNCTION pgs2nop(TEXT);
+DROP FUNCTION pgs2getscore(tid, TEXT);
+DROP FUNCTION pgs2getscore(tid);
+DROP FUNCTION pgs2getnhits();
+DROP FUNCTION pgs2options();
+DROP FUNCTION pgs2indexcache();
+DROP FUNCTION pgs2destroy();
+DROP FUNCTION pgs2indexinfo();
+DROP FUNCTION pgs2indexinfodb();
+DROP FUNCTION pgs2getlexicon(TEXT);
+DROP FUNCTION pgs2version();
+DROP FUNCTION pgs2seninfo();
+DROP FUNCTION pgs2getoption();
+DROP FUNCTION pgs2pdftotext1(TEXT);
+DROP FUNCTION pgs2pdftotext2(BYTEA);
+DROP FUNCTION pgs2snippet1(INT, INT, INT, TEXT, TEXT, INT, TEXT, TEXT);
+DROP FUNCTION pgs2norm(TEXT, INT);
+DROP FUNCTION pgs2textporter1(TEXT);
+DROP FUNCTION pgs2textporter2(BYTEA);



Ludia-users メーリングリストの案内
Back to archive index