@@ -552,6 +552,12 @@ fn resolve_select_qualified_column_table(
552552 let from_clause = select. from_clause ( ) ?;
553553 let from_item = from_clause. from_items ( ) . next ( ) ?;
554554
555+ if let Some ( alias_name) = from_item. alias ( ) . and_then ( |a| a. name ( ) )
556+ && Name :: from_node ( & alias_name) == table_name
557+ {
558+ return Some ( SyntaxNodePtr :: new ( alias_name. syntax ( ) ) ) ;
559+ }
560+
555561 let ( table_name, schema) = if let Some ( name_ref_node) = from_item. name_ref ( ) {
556562 // `from foo`
557563 let from_table_name = Name :: from_node ( & name_ref_node) ;
@@ -618,7 +624,48 @@ fn resolve_select_qualified_column(
618624 let from_clause = select. from_clause ( ) ?;
619625 let from_item = from_clause. from_items ( ) . next ( ) ?;
620626
621- if let Some ( name_ref_node) = from_item. name_ref ( ) {
627+ // `from t as u`
628+ // `from t as u(a, b, c)`
629+ if let Some ( alias) = from_item. alias ( )
630+ && let Some ( alias_name) = alias. name ( )
631+ && Name :: from_node ( & alias_name) == column_table_name
632+ {
633+ // `from t as u(a, b, c)`
634+ if let Some ( column_list) = alias. column_list ( ) {
635+ for column in column_list. columns ( ) {
636+ if let Some ( col_name) = column. name ( )
637+ && Name :: from_node ( & col_name) == column_name
638+ {
639+ return Some ( SyntaxNodePtr :: new ( col_name. syntax ( ) ) ) ;
640+ }
641+ }
642+
643+ // ```sql
644+ // create table t(a int, b int);
645+ // select b from t as u(x);
646+ // ^
647+ // ```
648+ if let Some ( name_ref_node) = from_item. name_ref ( ) {
649+ let cte_name = Name :: from_node ( & name_ref_node) ;
650+ return resolve_cte_column ( name_ref, & cte_name, & column_name) ;
651+ }
652+ }
653+
654+ // `from t as u`
655+ if let Some ( name_ref_node) = from_item. name_ref ( ) {
656+ ( Name :: from_node ( & name_ref_node) , None )
657+ // `from foo.t as u`
658+ } else if let Some ( from_field_expr) = from_item. field_expr ( ) {
659+ let table_name = Name :: from_node ( & from_field_expr. field ( ) ?) ;
660+ let ast:: Expr :: NameRef ( schema_name_ref) = from_field_expr. base ( ) ? else {
661+ return None ;
662+ } ;
663+ let schema = Schema ( Name :: from_node ( & schema_name_ref) ) ;
664+ ( table_name, Some ( schema) )
665+ } else {
666+ return None ;
667+ }
668+ } else if let Some ( name_ref_node) = from_item. name_ref ( ) {
622669 // `from bar`
623670 let from_table_name = Name :: from_node ( & name_ref_node) ;
624671 if from_table_name == column_table_name {
0 commit comments