From 74a8af099f0095bc87f25dfa9b54f09d6a8972d4 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 7 Jun 2002 21:52:33 +0000
Subject: [PATCH] Please apply attached patch to contrib/intarray (7.2, 7.3).

     Fixed bug with '=' operator for gist__int_ops and
     define '=' operator for gist__intbig_ops opclass.
     Now '=' operator is consistent with standard 'array' type.

     Thanks Achilleus Mantzios for bug report and suggestion.

Oleg Bartunov
---
 contrib/intarray/_int.c      | 21 +++++++++++++++++++++
 contrib/intarray/_int.sql.in | 11 ++++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/contrib/intarray/_int.c b/contrib/intarray/_int.c
index ba91a0eba4a..d956543af5f 100644
--- a/contrib/intarray/_int.c
+++ b/contrib/intarray/_int.c
@@ -312,6 +312,17 @@ g_int_consistent(PG_FUNCTION_ARGS) {
 									   query);
 			break;
 		case RTSameStrategyNumber:
+			if ( GIST_LEAF(entry) )
+				DirectFunctionCall3(
+					g_int_same,
+					entry->key,
+					PointerGetDatum(query),
+					PointerGetDatum(&retval)
+				);
+			else
+				retval = inner_int_contains((ArrayType *) DatumGetPointer(entry->key),
+										query);
+			break;
 		case RTContainsStrategyNumber:
 			retval = inner_int_contains((ArrayType *) DatumGetPointer(entry->key),
 										query);
@@ -1263,6 +1274,16 @@ g_intbig_consistent(PG_FUNCTION_ARGS) {
 			retval = _intbig_overlap((ArrayType *) DatumGetPointer(entry->key), q);
 			break;
 		case RTSameStrategyNumber:
+			if ( GIST_LEAF(entry) )
+				DirectFunctionCall3(
+					g_intbig_same,
+					entry->key,
+					PointerGetDatum(q),
+					PointerGetDatum(&retval)
+				);
+			else
+				retval = _intbig_contains((ArrayType *) DatumGetPointer(entry->key), q);
+			break;
 		case RTContainsStrategyNumber:
 			retval = _intbig_contains((ArrayType *) DatumGetPointer(entry->key), q);
 			break;
diff --git a/contrib/intarray/_int.sql.in b/contrib/intarray/_int.sql.in
index 60a4972984b..4d9031f6532 100644
--- a/contrib/intarray/_int.sql.in
+++ b/contrib/intarray/_int.sql.in
@@ -179,7 +179,7 @@ INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
 
 -- _int_same
 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
-   SELECT opcl.oid, 6, false, c.opoid
+   SELECT opcl.oid, 6, true, c.opoid
    FROM pg_opclass opcl, _int_ops_tmp c
    WHERE
       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
@@ -354,6 +354,15 @@ INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
       and opcname = 'gist__intbig_ops' 
       and c.oprname = '~';
 
+-- _int_same
+INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
+   SELECT opcl.oid, 6, true, c.opoid
+   FROM pg_opclass opcl, _int_ops_tmp c
+   WHERE
+      opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
+      and opcname = 'gist__intbig_ops' 
+      and c.oprname = '=';
+
 --boolean search
 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
    SELECT opcl.oid, 20, true, c.opoid
-- 
GitLab