From 74a8af099f0095bc87f25dfa9b54f09d6a8972d4 Mon Sep 17 00:00:00 2001 From: Bruce Momjian 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 ba91a0eba4..d956543af5 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 60a4972984..4d9031f653 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