From 7317e641268fb9b08d32519920adf1f16c8591ea Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 18 Mar 2025 11:17:43 +0100 Subject: Add some opfamily support functions to lsyscache.c Add get_opfamily_method() and get_opfamily_member_for_cmptype() in lsyscache.c. No callers yet, but we'll add some soon. This is part of generalizing some parts of the code away from having btree hardcoded and use CompareType instead. Author: Mark Dilger Discussion: https://www.postgresql.org/message-id/flat/E72EAA49-354D-4C2E-8EB9-255197F55330@enterprisedb.com --- src/backend/utils/cache/lsyscache.c | 44 +++++++++++++++++++++++++++++++++++++ src/include/utils/lsyscache.h | 4 ++++ 2 files changed, 48 insertions(+) (limited to 'src') diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 80c5a3fcfb7..82031c1e8e5 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -184,6 +184,28 @@ get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, return result; } +/* + * get_opfamily_member_for_cmptype + * Get the OID of the operator that implements the specified comparison + * type with the specified datatypes for the specified opfamily. + * + * Returns InvalidOid if there is no mapping for the comparison type or no + * pg_amop entry for the given keys. + */ +Oid +get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid righttype, + CompareType cmptype) +{ + Oid opmethod; + StrategyNumber strategy; + + opmethod = get_opfamily_method(opfamily); + strategy = IndexAmTranslateCompareType(cmptype, opmethod, opfamily, true); + if (!strategy) + return InvalidOid; + return get_opfamily_member(opfamily, lefttype, righttype, strategy); +} + /* * get_ordering_op_properties * Given the OID of an ordering operator (a btree "<" or ">" operator), @@ -1288,6 +1310,28 @@ get_opclass_method(Oid opclass) /* ---------- OPFAMILY CACHE ---------- */ +/* + * get_opfamily_method + * + * Returns the OID of the index access method the opfamily is for. + */ +Oid +get_opfamily_method(Oid opfid) +{ + HeapTuple tp; + Form_pg_opfamily opfform; + Oid result; + + tp = SearchSysCache1(OPFAMILYOID, ObjectIdGetDatum(opfid)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for operator family %u", opfid); + opfform = (Form_pg_opfamily) GETSTRUCT(tp); + + result = opfform->opfmethod; + ReleaseSysCache(tp); + return result; +} + char * get_opfamily_name(Oid opfid, bool missing_ok) { diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h index 6fab7aa6009..d42380a0d46 100644 --- a/src/include/utils/lsyscache.h +++ b/src/include/utils/lsyscache.h @@ -14,6 +14,7 @@ #define LSYSCACHE_H #include "access/attnum.h" +#include "access/cmptype.h" #include "access/htup.h" #include "nodes/pg_list.h" @@ -74,6 +75,8 @@ extern void get_op_opfamily_properties(Oid opno, Oid opfamily, bool ordering_op, Oid *righttype); extern Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy); +extern Oid get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid righttype, + CompareType cmptype); extern bool get_ordering_op_properties(Oid opno, Oid *opfamily, Oid *opcintype, int16 *strategy); extern Oid get_equality_op_for_ordering_op(Oid opno, bool *reverse); @@ -108,6 +111,7 @@ extern Oid get_opclass_input_type(Oid opclass); extern bool get_opclass_opfamily_and_input_type(Oid opclass, Oid *opfamily, Oid *opcintype); extern Oid get_opclass_method(Oid opclass); +extern Oid get_opfamily_method(Oid opfid); extern char *get_opfamily_name(Oid opfid, bool missing_ok); extern RegProcedure get_opcode(Oid opno); extern char *get_opname(Oid opno); -- cgit v1.2.3