diff options
-rw-r--r-- | contrib/bloom/blutils.c | 3 | ||||
-rw-r--r-- | doc/src/sgml/indexam.sgml | 6 | ||||
-rw-r--r-- | src/backend/access/brin/brin.c | 3 | ||||
-rw-r--r-- | src/backend/access/gin/ginutil.c | 3 | ||||
-rw-r--r-- | src/backend/access/gist/gist.c | 3 | ||||
-rw-r--r-- | src/backend/access/hash/hash.c | 3 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtree.c | 3 | ||||
-rw-r--r-- | src/backend/access/spgist/spgutils.c | 3 | ||||
-rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 7 | ||||
-rw-r--r-- | src/backend/utils/cache/lsyscache.c | 24 | ||||
-rw-r--r-- | src/include/access/amapi.h | 6 | ||||
-rw-r--r-- | src/test/modules/dummy_index_am/dummy_index_am.c | 3 |
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; |