1 add namespaces as Tom suggest http://www.pgsql.ru/db/mw/msg.html?mid=1987703
authorTeodor Sigaev <teodor@sigaev.ru>
Mon, 31 May 2004 16:51:56 +0000 (16:51 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Mon, 31 May 2004 16:51:56 +0000 (16:51 +0000)
2 remove select qeury in inserts

contrib/tsearch2/common.c
contrib/tsearch2/common.h
contrib/tsearch2/dict.c
contrib/tsearch2/query.c
contrib/tsearch2/snmap.c
contrib/tsearch2/snmap.h
contrib/tsearch2/ts_cfg.c
contrib/tsearch2/tsearch.sql.in
contrib/tsearch2/tsvector.c
contrib/tsearch2/untsearch.sql.in
contrib/tsearch2/wparser.c

index 30062180076672a27d1fab34afdd8e19575ca56b..b51c3e058339232340f5f5dcf3175f731ca30a83 100644 (file)
@@ -1,9 +1,29 @@
 #include "postgres.h"
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_namespace.h"
+#include "utils/syscache.h"
+
+#include "ts_cfg.h"
+#include "dict.h"
+#include "wparser.h"
+#include "snmap.h"
+#include "common.h"
+#include "tsvector.h"
+
+
+
 #include "common.h"
 #include "wparser.h"
 #include "ts_cfg.h"
 #include "dict.h"
 
+
+Oid TSNSP_FunctionOid = InvalidOid;
+
+
 text *
 char2text(char *in)
 {
@@ -100,3 +120,45 @@ text_cmp(text *a, text *b)
    return (int) VARSIZE(a) - (int) VARSIZE(b);
 
 }
+
+char*
+get_namespace(Oid funcoid) {
+        HeapTuple       tuple;
+        Form_pg_proc    proc;
+        Form_pg_namespace nsp;
+        Oid             nspoid;   
+        char *txt;
+
+        tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(funcoid), 0, 0, 0);
+        if (!HeapTupleIsValid(tuple))
+                elog(ERROR, "cache lookup failed for proc oid %u", funcoid);
+        proc=(Form_pg_proc) GETSTRUCT(tuple);
+        nspoid = proc->pronamespace;
+        ReleaseSysCache(tuple);
+
+        tuple = SearchSysCache(NAMESPACEOID, ObjectIdGetDatum(nspoid), 0, 0, 0);
+        if (!HeapTupleIsValid(tuple))
+                elog(ERROR, "cache lookup failed for namespace oid %u", nspoid);
+        nsp = (Form_pg_namespace) GETSTRUCT(tuple);
+        txt = pstrdup( NameStr((nsp->nspname)) );
+        ReleaseSysCache(tuple);
+
+        return txt;
+}
+
+Oid
+get_oidnamespace(Oid funcoid) {
+        HeapTuple       tuple;
+        Form_pg_proc    proc;
+        Oid             nspoid;   
+
+        tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(funcoid), 0, 0, 0);
+        if (!HeapTupleIsValid(tuple))
+                elog(ERROR, "cache lookup failed for proc oid %u", funcoid);
+        proc=(Form_pg_proc) GETSTRUCT(tuple);
+        nspoid = proc->pronamespace;
+        ReleaseSysCache(tuple);
+
+        return nspoid;
+}
+
index 481f00405bba6fa274a36f600c820bdfb9d23e6e..6720598f81736326697b5cfcbc5ab59294273c21 100644 (file)
@@ -21,4 +21,13 @@ int          text_cmp(text *a, text *b);
 
 void       ts_error(int state, const char *format,...);
 
+extern Oid TSNSP_FunctionOid; /* oid of called function, needed only for determ namespace, no more */
+char* get_namespace(Oid funcoid);
+Oid get_oidnamespace(Oid funcoid);
+
+#define SET_FUNCOID()   do {                                            \
+        if ( fcinfo->flinfo && fcinfo->flinfo->fn_oid != InvalidOid )   \
+                TSNSP_FunctionOid = fcinfo->flinfo->fn_oid;                   \
+} while(0)
+
 #endif
index 8bfeb96de2538422d09652789af6ba9019a38d9b..7be406da9edeaefb661ab590054ad82125876fed 100644 (file)
@@ -19,8 +19,6 @@
 
 /*********top interface**********/
 
