Skip to content

Commit d3e25d1

Browse files
committed
Implement SHOW REPLACEMENTS, SHOW CREATE REPLACEMENT
Signed-off-by: Moritz Hoffmann <[email protected]>
1 parent 3acd41c commit d3e25d1

File tree

17 files changed

+240
-34
lines changed

17 files changed

+240
-34
lines changed

doc/user/content/sql/system-catalog/mz_internal.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,7 @@ The `mz_webhook_sources` table contains a row for each webhook source in the sys
13381338
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_prepared_statement_history -->
13391339
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_recent_sql_text -->
13401340
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_recent_sql_text_redacted -->
1341+
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_replacement_materialized_views -->
13411342
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_session_history -->
13421343
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_all_objects -->
13431344
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_clusters -->
@@ -1349,6 +1350,7 @@ The `mz_webhook_sources` table contains a row for each webhook source in the sys
13491350
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_indexes -->
13501351
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_materialized_views -->
13511352
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_network_policies -->
1353+
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_replacements -->
13521354
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_roles -->
13531355
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_schemas -->
13541356
<!-- RELATION_SPEC_UNDOCUMENTED mz_internal.mz_show_secrets -->

src/catalog/src/builtin.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11199,6 +11199,41 @@ FROM
1119911199
access: vec![PUBLIC_SELECT],
1120011200
});
1120111201

11202+
pub static MZ_SHOW_REPLACEMENTS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11203+
name: "mz_show_replacements",
11204+
schema: MZ_INTERNAL_SCHEMA,
11205+
oid: oid::VIEW_MZ_SHOW_REPLACEMENTS_OID,
11206+
desc: RelationDesc::builder()
11207+
.with_column("id", SqlScalarType::String.nullable(false))
11208+
.with_column("name", SqlScalarType::String.nullable(false))
11209+
.with_column("replaces", SqlScalarType::String.nullable(false))
11210+
.with_column("cluster", SqlScalarType::String.nullable(false))
11211+
.with_column("schema_id", SqlScalarType::String.nullable(false))
11212+
.with_column("cluster_id", SqlScalarType::String.nullable(false))
11213+
.with_column("comment", SqlScalarType::String.nullable(false))
11214+
.finish(),
11215+
column_comments: BTreeMap::new(),
11216+
sql: "
11217+
WITH comments AS (
11218+
SELECT id, comment
11219+
FROM mz_internal.mz_comments
11220+
WHERE object_type = 'replacement' AND object_sub_id IS NULL
11221+
)
11222+
SELECT
11223+
mviews.id as id,
11224+
mviews.name,
11225+
mviews.replaces,
11226+
clusters.name AS cluster,
11227+
schema_id,
11228+
cluster_id,
11229+
COALESCE(comments.comment, '') as comment
11230+
FROM
11231+
mz_internal.mz_replacement_materialized_views AS mviews
11232+
JOIN mz_catalog.mz_clusters AS clusters ON clusters.id = mviews.cluster_id
11233+
LEFT JOIN comments ON mviews.id = comments.id",
11234+
access: vec![PUBLIC_SELECT],
11235+
});
11236+
1120211237
pub static MZ_SHOW_INDEXES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
1120311238
name: "mz_show_indexes",
1120411239
schema: MZ_INTERNAL_SCHEMA,
@@ -12811,6 +12846,15 @@ ON mz_internal.mz_show_materialized_views (schema_id)",
1281112846
is_retained_metrics_object: false,
1281212847
};
1281312848

