aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2025-03-18 11:17:43 +0100
committerPeter Eisentraut <peter@eisentraut.org>2025-03-18 11:17:43 +0100
commit7317e641268fb9b08d32519920adf1f16c8591ea (patch)
tree6e418f0e3bf7e441b0a36c429c621f494259e503 /src
parent122a9af5def2db78f2c2131958eab8873bfee93b (diff)
downloadpostgresql-7317e641268fb9b08d32519920adf1f16c8591ea.tar.gz
postgresql-7317e641268fb9b08d32519920adf1f16c8591ea.zip
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 <mark.dilger@enterprisedb.com> Discussion: https://www.postgresql.org/message-id/flat/E72EAA49-354D-4C2E-8EB9-255197F55330@enterprisedb.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/cache/lsyscache.c44
-rw-r--r--src/include/utils/lsyscache.h4
2 files changed, 48 insertions, 0 deletions
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
@@ -185,6 +185,28 @@ get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype,
}
/*
+ * 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),
* determine its opfamily, its declared input datatype, and its
@@ -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);