summaryrefslogtreecommitdiff
path: root/contrib/pg_trgm
diff options
context:
space:
mode:
authorTom Lane2009-03-25 22:19:02 +0000
committerTom Lane2009-03-25 22:19:02 +0000
commit87b8db37740bb044cb3b6a6439e656217869fd57 (patch)
treec59eb0167c37ed34b9b24e718b2357bec48dcce1 /contrib/pg_trgm
parent050a78dd3da8d3711197bda429ed7733bbf1b291 (diff)
Adjust the APIs for GIN opclass support functions to allow the extractQuery()
method to pass extra data to the consistent() and comparePartial() methods. This is the core infrastructure needed to support the soon-to-appear contrib/btree_gin module. The APIs are still upward compatible with the definitions used in 8.3 and before, although *not* with the previous 8.4devel function definitions. catversion bump for changes in pg_proc entries (although these are just cosmetic, since GIN doesn't actually look at the function signature before calling it...) Teodor Sigaev and Oleg Bartunov
Diffstat (limited to 'contrib/pg_trgm')
-rw-r--r--contrib/pg_trgm/pg_trgm.sql.in12
-rw-r--r--contrib/pg_trgm/trgm_gin.c47
-rw-r--r--contrib/pg_trgm/uninstall_pg_trgm.sql6
3 files changed, 26 insertions, 39 deletions
diff --git a/contrib/pg_trgm/pg_trgm.sql.in b/contrib/pg_trgm/pg_trgm.sql.in
index d65a9cf6b2..f59ea1ba85 100644
--- a/contrib/pg_trgm/pg_trgm.sql.in
+++ b/contrib/pg_trgm/pg_trgm.sql.in
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/contrib/pg_trgm/pg_trgm.sql.in,v 1.8 2008/04/14 17:05:32 tgl Exp $ */
+/* $PostgreSQL: pgsql/contrib/pg_trgm/pg_trgm.sql.in,v 1.9 2009/03/25 22:19:01 tgl Exp $ */
-- Adjust this setting to control where the objects get created.
SET search_path = public;
@@ -110,13 +110,13 @@ RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE;
-CREATE OR REPLACE FUNCTION gin_extract_trgm(text, internal, internal)
+CREATE OR REPLACE FUNCTION gin_extract_trgm(text, internal, int2, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE;
-CREATE OR REPLACE FUNCTION gin_trgm_consistent(internal, int2, text, internal)
-RETURNS internal
+CREATE OR REPLACE FUNCTION gin_trgm_consistent(internal, int2, text, int4, internal, internal)
+RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE;
@@ -127,6 +127,6 @@ AS
OPERATOR 1 % (text, text),
FUNCTION 1 btint4cmp (int4, int4),
FUNCTION 2 gin_extract_trgm (text, internal),
- FUNCTION 3 gin_extract_trgm (text, internal, internal),
- FUNCTION 4 gin_trgm_consistent (internal, int2, text, internal),
+ FUNCTION 3 gin_extract_trgm (text, internal, int2, internal, internal),
+ FUNCTION 4 gin_trgm_consistent (internal, int2, text, int4, internal, internal),
STORAGE int4;
diff --git a/contrib/pg_trgm/trgm_gin.c b/contrib/pg_trgm/trgm_gin.c
index 7a64764fb8..1a53d1d358 100644
--- a/contrib/pg_trgm/trgm_gin.c
+++ b/contrib/pg_trgm/trgm_gin.c
@@ -1,5 +1,5 @@
/*
- * $PostgreSQL: pgsql/contrib/pg_trgm/trgm_gin.c,v 1.6 2008/11/12 13:43:54 teodor Exp $
+ * $PostgreSQL: pgsql/contrib/pg_trgm/trgm_gin.c,v 1.7 2009/03/25 22:19:01 tgl Exp $
*/
#include "trgm.h"
@@ -47,53 +47,40 @@ gin_extract_trgm(PG_FUNCTION_ARGS)
ptr++;
}
+ if (PG_NARGS() > 4)
+ {
+ /*
+ * Function called from query extracting
+ */
+ Pointer **extra_data = (Pointer **) PG_GETARG_POINTER(4);
+
+ *extra_data = (Pointer*) palloc0(sizeof(Pointer)*(*nentries));
+
+ *(int32*)(*extra_data) = trglen;
+ }
}
PG_RETURN_POINTER(entries);
}
-/*
- * Per call strage for consistent functions to
- * cache computed value from query
- */
-typedef struct PerCallConsistentStorage {
- int trglen;
- text data[1]; /* query */
-} PerCallConsistentStorage;
-#define PCCSHDR_SZ offsetof(PerCallConsistentStorage, data)
-
Datum
gin_trgm_consistent(PG_FUNCTION_ARGS)
{
bool *check = (bool *) PG_GETARG_POINTER(0);
/* StrategyNumber strategy = PG_GETARG_UINT16(1); */
- text *query = PG_GETARG_TEXT_P(2);
- bool *recheck = (bool *) PG_GETARG_POINTER(3);
+ /* text *query = PG_GETARG_TEXT_P(2); */
+ /* int32 nkeys = PG_GETARG_INT32(3); */
+ Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
+ bool *recheck = (bool *) PG_GETARG_POINTER(5);
bool res = FALSE;
int4 i,
trglen,
ntrue = 0;
- PerCallConsistentStorage *pccs = (PerCallConsistentStorage*) fcinfo->flinfo->fn_extra;
/* All cases served by this function are inexact */
*recheck = true;
- if ( pccs == NULL || VARSIZE(pccs->data) != VARSIZE(query) || memcmp( pccs->data, query, VARSIZE(query) ) !=0 )
- {
- TRGM *trg = generate_trgm(VARDATA(query), VARSIZE(query) - VARHDRSZ);
-
- if ( pccs )
- pfree(pccs);
-
- fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- VARSIZE(query) + PCCSHDR_SZ);
- pccs = (PerCallConsistentStorage*) fcinfo->flinfo->fn_extra;
-
- pccs->trglen = ARRNELEM(trg);
- memcpy( pccs->data, query, VARSIZE(query) );
- }
-
- trglen = pccs->trglen;
+ trglen = *(int32*)extra_data;
for (i = 0; i < trglen; i++)
if (check[i])
diff --git a/contrib/pg_trgm/uninstall_pg_trgm.sql b/contrib/pg_trgm/uninstall_pg_trgm.sql
index 094dfcddc7..42c1d741f9 100644
--- a/contrib/pg_trgm/uninstall_pg_trgm.sql
+++ b/contrib/pg_trgm/uninstall_pg_trgm.sql
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/contrib/pg_trgm/uninstall_pg_trgm.sql,v 1.6 2008/04/14 17:05:32 tgl Exp $ */
+/* $PostgreSQL: pgsql/contrib/pg_trgm/uninstall_pg_trgm.sql,v 1.7 2009/03/25 22:19:01 tgl Exp $ */
-- Adjust this setting to control where the objects get dropped.
SET search_path = public;
@@ -25,9 +25,9 @@ DROP OPERATOR CLASS gin_trgm_ops USING gin;
DROP FUNCTION gin_extract_trgm(text, internal);
-DROP FUNCTION gin_extract_trgm(text, internal, internal);
+DROP FUNCTION gin_extract_trgm(text, internal, int2, internal, internal);
-DROP FUNCTION gin_trgm_consistent(internal, int2, text, internal);
+DROP FUNCTION gin_trgm_consistent(internal, int2, text, int4, internal, internal);
DROP OPERATOR % (text, text);