summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/bloom/blutils.c3
-rw-r--r--doc/src/sgml/indexam.sgml6
-rw-r--r--src/backend/access/brin/brin.c3
-rw-r--r--src/backend/access/gin/ginutil.c3
-rw-r--r--src/backend/access/gist/gist.c3
-rw-r--r--src/backend/access/hash/hash.c3
-rw-r--r--src/backend/access/nbtree/nbtree.c3
-rw-r--r--src/backend/access/spgist/spgutils.c3
-rw-r--r--src/backend/optimizer/plan/analyzejoins.c7
-rw-r--r--src/backend/utils/cache/lsyscache.c24
-rw-r--r--src/include/access/amapi.h6
-rw-r--r--src/test/modules/dummy_index_am/dummy_index_am.c3
12 files changed, 41 insertions, 26 deletions
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index c901e942720..2c0e71eedc6 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -110,7 +110,8 @@ blhandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = false;
amroutine->amcanorderbyop = false;
amroutine->amcanhash = false;
- amroutine->amcancrosscompare = false;
+ amroutine->amconsistentequality = false;
+ amroutine->amconsistentordering = false;
amroutine->amcanbackward = false;
amroutine->amcanunique = false;
amroutine->amcanmulticol = true;
diff --git a/doc/src/sgml/indexam.sgml b/doc/src/sgml/indexam.sgml
index c50ba60e21c..768b77aa0d2 100644
--- a/doc/src/sgml/indexam.sgml
+++ b/doc/src/sgml/indexam.sgml
@@ -105,8 +105,10 @@ typedef struct IndexAmRoutine
bool amcanorderbyop;
/* does AM support hashing using API consistent with the hash AM? */
bool amcanhash;
- /* does AM support cross-type comparisons? */
- bool amcancrosscompare;
+ /* do operators within an opfamily have consistent equality semantics? */
+ bool amconsistentequality;
+ /* do operators within an opfamily have consistent ordering semantics? */
+ bool amconsistentordering;
/* does AM support backward scanning? */
bool amcanbackward;
/* does AM support UNIQUE indexes? */
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index 75a65ec9c75..b01009c5d85 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -257,7 +257,8 @@ brinhandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = false;
amroutine->amcanorderbyop = false;
amroutine->amcanhash = false;
- amroutine->amcancrosscompare = false;
+ amroutine->amconsistentequality = false;
+ amroutine->amconsistentordering = false;
amroutine->amcanbackward = false;
amroutine->amcanunique = false;
amroutine->amcanmulticol = true;
diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c
index 0b67108bc34..78f7b7a2495 100644
--- a/src/backend/access/gin/ginutil.c
+++ b/src/backend/access/gin/ginutil.c
@@ -45,7 +45,8 @@ ginhandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = false;
amroutine->amcanorderbyop = false;
amroutine->amcanhash = false;
- amroutine->amcancrosscompare = false;
+ amroutine->amconsistentequality = false;
+ amroutine->amconsistentordering = false;
amroutine->amcanbackward = false;
amroutine->amcanunique = false;
amroutine->amcanmulticol = true;
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index 5482925a0f3..1840f04bfbf 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -66,7 +66,8 @@ gisthandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = false;
amroutine->amcanorderbyop = true;
amroutine->amcanhash = false;
- amroutine->amcancrosscompare = false;
+ amroutine->amconsistentequality = false;
+ amroutine->amconsistentordering = false;
amroutine->amcanbackward = false;
amroutine->amcanunique = false;
amroutine->amcanmulticol = true;
diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c
index 4c83b09edde..874558849a2 100644
--- a/src/backend/access/hash/hash.c
+++ b/src/backend/access/hash/hash.c
@@ -65,7 +65,8 @@ hashhandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = false;
amroutine->amcanorderbyop = false;
amroutine->amcanhash = true;
- amroutine->amcancrosscompare = true;
+ amroutine->amconsistentequality = true;
+ amroutine->amconsistentequality = false;
amroutine->amcanbackward = true;
amroutine->amcanunique = false;
amroutine->amcanmulticol = false;
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 45ea6afba1d..136e9408ae5 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -108,7 +108,8 @@ bthandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = true;
amroutine->amcanorderbyop = false;
amroutine->amcanhash = false;
- amroutine->amcancrosscompare = true;
+ amroutine->amconsistentequality = true;
+ amroutine->amconsistentordering = true;
amroutine->amcanbackward = true;
amroutine->amcanunique = true;
amroutine->amcanmulticol = true;
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 7e56b1e6b95..95fea74e296 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -51,7 +51,8 @@ spghandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = false;
amroutine->amcanorderbyop = true;
amroutine->amcanhash = false;
- amroutine->amcancrosscompare = false;
+ amroutine->amconsistentequality = false;
+ amroutine->amconsistentordering = false;
amroutine->amcanbackward = false;
amroutine->amcanunique = false;
amroutine->amcanmulticol = false;
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c
index b1e173c63bc..8a8d4a2af33 100644
--- a/src/backend/optimizer/plan/analyzejoins.c
+++ b/src/backend/optimizer/plan/analyzejoins.c
@@ -1083,9 +1083,10 @@ query_supports_distinctness(Query *query)
* the values are distinct. (Note: the opids entries could be cross-type
* operators, and thus not exactly the equality operators that the subquery
* would use itself. We use equality_ops_are_compatible() to check
- * compatibility. That looks at btree or hash opfamily membership, and so
- * should give trustworthy answers for all operators that we might need
- * to deal with here.)
+ * compatibility. That looks at opfamily membership for index AMs that have
+ * declared that they support consistent equality semantics within an
+ * opfamily, and so should give trustworthy answers for all operators that we
+ * might need to deal with here.)
*/
bool
query_is_distinct_for(Query *query, List *colnos, List *opids)
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
index 7bd476f3de7..97ad36a031b 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -690,10 +690,11 @@ get_op_btree_interpretation(Oid opno)
* semantics.
*
* This is trivially true if they are the same operator. Otherwise,
- * we look to see if they can be found in the same btree or hash opfamily.
- * Either finding allows us to assume that they have compatible notions
- * of equality. (The reason we need to do these pushups is that one might
- * be a cross-type operator; for instance int24eq vs int4eq.)
+ * Otherwise, we look to see if they both belong to an opfamily that
+ * guarantees compatible semantics for equality. Either finding allows us to
+ * assume that they have compatible notions of equality. (The reason we need
+ * to do these pushups is that one might be a cross-type operator; for
+ * instance int24eq vs int4eq.)
*/
bool
equality_ops_are_compatible(Oid opno1, Oid opno2)
@@ -718,7 +719,7 @@ equality_ops_are_compatible(Oid opno1, Oid opno2)
Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple);
IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
- if (amroutine->amcancrosscompare)
+ if (amroutine->amconsistentequality)
{
if (op_in_opfamily(opno2, op_form->amopfamily))
{
@@ -738,12 +739,13 @@ equality_ops_are_compatible(Oid opno1, Oid opno2)
* Return true if the two given comparison operators have compatible
* semantics.
*
- * This is trivially true if they are the same operator. Otherwise,
- * we look to see if they can be found in the same btree opfamily.
- * For example, '<' and '>=' ops match if they belong to the same family.
+ * This is trivially true if they are the same operator. Otherwise, we look
+ * to see if they both belong to an opfamily that guarantees compatible
+ * semantics for ordering. (For example, for btree, '<' and '>=' ops match if
+ * they belong to the same family.)
*
- * (This is identical to equality_ops_are_compatible(), except that we
- * don't bother to examine hash opclasses.)
+ * (This is identical to equality_ops_are_compatible(), except that we check
+ * amcanorder plus amconsistentordering instead of amconsistentequality.)
*/
bool
comparison_ops_are_compatible(Oid opno1, Oid opno2)
@@ -768,7 +770,7 @@ comparison_ops_are_compatible(Oid opno1, Oid opno2)
Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple);
IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
- if (amroutine->amcanorder && amroutine->amcancrosscompare)
+ if (amroutine->amcanorder && amroutine->amconsistentordering)
{
if (op_in_opfamily(opno2, op_form->amopfamily))
{
diff --git a/src/include/access/amapi.h b/src/include/access/amapi.h
index bf729a1e4ae..c4a0737731f 100644
--- a/src/include/access/amapi.h
+++ b/src/include/access/amapi.h
@@ -245,8 +245,10 @@ typedef struct IndexAmRoutine
bool amcanorderbyop;
/* does AM support hashing using API consistent with the hash AM? */
bool amcanhash;
- /* does AM support cross-type comparisons? */
- bool amcancrosscompare;
+ /* do operators within an opfamily have consistent equality semantics? */
+ bool amconsistentequality;
+ /* do operators within an opfamily have consistent ordering semantics? */
+ bool amconsistentordering;
/* does AM support backward scanning? */
bool amcanbackward;
/* does AM support UNIQUE indexes? */
diff --git a/src/test/modules/dummy_index_am/dummy_index_am.c b/src/test/modules/dummy_index_am/dummy_index_am.c
index c83954ad11d..94ef639b6fc 100644
--- a/src/test/modules/dummy_index_am/dummy_index_am.c
+++ b/src/test/modules/dummy_index_am/dummy_index_am.c
@@ -283,7 +283,8 @@ dihandler(PG_FUNCTION_ARGS)
amroutine->amcanorder = false;
amroutine->amcanorderbyop = false;
amroutine->amcanhash = false;
- amroutine->amcancrosscompare = false;
+ amroutine->amconsistentequality = false;
+ amroutine->amconsistentordering = false;
amroutine->amcanbackward = false;
amroutine->amcanunique = false;
amroutine->amcanmulticol = false;