Detoast query in g_intbig_consistent and copy query in g_int_consistent.
authorTeodor Sigaev <teodor@sigaev.ru>
Mon, 3 Apr 2006 10:45:28 +0000 (10:45 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Mon, 3 Apr 2006 10:45:28 +0000 (10:45 +0000)
Minor cleanups.

contrib/intarray/_int_gist.c
contrib/intarray/_intbig_gist.c

index 2d5e82a4596ceeb68a6d98ea9b16280d684a6a98..b534a358e6b4277617fc35e81b0450ac51d47631 100644 (file)
@@ -32,20 +32,24 @@ Datum
 g_int_consistent(PG_FUNCTION_ARGS)
 {
    GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-   ArrayType  *query = (ArrayType *) PG_GETARG_POINTER(1);
+   ArrayType  *query = (ArrayType *) PG_DETOAST_DATUM_COPY(PG_GETARG_POINTER(1));
    StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
    bool        retval;
 
-   if (strategy == BooleanSearchStrategy)
-       PG_RETURN_BOOL(execconsistent((QUERYTYPE *) query,
+   if (strategy == BooleanSearchStrategy) {
+        retval =execconsistent((QUERYTYPE *) query,
                               (ArrayType *) DatumGetPointer(entry->key),
-                 ISLEAFKEY((ArrayType *) DatumGetPointer(entry->key))));
+                 ISLEAFKEY((ArrayType *) DatumGetPointer(entry->key)));
+       pfree( query );
+
+       PG_RETURN_BOOL(retval);
+   }
 
-   /* XXX are we sure it's safe to scribble on the query object here? */
-   /* XXX what about toasted input? */
    /* sort query for fast search, key is already sorted */
-   if (ARRISVOID(query))
+   if (ARRISVOID(query)) {
+       pfree( query );
        PG_RETURN_BOOL(false);
+   }
    PREPAREARR(query);
 
    switch (strategy)
@@ -81,6 +85,7 @@ g_int_consistent(PG_FUNCTION_ARGS)
        default:
            retval = FALSE;
    }
+   pfree( query );
    PG_RETURN_BOOL(retval);
 }
 
index 07a051dd50c593e41c3ddb8ddad8ab9d17e9243c..dca1c7ab1b31997ac651224f283207fb6d8879b9 100644 (file)
@@ -477,23 +477,28 @@ Datum
 g_intbig_consistent(PG_FUNCTION_ARGS)
 {
    GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-   ArrayType  *query = (ArrayType *) PG_GETARG_POINTER(1);
+   ArrayType  *query = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_POINTER(1));
    StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
    bool        retval;
 
-   if (ISALLTRUE(DatumGetPointer(entry->key)))
+   if (ISALLTRUE(DatumGetPointer(entry->key))) {
+       PG_FREE_IF_COPY(query, 1);
        PG_RETURN_BOOL(true);
+   }
 
    if (strategy == BooleanSearchStrategy)
    {
-       PG_RETURN_BOOL(signconsistent((QUERYTYPE *) query,
+       retval = signconsistent((QUERYTYPE *) query,
                                    GETSIGN(DatumGetPointer(entry->key)),
-                                     false));
+                                     false);
+       PG_FREE_IF_COPY(query, 1);
+       PG_RETURN_BOOL(retval);
    }
 
-   /* XXX what about toasted input? */
-   if (ARRISVOID(query))
-       return FALSE;
+   if (ARRISVOID(query)) {
+       PG_FREE_IF_COPY(query, 1);  
+       PG_RETURN_BOOL(retval);
+   }
 
    switch (strategy)
    {
@@ -572,5 +577,6 @@ g_intbig_consistent(PG_FUNCTION_ARGS)
        default:
            retval = FALSE;
    }
+   PG_FREE_IF_COPY(query, 1);
    PG_RETURN_BOOL(retval);
 }