From 7f129956e16e74460fc47dd89c174ca232bfd1b6 Mon Sep 17 00:00:00 2001
From: Teodor Sigaev <teodor@sigaev.ru>
Date: Mon, 3 Apr 2006 08:21:05 +0000
Subject: [PATCH] Detoast query in g_intbig_consistent and copy query in
 g_int_consistent

---
 contrib/intarray/_int_gist.c    | 15 +++++++++------
 contrib/intarray/_intbig_gist.c | 10 ++++++----
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/contrib/intarray/_int_gist.c b/contrib/intarray/_int_gist.c
index 246d5669873..e8cf24fe47b 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 844236068db..caa0ad48c60 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);
 }
-- 
GitLab