diff options
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/tsginidx.c | 20 | ||||
-rw-r--r-- | src/backend/utils/adt/tsgistidx.c | 13 | ||||
-rw-r--r-- | src/backend/utils/adt/tsquery_gist.c | 9 |
3 files changed, 28 insertions, 14 deletions
diff --git a/src/backend/utils/adt/tsginidx.c b/src/backend/utils/adt/tsginidx.c index add1fc1910c..55518834ae9 100644 --- a/src/backend/utils/adt/tsginidx.c +++ b/src/backend/utils/adt/tsginidx.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsginidx.c,v 1.10 2008/03/25 22:42:44 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsginidx.c,v 1.11 2008/04/14 17:05:33 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -54,7 +54,7 @@ gin_extract_tsquery(PG_FUNCTION_ARGS) { TSQuery query = PG_GETARG_TSQUERY(0); int32 *nentries = (int32 *) PG_GETARG_POINTER(1); - StrategyNumber strategy = PG_GETARG_UINT16(2); + /* StrategyNumber strategy = PG_GETARG_UINT16(2); */ Datum *entries = NULL; *nentries = 0; @@ -89,12 +89,6 @@ gin_extract_tsquery(PG_FUNCTION_ARGS) txt = cstring_to_text_with_len(GETOPERAND(query) + val->distance, val->length); entries[j++] = PointerGetDatum(txt); - - if (strategy != TSearchWithClassStrategyNumber && val->weight != 0) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("@@ operator does not support lexeme weight restrictions in GIN index searches"), - errhint("Use the @@@ operator instead."))); } } else @@ -109,6 +103,7 @@ typedef struct { QueryItem *frst; bool *mapped_check; + bool *need_recheck; } GinChkVal; static bool @@ -116,6 +111,10 @@ checkcondition_gin(void *checkval, QueryOperand *val) { GinChkVal *gcv = (GinChkVal *) checkval; + /* if any val requiring a weight is used, set recheck flag */ + if (val->weight != 0) + *(gcv->need_recheck) = true; + return gcv->mapped_check[((QueryItem *) val) - gcv->frst]; } @@ -125,8 +124,12 @@ gin_tsquery_consistent(PG_FUNCTION_ARGS) bool *check = (bool *) PG_GETARG_POINTER(0); /* StrategyNumber strategy = PG_GETARG_UINT16(1); */ TSQuery query = PG_GETARG_TSQUERY(2); + bool *recheck = (bool *) PG_GETARG_POINTER(3); bool res = FALSE; + /* The query requires recheck only if it involves weights */ + *recheck = false; + if (query->size > 0) { int i, @@ -144,6 +147,7 @@ gin_tsquery_consistent(PG_FUNCTION_ARGS) gcv.frst = item = GETQUERY(query); gcv.mapped_check = (bool *) palloc(sizeof(bool) * query->size); + gcv.need_recheck = recheck; for (i = 0; i < query->size; i++) if (item[i].type == QI_VAL) diff --git a/src/backend/utils/adt/tsgistidx.c b/src/backend/utils/adt/tsgistidx.c index f3a98ba6f8d..ecbac7b40f2 100644 --- a/src/backend/utils/adt/tsgistidx.c +++ b/src/backend/utils/adt/tsgistidx.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsgistidx.c,v 1.7 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsgistidx.c,v 1.8 2008/04/14 17:05:33 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -330,10 +330,15 @@ checkcondition_bit(void *checkval, QueryOperand *val) Datum gtsvector_consistent(PG_FUNCTION_ARGS) { + GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); TSQuery query = PG_GETARG_TSQUERY(1); - SignTSVector *key = (SignTSVector *) DatumGetPointer( - ((GISTENTRY *) PG_GETARG_POINTER(0))->key - ); + /* StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); */ + /* Oid subtype = PG_GETARG_OID(3); */ + bool *recheck = (bool *) PG_GETARG_POINTER(4); + SignTSVector *key = (SignTSVector *) DatumGetPointer(entry->key); + + /* All cases served by this function are inexact */ + *recheck = true; if (!query->size) PG_RETURN_BOOL(false); diff --git a/src/backend/utils/adt/tsquery_gist.c b/src/backend/utils/adt/tsquery_gist.c index fdefd92bae2..df813b59223 100644 --- a/src/backend/utils/adt/tsquery_gist.c +++ b/src/backend/utils/adt/tsquery_gist.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_gist.c,v 1.4 2008/01/01 19:45:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_gist.c,v 1.5 2008/04/14 17:05:33 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -52,12 +52,17 @@ Datum gtsquery_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - TSQuerySign *key = (TSQuerySign *) DatumGetPointer(entry->key); TSQuery query = PG_GETARG_TSQUERY(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); + /* Oid subtype = PG_GETARG_OID(3); */ + bool *recheck = (bool *) PG_GETARG_POINTER(4); + TSQuerySign *key = (TSQuerySign *) DatumGetPointer(entry->key); TSQuerySign sq = makeTSQuerySign(query); bool retval; + /* All cases served by this function are inexact */ + *recheck = true; + switch (strategy) { case RTContainsStrategyNumber: |