diff options
author | Peter Eisentraut | 2025-03-18 10:29:15 +0000 |
---|---|---|
committer | Peter Eisentraut | 2025-03-18 10:29:15 +0000 |
commit | 9d6db8bec19413cd0167f1e59d1af005a997bd3e (patch) | |
tree | 373ada1d0cdfa11ed9cf060a841d8ae733bbfe4f /src/backend/commands | |
parent | f278e1fe300ab1b7d43c3efb55a29aa17e5f5dda (diff) |
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 <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/[email protected]
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/matview.c | 15 |
1 files 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) |