postgres.git / summary / log / commit / refs
commit 7f9acc9bccfe2dc4d7d8ba75057c91ef09a7ebf2
Author: David Rowley <drowley@postgresql.org>
Date: Tue Jan 06 02:25:13 2026 +0000
Simplify GetOperatorFromCompareType() code
The old code would set *opid = InvalidOid to determine if the
get_opclass_opfamily_and_input_type() worked or not. This means more
moving parts that what's really needed here. Let's just fail
immediately if the get_opclass_opfamily_and_input_type() lookup fails.
Author: Paul A Jungwirth <pj@illuminatedcomputing.com>
Reviewed-by: Neil Chen <carpenter.nail.cz@gmail.com>
Discussion: https://postgr.es/m/CA+renyXOrjLacP_nhqEQUf2W+ZCoY2q5kpQCfG05vQVYzr8b9w@mail.gmail.com
src/backend/commands/indexcmds.c | 52 +++++++++++++++++++++-------------------
1 file changed, 27 insertions(+), 25 deletions(-)
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 0a7b6f18fa2..08c86cc163c 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -2473,34 +2473,36 @@ GetOperatorFromCompareType(Oid opclass, Oid rhstype, CompareType cmptype,
Assert(cmptype == COMPARE_EQ || cmptype == COMPARE_OVERLAP || cmptype == COMPARE_CONTAINED_BY);
- amid = get_opclass_method(opclass);
+ /*
+ * Use the opclass to get the opfamily, opcintype, and access method. If
+ * any of this fails, quit early.
+ */
+ if (!get_opclass_opfamily_and_input_type(opclass, &opfamily, &opcintype))
+ elog(ERROR, "cache lookup failed for opclass %u", opclass);
- *opid = InvalidOid;
+ amid = get_opclass_method(opclass);
- if (get_opclass_opfamily_and_input_type(opclass, &opfamily, &opcintype))
- {
- /*
- * Ask the index AM to translate to its internal stratnum
- */
- *strat = IndexAmTranslateCompareType(cmptype, amid, opfamily, true);
- if (*strat == InvalidStrategy)
- ereport(ERROR,
- errcode(ERRCODE_UNDEFINED_OBJECT),
- cmptype == COMPARE_EQ ? errmsg("could not identify an equality operator for type %s", format_type_be(opcintype)) :
- cmptype == COMPARE_OVERLAP ? errmsg("could not identify an overlaps operator for type %s", format_type_be(opcintype)) :
- cmptype == COMPARE_CONTAINED_BY ? errmsg("could not identify a contained-by operator for type %s", format_type_be(opcintype)) : 0,
- errdetail("Could not translate compare type %d for operator family \"%s\" of access method \"%s\".",
- cmptype, get_opfamily_name(opfamily, false), get_am_name(amid)));
+ /*
+ * Ask the index AM to translate to its internal stratnum
+ */
+ *strat = IndexAmTranslateCompareType(cmptype, amid, opfamily, true);
+ if (*strat == InvalidStrategy)
+ ereport(ERROR,
+ errcode(ERRCODE_UNDEFINED_OBJECT),
+ cmptype == COMPARE_EQ ? errmsg("could not identify an equality operator for type %s", format_type_be(opcintype)) :
+ cmptype == COMPARE_OVERLAP ? errmsg("could not identify an overlaps operator for type %s", format_type_be(opcintype)) :
+ cmptype == COMPARE_CONTAINED_BY ? errmsg("could not identify a contained-by operator for type %s", format_type_be(opcintype)) : 0,
+ errdetail("Could not translate compare type %d for operator family \"%s\" of access method \"%s\".",
+ cmptype, get_opfamily_name(opfamily, false), get_am_name(amid)));
- /*
- * We parameterize rhstype so foreign keys can ask for a <@ operator
- * whose rhs matches the aggregate function. For example range_agg
- * returns anymultirange.
- */
- if (!OidIsValid(rhstype))
- rhstype = opcintype;
- *opid = get_opfamily_member(opfamily, opcintype, rhstype, *strat);
- }
+ /*
+ * We parameterize rhstype so foreign keys can ask for a <@ operator whose
+ * rhs matches the aggregate function. For example range_agg returns
+ * anymultirange.
+ */
+ if (!OidIsValid(rhstype))
+ rhstype = opcintype;
+ *opid = get_opfamily_member(opfamily, opcintype, rhstype, *strat);
if (!OidIsValid(*opid))
ereport(ERROR,
[parent: e8d4e94a47ea]