From be0c3ea2d30ba225f0249ae88d6b0bdf3b753162 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 9 Jan 2011 18:04:20 -0500 Subject: [PATCH] Update contrib/pg_trgm for new GIN extractQuery API. No actual change in functionality ... just get rid of uselessly complex code to pass the number of keys via extra_data. --- contrib/pg_trgm/trgm_gin.c | 46 +++++++++++++++----------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/contrib/pg_trgm/trgm_gin.c b/contrib/pg_trgm/trgm_gin.c index a5a94ca6755..2d3e35e2330 100644 --- a/contrib/pg_trgm/trgm_gin.c +++ b/contrib/pg_trgm/trgm_gin.c @@ -19,6 +19,9 @@ Datum gin_extract_trgm(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gin_trgm_consistent); Datum gin_trgm_consistent(PG_FUNCTION_ARGS); +/* + * This function is used as both extractValue and extractQuery + */ Datum gin_extract_trgm(PG_FUNCTION_ARGS) { @@ -26,7 +29,7 @@ gin_extract_trgm(PG_FUNCTION_ARGS) int32 *nentries = (int32 *) PG_GETARG_POINTER(1); Datum *entries = NULL; TRGM *trg; - int4 trglen; + int32 trglen; *nentries = 0; @@ -36,31 +39,19 @@ gin_extract_trgm(PG_FUNCTION_ARGS) if (trglen > 0) { trgm *ptr; - int4 i = 0, - item; + int32 i; - *nentries = (int32) trglen; + *nentries = trglen; entries = (Datum *) palloc(sizeof(Datum) * trglen); ptr = GETARR(trg); - while (ptr - GETARR(trg) < ARRNELEM(trg)) + for (i = 0; i < trglen; i++) { - item = trgm2int(ptr); - entries[i++] = Int32GetDatum(item); + int32 item = trgm2int(ptr); + entries[i] = Int32GetDatum(item); 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); @@ -70,30 +61,29 @@ 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); */ - /* int32 nkeys = PG_GETARG_INT32(3); */ - Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4); + 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, + int32 i, ntrue = 0; /* All cases served by this function are inexact */ *recheck = true; - trglen = *(int32 *) extra_data; - - for (i = 0; i < trglen; i++) + /* Count the matches */ + for (i = 0; i < nkeys; i++) + { if (check[i]) ntrue++; + } #ifdef DIVUNION - res = (trglen == ntrue) ? true : ((((((float4) ntrue) / ((float4) (trglen - ntrue)))) >= trgm_limit) ? true : false); + res = (nkeys == ntrue) ? true : ((((((float4) ntrue) / ((float4) (nkeys - ntrue)))) >= trgm_limit) ? true : false); #else - res = (trglen == 0) ? false : ((((((float4) ntrue) / ((float4) trglen))) >= trgm_limit) ? true : false); + res = (nkeys == 0) ? false : ((((((float4) ntrue) / ((float4) nkeys))) >= trgm_limit) ? true : false); #endif PG_RETURN_BOOL(res); -- 2.39.5