diff --git a/crates/squawk_ide/src/goto_definition.rs b/crates/squawk_ide/src/goto_definition.rs index 265fa83b..7a9cd3e6 100644 --- a/crates/squawk_ide/src/goto_definition.rs +++ b/crates/squawk_ide/src/goto_definition.rs @@ -5007,6 +5007,62 @@ group by a$0 + 1 ); } + #[test] + fn goto_update_alias_hides_table_name() { + goto_not_found( + " +create table t(a int); +update t as u set a = t$0.a; +", + ); + } + + #[test] + fn goto_insert_alias_hides_table_name() { + goto_not_found( + " +create table t(a int); +insert into t as u values (1) returning t$0.a; +", + ); + } + + #[test] + fn goto_delete_alias_hides_table_name() { + goto_not_found( + " +create table t(a int); +delete from t as u where t$0.a = 1; +", + ); + } + + #[test] + fn goto_merge_alias_hides_target_table_name() { + goto_not_found( + " +create table t(a int); +create table s(a int); +merge into t as u + using s on t$0.a = s.a + when matched then do nothing; +", + ); + } + + #[test] + fn goto_merge_using_alias_hides_table_name() { + goto_not_found( + " +create table t(a int); +create table s(a int); +merge into t + using s as u on s$0.a = t.a + when matched then do nothing; +", + ); + } + #[test] fn goto_select_alias_in_order_by_with_cte() { assert_snapshot!(goto(" diff --git a/crates/squawk_ide/src/resolve.rs b/crates/squawk_ide/src/resolve.rs index 2b426a72..3694c343 100644 --- a/crates/squawk_ide/src/resolve.rs +++ b/crates/squawk_ide/src/resolve.rs @@ -1062,10 +1062,11 @@ fn match_table_in_returning_clause( } } - if let Some(alias_name) = alias.and_then(|x| x.name()) - && Name::from_node(&alias_name) == *table_name + let alias_name = alias.and_then(|x| x.name()); + if let Some(alias_name) = &alias_name + && Name::from_node(alias_name) == *table_name { - return Some(ReturningClauseMatch::TableAlias(alias_name)); + return Some(ReturningClauseMatch::TableAlias(alias_name.clone())); } let old_name = Name::from_string("old"); @@ -1074,7 +1075,7 @@ fn match_table_in_returning_clause( return Some(ReturningClauseMatch::PseudoTable); } - if *stmt_table_name == *table_name { + if alias_name.is_none() && *stmt_table_name == *table_name { return Some(ReturningClauseMatch::Table); } @@ -3067,9 +3068,18 @@ fn resolve_merge_table_name_ptr( let path = merge.relation_name()?.path()?; - // Check USING clause for the source table - MERGE-specific + // Check USING clause for the source table - MERGE-specific. + // A source alias hides the underlying table name. if let Some(from_item) = merge.using_on_clause().and_then(|x| x.from_item()) { - if let Some(item_name_ref) = from_item.name_ref() { + if let Some(alias_name) = from_item.alias().and_then(|x| x.name()) { + if Name::from_node(&alias_name) == table_name { + return Some(smallvec![Location::new( + file, + alias_name.syntax().text_range(), + LocationKind::Table + )]); + } + } else if let Some(item_name_ref) = from_item.name_ref() { let item_name = Name::from_node(&item_name_ref); if item_name == table_name { let position = table_name_ref.syntax().text_range().start(); @@ -3079,16 +3089,6 @@ fn resolve_merge_table_name_ptr( return Some(smallvec![Location::new(file, ptr.text_range(), kind)]); } } - // Check for aliased source tables - if let Some(alias_name) = from_item.alias().and_then(|x| x.name()) - && Name::from_node(&alias_name) == table_name - { - return Some(smallvec![Location::new( - file, - alias_name.syntax().text_range(), - LocationKind::Table - )]); - } } resolve_table_in_returning_clause(