aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2025-03-25 07:11:56 +0100
committerPeter Eisentraut <peter@eisentraut.org>2025-03-25 07:11:56 +0100
commitbe1cc9aaf5b79f07bc0483a0c95366c77a844d0a (patch)
tree95b6d598cb5cbf90e14eecb5753c5b49b07e787b
parent5ac462e2b7ac97685de9f34b17296640220d0bfc (diff)
downloadpostgresql-be1cc9aaf5b79f07bc0483a0c95366c77a844d0a.tar.gz
postgresql-be1cc9aaf5b79f07bc0483a0c95366c77a844d0a.zip
Generalize index support in network support function
The network (inet) support functions currently only supported a hardcoded btree operator family. With the generalized compare type facility, we can generalize this to support any operator family from any index type that supports the required operators. Author: Mark Dilger <mark.dilger@enterprisedb.com> Co-authored-by: Peter Eisentraut <peter@eisentraut.org> Discussion: https://www.postgresql.org/message-id/flat/E72EAA49-354D-4C2E-8EB9-255197F55330@enterprisedb.com
-rw-r--r--src/backend/utils/adt/network.c37
1 files changed, 5 insertions, 32 deletions
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c
index 450dacd031c..227980c14d3 100644
--- a/src/backend/utils/adt/network.c
+++ b/src/backend/utils/adt/network.c
@@ -1094,38 +1094,12 @@ match_network_subset(Node *leftop,
rightopval = ((Const *) rightop)->constvalue;
/*
- * Must check that index's opfamily supports the operators we will want to
- * apply.
- *
- * We insist on the opfamily being the specific one we expect, else we'd
- * do the wrong thing if someone were to make a reverse-sort opfamily with
- * the same operators.
- */
- if (opfamily != NETWORK_BTREE_FAM_OID)
- return NIL;
-
- /*
* create clause "key >= network_scan_first( rightopval )", or ">" if the
* operator disallows equality.
- *
- * Note: seeing that this function supports only fixed values for opfamily
- * and datatype, we could just hard-wire the operator OIDs instead of
- * looking them up. But for now it seems better to be general.
*/
- if (is_eq)
- {
- opr1oid = get_opfamily_member(opfamily, datatype, datatype,
- BTGreaterEqualStrategyNumber);
- if (opr1oid == InvalidOid)
- elog(ERROR, "no >= operator for opfamily %u", opfamily);
- }
- else
- {
- opr1oid = get_opfamily_member(opfamily, datatype, datatype,
- BTGreaterStrategyNumber);
- if (opr1oid == InvalidOid)
- elog(ERROR, "no > operator for opfamily %u", opfamily);
- }
+ opr1oid = get_opfamily_member_for_cmptype(opfamily, datatype, datatype, is_eq ? COMPARE_GE : COMPARE_GT);
+ if (opr1oid == InvalidOid)
+ return NIL;
opr1right = network_scan_first(rightopval);
@@ -1140,10 +1114,9 @@ match_network_subset(Node *leftop,
/* create clause "key <= network_scan_last( rightopval )" */
- opr2oid = get_opfamily_member(opfamily, datatype, datatype,
- BTLessEqualStrategyNumber);
+ opr2oid = get_opfamily_member_for_cmptype(opfamily, datatype, datatype, COMPARE_LE);
if (opr2oid == InvalidOid)
- elog(ERROR, "no <= operator for opfamily %u", opfamily);
+ return NIL;
opr2right = network_scan_last(rightopval);