@@ -56,6 +56,7 @@ use common_storages_result_cache::ResultCacheReader;
5656use common_storages_result_cache:: ResultScan ;
5757use common_storages_view:: view_table:: QUERY ;
5858use common_users:: UserApiProvider ;
59+ use dashmap:: DashMap ;
5960
6061use crate :: binder:: copy:: parse_stage_location_v2;
6162use crate :: binder:: location:: parse_uri_location;
@@ -139,7 +140,9 @@ impl Binder {
139140 } ;
140141 // Check and bind common table expression
141142 if let Some ( cte_info) = bind_context. ctes_map . get ( & table_name) {
142- return self . bind_cte ( bind_context, & table_name, alias, & cte_info) ;
143+ return self
144+ . bind_cte ( bind_context, & table_name, alias, & cte_info)
145+ . await ;
143146 }
144147
145148 if database == "system" {
@@ -154,15 +157,36 @@ impl Binder {
154157 } ;
155158
156159 // Resolve table with catalog
157- let table_meta: Arc < dyn Table > = self
160+ let table_meta = match self
158161 . resolve_data_source (
159162 tenant. as_str ( ) ,
160163 catalog. as_str ( ) ,
161164 database. as_str ( ) ,
162165 table_name. as_str ( ) ,
163166 & navigation_point,
164167 )
165- . await ?;
168+ . await
169+ {
170+ Ok ( table) => table,
171+ Err ( _) => {
172+ let mut parent = bind_context. parent . as_ref ( ) ;
173+ loop {
174+ if parent. is_none ( ) {
175+ break ;
176+ }
177+ if let Some ( cte_info) = parent. unwrap ( ) . ctes_map . get ( & table_name) {
178+ return self
179+ . bind_cte ( bind_context, & table_name, alias, & cte_info)
180+ . await ;
181+ }
182+ parent = parent. unwrap ( ) . parent . as_ref ( ) ;
183+ }
184+ return Err ( ErrorCode :: UnknownTable ( format ! (
185+ "Unknown table '{table_name}'"
186+ ) ) ) ;
187+ }
188+ } ;
189+
166190 match table_meta. engine ( ) {
167191 "VIEW" => {
168192 let query = table_meta
@@ -418,15 +442,23 @@ impl Binder {
418442 }
419443 }
420444
421- fn bind_cte (
445+ async fn bind_cte (
422446 & mut self ,
423447 bind_context : & BindContext ,
424448 table_name : & str ,
425449 alias : & Option < TableAlias > ,
426450 cte_info : & CteInfo ,
427451 ) -> Result < ( SExpr , BindContext ) > {
428- let mut new_bind_context = bind_context. clone ( ) ;
429- new_bind_context. columns = cte_info. bind_context . columns . clone ( ) ;
452+ let new_bind_context = BindContext {
453+ parent : Some ( Box :: new ( bind_context. clone ( ) ) ) ,
454+ columns : vec ! [ ] ,
455+ aggregate_info : Default :: default ( ) ,
456+ in_grouping : false ,
457+ ctes_map : Box :: new ( DashMap :: new ( ) ) ,
458+ is_view : false ,
459+ } ;
460+ let ( s_expr, mut new_bind_context) =
461+ self . bind_query ( & new_bind_context, & cte_info. query ) . await ?;
430462 let mut cols_alias = cte_info. columns_alias . clone ( ) ;
431463 if let Some ( alias) = alias {
432464 for ( idx, col_alias) in alias. columns . iter ( ) . enumerate ( ) {
@@ -456,7 +488,7 @@ impl Binder {
456488 for ( index, column_name) in cols_alias. iter ( ) . enumerate ( ) {
457489 new_bind_context. columns [ index] . column_name = column_name. clone ( ) ;
458490 }
459- Ok ( ( cte_info . s_expr . clone ( ) , new_bind_context) )
491+ Ok ( ( s_expr, new_bind_context) )
460492 }
461493
462494 async fn bind_base_table (
0 commit comments