From 9552f30c710f5c09af90dd6712b9ff886d2ee318 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 5 Jan 2026 15:19:01 +1300 Subject: [PATCH v3 2/2] 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 Reviewed-by: Neil Chen 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, -- 2.51.0