mirror of
https://github.com/postgres/postgres.git
synced 2026-01-26 09:41:40 +03:00
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
This commit is contained in:
@@ -2473,34 +2473,36 @@ GetOperatorFromCompareType(Oid opclass, Oid rhstype, CompareType cmptype,
|
||||
|
||||
Assert(cmptype == COMPARE_EQ || cmptype == COMPARE_OVERLAP || cmptype == COMPARE_CONTAINED_BY);
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
amid = get_opclass_method(opclass);
|
||||
|
||||
*opid = InvalidOid;
|
||||
/*
|
||||
* 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)));
|
||||
|
||||
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)));
|
||||
|
||||
/*
|
||||
* 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,
|
||||
|
||||
Reference in New Issue
Block a user