diff --git a/crates/squawk_ide/src/goto_definition.rs b/crates/squawk_ide/src/goto_definition.rs index 85a8ede1..048c812d 100644 --- a/crates/squawk_ide/src/goto_definition.rs +++ b/crates/squawk_ide/src/goto_definition.rs @@ -2692,6 +2692,18 @@ drop table foo.t$0; "); } + #[test] + fn goto_column_not_in_cte_but_in_table() { + // we shouldn't navigate up to the table of the same name + goto_not_found( + r" +create table t (c int); +with t as (select 1 a) +select c$0 from t; +", + ); + } + #[test] fn goto_with_search_path_empty() { goto_not_found( diff --git a/crates/squawk_ide/src/resolve.rs b/crates/squawk_ide/src/resolve.rs index 2b16e987..b8d8c398 100644 --- a/crates/squawk_ide/src/resolve.rs +++ b/crates/squawk_ide/src/resolve.rs @@ -1112,10 +1112,13 @@ fn resolve_select_qualified_column_ptr( }; if schema.is_none() { - if let Some(cte_column_ptr) = - resolve_cte_column(binder, root, column_name_ref, &table_name, &column_name) - { - return Some(cte_column_ptr); + if resolve_cte_table(column_name_ref, &table_name).is_some() { + if let Some(cte_column_ptr) = + resolve_cte_column(binder, root, column_name_ref, &table_name, &column_name) + { + return Some(cte_column_ptr); + } + return None; } if let Some(alias_table_name) = resolve_alias(column_name_ref, &table_name) { table_name = alias_table_name; @@ -1245,11 +1248,13 @@ fn resolve_from_item_column_ptr( let (table_name, schema) = table_and_schema_from_from_item(from_item)?; - if schema.is_none() - && let Some(cte_column_ptr) = + if schema.is_none() && resolve_cte_table(column_name_ref, &table_name).is_some() { + if let Some(cte_column_ptr) = resolve_cte_column(binder, root, column_name_ref, &table_name, &column_name) - { - return Some(cte_column_ptr); + { + return Some(cte_column_ptr); + } + return None; } resolve_column_from_table_or_view( @@ -1838,6 +1843,13 @@ fn resolve_cte_table(name_ref: &ast::NameRef, cte_name: &Name) -> Option