12849+
pub const MZ_SHOW_REPLACEMENTS_IND: BuiltinIndex = BuiltinIndex {
12850+
name: "mz_show_replacements_ind",
12851+
schema: MZ_INTERNAL_SCHEMA,
12852+
oid: oid::INDEX_MZ_SHOW_REPLACEMENTS_IND_OID,
12853+
sql: "IN CLUSTER mz_catalog_server
12854+
ON mz_internal.mz_show_replacements (schema_id)",
12855+
is_retained_metrics_object: false,
12856+
};
12857+
1281412858
pub const MZ_SHOW_SINKS_IND: BuiltinIndex = BuiltinIndex {
1281512859
name: "mz_show_sinks_ind",
1281612860
schema: MZ_INTERNAL_SCHEMA,
@@ -13978,6 +14022,7 @@ pub static BUILTINS_STATIC: LazyLock<Vec<Builtin<NameReference>>> = LazyLock::ne
1397814022
Builtin::View(&MZ_SHOW_SOURCES),
1397914023
Builtin::View(&MZ_SHOW_SINKS),
1398014024
Builtin::View(&MZ_SHOW_MATERIALIZED_VIEWS),
14025+
Builtin::View(&MZ_SHOW_REPLACEMENTS),
1398114026
Builtin::View(&MZ_SHOW_INDEXES),
1398214027
Builtin::View(&MZ_SHOW_CONTINUAL_TASKS),
1398314028
Builtin::View(&MZ_CLUSTER_REPLICA_HISTORY),
@@ -14128,6 +14173,7 @@ pub static BUILTINS_STATIC: LazyLock<Vec<Builtin<NameReference>>> = LazyLock::ne
1412814173
Builtin::Index(&MZ_SHOW_SOURCES_IND),
1412914174
Builtin::Index(&MZ_SHOW_VIEWS_IND),
1413014175
Builtin::Index(&MZ_SHOW_MATERIALIZED_VIEWS_IND),
14176+
Builtin::Index(&MZ_SHOW_REPLACEMENTS_IND),
1413114177
Builtin::Index(&MZ_SHOW_SINKS_IND),
1413214178
Builtin::Index(&MZ_SHOW_TYPES_IND),
1413314179
Builtin::Index(&MZ_SHOW_ALL_OBJECTS_IND),

src/environmentd/tests/testdata/http/ws

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

src/pgrepr-consts/src/oid.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@ pub const VIEW_PG_EXTENSION_OID: u32 = 16875;
601601
pub const VIEW_MZ_SHOW_SOURCES_OID: u32 = 16876;
602602
pub const VIEW_MZ_SHOW_SINKS_OID: u32 = 16877;
603603
pub const VIEW_MZ_SHOW_MATERIALIZED_VIEWS_OID: u32 = 16878;
604+
pub const VIEW_MZ_SHOW_REPLACEMENTS_OID: u32 = 17062;
604605
pub const VIEW_MZ_SHOW_INDEXES_OID: u32 = 16879;
605606
pub const VIEW_MZ_SHOW_CLUSTER_REPLICAS_OID: u32 = 16880;
606607
pub const VIEW_MZ_SHOW_ROLE_MEMBERS_OID: u32 = 16881;
@@ -629,6 +630,7 @@ pub const INDEX_MZ_SHOW_TABLES_IND_OID: u32 = 16903;
629630
pub const INDEX_MZ_SHOW_SOURCES_IND_OID: u32 = 16904;
630631
pub const INDEX_MZ_SHOW_VIEWS_IND_OID: u32 = 16905;
631632
pub const INDEX_MZ_SHOW_MATERIALIZED_VIEWS_IND_OID: u32 = 16906;
633+
pub const INDEX_MZ_SHOW_REPLACEMENTS_IND_OID: u32 = 17063;
632634
pub const INDEX_MZ_SHOW_SINKS_IND_OID: u32 = 16907;
633635
pub const INDEX_MZ_SHOW_TYPES_IND_OID: u32 = 16908;
634636
pub const INDEX_MZ_SHOW_ALL_OBJECTS_IND_OID: u32 = 16909;

src/sql-lexer/src/keywords.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ Reoptimize
392392
Repeatable
393393
Replace
394394
Replacement
395+
Replacements
395396
Replan
396397
Replica
397398
Replicas

src/sql-parser/src/ast/defs/statement.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3698,6 +3698,25 @@ impl<T: AstInfo> AstDisplay for ShowCreateMaterializedViewStatement<T> {
36983698
}
36993699
impl_display_t!(ShowCreateMaterializedViewStatement);
37003700

3701+
/// `SHOW [REDACTED] CREATE REPLACEMENT <name>`
3702+
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
3703+
pub struct ShowCreateReplacementStatement<T: AstInfo> {
3704+
pub replacement_name: T::ItemName,
3705+
pub redacted: bool,
3706+
}
3707+
3708+
impl<T: AstInfo> AstDisplay for ShowCreateReplacementStatement<T> {
3709+
fn fmt<W: fmt::Write>(&self, f: &mut AstFormatter<W>) {
3710+
f.write_str("SHOW ");
3711+
if self.redacted {
3712+
f.write_str("REDACTED ");
3713+
}
3714+
f.write_str("CREATE REPLACEMENT ");
3715+
f.write_node(&self.replacement_name);
3716+
}
3717+
}
3718+
impl_display_t!(ShowCreateReplacementStatement);
3719+
37013720
/// `SHOW [REDACTED] CREATE SOURCE <source>`
37023721
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
37033722
pub struct ShowCreateSourceStatement<T: AstInfo> {
@@ -5212,6 +5231,7 @@ pub enum ShowStatement<T: AstInfo> {
52125231
ShowColumns(ShowColumnsStatement<T>),
52135232
ShowCreateView(ShowCreateViewStatement<T>),
52145233
ShowCreateMaterializedView(ShowCreateMaterializedViewStatement<T>),
5234+
ShowCreateReplacement(ShowCreateReplacementStatement<T>),
52155235
ShowCreateSource(ShowCreateSourceStatement<T>),
52165236
ShowCreateTable(ShowCreateTableStatement<T>),
52175237
ShowCreateSink(ShowCreateSinkStatement<T>),
@@ -5230,6 +5250,7 @@ impl<T: AstInfo> AstDisplay for ShowStatement<T> {
52305250
ShowStatement::ShowColumns(stmt) => f.write_node(stmt),
52315251
ShowStatement::ShowCreateView(stmt) => f.write_node(stmt),
52325252
ShowStatement::ShowCreateMaterializedView(stmt) => f.write_node(stmt),
5253+
ShowStatement::ShowCreateReplacement(stmt) => f.write_node(stmt),
52335254
ShowStatement::ShowCreateSource(stmt) => f.write_node(stmt),
52345255
ShowStatement::ShowCreateTable(stmt) => f.write_node(stmt),
52355256
ShowStatement::ShowCreateSink(stmt) => f.write_node(stmt),

src/sql-parser/src/parser.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8141,6 +8141,13 @@ impl<'a> Parser<'a> {
81418141
redacted,
81428142
},
81438143
))
8144+
} else if self.parse_keywords(&[CREATE, REPLACEMENT]) {
8145+
Ok(ShowStatement::ShowCreateReplacement(
8146+
ShowCreateReplacementStatement {
8147+
replacement_name: self.parse_raw_name()?,
8148+
redacted,
8149+
},
8150+
))
81448151
} else if self.parse_keywords(&[CREATE, SOURCE]) {
81458152
Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
81468153
source_name: self.parse_raw_name()?,
@@ -9763,6 +9770,7 @@ impl<'a> Parser<'a> {
97639770
SUBSOURCES,
97649771
CONTINUAL,
97659772
NETWORK,
9773+
REPLACEMENTS,
97669774
])? {
97679775
TABLES => ObjectType::Table,
97689776
VIEWS => ObjectType::View,
@@ -9809,6 +9817,7 @@ impl<'a> Parser<'a> {
98099817
return None;
98109818
}
98119819
}
9820+
REPLACEMENTS => ObjectType::Replacement,
98129821
_ => unreachable!(),
98139822
},
98149823
)

