diff options
author | Peter Eisentraut | 2025-03-07 09:51:53 +0000 |
---|---|---|
committer | Peter Eisentraut | 2025-03-07 10:46:33 +0000 |
commit | af4002b381d86df6479962953d82f03ecb4e2e06 (patch) | |
tree | 70b568724f3dff02edcb4f6d3e87fa5711d59bb5 | |
parent | 6da469badaffec32f8a804181cca279561467378 (diff) |
Rename amcancrosscompare
After more discussion about commit ce62f2f2a0a, rename the index AM
property amcancrosscompare to two separate properties
amconsistentequality and amconsistentordering. Also improve the
documentation and update some comments that were previously missed.
Reported-by: Tom Lane <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/E1tngY6-0000UL-2n%40gemulon.postgresql.org
-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 c901e94272..2c0e71eedc 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 c50ba60e21..768b77aa0d 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 75a65ec9c7..b01009c5d8 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 0b67108bc3..78f7b7a249 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 5482925a0f..1840f04bfb 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 4c83b09edd..874558849a 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 45ea6afba1..136e9408ae 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 7e56b1e6b9..95fea74e29 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 b1e173c63b..8a8d4a2af3 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 7bd476f3de..97ad36a031 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 bf729a1e4a..c4a0737731 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 c83954ad11..94ef639b6f 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; |