@@ -338,6 +338,18 @@ fn format_hover_for_column_node(
338338 return format_view_column ( & create_view, column_name, binder) ;
339339 }
340340
341+ if let Some ( alias) = ast:: Alias :: cast ( a. clone ( ) )
342+ && let Some ( alias_name) = alias. name ( )
343+ && alias. column_list ( ) . is_some ( )
344+ {
345+ let table_name = Name :: from_node ( & alias_name) ;
346+ let column_name = Name :: from_string ( column_name_node. text ( ) . to_string ( ) ) ;
347+ return Some ( ColumnHover :: table_column (
348+ & table_name. to_string ( ) ,
349+ & column_name. to_string ( ) ,
350+ ) ) ;
351+ }
352+
341353 if let Some ( create_table_as) = ast:: CreateTableAs :: cast ( a. clone ( ) ) {
342354 let column_name = if let Some ( name) = ast:: Name :: cast ( column_name_node. clone ( ) ) {
343355 Name :: from_node ( & name)
@@ -581,6 +593,9 @@ fn hover_unqualified_star_in_arg_list(
581593
582594fn hover_subquery_table ( def_node : & SyntaxNode ) -> Option < String > {
583595 let alias = def_node. ancestors ( ) . find_map ( ast:: Alias :: cast) ?;
596+ if alias. column_list ( ) . is_some ( ) {
597+ return None ;
598+ }
584599 let name = Name :: from_node ( & alias. name ( ) ?) ;
585600 let from_item = alias. syntax ( ) . ancestors ( ) . find_map ( ast:: FromItem :: cast) ?;
586601 let paren_select = from_item. paren_select ( ) ?;
@@ -671,10 +686,15 @@ fn collect_star_column_names(
671686 let table_name_node = table_ptr. to_node ( root) ;
672687
673688 if let Some ( paren_select) = ast:: ParenSelect :: cast ( table_name_node. clone ( ) ) {
674- return resolve:: collect_paren_select_columns_with_types ( binder, root, & paren_select)
675- . into_iter ( )
676- . map ( |( name, _ty) | name)
677- . collect ( ) ;
689+ let columns: Vec < Name > =
690+ resolve:: collect_paren_select_columns_with_types ( binder, root, & paren_select)
691+ . into_iter ( )
692+ . map ( |( name, _ty) | name)
693+ . collect ( ) ;
694+ if !columns. is_empty ( ) {
695+ return columns;
696+ }
697+ return collect_star_column_names_from_paren_select ( root, & paren_select, binder) ;
678698 }
679699
680700 match resolve:: find_table_source ( & table_name_node) {
@@ -720,6 +740,29 @@ fn collect_star_column_names(
720740 }
721741}
722742
743+ fn collect_star_column_names_from_paren_select (
744+ root : & SyntaxNode ,
745+ paren_select : & ast:: ParenSelect ,
746+ binder : & binder:: Binder ,
747+ ) -> Vec < Name > {
748+ let Some ( select_variant) = paren_select. select ( ) else {
749+ return vec ! [ ] ;
750+ } ;
751+ let ast:: SelectVariant :: Select ( select) = select_variant else {
752+ return vec ! [ ] ;
753+ } ;
754+ let Some ( from_clause) = select. from_clause ( ) else {
755+ return vec ! [ ] ;
756+ } ;
757+ let mut columns = vec ! [ ] ;
758+ for from_item in from_clause. from_items ( ) {
759+ if let Some ( table_ptr) = resolve:: table_ptr_from_from_item ( binder, & from_item) {
760+ columns. extend ( collect_star_column_names ( root, & table_ptr, binder) ) ;
761+ }
762+ }
763+ columns
764+ }
765+
723766fn hover_qualified_star_columns_from_table (
724767 root : & SyntaxNode ,
725768 create_table : & impl ast:: HasCreateTable ,
@@ -3235,6 +3278,19 @@ select u$0.x, u.y from t as u(x, y);
32353278 " ) ;
32363279 }
32373280
3281+ #[ test]
3282+ fn hover_on_cte_table_alias_with_column_list_column_ref ( ) {
3283+ assert_snapshot ! ( check_hover( "
3284+ with t as (select 1 a, 2 b, 3 c)
3285+ select u.x$0 from t as u(x, y);
3286+ " ) , @"
3287+ hover: column u.x
3288+ ╭▸
3289+ 3 │ select u.x from t as u(x, y);
3290+ ╰╴ ─ hover
3291+ " ) ;
3292+ }
3293+
32383294 #[ test]
32393295 fn hover_on_cte_table_alias_with_column_list_table_ref ( ) {
32403296 assert_snapshot ! ( check_hover( "
@@ -3248,6 +3304,32 @@ select u$0 from t as u(x, y);
32483304 " ) ;
32493305 }
32503306
3307+ #[ test]
3308+ fn hover_on_subquery_alias_with_column_list_table_ref ( ) {
3309+ assert_snapshot ! ( check_hover( "
3310+ with t as (select 1 a, 2 b, 3 c)
3311+ select z$0 from (select * from t) as z(x, y);
3312+ " ) , @"
3313+ hover: table z(x, y, c)
3314+ ╭▸
3315+ 3 │ select z from (select * from t) as z(x, y);
3316+ ╰╴ ─ hover
3317+ " ) ;
3318+ }
3319+
3320+ #[ test]
3321+ fn hover_on_subquery_nested_paren_alias_with_column_list_table_ref ( ) {
3322+ assert_snapshot ! ( check_hover( "
3323+ with t as (select 1 a, 2 b, 3 c)
3324+ select z$0 from ((select * from t)) as z(x, y);
3325+ " ) , @"
3326+ hover: table z(x, y, c)
3327+ ╭▸
3328+ 3 │ select z from ((select * from t)) as z(x, y);
3329+ ╰╴ ─ hover
3330+ " ) ;
3331+ }
3332+
32513333 #[ test]
32523334 fn hover_on_cte_table_alias_with_partial_column_list_star ( ) {
32533335 assert_snapshot ! ( check_hover( "
0 commit comments