src/sql-parser/tests/testdata/show

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,3 +994,32 @@ SHOW REDACTED MATERIALIZED
994994
error: SHOW REDACTED is only supported for SHOW REDACTED CREATE ...
995995
SHOW REDACTED MATERIALIZED
996996
^
997+
998+
parse-statement
999+
SHOW REPLACEMENTS
1000+
----
1001+
SHOW REPLACEMENTS
1002+
=>
1003+
Show(ShowObjects(ShowObjectsStatement { object_type: Replacement { in_cluster: None }, from: None, filter: None }))
1004+
1005+
1006+
parse-statement
1007+
SHOW REPLACEMENTS FROM abc IN CLUSTER my_cluster
1008+
----
1009+
SHOW REPLACEMENTS FROM abc IN CLUSTER my_cluster
1010+
=>
1011+
Show(ShowObjects(ShowObjectsStatement { object_type: Replacement { in_cluster: Some(Unresolved(Ident("my_cluster"))) }, from: Some(UnresolvedSchemaName([Ident("abc")])), filter: None }))
1012+
1013+
parse-statement
1014+
SHOW REPLACEMENTS FROM abc IN CLUSTER my_cluster WHERE true
1015+
----
1016+
SHOW REPLACEMENTS FROM abc IN CLUSTER my_cluster WHERE true
1017+
=>
1018+
Show(ShowObjects(ShowObjectsStatement { object_type: Replacement { in_cluster: Some(Unresolved(Ident("my_cluster"))) }, from: Some(UnresolvedSchemaName([Ident("abc")])), filter: Some(Where(Value(Boolean(true)))) }))
1019+
1020+
parse-statement
1021+
SHOW REDACTED REPLACEMENTS
1022+
----
1023+
error: SHOW REDACTED is only supported for SHOW REDACTED CREATE ...
1024+
SHOW REDACTED REPLACEMENTS
1025+
^