-static void *plan_getdict = NULL;
-
 void
 init_dict(Oid id, DictInfo * dict)
 {
@@ -28,20 +26,22 @@ init_dict(Oid id, DictInfo * dict)
    bool        isnull;
    Datum       pars[1];
    int         stat;
+   void *plan;
+   char buf[1024];
+   char *nsp = get_namespace(TSNSP_FunctionOid);
 
    arg[0] = OIDOID;
    pars[0] = ObjectIdGetDatum(id);
 
    memset(dict, 0, sizeof(DictInfo));
    SPI_connect();
-   if (!plan_getdict)
-   {
-       plan_getdict = SPI_saveplan(SPI_prepare("select dict_init, dict_initoption, dict_lexize from pg_ts_dict where oid = $1", 1, arg));
-       if (!plan_getdict)
-           ts_error(ERROR, "SPI_prepare() failed");
-   }
+   sprintf(buf,"select dict_init, dict_initoption, dict_lexize from %s.pg_ts_dict where oid = $1", nsp);
+   pfree(nsp);
+   plan= SPI_prepare(buf, 1, arg);
+   if (!plan)
+       ts_error(ERROR, "SPI_prepare() failed");
 
-   stat = SPI_execp(plan_getdict, pars, " ", 1);
+   stat = SPI_execp(plan, pars, " ", 1);
    if (stat < 0)
        ts_error(ERROR, "SPI_execp return %d", stat);
    if (SPI_processed > 0)
@@ -63,6 +63,7 @@ init_dict(Oid id, DictInfo * dict)
    }
    else
        ts_error(ERROR, "No dictionary with id %d", id);
+   SPI_freeplan(plan);
    SPI_finish();
 }
 
@@ -133,8 +134,6 @@ finddict(Oid id)
    return finddict(id); /* qsort changed order!! */ ;
 }
 
-static void *plan_name2id = NULL;
-
 Oid
 name2id_dict(text *name)
 {
@@ -143,6 +142,8 @@ name2id_dict(text *name)
    Datum       pars[1];
    int         stat;
    Oid         id = findSNMap_t(&(DList.name2id_map), name);
+   void *plan;
+   char buf[1024], *nsp;
 
    arg[0] = TEXTOID;
    pars[0] = PointerGetDatum(name);
@@ -150,21 +151,22 @@ name2id_dict(text *name)
    if (id)
        return id;
 
+   nsp = get_namespace(TSNSP_FunctionOid);
    SPI_connect();
-   if (!plan_name2id)
-   {
-       plan_name2id = SPI_saveplan(SPI_prepare("select oid from pg_ts_dict where dict_name = $1", 1, arg));
-       if (!plan_name2id)
-           ts_error(ERROR, "SPI_prepare() failed");
-   }
+   sprintf(buf,"select oid from %s.pg_ts_dict where dict_name = $1", nsp);
+   pfree(nsp);
+   plan= SPI_prepare(buf, 1, arg);
+   if (!plan)
+       ts_error(ERROR, "SPI_prepare() failed");
 
-   stat = SPI_execp(plan_name2id, pars, " ", 1);
+   stat = SPI_execp(plan, pars, " ", 1);
    if (stat < 0)
        ts_error(ERROR, "SPI_execp return %d", stat);
    if (SPI_processed > 0)
        id = DatumGetObjectId(SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull));
    else
        ts_error(ERROR, "No dictionary with name '%s'", text2char(name));
+   SPI_freeplan(plan);
    SPI_finish();
    addSNMap_t(&(DList.name2id_map), name, id);
    return id;
