Generalize index support in network support function
authorPeter Eisentraut <peter@eisentraut.org>
Tue, 25 Mar 2025 06:11:56 +0000 (07:11 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Tue, 25 Mar 2025 06:11:56 +0000 (07:11 +0100)
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

src/backend/utils/adt/network.c

index 450dacd031ca7a12c0f944f30d972dbac136b34b..227980c14d3cec37d5d847ca0f1838100a9b6af4 100644 (file)
@@ -1093,39 +1093,13 @@ match_network_subset(Node *leftop,
        return NIL;
    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);