diff --git a/contrib/pg_trgm/trgm_gin.c b/contrib/pg_trgm/trgm_gin.c index a5a94ca6755a693532d4846e6a56082578ce03c1..2d3e35e23308fffb2053e26378ffb826f7df5fa6 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);