From 2285ddd62bfe74fb8039121972d4c20e275986a8 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Sat, 7 Feb 2026 14:52:19 -0500 Subject: [PATCH] ide: goto def func call in on conflict --- crates/squawk_ide/src/classify.rs | 3 +++ crates/squawk_ide/src/goto_definition.rs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/crates/squawk_ide/src/classify.rs b/crates/squawk_ide/src/classify.rs index 0b0ab935..03381ee6 100644 --- a/crates/squawk_ide/src/classify.rs +++ b/crates/squawk_ide/src/classify.rs @@ -631,6 +631,9 @@ pub(crate) fn classify_name_ref(name_ref: &ast::NameRef) -> Option in_conflict_target = true; } if ast::Insert::can_cast(ancestor.kind()) { + if in_function_name && !in_special_sql_fn { + return Some(NameRefClass::SelectFunctionCall); + } if in_returning_clause || in_column_list || in_set_clause diff --git a/crates/squawk_ide/src/goto_definition.rs b/crates/squawk_ide/src/goto_definition.rs index f8998992..9a9ca0b7 100644 --- a/crates/squawk_ide/src/goto_definition.rs +++ b/crates/squawk_ide/src/goto_definition.rs @@ -7210,6 +7210,25 @@ insert into t values ('c', 'd') on conflict (c) do update set c = excluded.c$0;" "); } + #[test] + fn goto_insert_on_conflict_qualified_function() { + assert_snapshot!(goto(" +create function foo.lower(text) returns text + language internal; +create table t(c text); +insert into t values ('c') + on conflict (foo.lower$0(c)) + do nothing;" + ), @r" + ╭▸ + 2 │ create function foo.lower(text) returns text + │ ───── 2. destination + ‡ + 6 │ on conflict (foo.lower(c)) + ╰╴ ─ 1. source + "); + } + #[test] fn goto_delete_from_alias() { assert_snapshot!(goto("