From d71eb8ce88b920b374e05fc4def38b39ed50fa6a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 12 Mar 2025 14:15:36 +0100 Subject: [PATCH v21.2 4/4] Allow non-btree unique indexes for matviews We were rejecting non-btree indexes in some cases owing to the inability to determine the equality operators for other index AMs; that problem no longer exists, because we can look up the equality operator using COMPARE_EQ. Stop rejecting these indexes, but instead rely on all unique indexes having equality operators. Unique indexes must have equality operators. Author: Mark Dilger --- src/backend/commands/matview.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index 0bfbc5ca6dc..e7854add178 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -774,16 +774,14 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner, if (!HeapTupleIsValid(cla_ht)) elog(ERROR, "cache lookup failed for opclass %u", opclass); cla_tup = (Form_pg_opclass) GETSTRUCT(cla_ht); - Assert(cla_tup->opcmethod == BTREE_AM_OID); opfamily = cla_tup->opcfamily; opcintype = cla_tup->opcintype; ReleaseSysCache(cla_ht); - op = get_opfamily_member(opfamily, opcintype, opcintype, - BTEqualStrategyNumber); + op = get_opfamily_member_for_cmptype(opfamily, opcintype, opcintype, COMPARE_EQ); if (!OidIsValid(op)) - elog(ERROR, "missing operator %d(%u,%u) in opfamily %u", - BTEqualStrategyNumber, opcintype, opcintype, opfamily); + elog(ERROR, "missing equality operator for (%u,%u) in opfamily %u", + opcintype, opcintype, opfamily); /* * If we find the same column with the same equality semantics @@ -920,15 +918,10 @@ is_usable_unique_index(Relation indexRel) /* * Must be unique, valid, immediate, non-partial, and be defined over - * plain user columns (not expressions). We also require it to be a - * btree. Even if we had any other unique index kinds, we'd not know how - * to identify the corresponding equality operator, nor could we be sure - * that the planner could implement the required FULL JOIN with non-btree - * operators. + * plain user columns (not expressions). */ if (indexStruct->indisunique && indexStruct->indimmediate && - indexRel->rd_rel->relam == BTREE_AM_OID && indexStruct->indisvalid && RelationGetIndexPredicate(indexRel) == NIL && indexStruct->indnatts > 0) -- 2.48.1