aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/intarray/_int_gist.c19
-rw-r--r--contrib/intarray/_intbig_gist.c20
2 files changed, 25 insertions, 14 deletions
diff --git a/contrib/intarray/_int_gist.c b/contrib/intarray/_int_gist.c
index 2d5e82a4596..b534a358e6b 100644
--- a/contrib/intarray/_int_gist.c
+++ b/contrib/intarray/_int_gist.c
@@ -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);
}
diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c
index 07a051dd50c..dca1c7ab1b3 100644
--- a/contrib/intarray/_intbig_gist.c
+++ b/contrib/intarray/_intbig_gist.c
@@ -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);
}