summaryrefslogtreecommitdiff
path: root/contrib/tsearch2/wparser.c
diff options
context:
space:
mode:
authorTeodor Sigaev2004-05-31 16:51:56 +0000
committerTeodor Sigaev2004-05-31 16:51:56 +0000
commit553bc4163388d660a30d5cb0cacad0e86fb7e449 (patch)
tree087f5c3a3cb79e7256072b2ff996b1c0a2e8a1dc /contrib/tsearch2/wparser.c
parent7cb55d21ed8d9f6071eb7835b861d5231cd45e14 (diff)
1 add namespaces as Tom suggest http://www.pgsql.ru/db/mw/msg.html?mid=1987703
2 remove select qeury in inserts
Diffstat (limited to 'contrib/tsearch2/wparser.c')
-rw-r--r--contrib/tsearch2/wparser.c69
1 files changed, 40 insertions, 29 deletions
diff --git a/contrib/tsearch2/wparser.c b/contrib/tsearch2/wparser.c
index b97b158ca70..eba2cd6eb58 100644
--- a/contrib/tsearch2/wparser.c
+++ b/contrib/tsearch2/wparser.c
@@ -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()),