diff --git a/e2e_test/streaming/changelog.slt b/e2e_test/streaming/changelog.slt index 649478ffcb98..668c94ac30e9 100644 --- a/e2e_test/streaming/changelog.slt +++ b/e2e_test/streaming/changelog.slt @@ -11,7 +11,8 @@ statement ok create table t3 (v1 int primary key, v2 int); statement ok -create materialized view mv1 as with sub as changelog from t1 select * from sub; +# test public.t1 due to https://github.com/risingwavelabs/risingwave/issues/18747 +create materialized view mv1 as with sub as changelog from public.t1 select * from sub; statement ok create materialized view mv2 as with sub as changelog from t2 select * from sub; diff --git a/src/frontend/src/binder/query.rs b/src/frontend/src/binder/query.rs index 7ad2091e6fb8..a6d39315c51c 100644 --- a/src/frontend/src/binder/query.rs +++ b/src/frontend/src/binder/query.rs @@ -20,7 +20,7 @@ use risingwave_common::catalog::Schema; use risingwave_common::types::DataType; use risingwave_common::util::sort_util::{ColumnOrder, OrderType}; use risingwave_sqlparser::ast::{ - Cte, CteInner, Expr, Fetch, ObjectName, OrderByExpr, Query, SetExpr, SetOperator, Value, With, + Cte, CteInner, Expr, Fetch, OrderByExpr, Query, SetExpr, SetOperator, Value, With, }; use thiserror_ext::AsReport; @@ -350,11 +350,8 @@ impl Binder { } CteInner::ChangeLog(from_table_name) => { self.push_context(); - let from_table_relation = self.bind_relation_by_name( - ObjectName::from(vec![from_table_name]), - None, - None, - )?; + let from_table_relation = + self.bind_relation_by_name(from_table_name.clone(), None, None)?; self.pop_context()?; self.context.cte_to_relation.insert( table_name, diff --git a/src/meta/src/controller/rename.rs b/src/meta/src/controller/rename.rs index 5f10a8946414..97ac2893f75a 100644 --- a/src/meta/src/controller/rename.rs +++ b/src/meta/src/controller/rename.rs @@ -156,7 +156,7 @@ impl QueryRewriter<'_> { match &mut cte_table.cte_inner { risingwave_sqlparser::ast::CteInner::Query(query) => self.visit_query(query), risingwave_sqlparser::ast::CteInner::ChangeLog(from) => { - *from = Ident::new_unchecked(self.to) + *from = ObjectName(vec![Ident::new_unchecked(self.to)]) } } } diff --git a/src/sqlparser/src/ast/query.rs b/src/sqlparser/src/ast/query.rs index be03a5f1133e..5b6bd469b572 100644 --- a/src/sqlparser/src/ast/query.rs +++ b/src/sqlparser/src/ast/query.rs @@ -335,9 +335,12 @@ impl fmt::Display for Cte { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match &self.cte_inner { CteInner::Query(query) => write!(f, "{} AS ({})", self.alias, query)?, - CteInner::ChangeLog(ident) => { - write!(f, "{} AS changelog from {}", self.alias, ident.value)? - } + CteInner::ChangeLog(obj_name) => write!( + f, + "{} AS changelog from {}", + self.alias, + obj_name.real_value() + )?, } Ok(()) } @@ -347,7 +350,7 @@ impl fmt::Display for Cte { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum CteInner { Query(Query), - ChangeLog(Ident), + ChangeLog(ObjectName), } /// One item of the comma-separated list following `SELECT` diff --git a/src/sqlparser/src/parser.rs b/src/sqlparser/src/parser.rs index a36844b5619f..7a2258fc9424 100644 --- a/src/sqlparser/src/parser.rs +++ b/src/sqlparser/src/parser.rs @@ -4130,7 +4130,7 @@ impl Parser<'_> { parser_err!("Expected 'changelog' but found '{}'", changelog); } self.expect_keyword(Keyword::FROM)?; - Ok(CteInner::ChangeLog(self.parse_identifier()?)) + Ok(CteInner::ChangeLog(self.parse_object_name()?)) } }