src/sql/src/plan/query.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2066,6 +2066,10 @@ fn plan_set_expr(
20662066
show::plan_show_create_materialized_view(qcx.scx, stmt.clone())?,
20672067
show::describe_show_create_materialized_view(qcx.scx, stmt)?,
20682068
),
2069+
ShowStatement::ShowCreateReplacement(stmt) => to_hirscope(
2070+
show::plan_show_create_replacement(qcx.scx, stmt.clone())?,
2071+
show::describe_show_create_replacement(qcx.scx, stmt)?,
2072+
),
20692073
ShowStatement::ShowCreateType(stmt) => to_hirscope(
20702074
show::plan_show_create_type(qcx.scx, stmt.clone())?,
20712075
show::describe_show_create_type(qcx.scx, stmt)?,

src/sql/src/plan/statement.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ pub fn describe(
211211
Statement::Show(ShowStatement::ShowCreateMaterializedView(stmt)) => {
212212
show::describe_show_create_materialized_view(&scx, stmt)?
213213
}
214+
Statement::Show(ShowStatement::ShowCreateReplacement(stmt)) => {
215+
show::describe_show_create_replacement(&scx, stmt)?
216+
}
214217
Statement::Show(ShowStatement::ShowCreateType(stmt)) => {
215218
show::describe_show_create_type(&scx, stmt)?
216219
}
@@ -423,6 +426,9 @@ pub fn plan(
423426
Statement::Show(ShowStatement::ShowCreateMaterializedView(stmt)) => {
424427
show::plan_show_create_materialized_view(scx, stmt).map(Plan::ShowCreate)
425428
}
429+
Statement::Show(ShowStatement::ShowCreateReplacement(stmt)) => {
430+
show::plan_show_create_replacement(scx, stmt).map(Plan::ShowCreate)
431+
}
426432
Statement::Show(ShowStatement::ShowCreateType(stmt)) => {
427433
show::plan_show_create_type(scx, stmt).map(Plan::ShowCreate)
428434
}
@@ -1139,6 +1145,7 @@ impl<T: mz_sql_parser::ast::AstInfo> From<&Statement<T>> for StatementClassifica
11391145
Statement::Show(ShowStatement::ShowCreateTable(_)) => Show,
11401146
Statement::Show(ShowStatement::ShowCreateView(_)) => Show,
11411147
Statement::Show(ShowStatement::ShowCreateMaterializedView(_)) => Show,
1148+
Statement::Show(ShowStatement::ShowCreateReplacement(_)) => Show,
11421149
Statement::Show(ShowStatement::ShowCreateType(_)) => Show,
11431150
Statement::Show(ShowStatement::ShowObjects(_)) => Show,
11441151

0 commit comments

Comments
 (0)