Update contrib/pg_trgm for new GIN extractQuery API.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 9 Jan 2011 23:04:20 +0000 (18:04 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 9 Jan 2011 23:04:20 +0000 (18:04 -0500)
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

index a5a94ca6755a693532d4846e6a56082578ce03c1..2d3e35e23308fffb2053e26378ffb826f7df5fa6 100644 (file)
@@ -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;
-   int       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);