diff --git a/contrib/intarray/_int_gist.c b/contrib/intarray/_int_gist.c index 246d566987..e8cf24fe47 100644 --- a/contrib/intarray/_int_gist.c +++ b/contrib/intarray/_int_gist.c @@ -32,17 +32,19 @@ 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), - GIST_LEAF(entry))); + GIST_LEAF(entry)); + + 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 */ CHECKARRVALID(query); if (ARRISVOID(query)) @@ -82,6 +84,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 844236068d..caa0ad48c6 100644 --- a/contrib/intarray/_intbig_gist.c +++ b/contrib/intarray/_intbig_gist.c @@ -497,7 +497,7 @@ 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; @@ -506,12 +506,13 @@ g_intbig_consistent(PG_FUNCTION_ARGS) 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 ); + return retval; } - /* XXX what about toasted input? */ CHECKARRVALID(query); if (ARRISVOID(query)) return FALSE; @@ -597,5 +598,6 @@ g_intbig_consistent(PG_FUNCTION_ARGS) default: retval = FALSE; } + PG_FREE_IF_COPY( query, 1 ); PG_RETURN_BOOL(retval); }