diff --git a/crates/squawk_ide/src/hover.rs b/crates/squawk_ide/src/hover.rs index 96571dd8..4efc48c6 100644 --- a/crates/squawk_ide/src/hover.rs +++ b/crates/squawk_ide/src/hover.rs @@ -1581,4 +1581,18 @@ select a$0 from y; ╰╴ ─ hover "); } + + #[test] + fn hover_on_cte_shadowing_table_with_star() { + assert_snapshot!(check_hover(" +create table t(a bigint); +with t as (select * from t) +select a$0 from t; +"), @r" + hover: column public.t.a bigint + ╭▸ + 4 │ select a from t; + ╰╴ ─ hover + "); + } } diff --git a/crates/squawk_ide/src/resolve.rs b/crates/squawk_ide/src/resolve.rs index 6765ac2a..229ac152 100644 --- a/crates/squawk_ide/src/resolve.rs +++ b/crates/squawk_ide/src/resolve.rs @@ -851,7 +851,11 @@ fn resolve_cte_column( { let from_table_name = Name::new(from_name_ref.syntax().text().to_string()); - return resolve_cte_column(name_ref, &from_table_name, column_name); + // Skip recursive CTE lookup if the FROM table has the same name as the current CTE + // (CTEs don't shadow themselves in their own definition) + if from_table_name != *cte_name { + return resolve_cte_column(name_ref, &from_table_name, column_name); + } } } }