@@ -179,12 +181,14 @@ Datum
 lexize(PG_FUNCTION_ARGS)
 {
    text       *in = PG_GETARG_TEXT_P(1);
-   DictInfo   *dict = finddict(PG_GETARG_OID(0));
+   DictInfo   *dict;
    char      **res,
              **ptr;
    Datum      *da;
    ArrayType  *a;
 
+   SET_FUNCOID();
+   dict = finddict(PG_GETARG_OID(0));
 
    ptr = res = (char **) DatumGetPointer(
                                      FunctionCall3(&(dict->lexize_info),
@@ -241,8 +245,8 @@ lexize_byname(PG_FUNCTION_ARGS)
 {
    text       *dictname = PG_GETARG_TEXT_P(0);
    Datum       res;
+        SET_FUNCOID();
 
-   strdup("simple");
    res = DirectFunctionCall3(
                              lexize,
                              ObjectIdGetDatum(name2id_dict(dictname)),
@@ -263,6 +267,7 @@ Datum       set_curdict(PG_FUNCTION_ARGS);
 Datum
 set_curdict(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    finddict(PG_GETARG_OID(0));
    currect_dictionary_id = PG_GETARG_OID(0);
    PG_RETURN_VOID();
@@ -274,7 +279,7 @@ Datum
 set_curdict_byname(PG_FUNCTION_ARGS)
 {
    text       *dictname = PG_GETARG_TEXT_P(0);
-
+        SET_FUNCOID();
    DirectFunctionCall1(
                        set_curdict,
                        ObjectIdGetDatum(name2id_dict(dictname))
@@ -289,7 +294,7 @@ Datum
 lexize_bycurrent(PG_FUNCTION_ARGS)
 {
    Datum       res;
-
+        SET_FUNCOID();
    if (currect_dictionary_id == 0)
        ereport(ERROR,
                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
index 1cdefa76d8011b24f9ccb49763e23dc21da8bcf1..81343b0c4621cbb5c2728bdfda0120d52f60b4d9 100644 (file)
@@ -469,6 +469,7 @@ TS_execute(ITEM * curitem, void *checkval, bool calcnot, bool (*chkcond) (void *
 Datum
 rexectsq(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    return DirectFunctionCall2(
                               exectsq,
                               PG_GETARG_DATUM(1),
@@ -483,7 +484,7 @@ exectsq(PG_FUNCTION_ARGS)
    QUERYTYPE  *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
    CHKVAL      chkval;
    bool        result;
-
+        SET_FUNCOID();
    if (!val->size || !query->size)
    {
        PG_FREE_IF_COPY(val, 0);
@@ -638,6 +639,7 @@ static QUERYTYPE *
 Datum
 tsquery_in(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    PG_RETURN_POINTER(queryin((char *) PG_GETARG_POINTER(0), pushval_asis, 0));
 }
 
@@ -863,6 +865,7 @@ to_tsquery(PG_FUNCTION_ARGS)
    QUERYTYPE  *query;
    ITEM       *res;
    int4        len;
+        SET_FUNCOID();
 
    str = text2char(in);
    PG_FREE_IF_COPY(in, 1);
@@ -884,7 +887,9 @@ Datum
 to_tsquery_name(PG_FUNCTION_ARGS)
 {
    text       *name = PG_GETARG_TEXT_P(0);
-   Datum       res = DirectFunctionCall2(to_tsquery,
+   Datum       res;
+        SET_FUNCOID();
+   res = DirectFunctionCall2(to_tsquery,
                                        Int32GetDatum(name2id_cfg(name)),
                                          PG_GETARG_DATUM(1));
 
@@ -895,6 +900,7 @@ to_tsquery_name(PG_FUNCTION_ARGS)
 Datum
 to_tsquery_current(PG_FUNCTION_ARGS)
 {
+   SET_FUNCOID();
    PG_RETURN_DATUM(DirectFunctionCall2(to_tsquery,
                                        Int32GetDatum(get_currcfg()),
                                        PG_GETARG_DATUM(0)));
index ec7ef69a79af2825470b6bde44f11ecf332d7b02..d41fb45b0dc857eb703cf191a56d476de464bfdc 100644 (file)
 static int
 compareSNMapEntry(const void *a, const void *b)
 {
-   return strcmp(((SNMapEntry *) a)->key, ((SNMapEntry *) b)->key);
+   if ( ((SNMapEntry *) a)->nsp < ((SNMapEntry *) b)->nsp ) 
+       return -1;
+   else if ( ((SNMapEntry *) a)->nsp > ((SNMapEntry *) b)->nsp )
+       return 1;
+   else 
+       return strcmp(((SNMapEntry *) a)->key, ((SNMapEntry *) b)->key);
 }
 
 void
@@ -37,6 +42,7 @@ addSNMap(SNMap * map, char *key, Oid value)
        ereport(ERROR,
                (errcode(ERRCODE_OUT_OF_MEMORY),
                 errmsg("out of memory")));
+   map->list[map->len].nsp = get_oidnamespace(TSNSP_FunctionOid);
    map->list[map->len].value = value;
    map->len++;
    if (map->len > 1)
@@ -59,6 +65,7 @@ findSNMap(SNMap * map, char *key)
    SNMapEntry  ks;
 
    ks.key = key;
+   ks.nsp = get_oidnamespace(TSNSP_FunctionOid);
    ks.value = 0;
 
    if (map->len == 0 || !map->list)
index ae188b66a4c473cfee5e8c012b6a05efa3c0a791..c3e80fca57c4275d42c523478851f464b5ecb2c2 100644 (file)
@@ -7,6 +7,7 @@ typedef struct
 {
    char       *key;
    Oid         value;
+   Oid         nsp;
 }  SNMapEntry;
 
 typedef struct
index ded92ac1bc15469754e9d1d2f2d531b45746c840..efd79a1e32ffa8755a26f2aa22a81f969ba9b612 100644 (file)
 
 /*********top interface**********/
 
-static void *plan_getcfg_bylocale = NULL;
-static void *plan_getcfg = NULL;
-static void *plan_getmap = NULL;
-static void *plan_name2id = NULL;
 static Oid current_cfg_id = 0;
 
 void
@@ -42,7 +38,10 @@ init_cfg(Oid id, TSCfgInfo * cfg)
                j;
    text       *ptr;
    text       *prsname = NULL;
+   char *nsp=get_namespace(TSNSP_FunctionOid);
+   char buf[1024];
    MemoryContext oldcontext;
+   void *plan;
 
    arg[0] = OIDOID;
    arg[1] = OIDOID;
@@ -51,14 +50,13 @@ init_cfg(Oid id, TSCfgInfo * cfg)
 
    memset(cfg, 0, sizeof(TSCfgInfo));
    SPI_connect();
-   if (!plan_getcfg)
-   {
-       plan_getcfg = SPI_saveplan(SPI_prepare("select prs_name from pg_ts_cfg where oid = $1", 1, arg));
-       if (!plan_getcfg)
-           ts_error(ERROR, "SPI_prepare() failed");
-   }
 
-   stat = SPI_execp(plan_getcfg, pars, " ", 1);
+   sprintf(buf, "select prs_name from %s.pg_ts_cfg where oid = $1", nsp);
+   plan= SPI_prepare(buf, 1, arg);
+   if (!plan)
+       ts_error(ERROR, "SPI_prepare() failed");
+
+   stat = SPI_execp(plan, pars, " ", 1);
    if (stat < 0)
        ts_error(ERROR, "SPI_execp return %d", stat);
    if (SPI_processed > 0)
@@ -75,16 +73,16 @@ init_cfg(Oid id, TSCfgInfo * cfg)
    else
        ts_error(ERROR, "No tsearch cfg with id %d", id);
 
+   SPI_freeplan(plan);
+
    arg[0] = TEXTOID;
-   if (!plan_getmap)
-   {
-       plan_getmap = SPI_saveplan(SPI_prepare("select lt.tokid, pg_ts_cfgmap.dict_name from pg_ts_cfgmap, pg_ts_cfg, token_type( $1 ) as lt where lt.alias = pg_ts_cfgmap.tok_alias and pg_ts_cfgmap.ts_name = pg_ts_cfg.ts_name and pg_ts_cfg.oid= $2 order by lt.tokid desc;", 2, arg));
-       if (!plan_getmap)
-           ts_error(ERROR, "SPI_prepare() failed");
-   }
+   sprintf(buf, "select lt.tokid, map.dict_name from %s.pg_ts_cfgmap as map, %s.pg_ts_cfg as cfg, %s.token_type( $1 ) as lt where lt.alias =  map.tok_alias and map.ts_name = cfg.ts_name and cfg.oid= $2 order by lt.tokid desc;", nsp, nsp, nsp);
+   plan= SPI_prepare(buf, 2, arg);
+   if (!plan)
+       ts_error(ERROR, "SPI_prepare() failed");
 
    pars[0] = PointerGetDatum(prsname);
-   stat = SPI_execp(plan_getmap, pars, " ", 0);
+   stat = SPI_execp(plan, pars, " ", 0);
    if (stat < 0)
        ts_error(ERROR, "SPI_execp return %d", stat);
    if (SPI_processed <= 0)
@@ -136,9 +134,11 @@ init_cfg(Oid id, TSCfgInfo * cfg)
            pfree(a);
    }
 
+   SPI_freeplan(plan);
    SPI_finish();
    cfg->prs_id = name2id_prs(prsname);
    pfree(prsname);
+   pfree(nsp);
    for (i = 0; i < cfg->len; i++)
    {
        for (j = 0; j < cfg->map[i].len; j++)
@@ -235,6 +235,9 @@ name2id_cfg(text *name)
    Datum       pars[1];
    int         stat;
    Oid         id = findSNMap_t(&(CList.name2id_map), name);
+   void *plan;
+   char *nsp;
+   char buf[1024];
 
    arg[0] = TEXTOID;
    pars[0] = PointerGetDatum(name);
@@ -242,16 +245,15 @@ name2id_cfg(text *name)
    if (id)
        return id;
 
+   nsp=get_namespace(TSNSP_FunctionOid);
    SPI_connect();
-   if (!plan_name2id)
-   {
-       plan_name2id = SPI_saveplan(SPI_prepare("select oid from pg_ts_cfg where ts_name = $1", 1, arg));
-       if (!plan_name2id)
-           /* internal error */
-           elog(ERROR, "SPI_prepare() failed");
-   }
+        sprintf(buf, "select oid from %s.pg_ts_cfg where ts_name = $1", nsp);
+   plan= SPI_prepare(buf, 1, arg);
+   if (!plan)
+       /* internal error */
+       elog(ERROR, "SPI_prepare() failed");
 
-   stat = SPI_execp(plan_name2id, pars, " ", 1);
+   stat = SPI_execp(plan, pars, " ", 1);
    if (stat < 0)
        /* internal error */
        elog(ERROR, "SPI_execp return %d", stat);
@@ -268,6 +270,7 @@ name2id_cfg(text *name)
                (errcode(ERRCODE_CONFIG_FILE_ERROR),
                 errmsg("no tsearch config")));
 
+   SPI_freeplan(plan);
    SPI_finish();
    addSNMap_t(&(CList.name2id_map), name, id);
    return id;
@@ -549,22 +552,25 @@ get_currcfg(void)
    Datum       pars[1];
    bool        isnull;
    int         stat;
+        char buf[1024];
+        char *nsp;
+   void *plan;
 
    if (current_cfg_id > 0)
        return current_cfg_id;
 
+        nsp=get_namespace(TSNSP_FunctionOid);
    SPI_connect();
-   if (!plan_getcfg_bylocale)
-   {
-       plan_getcfg_bylocale = SPI_saveplan(SPI_prepare("select oid from pg_ts_cfg where locale = $1 ", 1, arg));
-       if (!plan_getcfg_bylocale)
-           /* internal error */
-           elog(ERROR, "SPI_prepare() failed");
-   }
+        sprintf(buf, "select oid from %s.pg_ts_cfg where locale = $1 ", nsp);
+   pfree(nsp);
+   plan = SPI_prepare(buf, 1, arg);
+   if (!plan)
+       /* internal error */
+       elog(ERROR, "SPI_prepare() failed");
 
    curlocale = setlocale(LC_CTYPE, NULL);
    pars[0] = PointerGetDatum(char2text((char *) curlocale));
-   stat = SPI_execp(plan_getcfg_bylocale, pars, " ", 1);
+   stat = SPI_execp(plan, pars, " ", 1);
 
    if (stat < 0)
        /* internal error */
@@ -577,6 +583,7 @@ get_currcfg(void)
                 errmsg("could not find tsearch config by locale")));
 
    pfree(DatumGetPointer(pars[0]));
+   SPI_freeplan(plan);
    SPI_finish();
    return current_cfg_id;
 }
@@ -586,6 +593,7 @@ Datum       set_curcfg(PG_FUNCTION_ARGS);
 Datum
 set_curcfg(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    findcfg(PG_GETARG_OID(0));
    current_cfg_id = PG_GETARG_OID(0);
    PG_RETURN_VOID();
@@ -597,7 +605,7 @@ Datum
 set_curcfg_byname(PG_FUNCTION_ARGS)
 {
    text       *name = PG_GETARG_TEXT_P(0);
-
+        SET_FUNCOID();
    DirectFunctionCall1(
                        set_curcfg,
                        ObjectIdGetDatum(name2id_cfg(name))
@@ -611,6 +619,7 @@ Datum       show_curcfg(PG_FUNCTION_ARGS);
 Datum
 show_curcfg(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    PG_RETURN_OID(get_currcfg());
 }
 
@@ -619,6 +628,8 @@ Datum       reset_tsearch(PG_FUNCTION_ARGS);
 Datum
 reset_tsearch(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    ts_error(NOTICE, "TSearch cache cleaned");
    PG_RETURN_VOID();
 }
+
index 1f8ed4b1d84caf9e9756a372ffd14c159e812f5d..25cb05f59c0ee82be4eae47b497153c4b9c8ee13 100644 (file)
@@ -57,9 +57,9 @@ CREATE FUNCTION dex_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
    'simple', 
-   (select oid from pg_proc where proname='dex_init'),
+   'dex_init(text)',
    null,
-   (select oid from pg_proc where proname='dex_lexize'),
+   'dex_lexize(internal,internal,int4)',
    'Simple example of dictionary.'
 ;
     
@@ -76,9 +76,9 @@ CREATE FUNCTION snb_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
    'en_stem', 
-   (select oid from pg_proc where proname='snb_en_init'),
+   'snb_en_init(text)',
    'DATA_PATH/english.stop',
-   (select oid from pg_proc where proname='snb_lexize'),
+   'snb_lexize(internal,internal,int4)',
    'English Stemmer. Snowball.'
 ;
 
@@ -89,9 +89,9 @@ CREATE FUNCTION snb_ru_init(text)
 
 insert into pg_ts_dict select 
    'ru_stem', 
-   (select oid from pg_proc where proname='snb_ru_init'),
+   'snb_ru_init(text)',
    'DATA_PATH/russian.stop',
-   (select oid from pg_proc where proname='snb_lexize'),
+   'snb_lexize(internal,internal,int4)',
    'Russian Stemmer. Snowball.'
 ;
     
@@ -108,9 +108,9 @@ CREATE FUNCTION spell_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
    'ispell_template', 
-   (select oid from pg_proc where proname='spell_init'),
+   'spell_init(text)',
    null,
-   (select oid from pg_proc where proname='spell_lexize'),
+   'spell_lexize(internal,internal,int4)',
    'ISpell interface. Must have .dict and .aff files'
 ;
 
@@ -127,9 +127,9 @@ CREATE FUNCTION syn_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
    'synonym', 
-   (select oid from pg_proc where proname='syn_init'),
+   'syn_init(text)',
    null,
-   (select oid from pg_proc where proname='syn_lexize'),
+   'syn_lexize(internal,internal,int4)',
    'Example of synonym dictionary'
 ;
 
@@ -227,11 +227,11 @@ CREATE FUNCTION prsd_headline(internal,internal,internal)
 
 insert into pg_ts_parser select
    'default',
-   (select oid from pg_proc where proname='prsd_start'),   
-   (select oid from pg_proc where proname='prsd_getlexeme'),   
-   (select oid from pg_proc where proname='prsd_end'), 
-   (select oid from pg_proc where proname='prsd_headline'),
-   (select oid from pg_proc where proname='prsd_lextype'),
+   'prsd_start(internal,int4)',
+   'prsd_getlexeme(internal,internal,internal)',
+   'prsd_end(internal)',
+   'prsd_headline(internal,internal,internal)',
+   'prsd_lextype(internal)',
    'Parser from OpenFTS v0.34'
 ;  
 
index 14bdd9ff5cf8fe8099445db67165137f277fb603..a39a40fb3661cb528b4a195ddc5ff308f02447f7 100644 (file)
@@ -404,7 +404,7 @@ tsvector_in(PG_FUNCTION_ARGS)
               *cur;
    int4        i,
                buflen = 256;
-
+        SET_FUNCOID();
    state.prsbuf = buf;
    state.len = 32;
    state.word = (char *) palloc(state.len);
@@ -723,7 +723,10 @@ to_tsvector(PG_FUNCTION_ARGS)
    text       *in = PG_GETARG_TEXT_P(1);
    PRSTEXT     prs;
    tsvector   *out = NULL;
-   TSCfgInfo  *cfg = findcfg(PG_GETARG_INT32(0));
+   TSCfgInfo  *cfg;
+
+        SET_FUNCOID();
+   cfg = findcfg(PG_GETARG_INT32(0));
 
    prs.lenwords = 32;
    prs.curwords = 0;
@@ -749,7 +752,9 @@ Datum
 to_tsvector_name(PG_FUNCTION_ARGS)
 {
    text       *cfg = PG_GETARG_TEXT_P(0);
-   Datum       res = DirectFunctionCall3(
+   Datum       res;
+        SET_FUNCOID();
+   res = DirectFunctionCall3(
                                          to_tsvector,
                                          Int32GetDatum(name2id_cfg(cfg)),
                                          PG_GETARG_DATUM(1),
@@ -763,7 +768,9 @@ to_tsvector_name(PG_FUNCTION_ARGS)
 Datum
 to_tsvector_current(PG_FUNCTION_ARGS)
 {
-   Datum       res = DirectFunctionCall3(
+   Datum       res;
+        SET_FUNCOID();
+   res = DirectFunctionCall3(
                                          to_tsvector,
                                          Int32GetDatum(get_currcfg()),
                                          PG_GETARG_DATUM(0),
@@ -809,12 +816,15 @@ tsearch2(PG_FUNCTION_ARGS)
    Trigger    *trigger;
    Relation    rel;
    HeapTuple   rettuple = NULL;
-   TSCfgInfo  *cfg = findcfg(get_currcfg());
    int         numidxattr,
                i;
    PRSTEXT     prs;
    Datum       datum = (Datum) 0;
    Oid         funcoid = InvalidOid;
+   TSCfgInfo  *cfg;
+
+        SET_FUNCOID();
+   cfg = findcfg(get_currcfg());
 
    if (!CALLED_AS_TRIGGER(fcinfo))
        /* internal error */
index b55e3185abf290cf3d7f027ec0208378b08206d6..b1883d5fbdf083ced54b93bab60659d7c0b95890 100644 (file)
@@ -12,7 +12,7 @@ DROP OPERATOR || (tsvector, tsvector);
 DROP OPERATOR @@ (tsvector, tsquery);
 DROP OPERATOR @@ (tsquery, tsvector);
 
-DROP AGGREGATE stat(tsvector);
+--DROP AGGREGATE stat(tsvector);
 
 DROP TABLE pg_ts_dict;
 DROP TABLE pg_ts_parser;
@@ -24,7 +24,7 @@ DROP TYPE tokenout CASCADE;
 DROP TYPE tsvector CASCADE;
 DROP TYPE tsquery CASCADE;
 DROP TYPE gtsvector CASCADE;
-DROP TYPE tsstat CASCADE;
+--DROP TYPE tsstat CASCADE;
 DROP TYPE statinfo CASCADE;
 DROP TYPE tsdebug CASCADE;
 
@@ -59,8 +59,6 @@ DROP FUNCTION gtsvector_penalty(internal,internal,internal);
 DROP FUNCTION gtsvector_picksplit(internal, internal);
 DROP FUNCTION gtsvector_union(internal, internal);
 DROP FUNCTION reset_tsearch();
-DROP FUNCTION stat(text);
-DROP FUNCTION stat(text,stat);
 DROP FUNCTION tsearch2() CASCADE;
 DROP FUNCTION _get_parser_from_curcfg();
 
index b97b158ca70b09bb12a6ab10142d603b9ec95fdd..eba2cd6eb58d7e56e7038ef47b6d039ffefce581 100644 (file)
@@ -21,7 +21,6 @@
 
 /*********top interface**********/
 
-static void *plan_getparser = NULL;
 static Oid current_parser_id = InvalidOid;
 
 void
@@ -31,20 +30,22 @@ init_prs(Oid id, WParserInfo * prs)
    bool        isnull;
    Datum       pars[1];
    int         stat;
+   void *plan;
+   char buf[1024], *nsp;
 
    arg[0] = OIDOID;
    pars[0] = ObjectIdGetDatum(id);
 
    memset(prs, 0, sizeof(WParserInfo));
    SPI_connect();
-   if (!plan_getparser)
-   {
-       plan_getparser = SPI_saveplan(SPI_prepare("select prs_start, prs_nexttoken, prs_end, prs_lextype, prs_headline from pg_ts_parser where oid = $1", 1, arg));
-       if (!plan_getparser)
-           ts_error(ERROR, "SPI_prepare() failed");
-   }
-
-   stat = SPI_execp(plan_getparser, pars, " ", 1);
+   nsp=get_namespace(TSNSP_FunctionOid);
+   sprintf(buf, "select prs_start, prs_nexttoken, prs_end, prs_lextype, prs_headline from %s.pg_ts_parser where oid = $1", nsp);
+   pfree(nsp);
+   plan= SPI_prepare(buf, 1, arg);
+   if (!plan)
+       ts_error(ERROR, "SPI_prepare() failed");
+
+   stat = SPI_execp(plan, pars, " ", 1);
    if (stat < 0)
        ts_error(ERROR, "SPI_execp return %d", stat);
    if (SPI_processed > 0)
@@ -64,6 +65,7 @@ init_prs(Oid id, WParserInfo * prs)
    }
    else
        ts_error(ERROR, "No parser with id %d", id);
+   SPI_freeplan(plan);
    SPI_finish();
 }
 
@@ -130,8 +132,6 @@ findprs(Oid id)
    return findprs(id); /* qsort changed order!! */ ;
 }
 
-static void *plan_name2id = NULL;
-
 Oid
 name2id_prs(text *name)
 {
@@ -140,6 +140,8 @@ name2id_prs(text *name)
    Datum       pars[1];
    int         stat;
    Oid         id = findSNMap_t(&(PList.name2id_map), name);
+   char buf[1024], *nsp;
+   void *plan;
 
    arg[0] = TEXTOID;
    pars[0] = PointerGetDatum(name);
@@ -148,20 +150,21 @@ name2id_prs(text *name)
        return id;
 
    SPI_connect();
-   if (!plan_name2id)
-   {
-       plan_name2id = SPI_saveplan(SPI_prepare("select oid from pg_ts_parser where prs_name = $1", 1, arg));
-       if (!plan_name2id)
-           ts_error(ERROR, "SPI_prepare() failed");
-   }
-
-   stat = SPI_execp(plan_name2id, pars, " ", 1);
+   nsp = get_namespace(TSNSP_FunctionOid);
+   sprintf(buf, "select oid from %s.pg_ts_parser where prs_name = $1", nsp);
+   pfree(nsp);
+   plan= SPI_prepare(buf, 1, arg);
+   if (!plan)
+       ts_error(ERROR, "SPI_prepare() failed");
+
+   stat = SPI_execp(plan, pars, " ", 1);
    if (stat < 0)
        ts_error(ERROR, "SPI_execp return %d", stat);
    if (SPI_processed > 0)
        id = DatumGetObjectId(SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull));
    else
        ts_error(ERROR, "No parser '%s'", text2char(name));
+   SPI_freeplan(plan);
    SPI_finish();
    addSNMap_t(&(PList.name2id_map), name, id);
    return id;
@@ -239,7 +242,7 @@ token_type(PG_FUNCTION_ARGS)
 {
    FuncCallContext *funcctx;
    Datum       result;
-
+        SET_FUNCOID();
    if (SRF_IS_FIRSTCALL())
    {
        funcctx = SRF_FIRSTCALL_INIT();
@@ -260,7 +263,7 @@ token_type_byname(PG_FUNCTION_ARGS)
 {
    FuncCallContext *funcctx;
    Datum       result;
-
+        SET_FUNCOID();
    if (SRF_IS_FIRSTCALL())
    {
        text       *name = PG_GETARG_TEXT_P(0);
@@ -284,7 +287,7 @@ token_type_current(PG_FUNCTION_ARGS)
 {
    FuncCallContext *funcctx;
    Datum       result;
-
+        SET_FUNCOID();
    if (SRF_IS_FIRSTCALL())
    {
        funcctx = SRF_FIRSTCALL_INIT();
@@ -306,6 +309,7 @@ Datum       set_curprs(PG_FUNCTION_ARGS);
 Datum
 set_curprs(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    findprs(PG_GETARG_OID(0));
    current_parser_id = PG_GETARG_OID(0);
    PG_RETURN_VOID();
@@ -317,7 +321,7 @@ Datum
 set_curprs_byname(PG_FUNCTION_ARGS)
 {
    text       *name = PG_GETARG_TEXT_P(0);
-
+        SET_FUNCOID();
    DirectFunctionCall1(
                        set_curprs,
                        ObjectIdGetDatum(name2id_prs(name))
@@ -440,7 +444,7 @@ parse(PG_FUNCTION_ARGS)
 {
    FuncCallContext *funcctx;
    Datum       result;
-
+        SET_FUNCOID();
    if (SRF_IS_FIRSTCALL())
    {
        text       *txt = PG_GETARG_TEXT_P(1);
@@ -464,7 +468,7 @@ parse_byname(PG_FUNCTION_ARGS)
 {
    FuncCallContext *funcctx;
    Datum       result;
-
+        SET_FUNCOID();
    if (SRF_IS_FIRSTCALL())
    {
        text       *name = PG_GETARG_TEXT_P(0);
@@ -491,7 +495,7 @@ parse_current(PG_FUNCTION_ARGS)
 {
    FuncCallContext *funcctx;
    Datum       result;
-
+        SET_FUNCOID();
    if (SRF_IS_FIRSTCALL())
    {
        text       *txt = PG_GETARG_TEXT_P(0);
@@ -515,13 +519,17 @@ Datum     headline(PG_FUNCTION_ARGS);
 Datum
 headline(PG_FUNCTION_ARGS)
 {
-   TSCfgInfo  *cfg = findcfg(PG_GETARG_OID(0));
    text       *in = PG_GETARG_TEXT_P(1);
    QUERYTYPE  *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(2)));
    text       *opt = (PG_NARGS() > 3 && PG_GETARG_POINTER(3)) ? PG_GETARG_TEXT_P(3) : NULL;
    HLPRSTEXT   prs;
    text       *out;
-   WParserInfo *prsobj = findprs(cfg->prs_id);
+   TSCfgInfo  *cfg;
+   WParserInfo *prsobj;
+
+        SET_FUNCOID();
+   cfg = findcfg(PG_GETARG_OID(0));
+   prsobj = findprs(cfg->prs_id);
 
    memset(&prs, 0, sizeof(HLPRSTEXT));
    prs.lenwords = 32;
@@ -557,7 +565,9 @@ headline_byname(PG_FUNCTION_ARGS)
 {
    text       *cfg = PG_GETARG_TEXT_P(0);
 
-   Datum       out = DirectFunctionCall4(
+   Datum       out;
+        SET_FUNCOID();
+   out = DirectFunctionCall4(
                                          headline,
                                      ObjectIdGetDatum(name2id_cfg(cfg)),
                                          PG_GETARG_DATUM(1),
@@ -574,6 +584,7 @@ Datum       headline_current(PG_FUNCTION_ARGS);
 Datum
 headline_current(PG_FUNCTION_ARGS)
 {
+        SET_FUNCOID();
    PG_RETURN_DATUM(DirectFunctionCall4(
                                        headline,
                                        ObjectIdGetDatum(get_currcfg()),