Skip to content

Commit 340a167

Browse files
authored
fix: synchronize the index on the mview when changing the owner or schema (#20093)
1 parent e6e9ace commit 340a167

File tree

3 files changed

+53
-35
lines changed

3 files changed

+53
-35
lines changed

e2e_test/ddl/alter_owner.slt

+18
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ v user1
6767
statement ok
6868
CREATE MATERIALIZED VIEW mv AS SELECT v1, (t.v2).v1 AS v21 FROM t;
6969

70+
statement ok
71+
CREATE INDEX mv_idx ON mv(v1);
72+
7073
statement ok
7174
ALTER MATERIALIZED VIEW mv OWNER TO user1;
7275

@@ -85,6 +88,21 @@ WHERE
8588
----
8689
mv user1
8790

91+
query TT
92+
SELECT
93+
pg_class.relname AS rel_name,
94+
pg_roles.rolname AS owner
95+
FROM
96+
pg_class
97+
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
98+
JOIN pg_roles ON pg_roles.oid = pg_class.relowner
99+
WHERE
100+
pg_namespace.nspname NOT LIKE 'pg_%'
101+
AND pg_namespace.nspname != 'information_schema'
102+
AND pg_class.relname = 'mv_idx';
103+
----
104+
mv_idx user1
105+
88106
statement ok
89107
CREATE SOURCE src (v INT) WITH (
90108
connector = 'datagen',

e2e_test/ddl/alter_set_schema.slt

+11-1
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,21 @@ CREATE INDEX test_index1 ON test_table(u);
2323
statement ok
2424
CREATE INDEX test_index2 ON test_table(v);
2525

26+
statement ok
27+
CREATE MATERIALIZED VIEW test_mv AS SELECT u FROM test_table;
28+
29+
statement ok
30+
CREATE INDEX test_mv_index ON test_mv(u);
31+
2632
statement ok
2733
ALTER TABLE test_table SET SCHEMA public;
2834

2935
statement ok
3036
ALTER TABLE test_table SET SCHEMA test_schema;
3137

38+
statement ok
39+
ALTER MATERIALIZED VIEW test_mv SET SCHEMA test_schema;
40+
3241
query TT
3342
SELECT tablename, schemaname FROM pg_tables WHERE schemaname = 'test_schema';
3443
----
@@ -39,6 +48,7 @@ SELECT indexname, schemaname FROM pg_indexes WHERE schemaname = 'test_schema';
3948
----
4049
test_index1 test_schema
4150
test_index2 test_schema
51+
test_mv_index test_schema
4252

4353
statement ok
4454
CREATE SOURCE test_source (v INT) WITH (
@@ -104,7 +114,7 @@ statement ok
104114
DROP SOURCE test_schema.test_source;
105115

106116
statement ok
107-
DROP TABLE test_schema.test_table;
117+
DROP TABLE test_schema.test_table cascade;
108118

109119
statement ok
110120
DROP SCHEMA test_schema;

src/meta/src/controller/catalog/alter_op.rs

+24-34
Original file line numberDiff line numberDiff line change
@@ -331,20 +331,15 @@ impl CatalogController {
331331
}
332332

333333
// indexes.
334-
let (index_ids, mut table_ids): (Vec<IndexId>, Vec<TableId>) =
335-
if table.table_type == TableType::Table {
336-
Index::find()
337-
.select_only()
338-
.columns([index::Column::IndexId, index::Column::IndexTableId])
339-
.filter(index::Column::PrimaryTableId.eq(object_id))
340-
.into_tuple::<(IndexId, TableId)>()
341-
.all(&txn)
342-
.await?
343-
.into_iter()
344-
.unzip()
345-
} else {
346-
(vec![], vec![])
347-
};
334+
let (index_ids, mut table_ids): (Vec<IndexId>, Vec<TableId>) = Index::find()
335+
.select_only()
336+
.columns([index::Column::IndexId, index::Column::IndexTableId])
337+
.filter(index::Column::PrimaryTableId.eq(object_id))
338+
.into_tuple::<(IndexId, TableId)>()
339+
.all(&txn)
340+
.await?
341+
.into_iter()
342+
.unzip();
348343
relations.push(PbRelationInfo::Table(ObjectModel(table, obj).into()));
349344

350345
// internal tables.
@@ -501,8 +496,7 @@ impl CatalogController {
501496
.await?
502497
.ok_or_else(|| MetaError::catalog_id_not_found("table", object_id))?;
503498
check_relation_name_duplicate(&table.name, database_id, new_schema, &txn).await?;
504-
let (associated_src_id, table_type) =
505-
(table.optional_associated_source_id, table.table_type);
499+
let associated_src_id = table.optional_associated_source_id;
506500

507501
let mut obj = obj.into_active_model();
508502
obj.schema_id = Set(Some(new_schema));
@@ -531,24 +525,20 @@ impl CatalogController {
531525
let (index_ids, (index_names, mut table_ids)): (
532526
Vec<IndexId>,
533527
(Vec<String>, Vec<TableId>),
534-
) = if table_type == TableType::Table {
535-
Index::find()
536-
.select_only()
537-
.columns([
538-
index::Column::IndexId,
539-
index::Column::Name,
540-
index::Column::IndexTableId,
541-
])
542-
.filter(index::Column::PrimaryTableId.eq(object_id))
543-
.into_tuple::<(IndexId, String, TableId)>()
544-
.all(&txn)
545-
.await?
546-
.into_iter()
547-
.map(|(id, name, t_id)| (id, (name, t_id)))
548-
.unzip()
549-
} else {
550-
(vec![], (vec![], vec![]))
551-
};
528+
) = Index::find()
529+
.select_only()
530+
.columns([
531+
index::Column::IndexId,
532+
index::Column::Name,
533+
index::Column::IndexTableId,
534+
])
535+
.filter(index::Column::PrimaryTableId.eq(object_id))
536+
.into_tuple::<(IndexId, String, TableId)>()
537+
.all(&txn)
538+
.await?
539+
.into_iter()
540+
.map(|(id, name, t_id)| (id, (name, t_id)))
541+
.unzip();
552542

553543
// internal tables.
554544
let internal_tables: Vec<TableId> = Table::find()

0 commit comments

Comments
 (0)