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);