@@ -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;
@@ -138,7 +139,9 @@ impl Binder {
138139 } ;
139140 // Check and bind common table expression
140141 if let Some ( cte_info) = bind_context. ctes_map . get ( & table_name) {
141- return self . bind_cte ( bind_context, & table_name, alias, & cte_info) ;
142+ return self
143+ . bind_cte ( bind_context, & table_name, alias, & cte_info)
144+ . await ;
142145 }
143146
144147 if database == "system" {
@@ -153,15 +156,36 @@ impl Binder {
153156 } ;
154157
155158 // Resolve table with catalog
156- let table_meta: Arc < dyn Table > = self
159+ let table_meta = match self
157160 . resolve_data_source (
158161 tenant. as_str ( ) ,
159162 catalog. as_str ( ) ,
160163 database. as_str ( ) ,
161164 table_name. as_str ( ) ,
162165 & navigation_point,
163166 )
164- . await ?;
167+ . await
168+ {
169+ Ok ( table) => table,
170+ Err ( _) => {
171+ let mut parent = bind_context. parent . as_ref ( ) ;
172+ loop {
173+ if parent. is_none ( ) {
174+ break ;
175+ }
176+ if let Some ( cte_info) = parent. unwrap ( ) . ctes_map . get ( & table_name) {
177+ return self
178+ . bind_cte ( bind_context, & table_name, alias, & cte_info)
179+ . await ;
180+ }
181+ parent = parent. unwrap ( ) . parent . as_ref ( ) ;
182+ }
183+ return Err ( ErrorCode :: UnknownTable ( format ! (
184+ "Unknown table '{table_name}'"
185+ ) ) ) ;
186+ }
187+ } ;
188+
165189 match table_meta. engine ( ) {
166190 "VIEW" => {
167191 let query = table_meta
@@ -417,15 +441,23 @@ impl Binder {
417441 }
418442 }
419443
420- fn bind_cte (
444+ async fn bind_cte (
421445 & mut self ,
422446 bind_context : & BindContext ,
423447 table_name : & str ,
424448 alias : & Option < TableAlias > ,
425449 cte_info : & CteInfo ,
426450 ) -> Result < ( SExpr , BindContext ) > {
427- let mut new_bind_context = bind_context. clone ( ) ;
428- new_bind_context. columns = cte_info. bind_context . columns . clone ( ) ;
451+ let new_bind_context = BindContext {
452+ parent : Some ( Box :: new ( bind_context. clone ( ) ) ) ,
453+ columns : vec ! [ ] ,
454+ aggregate_info : Default :: default ( ) ,
455+ in_grouping : false ,
456+ ctes_map : Box :: new ( DashMap :: new ( ) ) ,
457+ is_view : false ,
458+ } ;
459+ let ( s_expr, mut new_bind_context) =
460+ self . bind_query ( & new_bind_context, & cte_info. query ) . await ?;
429461 let mut cols_alias = cte_info. columns_alias . clone ( ) ;
430462 if let Some ( alias) = alias {
431463 for ( idx, col_alias) in alias. columns . iter ( ) . enumerate ( ) {
@@ -455,7 +487,7 @@ impl Binder {
455487 for ( index, column_name) in cols_alias. iter ( ) . enumerate ( ) {
456488 new_bind_context. columns [ index] . column_name = column_name. clone ( ) ;
457489 }
458- Ok ( ( cte_info . s_expr . clone ( ) , new_bind_context) )
490+ Ok ( ( s_expr, new_bind_context) )
459491 }
460492
461493 async fn bind_base_table (
0 commit comments