summaryrefslogtreecommitdiff
path: root/src/backend/commands
diff options
context:
space:
mode:
authorPeter Eisentraut2025-03-18 10:29:15 +0000
committerPeter Eisentraut2025-03-18 10:29:15 +0000
commit9d6db8bec19413cd0167f1e59d1af005a997bd3e (patch)
tree373ada1d0cdfa11ed9cf060a841d8ae733bbfe4f /src/backend/commands
parentf278e1fe300ab1b7d43c3efb55a29aa17e5f5dda (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.c15
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)