Skip to main content

squawk_ide/
goto_definition.rs

1use crate::binder;
2use crate::offsets::token_from_offset;
3use crate::resolve;
4use rowan::{TextRange, TextSize};
5use smallvec::{SmallVec, smallvec};
6use squawk_syntax::{
7    SyntaxKind,
8    ast::{self, AstNode},
9};
10
11pub fn goto_definition(file: ast::SourceFile, offset: TextSize) -> SmallVec<[TextRange; 1]> {
12    let Some(token) = token_from_offset(&file, offset) else {
13        return smallvec![];
14    };
15    let Some(parent) = token.parent() else {
16        return smallvec![];
17    };
18
19    // goto def on case exprs
20    if (token.kind() == SyntaxKind::WHEN_KW && parent.kind() == SyntaxKind::WHEN_CLAUSE)
21        || (token.kind() == SyntaxKind::ELSE_KW && parent.kind() == SyntaxKind::ELSE_CLAUSE)
22        || (token.kind() == SyntaxKind::END_KW && parent.kind() == SyntaxKind::CASE_EXPR)
23    {
24        for parent in token.parent_ancestors() {
25            if let Some(case_expr) = ast::CaseExpr::cast(parent)
26                && let Some(case_token) = case_expr.case_token()
27            {
28                return smallvec![case_token.text_range()];
29            }
30        }
31    }
32
33    // goto def on COMMIT -> BEGIN/START TRANSACTION
34    if ast::Commit::can_cast(parent.kind()) {
35        if let Some(begin_range) = find_preceding_begin(&file, token.text_range().start()) {
36            return smallvec![begin_range];
37        }
38    }
39
40    // goto def on ROLLBACK -> BEGIN/START TRANSACTION
41    if ast::Rollback::can_cast(parent.kind()) {
42        if let Some(begin_range) = find_preceding_begin(&file, token.text_range().start()) {
43            return smallvec![begin_range];
44        }
45    }
46
47    // goto def on BEGIN/START TRANSACTION -> COMMIT or ROLLBACK
48    if ast::Begin::can_cast(parent.kind()) {
49        if let Some(end_range) = find_following_commit_or_rollback(&file, token.text_range().end())
50        {
51            return smallvec![end_range];
52        }
53    }
54
55    if let Some(name) = ast::Name::cast(parent.clone()) {
56        return smallvec![name.syntax().text_range()];
57    }
58
59    if let Some(name_ref) = ast::NameRef::cast(parent.clone()) {
60        let binder_output = binder::bind(&file);
61        let root = file.syntax();
62        if let Some(ptrs) = resolve::resolve_name_ref_ptrs(&binder_output, root, &name_ref) {
63            return ptrs
64                .iter()
65                .map(|ptr| ptr.to_node(file.syntax()).text_range())
66                .collect();
67        }
68    }
69
70    let type_node = ast::Type::cast(parent.clone()).or_else(|| {
71        // special case if we're at the timezone clause inside a timezone type
72        if ast::Timezone::can_cast(parent.kind()) {
73            parent.parent().and_then(ast::Type::cast)
74        } else {
75            None
76        }
77    });
78    if let Some(ty) = type_node {
79        let binder_output = binder::bind(&file);
80        let position = token.text_range().start();
81        if let Some(ptr) = resolve::resolve_type_ptr_from_type(&binder_output, &ty, position) {
82            return smallvec![ptr.to_node(file.syntax()).text_range()];
83        }
84    }
85
86    smallvec![]
87}
88
89fn find_preceding_begin(file: &ast::SourceFile, before: TextSize) -> Option<TextRange> {
90    let mut last_begin: Option<TextRange> = None;
91    for stmt in file.stmts() {
92        if let ast::Stmt::Begin(begin) = stmt {
93            let range = begin.syntax().text_range();
94            if range.end() <= before {
95                last_begin = Some(range);
96            }
97        }
98    }
99    last_begin
100}
101
102fn find_following_commit_or_rollback(file: &ast::SourceFile, after: TextSize) -> Option<TextRange> {
103    for stmt in file.stmts() {
104        let range = match &stmt {
105            ast::Stmt::Commit(commit) => commit.syntax().text_range(),
106            ast::Stmt::Rollback(rollback) => rollback.syntax().text_range(),
107            _ => continue,
108        };
109        if range.start() >= after {
110            return Some(range);
111        }
112    }
113    None
114}
115
116#[cfg(test)]
117mod test {
118    use crate::goto_definition::goto_definition;
119    use crate::test_utils::fixture;
120    use annotate_snippets::{AnnotationKind, Level, Renderer, Snippet, renderer::DecorStyle};
121    use insta::assert_snapshot;
122    use log::info;
123    use squawk_syntax::ast;
124
125    #[track_caller]
126    fn goto(sql: &str) -> String {
127        goto_(sql).expect("should always find a definition")
128    }
129
130    #[track_caller]
131    fn goto_(sql: &str) -> Option<String> {
132        info!("starting");
133        let (mut offset, sql) = fixture(sql);
134        // For go to def we want the previous character since we usually put the
135        // marker after the item we're trying to go to def on.
136        offset = offset.checked_sub(1.into()).unwrap_or_default();
137        let parse = ast::SourceFile::parse(&sql);
138        assert_eq!(parse.errors(), vec![]);
139        let file: ast::SourceFile = parse.tree();
140        let results = goto_definition(file, offset);
141        if !results.is_empty() {
142            let offset: usize = offset.into();
143            let mut snippet = Snippet::source(&sql).fold(true);
144
145            for (i, result) in results.iter().enumerate() {
146                snippet = snippet.annotation(
147                    AnnotationKind::Context
148                        .span((*result).into())
149                        .label(format!("{}. destination", i + 2)),
150                );
151            }
152
153            snippet = snippet.annotation(
154                AnnotationKind::Context
155                    .span(offset..offset + 1)
156                    .label("1. source"),
157            );
158
159            let group = Level::INFO.primary_title("definition").element(snippet);
160            let renderer = Renderer::plain().decor_style(DecorStyle::Unicode);
161            return Some(
162                renderer
163                    .render(&[group])
164                    .to_string()
165                    // hacky cleanup to make the text shorter
166                    .replace("info: definition", ""),
167            );
168        }
169        None
170    }
171
172    fn goto_not_found(sql: &str) {
173        assert!(goto_(sql).is_none(), "Should not find a definition");
174    }
175
176    #[test]
177    fn goto_case_when() {
178        assert_snapshot!(goto("
179select case when$0 x > 1 then 1 else 2 end;
180"), @r"
181          ╭▸ 
182        2 │ select case when x > 1 then 1 else 2 end;
183          │        ┬───    ─ 1. source
184          │        │
185          ╰╴       2. destination
186        ");
187    }
188
189    #[test]
190    fn goto_case_else() {
191        assert_snapshot!(goto("
192select case when x > 1 then 1 else$0 2 end;
193"), @r"
194          ╭▸ 
195        2 │ select case when x > 1 then 1 else 2 end;
196          ╰╴       ──── 2. destination       ─ 1. source
197        ");
198    }
199
200    #[test]
201    fn goto_case_end() {
202        assert_snapshot!(goto("
203select case when x > 1 then 1 else 2 end$0;
204"), @r"
205          ╭▸ 
206        2 │ select case when x > 1 then 1 else 2 end;
207          ╰╴       ──── 2. destination             ─ 1. source
208        ");
209    }
210
211    #[test]
212    fn goto_case_end_trailing_semi() {
213        assert_snapshot!(goto("
214select case when x > 1 then 1 else 2 end;$0
215"), @r"
216          ╭▸ 
217        2 │ select case when x > 1 then 1 else 2 end;
218          ╰╴       ──── 2. destination              ─ 1. source
219        ");
220    }
221
222    #[test]
223    fn goto_case_then_not_found() {
224        goto_not_found(
225            "
226select case when x > 1 then$0 1 else 2 end;
227",
228        )
229    }
230
231    #[test]
232    fn rollback_to_begin() {
233        assert_snapshot!(goto(
234            "
235begin;
236select 1;
237rollback$0;
238",
239        ), @r"
240          ╭▸ 
241        2 │ begin;
242          │ ───── 2. destination
243        3 │ select 1;
244        4 │ rollback;
245          ╰╴       ─ 1. source
246        ");
247    }
248
249    #[test]
250    fn goto_drop_table() {
251        assert_snapshot!(goto("
252create table t();
253drop table t$0;
254"), @r"
255          ╭▸ 
256        2 │ create table t();
257          │              ─ 2. destination
258        3 │ drop table t;
259          ╰╴           ─ 1. source
260        ");
261    }
262
263    #[test]
264    fn goto_drop_foreign_table() {
265        assert_snapshot!(goto("
266create foreign table t(a int) server s;
267drop foreign table t$0;
268"), @r"
269          ╭▸ 
270        2 │ create foreign table t(a int) server s;
271          │                      ─ 2. destination
272        3 │ drop foreign table t;
273          ╰╴                   ─ 1. source
274        ");
275    }
276
277    #[test]
278    fn goto_definition_prefers_previous_token() {
279        assert_snapshot!(goto("
280create table t(a int);
281select t.$0a from t;
282"), @r"
283          ╭▸ 
284        2 │ create table t(a int);
285          │              ─ 2. destination
286        3 │ select t.a from t;
287          ╰╴        ─ 1. source
288        ");
289
290        assert_snapshot!(goto("
291create type ty as (a int, b int);
292with t as (select '(1,2)'::ty c)
293select (c)$0.a from t;
294"), @r"
295          ╭▸ 
296        3 │ with t as (select '(1,2)'::ty c)
297          │                               ─ 2. destination
298        4 │ select (c).a from t;
299          ╰╴         ─ 1. source
300        ");
301        assert_snapshot!(goto("
302create function f() returns int as 'select 1' language sql;
303select f($0);
304"), @r"
305          ╭▸ 
306        2 │ create function f() returns int as 'select 1' language sql;
307          │                 ─ 2. destination
308        3 │ select f();
309          ╰╴        ─ 1. source
310        ");
311
312        assert_snapshot!(goto("
313with t as (select array[1,2,3]::int[] c)
314select c[$01] from t;
315"), @r"
316          ╭▸ 
317        2 │ with t as (select array[1,2,3]::int[] c)
318          │                                       ─ 2. destination
319        3 │ select c[1] from t;
320          ╰╴        ─ 1. source
321        ");
322
323        assert_snapshot!(goto("
324with t as (select array[1,2,3]::int[] c, 1 b)
325select c[b]$0 from t;
326"), @r"
327          ╭▸ 
328        2 │ with t as (select array[1,2,3]::int[] c, 1 b)
329          │                                            ─ 2. destination
330        3 │ select c[b] from t;
331          ╰╴          ─ 1. source
332        ");
333    }
334
335    #[test]
336    fn goto_fetch_cursor() {
337        assert_snapshot!(goto("
338declare c scroll cursor for select * from t;
339fetch forward 5 from c$0;
340"), @r"
341          ╭▸ 
342        2 │ declare c scroll cursor for select * from t;
343          │         ─ 2. destination
344        3 │ fetch forward 5 from c;
345          ╰╴                     ─ 1. source
346        ");
347    }
348
349    #[test]
350    fn goto_close_cursor() {
351        assert_snapshot!(goto("
352declare c scroll cursor for select * from t;
353close c$0;
354"), @r"
355          ╭▸ 
356        2 │ declare c scroll cursor for select * from t;
357          │         ─ 2. destination
358        3 │ close c;
359          ╰╴      ─ 1. source
360        ");
361    }
362
363    #[test]
364    fn goto_move_cursor() {
365        assert_snapshot!(goto("
366declare c scroll cursor for select * from t;
367move forward 10 from c$0;
368"), @r"
369          ╭▸ 
370        2 │ declare c scroll cursor for select * from t;
371          │         ─ 2. destination
372        3 │ move forward 10 from c;
373          ╰╴                     ─ 1. source
374        ");
375    }
376
377    #[test]
378    fn goto_execute_prepared_statement() {
379        assert_snapshot!(goto("
380prepare stmt as select 1;
381execute stmt$0;
382"), @r"
383          ╭▸ 
384        2 │ prepare stmt as select 1;
385          │         ──── 2. destination
386        3 │ execute stmt;
387          ╰╴           ─ 1. source
388        ");
389    }
390
391    #[test]
392    fn goto_deallocate_prepared_statement() {
393        assert_snapshot!(goto("
394prepare stmt as select 1;
395deallocate stmt$0;
396"), @r"
397          ╭▸ 
398        2 │ prepare stmt as select 1;
399          │         ──── 2. destination
400        3 │ deallocate stmt;
401          ╰╴              ─ 1. source
402        ");
403    }
404
405    #[test]
406    fn goto_notify_channel() {
407        assert_snapshot!(goto("
408listen updates;
409notify updates$0;
410"), @r"
411          ╭▸ 
412        2 │ listen updates;
413          │        ─────── 2. destination
414        3 │ notify updates;
415          ╰╴             ─ 1. source
416        ");
417    }
418
419    #[test]
420    fn goto_unlisten_channel() {
421        assert_snapshot!(goto("
422listen updates;
423unlisten updates$0;
424"), @r"
425          ╭▸ 
426        2 │ listen updates;
427          │        ─────── 2. destination
428        3 │ unlisten updates;
429          ╰╴               ─ 1. source
430        ");
431    }
432
433    #[test]
434    fn goto_delete_where_current_of_cursor() {
435        assert_snapshot!(goto("
436declare c scroll cursor for select * from t;
437delete from t where current of c$0;
438"), @r"
439          ╭▸ 
440        2 │ declare c scroll cursor for select * from t;
441          │         ─ 2. destination
442        3 │ delete from t where current of c;
443          ╰╴                               ─ 1. source
444        ");
445    }
446
447    #[test]
448    fn goto_update_where_current_of_cursor() {
449        assert_snapshot!(goto("
450declare c scroll cursor for select * from t;
451update t set a = a + 10 where current of c$0;
452"), @r"
453          ╭▸ 
454        2 │ declare c scroll cursor for select * from t;
455          │         ─ 2. destination
456        3 │ update t set a = a + 10 where current of c;
457          ╰╴                                         ─ 1. source
458        ");
459    }
460
461    #[test]
462    fn goto_with_table_star() {
463        assert_snapshot!(goto("
464with t as (select 1 a)
465select t$0.* from t;
466"), @r"
467          ╭▸ 
468        2 │ with t as (select 1 a)
469          │      ─ 2. destination
470        3 │ select t.* from t;
471          ╰╴       ─ 1. source
472        ");
473    }
474
475    #[test]
476    fn goto_drop_sequence() {
477        assert_snapshot!(goto("
478create sequence s;
479drop sequence s$0;
480"), @r"
481          ╭▸ 
482        2 │ create sequence s;
483          │                 ─ 2. destination
484        3 │ drop sequence s;
485          ╰╴              ─ 1. source
486        ");
487    }
488
489    #[test]
490    fn goto_drop_trigger() {
491        assert_snapshot!(goto("
492create trigger tr before insert on t for each row execute function f();
493drop trigger tr$0 on t;
494"), @r"
495          ╭▸ 
496        2 │ create trigger tr before insert on t for each row execute function f();
497          │                ── 2. destination
498        3 │ drop trigger tr on t;
499          ╰╴              ─ 1. source
500        ");
501    }
502
503    #[test]
504    fn goto_drop_policy() {
505        assert_snapshot!(goto("
506create table t(c int);
507create table u(c int);
508create policy p on t;
509create policy p on u;
510drop policy if exists p$0 on t;
511"), @r"
512          ╭▸ 
513        4 │ create policy p on t;
514          │               ─ 2. destination
515        5 │ create policy p on u;
516        6 │ drop policy if exists p on t;
517          ╰╴                      ─ 1. source
518        ");
519    }
520
521    #[test]
522    fn goto_alter_policy() {
523        assert_snapshot!(goto("
524create table t(c int);
525create policy p on t;
526alter policy p$0 on t
527  with check (c > 1);
528"), @r"
529          ╭▸ 
530        3 │ create policy p on t;
531          │               ─ 2. destination
532        4 │ alter policy p on t
533          ╰╴             ─ 1. source
534        ");
535    }
536
537    #[test]
538    fn goto_alter_policy_column() {
539        assert_snapshot!(goto("
540create table t(c int);
541create policy p on t;
542alter policy p on t
543  with check (c$0 > 1);
544"), @r"
545          ╭▸ 
546        3 │ create policy p on t;
547          │               ─ 2. destination
548        4 │ alter policy p on t
549        5 │   with check (c > 1);
550          ╰╴              ─ 1. source
551        ");
552    }
553
554    #[test]
555    fn goto_create_policy_column() {
556        assert_snapshot!(goto("
557create table t(c int, d int);
558create policy p on t
559  with check (c$0 > d);
560"), @r"
561          ╭▸ 
562        2 │ create table t(c int, d int);
563          │                ─ 2. destination
564        3 │ create policy p on t
565        4 │   with check (c > d);
566          ╰╴              ─ 1. source
567        ");
568    }
569
570    #[test]
571    fn goto_create_policy_using_column() {
572        assert_snapshot!(goto("
573create table t(c int, d int);
574create policy p on t
575  using (c$0 > d and 1 < 2);
576"), @r"
577          ╭▸ 
578        2 │ create table t(c int, d int);
579          │                ─ 2. destination
580        3 │ create policy p on t
581        4 │   using (c > d and 1 < 2);
582          ╰╴         ─ 1. source
583        ");
584    }
585
586    #[test]
587    fn goto_create_policy_qualified_column_table() {
588        assert_snapshot!(goto("
589create table t(c int, d int);
590create policy p on t
591  with check (t$0.c > d);
592"), @r"
593          ╭▸ 
594        2 │ create table t(c int, d int);
595          │              ─ 2. destination
596        3 │ create policy p on t
597        4 │   with check (t.c > d);
598          ╰╴              ─ 1. source
599        ");
600    }
601
602    #[test]
603    fn goto_create_policy_qualified_column() {
604        assert_snapshot!(goto("
605create table t(c int, d int);
606create policy p on t
607  with check (t.c$0 > d);
608"), @r"
609          ╭▸ 
610        2 │ create table t(c int, d int);
611          │                ─ 2. destination
612        3 │ create policy p on t
613        4 │   with check (t.c > d);
614          ╰╴                ─ 1. source
615        ");
616    }
617
618    #[test]
619    fn goto_create_policy_field_style_function_call() {
620        assert_snapshot!(goto("
621create table t(c int);
622create function x(t) returns int8
623  as 'select 1'
624  language sql;
625create policy p on t
626  with check (t.c > 1 and t.x$0 > 0);
627"), @r"
628          ╭▸ 
629        3 │ create function x(t) returns int8
630          │                 ─ 2. destination
631632        7 │   with check (t.c > 1 and t.x > 0);
633          ╰╴                            ─ 1. source
634        ");
635    }
636
637    #[test]
638    fn goto_alter_policy_qualified_column_table() {
639        assert_snapshot!(goto("
640create table t(c int, d int);
641alter policy p on t
642  with check (t$0.c > d);
643"), @r"
644          ╭▸ 
645        2 │ create table t(c int, d int);
646          │              ─ 2. destination
647        3 │ alter policy p on t
648        4 │   with check (t.c > d);
649          ╰╴              ─ 1. source
650        ");
651    }
652
653    #[test]
654    fn goto_alter_policy_qualified_column() {
655        assert_snapshot!(goto("
656create table t(c int, d int);
657alter policy p on t
658  with check (t.c$0 > d);
659"), @r"
660          ╭▸ 
661        2 │ create table t(c int, d int);
662          │                ─ 2. destination
663        3 │ alter policy p on t
664        4 │   with check (t.c > d);
665          ╰╴                ─ 1. source
666        ");
667    }
668
669    #[test]
670    fn goto_create_policy_schema_qualified_table() {
671        assert_snapshot!(goto("
672create schema foo;
673create table foo.t(c int);
674create policy p on foo.t
675  with check (foo.t$0.c > 1);
676"), @r"
677          ╭▸ 
678        3 │ create table foo.t(c int);
679          │                  ─ 2. destination
680        4 │ create policy p on foo.t
681        5 │   with check (foo.t.c > 1);
682          ╰╴                  ─ 1. source
683        ");
684    }
685
686    #[test]
687    fn goto_create_policy_unqualified_table_with_schema_on_table() {
688        assert_snapshot!(goto("
689create schema foo;
690create table foo.t(c int);
691create policy p on foo.t
692  with check (t$0.c > 1);
693"), @r"
694          ╭▸ 
695        3 │ create table foo.t(c int);
696          │                  ─ 2. destination
697        4 │ create policy p on foo.t
698        5 │   with check (t.c > 1);
699          ╰╴              ─ 1. source
700        ");
701    }
702
703    #[test]
704    fn goto_drop_event_trigger() {
705        assert_snapshot!(goto("
706create event trigger et on ddl_command_start execute function f();
707drop event trigger et$0;
708"), @r"
709          ╭▸ 
710        2 │ create event trigger et on ddl_command_start execute function f();
711          │                      ── 2. destination
712        3 │ drop event trigger et;
713          ╰╴                    ─ 1. source
714        ");
715    }
716
717    #[test]
718    fn goto_alter_event_trigger() {
719        assert_snapshot!(goto("
720create event trigger et on ddl_command_start execute function f();
721alter event trigger et$0 disable;
722"), @r"
723          ╭▸ 
724        2 │ create event trigger et on ddl_command_start execute function f();
725          │                      ── 2. destination
726        3 │ alter event trigger et disable;
727          ╰╴                     ─ 1. source
728        ");
729    }
730
731    #[test]
732    fn goto_create_event_trigger_function() {
733        assert_snapshot!(goto("
734create function f() returns event_trigger as 'select 1' language sql;
735create event trigger et on ddl_command_start execute function f$0();
736"), @r"
737          ╭▸ 
738        2 │ create function f() returns event_trigger as 'select 1' language sql;
739          │                 ─ 2. destination
740        3 │ create event trigger et on ddl_command_start execute function f();
741          ╰╴                                                              ─ 1. source
742        ");
743    }
744
745    #[test]
746    fn goto_create_event_trigger_procedure() {
747        assert_snapshot!(goto("
748create procedure p() language sql as 'select 1';
749create event trigger tr
750  on ddl_command_end
751  execute procedure p$0();
752"), @r"
753          ╭▸ 
754        2 │ create procedure p() language sql as 'select 1';
755          │                  ─ 2. destination
756757        5 │   execute procedure p();
758          ╰╴                    ─ 1. source
759        ");
760    }
761
762    #[test]
763    fn goto_create_trigger_function() {
764        assert_snapshot!(goto("
765create function f() returns trigger as 'select 1' language sql;
766create trigger tr before insert on t for each row execute function f$0();
767"), @r"
768          ╭▸ 
769        2 │ create function f() returns trigger as 'select 1' language sql;
770          │                 ─ 2. destination
771        3 │ create trigger tr before insert on t for each row execute function f();
772          ╰╴                                                                   ─ 1. source
773        ");
774    }
775
776    #[test]
777    fn goto_create_trigger_procedure() {
778        assert_snapshot!(goto("
779create procedure a() language sql as 'select 1';
780create trigger tr before truncate or delete or insert
781on t
782execute procedure a$0();
783"), @r"
784          ╭▸ 
785        2 │ create procedure a() language sql as 'select 1';
786          │                  ─ 2. destination
787788        5 │ execute procedure a();
789          ╰╴                  ─ 1. source
790        ");
791    }
792
793    #[test]
794    fn goto_drop_trigger_table_specific() {
795        assert_snapshot!(goto("
796create table u(a int);
797create trigger tr before truncate
798on u
799execute function noop();
800
801create table t(b int);
802create trigger tr before truncate
803on t
804execute function noop();
805
806drop trigger tr$0 on t;
807"), @r"
808           ╭▸ 
809         8 │ create trigger tr before truncate
810           │                ── 2. destination
811812        12 │ drop trigger tr on t;
813           ╰╴              ─ 1. source
814        ");
815    }
816
817    #[test]
818    fn goto_create_trigger_table() {
819        assert_snapshot!(goto("
820create table t(b int);
821create trigger tr before truncate
822on t$0
823execute function noop();
824"), @r"
825          ╭▸ 
826        2 │ create table t(b int);
827          │              ─ 2. destination
828        3 │ create trigger tr before truncate
829        4 │ on t
830          ╰╴   ─ 1. source
831        ");
832    }
833
834    #[test]
835    fn goto_create_sequence_owned_by() {
836        assert_snapshot!(goto("
837create table t(c serial);
838create sequence s
839  owned by t.c$0;
840"), @r"
841          ╭▸ 
842        2 │ create table t(c serial);
843          │                ─ 2. destination
844        3 │ create sequence s
845        4 │   owned by t.c;
846          ╰╴             ─ 1. source
847        ");
848    }
849
850    #[test]
851    fn goto_drop_tablespace() {
852        assert_snapshot!(goto("
853create tablespace ts location '/tmp/ts';
854drop tablespace ts$0;
855"), @r"
856          ╭▸ 
857        2 │ create tablespace ts location '/tmp/ts';
858          │                   ── 2. destination
859        3 │ drop tablespace ts;
860          ╰╴                 ─ 1. source
861        ");
862    }
863
864    #[test]
865    fn goto_create_table_tablespace() {
866        assert_snapshot!(goto("
867create tablespace bar location '/tmp/ts';
868create table t (a int) tablespace b$0ar;
869"), @r"
870          ╭▸ 
871        2 │ create tablespace bar location '/tmp/ts';
872          │                   ─── 2. destination
873        3 │ create table t (a int) tablespace bar;
874          ╰╴                                  ─ 1. source
875        ");
876    }
877
878    #[test]
879    fn goto_drop_database() {
880        assert_snapshot!(goto("
881create database mydb;
882drop database my$0db;
883"), @r"
884          ╭▸ 
885        2 │ create database mydb;
886          │                 ──── 2. destination
887        3 │ drop database mydb;
888          ╰╴               ─ 1. source
889        ");
890    }
891
892    #[test]
893    fn goto_drop_role() {
894        assert_snapshot!(goto("
895create role reader;
896drop role read$0er;
897"), @r"
898          ╭▸ 
899        2 │ create role reader;
900          │             ────── 2. destination
901        3 │ drop role reader;
902          ╰╴             ─ 1. source
903        ");
904    }
905
906    #[test]
907    fn goto_alter_role() {
908        assert_snapshot!(goto("
909create role reader;
910alter role read$0er rename to writer;
911"), @r"
912          ╭▸ 
913        2 │ create role reader;
914          │             ────── 2. destination
915        3 │ alter role reader rename to writer;
916          ╰╴              ─ 1. source
917        ");
918    }
919
920    #[test]
921    fn goto_set_role() {
922        assert_snapshot!(goto("
923create role reader;
924set role read$0er;
925"), @r"
926          ╭▸ 
927        2 │ create role reader;
928          │             ────── 2. destination
929        3 │ set role reader;
930          ╰╴            ─ 1. source
931        ");
932    }
933
934    #[test]
935    fn goto_create_tablespace_owner_role() {
936        assert_snapshot!(goto("
937create role reader;
938create tablespace t owner read$0er location 'foo';
939"), @r"
940          ╭▸ 
941        2 │ create role reader;
942          │             ────── 2. destination
943        3 │ create tablespace t owner reader location 'foo';
944          ╰╴                             ─ 1. source
945        ");
946    }
947
948    #[test]
949    fn goto_role_definition_returns_self() {
950        assert_snapshot!(goto("
951create role read$0er;
952"), @r"
953          ╭▸ 
954        2 │ create role reader;
955          │             ┬──┬──
956          │             │  │
957          │             │  1. source
958          ╰╴            2. destination
959        ");
960    }
961
962    #[test]
963    fn goto_drop_database_defined_after() {
964        assert_snapshot!(goto("
965drop database my$0db;
966create database mydb;
967"), @r"
968          ╭▸ 
969        2 │ drop database mydb;
970          │                ─ 1. source
971        3 │ create database mydb;
972          ╰╴                ──── 2. destination
973        ");
974    }
975
976    #[test]
977    fn goto_database_definition_returns_self() {
978        assert_snapshot!(goto("
979create database my$0db;
980"), @r"
981          ╭▸ 
982        2 │ create database mydb;
983          │                 ┬┬──
984          │                 ││
985          │                 │1. source
986          ╰╴                2. destination
987        ");
988    }
989
990    #[test]
991    fn goto_drop_server() {
992        assert_snapshot!(goto("
993create server myserver foreign data wrapper fdw;
994drop server my$0server;
995"), @r"
996          ╭▸ 
997        2 │ create server myserver foreign data wrapper fdw;
998          │               ──────── 2. destination
999        3 │ drop server myserver;
1000          ╰╴             ─ 1. source
1001        ");
1002    }
1003
1004    #[test]
1005    fn goto_drop_server_defined_after() {
1006        assert_snapshot!(goto("
1007drop server my$0server;
1008create server myserver foreign data wrapper fdw;
1009"), @r"
1010          ╭▸ 
1011        2 │ drop server myserver;
1012          │              ─ 1. source
1013        3 │ create server myserver foreign data wrapper fdw;
1014          ╰╴              ──────── 2. destination
1015        ");
1016    }
1017
1018    #[test]
1019    fn goto_alter_server() {
1020        assert_snapshot!(goto("
1021create server myserver foreign data wrapper fdw;
1022alter server my$0server options (add foo 'bar');
1023"), @r"
1024          ╭▸ 
1025        2 │ create server myserver foreign data wrapper fdw;
1026          │               ──────── 2. destination
1027        3 │ alter server myserver options (add foo 'bar');
1028          ╰╴              ─ 1. source
1029        ");
1030    }
1031
1032    #[test]
1033    fn goto_server_definition_returns_self() {
1034        assert_snapshot!(goto("
1035create server my$0server foreign data wrapper fdw;
1036"), @r"
1037          ╭▸ 
1038        2 │ create server myserver foreign data wrapper fdw;
1039          │               ┬┬──────
1040          │               ││
1041          │               │1. source
1042          ╰╴              2. destination
1043        ");
1044    }
1045
1046    #[test]
1047    fn goto_drop_extension() {
1048        assert_snapshot!(goto("
1049create extension myext;
1050drop extension my$0ext;
1051"), @r"
1052          ╭▸ 
1053        2 │ create extension myext;
1054          │                  ───── 2. destination
1055        3 │ drop extension myext;
1056          ╰╴                ─ 1. source
1057        ");
1058    }
1059
1060    #[test]
1061    fn goto_drop_extension_defined_after() {
1062        assert_snapshot!(goto("
1063drop extension my$0ext;
1064create extension myext;
1065"), @r"
1066          ╭▸ 
1067        2 │ drop extension myext;
1068          │                 ─ 1. source
1069        3 │ create extension myext;
1070          ╰╴                 ───── 2. destination
1071        ");
1072    }
1073
1074    #[test]
1075    fn goto_alter_extension() {
1076        assert_snapshot!(goto("
1077create extension myext;
1078alter extension my$0ext update to '2.0';
1079"), @r"
1080          ╭▸ 
1081        2 │ create extension myext;
1082          │                  ───── 2. destination
1083        3 │ alter extension myext update to '2.0';
1084          ╰╴                 ─ 1. source
1085        ");
1086    }
1087
1088    #[test]
1089    fn goto_extension_definition_returns_self() {
1090        assert_snapshot!(goto("
1091create extension my$0ext;
1092"), @r"
1093          ╭▸ 
1094        2 │ create extension myext;
1095          │                  ┬┬───
1096          │                  ││
1097          │                  │1. source
1098          ╰╴                 2. destination
1099        ");
1100    }
1101
1102    #[test]
1103    fn goto_drop_sequence_with_schema() {
1104        assert_snapshot!(goto("
1105create sequence foo.s;
1106drop sequence foo.s$0;
1107"), @r"
1108          ╭▸ 
1109        2 │ create sequence foo.s;
1110          │                     ─ 2. destination
1111        3 │ drop sequence foo.s;
1112          ╰╴                  ─ 1. source
1113        ");
1114    }
1115
1116    #[test]
1117    fn goto_drop_table_with_schema() {
1118        assert_snapshot!(goto("
1119create table public.t();
1120drop table t$0;
1121"), @r"
1122          ╭▸ 
1123        2 │ create table public.t();
1124          │                     ─ 2. destination
1125        3 │ drop table t;
1126          ╰╴           ─ 1. source
1127        ");
1128
1129        assert_snapshot!(goto("
1130create table foo.t();
1131drop table foo.t$0;
1132"), @r"
1133          ╭▸ 
1134        2 │ create table foo.t();
1135          │                  ─ 2. destination
1136        3 │ drop table foo.t;
1137          ╰╴               ─ 1. source
1138        ");
1139
1140        goto_not_found(
1141            "
1142-- defaults to public schema
1143create table t();
1144drop table foo.t$0;
1145",
1146        );
1147    }
1148
1149    #[test]
1150    fn goto_drop_temp_table() {
1151        assert_snapshot!(goto("
1152create temp table t();
1153drop table t$0;
1154"), @r"
1155          ╭▸ 
1156        2 │ create temp table t();
1157          │                   ─ 2. destination
1158        3 │ drop table t;
1159          ╰╴           ─ 1. source
1160        ");
1161    }
1162
1163    #[test]
1164    fn goto_drop_temporary_table() {
1165        assert_snapshot!(goto("
1166create temporary table t();
1167drop table t$0;
1168"), @r"
1169          ╭▸ 
1170        2 │ create temporary table t();
1171          │                        ─ 2. destination
1172        3 │ drop table t;
1173          ╰╴           ─ 1. source
1174        ");
1175    }
1176
1177    #[test]
1178    fn goto_drop_temp_table_with_pg_temp_schema() {
1179        assert_snapshot!(goto("
1180create temp table t();
1181drop table pg_temp.t$0;
1182"), @r"
1183          ╭▸ 
1184        2 │ create temp table t();
1185          │                   ─ 2. destination
1186        3 │ drop table pg_temp.t;
1187          ╰╴                   ─ 1. source
1188        ");
1189    }
1190
1191    #[test]
1192    fn goto_table_definition_returns_self() {
1193        assert_snapshot!(goto("
1194create table t$0(x bigint, y bigint);
1195"), @r"
1196          ╭▸ 
1197        2 │ create table t(x bigint, y bigint);
1198          │              ┬
1199          │              │
1200          │              2. destination
1201          ╰╴             1. source
1202        ");
1203    }
1204
1205    #[test]
1206    fn goto_foreign_table_column() {
1207        assert_snapshot!(goto("
1208create foreign table ft(a int)
1209  server s;
1210
1211select a$0 from ft;
1212"), @r"
1213          ╭▸ 
1214        2 │ create foreign table ft(a int)
1215          │                         ─ 2. destination
12161217        5 │ select a from ft;
1218          ╰╴       ─ 1. source
1219        ");
1220    }
1221
1222    #[test]
1223    fn goto_foreign_table_definition() {
1224        assert_snapshot!(goto("
1225create foreign table ft(a int)
1226  server s;
1227
1228select a from ft$0;
1229"), @r"
1230          ╭▸ 
1231        2 │ create foreign table ft(a int)
1232          │                      ── 2. destination
12331234        5 │ select a from ft;
1235          ╰╴               ─ 1. source
1236        ");
1237    }
1238
1239    #[test]
1240    fn goto_foreign_table_server_name() {
1241        assert_snapshot!(goto("
1242create server myserver foreign data wrapper fdw;
1243create foreign table ft(a int)
1244  server my$0server;
1245"), @r"
1246          ╭▸ 
1247        2 │ create server myserver foreign data wrapper fdw;
1248          │               ──────── 2. destination
1249        3 │ create foreign table ft(a int)
1250        4 │   server myserver;
1251          ╰╴          ─ 1. source
1252        ");
1253    }
1254
1255    #[test]
1256    fn goto_foreign_table_server_name_defined_after() {
1257        assert_snapshot!(goto("
1258create foreign table ft(a int)
1259  server my$0server;
1260create server myserver foreign data wrapper fdw;
1261"), @r"
1262          ╭▸ 
1263        3 │   server myserver;
1264          │           ─ 1. source
1265        4 │ create server myserver foreign data wrapper fdw;
1266          ╰╴              ──────── 2. destination
1267        ");
1268    }
1269
1270    #[test]
1271    fn goto_user_mapping_server_name() {
1272        assert_snapshot!(goto("
1273create server myserver foreign data wrapper fdw;
1274create user mapping for current_user server my$0server;
1275"), @r"
1276          ╭▸ 
1277        2 │ create server myserver foreign data wrapper fdw;
1278          │               ──────── 2. destination
1279        3 │ create user mapping for current_user server myserver;
1280          ╰╴                                             ─ 1. source
1281        ");
1282    }
1283
1284    #[test]
1285    fn goto_foreign_key_references_table() {
1286        assert_snapshot!(goto("
1287create table foo(id int);
1288create table bar(
1289  id int,
1290  foo_id int,
1291  foreign key (foo_id) references foo$0(id)
1292);
1293"), @r"
1294          ╭▸ 
1295        2 │ create table foo(id int);
1296          │              ─── 2. destination
12971298        6 │   foreign key (foo_id) references foo(id)
1299          ╰╴                                    ─ 1. source
1300        ");
1301    }
1302
1303    #[test]
1304    fn goto_foreign_key_on_delete_set_null_column() {
1305        assert_snapshot!(goto("
1306create table users (
1307  user_id integer not null,
1308  primary key (user_id)
1309);
1310
1311create table posts (
1312  post_id integer not null,
1313  author_id integer,
1314  primary key (post_id),
1315  foreign key (author_id) references users on delete set null (author_id$0)
1316);
1317"), @r"
1318           ╭▸ 
1319         9 │   author_id integer,
1320           │   ───────── 2. destination
1321        10 │   primary key (post_id),
1322        11 │   foreign key (author_id) references users on delete set null (author_id)
1323           ╰╴                                                                       ─ 1. source
1324        ");
1325    }
1326
1327    #[test]
1328    fn goto_references_constraint_table() {
1329        assert_snapshot!(goto("
1330create table t (
1331  id serial primary key
1332);
1333
1334create table u (
1335  id serial primary key,
1336  t_id int references t$0
1337);
1338"), @r"
1339          ╭▸ 
1340        2 │ create table t (
1341          │              ─ 2. destination
13421343        8 │   t_id int references t
1344          ╰╴                      ─ 1. source
1345        ");
1346    }
1347
1348    #[test]
1349    fn goto_references_constraint_column() {
1350        assert_snapshot!(goto("
1351create table t (
1352  id serial primary key
1353);
1354
1355create table u (
1356  id serial primary key,
1357  t_id int references t(id$0)
1358);
1359"), @r"
1360          ╭▸ 
1361        3 │   id serial primary key
1362          │   ── 2. destination
13631364        8 │   t_id int references t(id)
1365          ╰╴                         ─ 1. source
1366        ");
1367    }
1368
1369    #[test]
1370    fn goto_foreign_key_references_column() {
1371        assert_snapshot!(goto("
1372create table foo(id int);
1373create table bar(
1374  id int,
1375  foo_id int,
1376  foreign key (foo_id) references foo(id$0)
1377);
1378"), @r"
1379          ╭▸ 
1380        2 │ create table foo(id int);
1381          │                  ── 2. destination
13821383        6 │   foreign key (foo_id) references foo(id)
1384          ╰╴                                       ─ 1. source
1385        ");
1386    }
1387
1388    #[test]
1389    fn goto_foreign_key_local_column() {
1390        assert_snapshot!(goto("
1391create table bar(
1392  id int,
1393  foo_id int,
1394  foreign key (foo_id$0) references foo(id)
1395);
1396"), @r"
1397          ╭▸ 
1398        4 │   foo_id int,
1399          │   ────── 2. destination
1400        5 │   foreign key (foo_id) references foo(id)
1401          ╰╴                    ─ 1. source
1402        ");
1403    }
1404
1405    #[test]
1406    fn goto_alter_table_foreign_key_local_column() {
1407        assert_snapshot!(goto("
1408create table t (
1409  id bigserial primary key
1410);
1411
1412create table u (
1413  id bigserial primary key,
1414  t_id bigint
1415);
1416
1417alter table u
1418  add constraint fooo_fkey
1419  foreign key (t_id$0) references t (id);
1420"), @r"
1421           ╭▸ 
1422         8 │   t_id bigint
1423           │   ──── 2. destination
14241425        13 │   foreign key (t_id) references t (id);
1426           ╰╴                  ─ 1. source
1427        ");
1428    }
1429
1430    #[test]
1431    fn goto_check_constraint_column() {
1432        assert_snapshot!(goto("
1433create table t (
1434  b int check (b > 10),
1435  c int check (c$0 > 10) no inherit
1436);
1437"), @r"
1438          ╭▸ 
1439        4 │   c int check (c > 10) no inherit
1440          │   ┬            ─ 1. source
1441          │   │
1442          ╰╴  2. destination
1443        ");
1444    }
1445
1446    #[test]
1447    fn goto_generated_column() {
1448        assert_snapshot!(goto("
1449create table t (
1450  a int,
1451  b int generated always as (
1452    a$0 * 2
1453  ) stored
1454);
1455"), @r"
1456          ╭▸ 
1457        3 │   a int,
1458          │   ─ 2. destination
1459        4 │   b int generated always as (
1460        5 │     a * 2
1461          ╰╴    ─ 1. source
1462        ");
1463    }
1464
1465    #[test]
1466    fn goto_generated_column_function_call() {
1467        assert_snapshot!(goto("
1468create function pg_catalog.lower(text) returns text
1469  language internal;
1470
1471create table articles (
1472  id serial primary key,
1473  title text not null,
1474  body text not null,
1475  title_lower text generated always as (
1476    lower$0(title)
1477  ) stored
1478);
1479"), @r"
1480           ╭▸ 
1481         2 │ create function pg_catalog.lower(text) returns text
1482           │                            ───── 2. destination
14831484        10 │     lower(title)
1485           ╰╴        ─ 1. source
1486        ");
1487    }
1488
1489    #[test]
1490    fn goto_index_expr_function_call() {
1491        assert_snapshot!(goto("
1492create function lower(text) returns text language internal;
1493create table articles (
1494  id serial primary key,
1495  title text not null
1496);
1497create index on articles (lower$0(title));
1498"), @r"
1499          ╭▸ 
1500        2 │ create function lower(text) returns text language internal;
1501          │                 ───── 2. destination
15021503        7 │ create index on articles (lower(title));
1504          ╰╴                              ─ 1. source
1505        ");
1506    }
1507
1508    #[test]
1509    fn goto_exclude_constraint_expr_function_call() {
1510        assert_snapshot!(goto("
1511create function lower(text) returns text language internal;
1512create table articles (
1513  title text not null,
1514  exclude using btree (lower$0(title) with =)
1515);
1516"), @r"
1517          ╭▸ 
1518        2 │ create function lower(text) returns text language internal;
1519          │                 ───── 2. destination
15201521        5 │   exclude using btree (lower(title) with =)
1522          ╰╴                           ─ 1. source
1523        ");
1524    }
1525
1526    #[test]
1527    fn goto_partition_by_expr_function_call() {
1528        assert_snapshot!(goto("
1529create function lower(text) returns text language internal;
1530create table articles (
1531  id serial primary key,
1532  title text not null
1533) partition by range (lower$0(title));
1534"), @r"
1535          ╭▸ 
1536        2 │ create function lower(text) returns text language internal;
1537          │                 ───── 2. destination
15381539        6 │ ) partition by range (lower(title));
1540          ╰╴                          ─ 1. source
1541        ");
1542    }
1543
1544    #[test]
1545    fn goto_table_check_constraint_column() {
1546        assert_snapshot!(goto("
1547create table t (
1548  a int,
1549  b text,
1550  check (a$0 > b)
1551);
1552"), @r"
1553          ╭▸ 
1554        3 │   a int,
1555          │   ─ 2. destination
1556        4 │   b text,
1557        5 │   check (a > b)
1558          ╰╴         ─ 1. source
1559        ");
1560    }
1561
1562    #[test]
1563    fn goto_table_unique_constraint_column() {
1564        assert_snapshot!(goto("
1565create table t (
1566  a int,
1567  b text,
1568  unique (a$0)
1569);
1570"), @r"
1571          ╭▸ 
1572        3 │   a int,
1573          │   ─ 2. destination
1574        4 │   b text,
1575        5 │   unique (a)
1576          ╰╴          ─ 1. source
1577        ");
1578    }
1579
1580    #[test]
1581    fn goto_table_primary_key_constraint_column() {
1582        assert_snapshot!(goto("
1583create table t (
1584  id bigint generated always as identity,
1585  inserted_at timestamptz not null default now(),
1586  primary key (id, inserted_at$0)
1587);
1588"), @r"
1589          ╭▸ 
1590        4 │   inserted_at timestamptz not null default now(),
1591          │   ─────────── 2. destination
1592        5 │   primary key (id, inserted_at)
1593          ╰╴                             ─ 1. source
1594        ");
1595    }
1596
1597    #[test]
1598    fn goto_table_not_null_constraint_column() {
1599        assert_snapshot!(goto("
1600create table t (
1601  id integer,
1602  name text,
1603  not null name$0
1604);
1605"), @r"
1606          ╭▸ 
1607        4 │   name text,
1608          │   ──── 2. destination
1609        5 │   not null name
1610          ╰╴              ─ 1. source
1611        ");
1612    }
1613
1614    #[test]
1615    fn goto_table_exclude_constraint_column() {
1616        assert_snapshot!(goto("
1617create table circles (
1618  c circle,
1619  exclude using gist (c$0 with &&)
1620);
1621"), @r"
1622          ╭▸ 
1623        3 │   c circle,
1624          │   ─ 2. destination
1625        4 │   exclude using gist (c with &&)
1626          ╰╴                      ─ 1. source
1627        ");
1628    }
1629
1630    #[test]
1631    fn goto_table_exclude_constraint_include_column() {
1632        assert_snapshot!(goto("
1633create table t (
1634  a int,
1635  b text,
1636  exclude using btree ( a with > ) 
1637    include (a$0, b)
1638);
1639"), @r"
1640          ╭▸ 
1641        3 │   a int,
1642          │   ─ 2. destination
16431644        6 │     include (a, b)
1645          ╰╴             ─ 1. source
1646        ");
1647    }
1648
1649    #[test]
1650    fn goto_table_exclude_constraint_where_column() {
1651        assert_snapshot!(goto("
1652create table t (
1653  a int,
1654  b text,
1655  exclude using btree ( a with > ) 
1656    where ( a$0 > 10 and b like '%foo' )
1657);
1658"), @r"
1659          ╭▸ 
1660        3 │   a int,
1661          │   ─ 2. destination
16621663        6 │     where ( a > 10 and b like '%foo' )
1664          ╰╴            ─ 1. source
1665        ");
1666    }
1667
1668    #[test]
1669    fn goto_table_partition_by_column() {
1670        assert_snapshot!(goto("
1671create table t (
1672  id bigint generated always as identity,
1673  inserted_at timestamptz not null default now()
1674) partition by range (inserted_at$0);
1675"), @r"
1676          ╭▸ 
1677        4 │   inserted_at timestamptz not null default now()
1678          │   ─────────── 2. destination
1679        5 │ ) partition by range (inserted_at);
1680          ╰╴                                ─ 1. source
1681        ");
1682    }
1683
1684    #[test]
1685    fn goto_table_partition_of_table() {
1686        assert_snapshot!(goto("
1687create table t ();
1688create table t_2026_01_02 partition of t$0
1689    for values from ('2026-01-02') to ('2026-01-03');
1690"), @r"
1691          ╭▸ 
1692        2 │ create table t ();
1693          │              ─ 2. destination
1694        3 │ create table t_2026_01_02 partition of t
1695          ╰╴                                       ─ 1. source
1696        ");
1697    }
1698
1699    #[test]
1700    fn goto_table_partition_of_cycle() {
1701        goto_not_found(
1702            "
1703create table part1 partition of part2
1704    for values from ('2026-01-02') to ('2026-01-03');
1705create table part2 partition of part1
1706    for values from ('2026-01-02') to ('2026-01-03');
1707select a$0 from part2;
1708",
1709        );
1710    }
1711
1712    #[test]
1713    fn goto_partition_table_column() {
1714        assert_snapshot!(goto("
1715create table part (
1716  a int,
1717  inserted_at timestamptz not null default now()
1718) partition by range (inserted_at);
1719create table part_2026_01_02 partition of part
1720    for values from ('2026-01-02') to ('2026-01-03');
1721select a$0 from part_2026_01_02;
1722"), @r"
1723          ╭▸ 
1724        3 │   a int,
1725          │   ─ 2. destination
17261727        8 │ select a from part_2026_01_02;
1728          ╰╴       ─ 1. source
1729        ");
1730    }
1731
1732    #[test]
1733    fn goto_alter_index_attach_partition() {
1734        assert_snapshot!(goto("
1735create table t (
1736  inserted_at timestamptz not null default now()
1737) partition by range (inserted_at);
1738create table part partition of t
1739    for values from ('2026-01-02') to ('2026-01-03');
1740alter index t attach partition part$0;
1741"), @r"
1742          ╭▸ 
1743        5 │ create table part partition of t
1744          │              ──── 2. destination
1745        6 │     for values from ('2026-01-02') to ('2026-01-03');
1746        7 │ alter index t attach partition part;
1747          ╰╴                                  ─ 1. source
1748        ");
1749    }
1750
1751    #[test]
1752    fn goto_create_table_like_clause() {
1753        assert_snapshot!(goto("
1754create table large_data_table(a text);
1755create table t (
1756  a text,
1757  like large_data_table$0,
1758  b integer
1759);
1760"), @r"
1761          ╭▸ 
1762        2 │ create table large_data_table(a text);
1763          │              ──────────────── 2. destination
17641765        5 │   like large_data_table,
1766          ╰╴                      ─ 1. source
1767        ");
1768    }
1769
1770    #[test]
1771    fn goto_create_table_inherits() {
1772        assert_snapshot!(goto("
1773create table bar(a int);
1774create table t (a int)
1775inherits (foo.bar, bar$0, buzz);
1776"), @r"
1777          ╭▸ 
1778        2 │ create table bar(a int);
1779          │              ─── 2. destination
1780        3 │ create table t (a int)
1781        4 │ inherits (foo.bar, bar, buzz);
1782          ╰╴                     ─ 1. source
1783        ");
1784    }
1785
1786    #[test]
1787    fn goto_create_table_like_clause_columns() {
1788        assert_snapshot!(goto("
1789create table t(a int, b int);
1790create table u(like t, c int);
1791select a$0, c from u;
1792"), @r"
1793          ╭▸ 
1794        2 │ create table t(a int, b int);
1795          │                ─ 2. destination
1796        3 │ create table u(like t, c int);
1797        4 │ select a, c from u;
1798          ╰╴       ─ 1. source
1799        ");
1800    }
1801
1802    #[test]
1803    fn goto_create_table_like_clause_local_column() {
1804        assert_snapshot!(goto("
1805create table t(a int, b int);
1806create table u(like t, c int);
1807select a, c$0 from u;
1808"), @r"
1809          ╭▸ 
1810        3 │ create table u(like t, c int);
1811          │                        ─ 2. destination
1812        4 │ select a, c from u;
1813          ╰╴          ─ 1. source
1814        ");
1815    }
1816
1817    #[test]
1818    fn goto_create_table_like_clause_multi() {
1819        assert_snapshot!(goto("
1820create table t(a int, b int);
1821create table u(x int, y int);
1822create table k(like t, like u, c int);
1823select y$0 from k;
1824"), @r"
1825          ╭▸ 
1826        3 │ create table u(x int, y int);
1827          │                       ─ 2. destination
1828        4 │ create table k(like t, like u, c int);
1829        5 │ select y from k;
1830          ╰╴       ─ 1. source
1831        ");
1832    }
1833
1834    #[test]
1835    fn goto_create_table_inherits_column() {
1836        assert_snapshot!(goto("
1837create table t (
1838  a int, b text
1839);
1840create table u (
1841  c int
1842) inherits (t);
1843select a$0 from u;
1844"), @r"
1845          ╭▸ 
1846        3 │   a int, b text
1847          │   ─ 2. destination
18481849        8 │ select a from u;
1850          ╰╴       ─ 1. source
1851        ");
1852    }
1853
1854    #[test]
1855    fn goto_create_table_inherits_local_column() {
1856        assert_snapshot!(goto("
1857create table t (
1858  a int, b text
1859);
1860create table u (
1861  c int
1862) inherits (t);
1863select c$0 from u;
1864"), @r"
1865          ╭▸ 
1866        6 │   c int
1867          │   ─ 2. destination
1868        7 │ ) inherits (t);
1869        8 │ select c from u;
1870          ╰╴       ─ 1. source
1871        ");
1872    }
1873
1874    #[test]
1875    fn goto_create_table_inherits_multiple_parents() {
1876        assert_snapshot!(goto("
1877create table t1 (
1878  a int
1879);
1880create table t2 (
1881  b text
1882);
1883create table u (
1884  c int
1885) inherits (t1, t2);
1886select b$0 from u;
1887"), @r"
1888           ╭▸ 
1889         6 │   b text
1890           │   ─ 2. destination
18911892        11 │ select b from u;
1893           ╰╴       ─ 1. source
1894        ");
1895    }
1896
1897    #[test]
1898    fn goto_create_foreign_table_inherits_column() {
1899        assert_snapshot!(goto("
1900create server myserver foreign data wrapper postgres_fdw;
1901create table t (
1902  a int, b text
1903);
1904create foreign table u (
1905  c int
1906) inherits (t) server myserver;
1907select a$0 from u;
1908"), @r"
1909          ╭▸ 
1910        4 │   a int, b text
1911          │   ─ 2. destination
19121913        9 │ select a from u;
1914          ╰╴       ─ 1. source
1915        ");
1916    }
1917
1918    #[test]
1919    fn goto_drop_temp_table_shadows_public() {
1920        // temp tables shadow public tables when no schema is specified
1921        assert_snapshot!(goto("
1922create table t();
1923create temp table t();
1924drop table t$0;
1925"), @r"
1926          ╭▸ 
1927        2 │ create table t();
1928          │              ─ 2. destination
1929        3 │ create temp table t();
1930        4 │ drop table t;
1931          ╰╴           ─ 1. source
1932        ");
1933    }
1934
1935    #[test]
1936    fn goto_drop_public_table_when_temp_exists() {
1937        // can still access public table explicitly
1938        assert_snapshot!(goto("
1939create table t();
1940create temp table t();
1941drop table public.t$0;
1942"), @r"
1943          ╭▸ 
1944        2 │ create table t();
1945          │              ─ 2. destination
1946        3 │ create temp table t();
1947        4 │ drop table public.t;
1948          ╰╴                  ─ 1. source
1949        ");
1950    }
1951
1952    #[test]
1953    fn goto_drop_table_defined_after() {
1954        assert_snapshot!(goto("
1955drop table t$0;
1956create table t();
1957"), @r"
1958          ╭▸ 
1959        2 │ drop table t;
1960          │            ─ 1. source
1961        3 │ create table t();
1962          ╰╴             ─ 2. destination
1963        ");
1964    }
1965
1966    #[test]
1967    fn goto_drop_type() {
1968        assert_snapshot!(goto("
1969create type t as enum ('a', 'b');
1970drop type t$0;
1971"), @r"
1972          ╭▸ 
1973        2 │ create type t as enum ('a', 'b');
1974          │             ─ 2. destination
1975        3 │ drop type t;
1976          ╰╴          ─ 1. source
1977        ");
1978    }
1979
1980    #[test]
1981    fn goto_drop_type_with_schema() {
1982        assert_snapshot!(goto("
1983create type public.t as enum ('a', 'b');
1984drop type t$0;
1985"), @r"
1986          ╭▸ 
1987        2 │ create type public.t as enum ('a', 'b');
1988          │                    ─ 2. destination
1989        3 │ drop type t;
1990          ╰╴          ─ 1. source
1991        ");
1992
1993        assert_snapshot!(goto("
1994create type foo.t as enum ('a', 'b');
1995drop type foo.t$0;
1996"), @r"
1997          ╭▸ 
1998        2 │ create type foo.t as enum ('a', 'b');
1999          │                 ─ 2. destination
2000        3 │ drop type foo.t;
2001          ╰╴              ─ 1. source
2002        ");
2003
2004        goto_not_found(
2005            "
2006create type t as enum ('a', 'b');
2007drop type foo.t$0;
2008",
2009        );
2010    }
2011
2012    #[test]
2013    fn goto_drop_type_defined_after() {
2014        assert_snapshot!(goto("
2015drop type t$0;
2016create type t as enum ('a', 'b');
2017"), @r"
2018          ╭▸ 
2019        2 │ drop type t;
2020          │           ─ 1. source
2021        3 │ create type t as enum ('a', 'b');
2022          ╰╴            ─ 2. destination
2023        ");
2024    }
2025
2026    #[test]
2027    fn goto_drop_type_composite() {
2028        assert_snapshot!(goto("
2029create type person as (name text, age int);
2030drop type person$0;
2031"), @r"
2032          ╭▸ 
2033        2 │ create type person as (name text, age int);
2034          │             ────── 2. destination
2035        3 │ drop type person;
2036          ╰╴               ─ 1. source
2037        ");
2038    }
2039
2040    #[test]
2041    fn goto_create_table_type_reference() {
2042        assert_snapshot!(goto("
2043create type person_info as (name text, email text);
2044create table user(id int, member person_info$0);
2045"), @r"
2046          ╭▸ 
2047        2 │ create type person_info as (name text, email text);
2048          │             ─────────── 2. destination
2049        3 │ create table user(id int, member person_info);
2050          ╰╴                                           ─ 1. source
2051        ");
2052    }
2053
2054    #[test]
2055    fn goto_function_param_table_type() {
2056        assert_snapshot!(goto("
2057create table t(a int, b int);
2058create function b(t$0) returns int as 'select 1' language sql;
2059"), @r"
2060          ╭▸ 
2061        2 │ create table t(a int, b int);
2062          │              ─ 2. destination
2063        3 │ create function b(t) returns int as 'select 1' language sql;
2064          ╰╴                  ─ 1. source
2065        ");
2066    }
2067
2068    #[test]
2069    fn goto_function_param_time_type() {
2070        assert_snapshot!(goto("
2071create type timestamp;
2072create function f(timestamp$0 without time zone) returns text language internal;
2073"), @r"
2074          ╭▸ 
2075        2 │ create type timestamp;
2076          │             ───────── 2. destination
2077        3 │ create function f(timestamp without time zone) returns text language internal;
2078          ╰╴                          ─ 1. source
2079        ");
2080    }
2081
2082    #[test]
2083    fn goto_function_param_time_type_no_timezone() {
2084        assert_snapshot!(goto("
2085create type time;
2086create function f(time$0) returns text language internal;
2087"), @r"
2088  ╭▸ 
20892 │ create type time;
2090  │             ──── 2. destination
20913 │ create function f(time) returns text language internal;
2092  ╰╴                     ─ 1. source
2093");
2094    }
2095
2096    #[test]
2097    fn goto_create_table_type_reference_enum() {
2098        assert_snapshot!(goto("
2099create type mood as enum ('sad', 'ok', 'happy');
2100create table users(id int, mood mood$0);
2101"), @r"
2102          ╭▸ 
2103        2 │ create type mood as enum ('sad', 'ok', 'happy');
2104          │             ──── 2. destination
2105        3 │ create table users(id int, mood mood);
2106          ╰╴                                   ─ 1. source
2107        ");
2108    }
2109
2110    #[test]
2111    fn goto_create_table_type_reference_range() {
2112        assert_snapshot!(goto("
2113create type int4_range as range (subtype = int4);
2114create table metrics(id int, span int4_range$0);
2115"), @r"
2116          ╭▸ 
2117        2 │ create type int4_range as range (subtype = int4);
2118          │             ────────── 2. destination
2119        3 │ create table metrics(id int, span int4_range);
2120          ╰╴                                           ─ 1. source
2121        ");
2122    }
2123
2124    #[test]
2125    fn goto_create_table_type_reference_input_output() {
2126        assert_snapshot!(goto("
2127create type myint (input = myintin, output = myintout, like = int4);
2128create table data(id int, value myint$0);
2129"), @r"
2130          ╭▸ 
2131        2 │ create type myint (input = myintin, output = myintout, like = int4);
2132          │             ───── 2. destination
2133        3 │ create table data(id int, value myint);
2134          ╰╴                                    ─ 1. source
2135        ");
2136    }
2137
2138    #[test]
2139    fn goto_composite_type_field() {
2140        assert_snapshot!(goto("
2141create type person_info as (name text, email text);
2142create table user(id int, member person_info);
2143select (member).name$0 from user;
2144"), @r"
2145          ╭▸ 
2146        2 │ create type person_info as (name text, email text);
2147          │                             ──── 2. destination
2148        3 │ create table user(id int, member person_info);
2149        4 │ select (member).name from user;
2150          ╰╴                   ─ 1. source
2151        ");
2152    }
2153
2154    #[test]
2155    fn goto_drop_type_range() {
2156        assert_snapshot!(goto("
2157create type int4_range as range (subtype = int4);
2158drop type int4_range$0;
2159"), @r"
2160          ╭▸ 
2161        2 │ create type int4_range as range (subtype = int4);
2162          │             ────────── 2. destination
2163        3 │ drop type int4_range;
2164          ╰╴                   ─ 1. source
2165        ");
2166    }
2167
2168    #[test]
2169    fn goto_drop_domain() {
2170        assert_snapshot!(goto("
2171create domain posint as integer check (value > 0);
2172drop domain posint$0;
2173"), @r"
2174          ╭▸ 
2175        2 │ create domain posint as integer check (value > 0);
2176          │               ────── 2. destination
2177        3 │ drop domain posint;
2178          ╰╴                 ─ 1. source
2179        ");
2180    }
2181
2182    #[test]
2183    fn goto_cast_to_domain() {
2184        assert_snapshot!(goto("
2185create domain posint as integer check (value > 0);
2186select 1::posint$0;
2187"), @r"
2188          ╭▸ 
2189        2 │ create domain posint as integer check (value > 0);
2190          │               ────── 2. destination
2191        3 │ select 1::posint;
2192          ╰╴               ─ 1. source
2193        ");
2194    }
2195
2196    #[test]
2197    fn goto_drop_type_domain() {
2198        assert_snapshot!(goto("
2199create domain posint as integer check (value > 0);
2200drop type posint$0;
2201"), @r"
2202          ╭▸ 
2203        2 │ create domain posint as integer check (value > 0);
2204          │               ────── 2. destination
2205        3 │ drop type posint;
2206          ╰╴               ─ 1. source
2207        ");
2208    }
2209
2210    #[test]
2211    fn goto_drop_view() {
2212        assert_snapshot!(goto("
2213create view v as select 1;
2214drop view v$0;
2215"), @r"
2216          ╭▸ 
2217        2 │ create view v as select 1;
2218          │             ─ 2. destination
2219        3 │ drop view v;
2220          ╰╴          ─ 1. source
2221        ");
2222    }
2223
2224    #[test]
2225    fn goto_drop_materialized_view() {
2226        assert_snapshot!(goto("
2227create materialized view v as select 1;
2228drop materialized view v$0;
2229"), @r"
2230          ╭▸ 
2231        2 │ create materialized view v as select 1;
2232          │                          ─ 2. destination
2233        3 │ drop materialized view v;
2234          ╰╴                       ─ 1. source
2235        ");
2236    }
2237
2238    #[test]
2239    fn goto_drop_view_with_schema() {
2240        assert_snapshot!(goto("
2241create view public.v as select 1;
2242drop view v$0;
2243"), @r"
2244          ╭▸ 
2245        2 │ create view public.v as select 1;
2246          │                    ─ 2. destination
2247        3 │ drop view v;
2248          ╰╴          ─ 1. source
2249        ");
2250
2251        assert_snapshot!(goto("
2252create view foo.v as select 1;
2253drop view foo.v$0;
2254"), @r"
2255          ╭▸ 
2256        2 │ create view foo.v as select 1;
2257          │                 ─ 2. destination
2258        3 │ drop view foo.v;
2259          ╰╴              ─ 1. source
2260        ");
2261
2262        goto_not_found(
2263            "
2264create view v as select 1;
2265drop view foo.v$0;
2266",
2267        );
2268    }
2269
2270    #[test]
2271    fn goto_drop_temp_view() {
2272        assert_snapshot!(goto("
2273create temp view v as select 1;
2274drop view v$0;
2275"), @r"
2276          ╭▸ 
2277        2 │ create temp view v as select 1;
2278          │                  ─ 2. destination
2279        3 │ drop view v;
2280          ╰╴          ─ 1. source
2281        ");
2282    }
2283
2284    #[test]
2285    fn goto_select_from_view() {
2286        assert_snapshot!(goto("
2287create view v as select 1;
2288select * from v$0;
2289"), @r"
2290          ╭▸ 
2291        2 │ create view v as select 1;
2292          │             ─ 2. destination
2293        3 │ select * from v;
2294          ╰╴              ─ 1. source
2295        ");
2296    }
2297
2298    #[test]
2299    fn goto_select_from_materialized_view() {
2300        assert_snapshot!(goto("
2301create materialized view v as select 1;
2302select * from v$0;
2303"), @r"
2304          ╭▸ 
2305        2 │ create materialized view v as select 1;
2306          │                          ─ 2. destination
2307        3 │ select * from v;
2308          ╰╴              ─ 1. source
2309        ");
2310    }
2311
2312    #[test]
2313    fn goto_select_from_view_with_schema() {
2314        assert_snapshot!(goto("
2315create view public.v as select 1;
2316select * from public.v$0;
2317"), @r"
2318          ╭▸ 
2319        2 │ create view public.v as select 1;
2320          │                    ─ 2. destination
2321        3 │ select * from public.v;
2322          ╰╴                     ─ 1. source
2323        ");
2324    }
2325
2326    #[test]
2327    fn goto_view_column() {
2328        assert_snapshot!(goto("
2329create view v as select 1 as a;
2330select a$0 from v;
2331"), @r"
2332          ╭▸ 
2333        2 │ create view v as select 1 as a;
2334          │                              ─ 2. destination
2335        3 │ select a from v;
2336          ╰╴       ─ 1. source
2337        ");
2338    }
2339
2340    #[test]
2341    fn goto_view_column_qualified() {
2342        assert_snapshot!(goto("
2343create view v as select 1 as a;
2344select v.a$0 from v;
2345"), @r"
2346          ╭▸ 
2347        2 │ create view v as select 1 as a;
2348          │                              ─ 2. destination
2349        3 │ select v.a from v;
2350          ╰╴         ─ 1. source
2351        ");
2352    }
2353
2354    #[test]
2355    fn goto_create_table_as_column() {
2356        assert_snapshot!(goto("
2357create table t as select 1 a;
2358select a$0 from t;
2359"), @r"
2360          ╭▸ 
2361        2 │ create table t as select 1 a;
2362          │                            ─ 2. destination
2363        3 │ select a from t;
2364          ╰╴       ─ 1. source
2365        ");
2366    }
2367
2368    #[test]
2369    fn goto_select_from_create_table_as() {
2370        assert_snapshot!(goto("
2371create table t as select 1 a;
2372select a from t$0;
2373"), @r"
2374          ╭▸ 
2375        2 │ create table t as select 1 a;
2376          │              ─ 2. destination
2377        3 │ select a from t;
2378          ╰╴              ─ 1. source
2379        ");
2380    }
2381
2382    #[test]
2383    fn goto_view_with_explicit_column_list() {
2384        assert_snapshot!(goto("
2385create view v(col1) as select 1;
2386select * from v$0;
2387"), @r"
2388          ╭▸ 
2389        2 │ create view v(col1) as select 1;
2390          │             ─ 2. destination
2391        3 │ select * from v;
2392          ╰╴              ─ 1. source
2393        ");
2394    }
2395
2396    #[test]
2397    fn goto_view_column_with_explicit_column_list() {
2398        assert_snapshot!(goto("
2399    create view v(col1) as select 1;
2400    select col1$0 from v;
2401    "), @r"
2402          ╭▸ 
2403        2 │     create view v(col1) as select 1;
2404          │                   ──── 2. destination
2405        3 │     select col1 from v;
2406          ╰╴              ─ 1. source
2407        ");
2408    }
2409
2410    #[test]
2411    fn goto_view_column_with_schema() {
2412        assert_snapshot!(goto("
2413create view public.v as select 1 as a;
2414select a$0 from public.v;
2415"), @r"
2416          ╭▸ 
2417        2 │ create view public.v as select 1 as a;
2418          │                                     ─ 2. destination
2419        3 │ select a from public.v;
2420          ╰╴       ─ 1. source
2421        ");
2422    }
2423
2424    #[test]
2425    fn goto_view_multiple_columns() {
2426        assert_snapshot!(goto("
2427create view v as select 1 as a, 2 as b;
2428select b$0 from v;
2429"), @r"
2430          ╭▸ 
2431        2 │ create view v as select 1 as a, 2 as b;
2432          │                                      ─ 2. destination
2433        3 │ select b from v;
2434          ╰╴       ─ 1. source
2435        ");
2436    }
2437
2438    #[test]
2439    fn goto_view_column_from_table() {
2440        assert_snapshot!(goto("
2441create table t(x int, y int);
2442create view v as select x, y from t;
2443select x$0 from v;
2444"), @r"
2445          ╭▸ 
2446        3 │ create view v as select x, y from t;
2447          │                         ─ 2. destination
2448        4 │ select x from v;
2449          ╰╴       ─ 1. source
2450        ");
2451    }
2452
2453    #[test]
2454    fn goto_view_column_with_table_preference() {
2455        assert_snapshot!(goto("
2456create table v(a int);
2457create view vw as select 1 as a;
2458select a$0 from v;
2459"), @r"
2460          ╭▸ 
2461        2 │ create table v(a int);
2462          │                ─ 2. destination
2463        3 │ create view vw as select 1 as a;
2464        4 │ select a from v;
2465          ╰╴       ─ 1. source
2466        ");
2467    }
2468
2469    #[test]
2470    fn goto_cast_operator() {
2471        assert_snapshot!(goto("
2472create type foo as enum ('a', 'b');
2473select x::foo$0;
2474"), @r"
2475          ╭▸ 
2476        2 │ create type foo as enum ('a', 'b');
2477          │             ─── 2. destination
2478        3 │ select x::foo;
2479          ╰╴            ─ 1. source
2480        ");
2481    }
2482
2483    #[test]
2484    fn goto_cast_function() {
2485        assert_snapshot!(goto("
2486create type bar as enum ('x', 'y');
2487select cast(x as bar$0);
2488"), @r"
2489          ╭▸ 
2490        2 │ create type bar as enum ('x', 'y');
2491          │             ─── 2. destination
2492        3 │ select cast(x as bar);
2493          ╰╴                   ─ 1. source
2494        ");
2495    }
2496
2497    #[test]
2498    fn goto_cast_with_schema() {
2499        assert_snapshot!(goto("
2500create type public.baz as enum ('m', 'n');
2501select x::public.baz$0;
2502"), @r"
2503          ╭▸ 
2504        2 │ create type public.baz as enum ('m', 'n');
2505          │                    ─── 2. destination
2506        3 │ select x::public.baz;
2507          ╰╴                   ─ 1. source
2508        ");
2509    }
2510
2511    #[test]
2512    fn goto_cast_timestamp_without_time_zone() {
2513        assert_snapshot!(goto("
2514create type pg_catalog.timestamp;
2515select ''::timestamp without$0 time zone;
2516"), @r"
2517          ╭▸ 
2518        2 │ create type pg_catalog.timestamp;
2519          │                        ───────── 2. destination
2520        3 │ select ''::timestamp without time zone;
2521          ╰╴                           ─ 1. source
2522        ");
2523    }
2524
2525    #[test]
2526    fn goto_cast_timestamp_with_time_zone() {
2527        assert_snapshot!(goto("
2528create type pg_catalog.timestamptz;
2529select ''::timestamp with$0 time zone;
2530"), @r"
2531          ╭▸ 
2532        2 │ create type pg_catalog.timestamptz;
2533          │                        ─────────── 2. destination
2534        3 │ select ''::timestamp with time zone;
2535          ╰╴                        ─ 1. source
2536        ");
2537    }
2538
2539    #[test]
2540    fn goto_cast_multirange_type_from_range() {
2541        assert_snapshot!(goto("
2542create type floatrange as range (
2543  subtype = float8,
2544  subtype_diff = float8mi
2545);
2546select '{[1.234, 5.678]}'::floatmultirange$0;
2547"), @r"
2548          ╭▸ 
2549        2 │ create type floatrange as range (
2550          │             ────────── 2. destination
25512552        6 │ select '{[1.234, 5.678]}'::floatmultirange;
2553          ╰╴                                         ─ 1. source
2554        ");
2555    }
2556
2557    #[test]
2558    fn goto_cast_multirange_special_type_name_string() {
2559        assert_snapshot!(goto("
2560create type floatrange as range (
2561  subtype = float8,
2562  subtype_diff = float8mi,
2563  multirange_type_name = 'floatmulirangething'
2564);
2565select '{[1.234, 5.678]}'::floatmulirangething$0;
2566"), @r"
2567          ╭▸ 
2568        2 │ create type floatrange as range (
2569          │             ────────── 2. destination
25702571        7 │ select '{[1.234, 5.678]}'::floatmulirangething;
2572          ╰╴                                             ─ 1. source
2573        ");
2574    }
2575
2576    #[test]
2577    fn goto_cast_multirange_special_type_name_ident() {
2578        assert_snapshot!(goto("
2579create type floatrange as range (
2580  subtype = float8,
2581  subtype_diff = float8mi,
2582  multirange_type_name = floatrangemutirange
2583);
2584select '{[1.234, 5.678]}'::floatrangemutirange$0;
2585"), @r"
2586          ╭▸ 
2587        2 │ create type floatrange as range (
2588          │             ────────── 2. destination
25892590        7 │ select '{[1.234, 5.678]}'::floatrangemutirange;
2591          ╰╴                                             ─ 1. source
2592        ");
2593    }
2594
2595    #[test]
2596    fn goto_cast_multirange_edge_case_type_from_range() {
2597        // make sure we're calculating the multirange correctly
2598        assert_snapshot!(goto("
2599create type floatrangerange as range (
2600  subtype = float8,
2601  subtype_diff = float8mi
2602);
2603select '{[1.234, 5.678]}'::floatmultirangerange$0;
2604"), @r"
2605          ╭▸ 
2606        2 │ create type floatrangerange as range (
2607          │             ─────────────── 2. destination
26082609        6 │ select '{[1.234, 5.678]}'::floatmultirangerange;
2610          ╰╴                                              ─ 1. source
2611        ");
2612    }
2613
2614    #[test]
2615    fn goto_cast_bigint_falls_back_to_int8() {
2616        assert_snapshot!(goto("
2617create type pg_catalog.int8;
2618select 1::bigint$0;
2619"), @r"
2620          ╭▸ 
2621        2 │ create type pg_catalog.int8;
2622          │                        ──── 2. destination
2623        3 │ select 1::bigint;
2624          ╰╴               ─ 1. source
2625        ");
2626    }
2627
2628    #[test]
2629    fn goto_cast_bigint_prefers_user_type() {
2630        assert_snapshot!(goto("
2631create type bigint;
2632create type pg_catalog.int8;
2633select 1::bigint$0;
2634"), @r"
2635          ╭▸ 
2636        2 │ create type bigint;
2637          │             ────── 2. destination
2638        3 │ create type pg_catalog.int8;
2639        4 │ select 1::bigint;
2640          ╰╴               ─ 1. source
2641        ");
2642    }
2643
2644    #[test]
2645    fn goto_cast_smallserial_falls_back_to_int2() {
2646        assert_snapshot!(goto("
2647create type pg_catalog.int2;
2648select 1::smallserial$0;
2649"), @r"
2650          ╭▸ 
2651        2 │ create type pg_catalog.int2;
2652          │                        ──── 2. destination
2653        3 │ select 1::smallserial;
2654          ╰╴                    ─ 1. source
2655        ");
2656    }
2657
2658    #[test]
2659    fn goto_cast_serial2_falls_back_to_int2() {
2660        assert_snapshot!(goto("
2661create type pg_catalog.int2;
2662select 1::serial2$0;
2663"), @r"
2664          ╭▸ 
2665        2 │ create type pg_catalog.int2;
2666          │                        ──── 2. destination
2667        3 │ select 1::serial2;
2668          ╰╴                ─ 1. source
2669        ");
2670    }
2671
2672    #[test]
2673    fn goto_cast_serial_falls_back_to_int4() {
2674        assert_snapshot!(goto("
2675create type pg_catalog.int4;
2676select 1::serial$0;
2677"), @r"
2678          ╭▸ 
2679        2 │ create type pg_catalog.int4;
2680          │                        ──── 2. destination
2681        3 │ select 1::serial;
2682          ╰╴               ─ 1. source
2683        ");
2684    }
2685
2686    #[test]
2687    fn goto_cast_serial4_falls_back_to_int4() {
2688        assert_snapshot!(goto("
2689create type pg_catalog.int4;
2690select 1::serial4$0;
2691"), @r"
2692          ╭▸ 
2693        2 │ create type pg_catalog.int4;
2694          │                        ──── 2. destination
2695        3 │ select 1::serial4;
2696          ╰╴                ─ 1. source
2697        ");
2698    }
2699
2700    #[test]
2701    fn goto_cast_bigserial_falls_back_to_int8() {
2702        assert_snapshot!(goto("
2703create type pg_catalog.int8;
2704select 1::bigserial$0;
2705"), @r"
2706          ╭▸ 
2707        2 │ create type pg_catalog.int8;
2708          │                        ──── 2. destination
2709        3 │ select 1::bigserial;
2710          ╰╴                  ─ 1. source
2711        ");
2712    }
2713
2714    #[test]
2715    fn goto_cast_serial8_falls_back_to_int8() {
2716        assert_snapshot!(goto("
2717create type pg_catalog.int8;
2718select 1::serial8$0;
2719"), @r"
2720          ╭▸ 
2721        2 │ create type pg_catalog.int8;
2722          │                        ──── 2. destination
2723        3 │ select 1::serial8;
2724          ╰╴                ─ 1. source
2725        ");
2726    }
2727
2728    #[test]
2729    fn goto_cast_int_falls_back_to_int4() {
2730        assert_snapshot!(goto("
2731create type pg_catalog.int4;
2732select 1::int$0;
2733"), @r"
2734          ╭▸ 
2735        2 │ create type pg_catalog.int4;
2736          │                        ──── 2. destination
2737        3 │ select 1::int;
2738          ╰╴            ─ 1. source
2739        ");
2740    }
2741
2742    #[test]
2743    fn goto_cast_integer_falls_back_to_int4() {
2744        assert_snapshot!(goto("
2745create type pg_catalog.int4;
2746select 1::integer$0;
2747"), @r"
2748          ╭▸ 
2749        2 │ create type pg_catalog.int4;
2750          │                        ──── 2. destination
2751        3 │ select 1::integer;
2752          ╰╴                ─ 1. source
2753        ");
2754    }
2755
2756    #[test]
2757    fn goto_cast_smallint_falls_back_to_int2() {
2758        assert_snapshot!(goto("
2759create type pg_catalog.int2;
2760select 1::smallint$0;
2761"), @r"
2762          ╭▸ 
2763        2 │ create type pg_catalog.int2;
2764          │                        ──── 2. destination
2765        3 │ select 1::smallint;
2766          ╰╴                 ─ 1. source
2767        ");
2768    }
2769
2770    #[test]
2771    fn goto_cast_double_precision_falls_back_to_float8() {
2772        assert_snapshot!(goto("
2773create type pg_catalog.float8;
2774select '1'::double precision[]$0;
2775"), @r"
2776          ╭▸ 
2777        2 │ create type pg_catalog.float8;
2778          │                        ────── 2. destination
2779        3 │ select '1'::double precision[];
2780          ╰╴                             ─ 1. source
2781        ");
2782    }
2783
2784    #[test]
2785    fn goto_cast_varchar_with_modifier() {
2786        assert_snapshot!(goto("
2787create type pg_catalog.varchar;
2788select '1'::varchar$0(1);
2789"), @r"
2790          ╭▸ 
2791        2 │ create type pg_catalog.varchar;
2792          │                        ─────── 2. destination
2793        3 │ select '1'::varchar(1);
2794          ╰╴                  ─ 1. source
2795        ");
2796    }
2797
2798    #[test]
2799    fn goto_cast_composite_type() {
2800        assert_snapshot!(goto("
2801create type person_info as (name varchar(50), age int);
2802select ('Alice', 30)::person_info$0;
2803"), @r"
2804          ╭▸ 
2805        2 │ create type person_info as (name varchar(50), age int);
2806          │             ─────────── 2. destination
2807        3 │ select ('Alice', 30)::person_info;
2808          ╰╴                                ─ 1. source
2809        ");
2810    }
2811
2812    #[test]
2813    fn goto_cast_composite_type_in_cte() {
2814        assert_snapshot!(goto("
2815create type person_info as (name varchar(50), age int);
2816with team as (
2817    select 1 as id, ('Alice', 30)::person_info$0 as member
2818)
2819select * from team;
2820"), @r"
2821          ╭▸ 
2822        2 │ create type person_info as (name varchar(50), age int);
2823          │             ─────────── 2. destination
2824        3 │ with team as (
2825        4 │     select 1 as id, ('Alice', 30)::person_info as member
2826          ╰╴                                             ─ 1. source
2827        ");
2828    }
2829
2830    #[test]
2831    fn goto_composite_type_field_name() {
2832        assert_snapshot!(goto("
2833create type person_info as (name varchar(50), age int);
2834with team as (
2835    select 1 as id, ('Alice', 30)::person_info as member
2836)
2837select (member).name$0, (member).age from team;
2838"), @r"
2839          ╭▸ 
2840        2 │ create type person_info as (name varchar(50), age int);
2841          │                             ──── 2. destination
28422843        6 │ select (member).name, (member).age from team;
2844          ╰╴                   ─ 1. source
2845        ");
2846    }
2847
2848    #[test]
2849    fn goto_composite_type_field_in_where() {
2850        assert_snapshot!(goto("
2851create type person_info as (name varchar(50), age int);
2852with team as (
2853    select 1 as id, ('Alice', 30)::person_info as member
2854    union all
2855    select 2, ('Bob', 25)::person_info
2856)
2857select (member).name, (member).age
2858from team
2859where (member).age$0 >= 18;
2860"), @r"
2861           ╭▸ 
2862         2 │ create type person_info as (name varchar(50), age int);
2863           │                                               ─── 2. destination
28642865        10 │ where (member).age >= 18;
2866           ╰╴                 ─ 1. source
2867        ");
2868    }
2869
2870    #[test]
2871    fn goto_composite_type_field_base() {
2872        assert_snapshot!(goto("
2873create type person_info as (name varchar(50), age int);
2874with team as (
2875    select 1 as id, ('Alice', 30)::person_info as member
2876)
2877select (member$0).age from team;
2878"), @r"
2879          ╭▸ 
2880        4 │     select 1 as id, ('Alice', 30)::person_info as member
2881          │                                                   ────── 2. destination
2882        5 │ )
2883        6 │ select (member).age from team;
2884          ╰╴             ─ 1. source
2885        ");
2886    }
2887
2888    #[test]
2889    fn goto_composite_type_field_nested_parens() {
2890        assert_snapshot!(goto("
2891create type person_info as (name varchar(50), age int);
2892with team as (
2893    select 1 as id, ('Alice', 30)::person_info as member
2894)
2895select ((((member))).name$0) from team;
2896"), @r"
2897          ╭▸ 
2898        2 │ create type person_info as (name varchar(50), age int);
2899          │                             ──── 2. destination
29002901        6 │ select ((((member))).name) from team;
2902          ╰╴                        ─ 1. source
2903        ");
2904    }
2905
2906    #[test]
2907    fn begin_to_rollback() {
2908        assert_snapshot!(goto(
2909            "
2910begin$0;
2911select 1;
2912rollback;
2913commit;
2914",
2915        ), @r"
2916          ╭▸ 
2917        2 │ begin;
2918          │     ─ 1. source
2919        3 │ select 1;
2920        4 │ rollback;
2921          ╰╴──────── 2. destination
2922        ");
2923    }
2924
2925    #[test]
2926    fn commit_to_begin() {
2927        assert_snapshot!(goto(
2928            "
2929begin;
2930select 1;
2931commit$0;
2932",
2933        ), @r"
2934          ╭▸ 
2935        2 │ begin;
2936          │ ───── 2. destination
2937        3 │ select 1;
2938        4 │ commit;
2939          ╰╴     ─ 1. source
2940        ");
2941    }
2942
2943    #[test]
2944    fn begin_to_commit() {
2945        assert_snapshot!(goto(
2946            "
2947begin$0;
2948select 1;
2949commit;
2950",
2951        ), @r"
2952          ╭▸ 
2953        2 │ begin;
2954          │     ─ 1. source
2955        3 │ select 1;
2956        4 │ commit;
2957          ╰╴────── 2. destination
2958        ");
2959    }
2960
2961    #[test]
2962    fn commit_to_start_transaction() {
2963        assert_snapshot!(goto(
2964            "
2965start transaction;
2966select 1;
2967commit$0;
2968",
2969        ), @r"
2970          ╭▸ 
2971        2 │ start transaction;
2972          │ ───────────────── 2. destination
2973        3 │ select 1;
2974        4 │ commit;
2975          ╰╴     ─ 1. source
2976        ");
2977    }
2978
2979    #[test]
2980    fn start_transaction_to_commit() {
2981        assert_snapshot!(goto(
2982            "
2983start$0 transaction;
2984select 1;
2985commit;
2986",
2987        ), @r"
2988          ╭▸ 
2989        2 │ start transaction;
2990          │     ─ 1. source
2991        3 │ select 1;
2992        4 │ commit;
2993          ╰╴────── 2. destination
2994        ");
2995    }
2996
2997    #[test]
2998    fn goto_with_search_path() {
2999        assert_snapshot!(goto(r#"
3000set search_path to "foo", public;
3001create table foo.t();
3002drop table t$0;
3003"#), @r"
3004          ╭▸ 
3005        3 │ create table foo.t();
3006          │                  ─ 2. destination
3007        4 │ drop table t;
3008          ╰╴           ─ 1. source
3009        ");
3010    }
3011
3012    #[test]
3013    fn goto_with_search_path_and_unspecified_table() {
3014        assert_snapshot!(goto(r#"
3015set search_path to foo,bar;
3016create table t();
3017drop table foo.t$0;
3018"#), @r"
3019          ╭▸ 
3020        3 │ create table t();
3021          │              ─ 2. destination
3022        4 │ drop table foo.t;
3023          ╰╴               ─ 1. source
3024        ");
3025    }
3026
3027    #[test]
3028    fn goto_column_not_in_cte_but_in_table() {
3029        // we shouldn't navigate up to the table of the same name
3030        goto_not_found(
3031            r"
3032create table t (c int);
3033with t as (select 1 a)
3034select c$0 from t;
3035",
3036        );
3037    }
3038
3039    #[test]
3040    fn goto_with_search_path_empty() {
3041        goto_not_found(
3042            r#"
3043set search_path = '';
3044create table t();
3045drop table t$0;
3046"#,
3047        );
3048    }
3049
3050    #[test]
3051    fn goto_with_search_path_like_variable() {
3052        // not actually search path
3053        goto_not_found(
3054            "
3055set bar.search_path to foo, public;
3056create table foo.t();
3057drop table t$0;
3058",
3059        )
3060    }
3061
3062    #[test]
3063    fn goto_with_search_path_second_schema() {
3064        assert_snapshot!(goto("
3065set search_path to foo, bar, public;
3066create table bar.t();
3067drop table t$0;
3068"), @r"
3069          ╭▸ 
3070        3 │ create table bar.t();
3071          │                  ─ 2. destination
3072        4 │ drop table t;
3073          ╰╴           ─ 1. source
3074        ");
3075    }
3076
3077    #[test]
3078    fn goto_with_search_path_skips_first() {
3079        assert_snapshot!(goto("
3080set search_path to foo, bar, public;
3081create table foo.t();
3082create table bar.t();
3083drop table t$0;
3084"), @r"
3085          ╭▸ 
3086        3 │ create table foo.t();
3087          │                  ─ 2. destination
3088        4 │ create table bar.t();
3089        5 │ drop table t;
3090          ╰╴           ─ 1. source
3091        ");
3092    }
3093
3094    #[test]
3095    fn goto_without_search_path_uses_default() {
3096        assert_snapshot!(goto("
3097create table foo.t();
3098create table public.t();
3099drop table t$0;
3100"), @r"
3101          ╭▸ 
3102        3 │ create table public.t();
3103          │                     ─ 2. destination
3104        4 │ drop table t;
3105          ╰╴           ─ 1. source
3106        ");
3107    }
3108
3109    #[test]
3110    fn goto_with_set_schema() {
3111        assert_snapshot!(goto("
3112set schema 'myschema';
3113create table myschema.t();
3114drop table t$0;
3115"), @r"
3116          ╭▸ 
3117        3 │ create table myschema.t();
3118          │                       ─ 2. destination
3119        4 │ drop table t;
3120          ╰╴           ─ 1. source
3121        ");
3122    }
3123
3124    #[test]
3125    fn goto_with_set_schema_ignores_other_schemas() {
3126        assert_snapshot!(goto("
3127set schema 'myschema';
3128create table public.t();
3129create table myschema.t();
3130drop table t$0;
3131"), @r"
3132          ╭▸ 
3133        4 │ create table myschema.t();
3134          │                       ─ 2. destination
3135        5 │ drop table t;
3136          ╰╴           ─ 1. source
3137        ");
3138    }
3139
3140    #[test]
3141    fn goto_with_search_path_changed_twice() {
3142        assert_snapshot!(goto("
3143set search_path to foo;
3144create table foo.t();
3145set search_path to bar;
3146create table bar.t();
3147drop table t$0;
3148"), @r"
3149          ╭▸ 
3150        5 │ create table bar.t();
3151          │                  ─ 2. destination
3152        6 │ drop table t;
3153          ╰╴           ─ 1. source
3154        ");
3155
3156        assert_snapshot!(goto("
3157set search_path to foo;
3158create table foo.t();
3159drop table t$0;
3160set search_path to bar;
3161create table bar.t();
3162drop table t;
3163"), @r"
3164          ╭▸ 
3165        3 │ create table foo.t();
3166          │                  ─ 2. destination
3167        4 │ drop table t;
3168          ╰╴           ─ 1. source
3169        ");
3170    }
3171
3172    #[test]
3173    fn goto_with_empty_search_path() {
3174        goto_not_found(
3175            "
3176set search_path to '';
3177create table public.t();
3178drop table t$0;
3179",
3180        )
3181    }
3182
3183    #[test]
3184    fn goto_with_search_path_uppercase() {
3185        assert_snapshot!(goto("
3186SET SEARCH_PATH TO foo;
3187create table foo.t();
3188drop table t$0;
3189"), @r"
3190          ╭▸ 
3191        3 │ create table foo.t();
3192          │                  ─ 2. destination
3193        4 │ drop table t;
3194          ╰╴           ─ 1. source
3195        ");
3196    }
3197
3198    #[test]
3199    fn goto_table_stmt() {
3200        assert_snapshot!(goto("
3201create table t();
3202table t$0;
3203"), @r"
3204          ╭▸ 
3205        2 │ create table t();
3206          │              ─ 2. destination
3207        3 │ table t;
3208          ╰╴      ─ 1. source
3209        ");
3210    }
3211
3212    #[test]
3213    fn goto_table_stmt_with_schema() {
3214        assert_snapshot!(goto("
3215create table public.t();
3216table public.t$0;
3217"), @r"
3218          ╭▸ 
3219        2 │ create table public.t();
3220          │                     ─ 2. destination
3221        3 │ table public.t;
3222          ╰╴             ─ 1. source
3223        ");
3224    }
3225
3226    #[test]
3227    fn goto_table_stmt_with_search_path() {
3228        assert_snapshot!(goto("
3229set search_path to foo;
3230create table foo.t();
3231table t$0;
3232"), @r"
3233          ╭▸ 
3234        3 │ create table foo.t();
3235          │                  ─ 2. destination
3236        4 │ table t;
3237          ╰╴      ─ 1. source
3238        ");
3239    }
3240
3241    #[test]
3242    fn goto_drop_index() {
3243        assert_snapshot!(goto("
3244create index idx_name on t(x);
3245drop index idx_name$0;
3246"), @r"
3247          ╭▸ 
3248        2 │ create index idx_name on t(x);
3249          │              ──────── 2. destination
3250        3 │ drop index idx_name;
3251          ╰╴                  ─ 1. source
3252        ");
3253    }
3254
3255    #[test]
3256    fn goto_drop_index_with_schema() {
3257        assert_snapshot!(goto(r#"
3258set search_path to public;
3259create index idx_name on t(x);
3260drop index public.idx_name$0;
3261"#), @r"
3262          ╭▸ 
3263        3 │ create index idx_name on t(x);
3264          │              ──────── 2. destination
3265        4 │ drop index public.idx_name;
3266          ╰╴                         ─ 1. source
3267        ");
3268    }
3269
3270    #[test]
3271    fn goto_drop_index_defined_after() {
3272        assert_snapshot!(goto("
3273drop index idx_name$0;
3274create index idx_name on t(x);
3275"), @r"
3276          ╭▸ 
3277        2 │ drop index idx_name;
3278          │                   ─ 1. source
3279        3 │ create index idx_name on t(x);
3280          ╰╴             ──────── 2. destination
3281        ");
3282    }
3283
3284    #[test]
3285    fn goto_index_definition_returns_self() {
3286        assert_snapshot!(goto("
3287create index idx_name$0 on t(x);
3288"), @r"
3289          ╭▸ 
3290        2 │ create index idx_name on t(x);
3291          │              ┬──────┬
3292          │              │      │
3293          │              │      1. source
3294          ╰╴             2. destination
3295        ");
3296    }
3297
3298    #[test]
3299    fn goto_drop_index_with_search_path() {
3300        assert_snapshot!(goto(r#"
3301create index idx_name on t(x);
3302set search_path to bar;
3303create index idx_name on f(x);
3304set search_path to default;
3305drop index idx_name$0;
3306"#), @r"
3307          ╭▸ 
3308        2 │ create index idx_name on t(x);
3309          │              ──────── 2. destination
33103311        6 │ drop index idx_name;
3312          ╰╴                  ─ 1. source
3313        ");
3314    }
3315
3316    #[test]
3317    fn goto_drop_index_multiple() {
3318        assert_snapshot!(goto("
3319create index idx1 on t(x);
3320create index idx2 on t(y);
3321drop index idx1, idx2$0;
3322"), @r"
3323          ╭▸ 
3324        3 │ create index idx2 on t(y);
3325          │              ──── 2. destination
3326        4 │ drop index idx1, idx2;
3327          ╰╴                    ─ 1. source
3328        ");
3329    }
3330
3331    #[test]
3332    fn goto_create_index_table() {
3333        assert_snapshot!(goto("
3334create table users(id int);
3335create index idx_users on users$0(id);
3336"), @r"
3337          ╭▸ 
3338        2 │ create table users(id int);
3339          │              ───── 2. destination
3340        3 │ create index idx_users on users(id);
3341          ╰╴                              ─ 1. source
3342        ");
3343    }
3344
3345    #[test]
3346    fn goto_create_index_table_with_schema() {
3347        assert_snapshot!(goto("
3348create table public.users(id int);
3349create index idx_users on public.users$0(id);
3350"), @r"
3351          ╭▸ 
3352        2 │ create table public.users(id int);
3353          │                     ───── 2. destination
3354        3 │ create index idx_users on public.users(id);
3355          ╰╴                                     ─ 1. source
3356        ");
3357    }
3358
3359    #[test]
3360    fn goto_create_index_table_with_search_path() {
3361        assert_snapshot!(goto(r#"
3362set search_path to foo;
3363create table foo.users(id int);
3364create index idx_users on users$0(id);
3365"#), @r"
3366          ╭▸ 
3367        3 │ create table foo.users(id int);
3368          │                  ───── 2. destination
3369        4 │ create index idx_users on users(id);
3370          ╰╴                              ─ 1. source
3371        ");
3372    }
3373
3374    #[test]
3375    fn goto_create_index_temp_table() {
3376        assert_snapshot!(goto("
3377create temp table users(id int);
3378create index idx_users on users$0(id);
3379"), @r"
3380          ╭▸ 
3381        2 │ create temp table users(id int);
3382          │                   ───── 2. destination
3383        3 │ create index idx_users on users(id);
3384          ╰╴                              ─ 1. source
3385        ");
3386    }
3387
3388    #[test]
3389    fn goto_create_index_column() {
3390        assert_snapshot!(goto("
3391create table users(id int, email text);
3392create index idx_email on users(email$0);
3393"), @r"
3394          ╭▸ 
3395        2 │ create table users(id int, email text);
3396          │                            ───── 2. destination
3397        3 │ create index idx_email on users(email);
3398          ╰╴                                    ─ 1. source
3399        ");
3400    }
3401
3402    #[test]
3403    fn goto_create_index_first_column() {
3404        assert_snapshot!(goto("
3405create table users(id int, email text);
3406create index idx_id on users(id$0);
3407"), @r"
3408          ╭▸ 
3409        2 │ create table users(id int, email text);
3410          │                    ── 2. destination
3411        3 │ create index idx_id on users(id);
3412          ╰╴                              ─ 1. source
3413        ");
3414    }
3415
3416    #[test]
3417    fn goto_create_index_multiple_columns() {
3418        assert_snapshot!(goto("
3419create table users(id int, email text, name text);
3420create index idx_users on users(id, email$0, name);
3421"), @r"
3422          ╭▸ 
3423        2 │ create table users(id int, email text, name text);
3424          │                            ───── 2. destination
3425        3 │ create index idx_users on users(id, email, name);
3426          ╰╴                                        ─ 1. source
3427        ");
3428    }
3429
3430    #[test]
3431    fn goto_create_index_column_with_schema() {
3432        assert_snapshot!(goto("
3433create table public.users(id int, email text);
3434create index idx_email on public.users(email$0);
3435"), @r"
3436          ╭▸ 
3437        2 │ create table public.users(id int, email text);
3438          │                                   ───── 2. destination
3439        3 │ create index idx_email on public.users(email);
3440          ╰╴                                           ─ 1. source
3441        ");
3442    }
3443
3444    #[test]
3445    fn goto_create_index_column_temp_table() {
3446        assert_snapshot!(goto("
3447create temp table users(id int, email text);
3448create index idx_email on users(email$0);
3449"), @r"
3450          ╭▸ 
3451        2 │ create temp table users(id int, email text);
3452          │                                 ───── 2. destination
3453        3 │ create index idx_email on users(email);
3454          ╰╴                                    ─ 1. source
3455        ");
3456    }
3457
3458    #[test]
3459    fn goto_drop_function() {
3460        assert_snapshot!(goto("
3461create function foo() returns int as $$ select 1 $$ language sql;
3462drop function foo$0();
3463"), @r"
3464          ╭▸ 
3465        2 │ create function foo() returns int as $$ select 1 $$ language sql;
3466          │                 ─── 2. destination
3467        3 │ drop function foo();
3468          ╰╴                ─ 1. source
3469        ");
3470    }
3471
3472    #[test]
3473    fn goto_drop_function_with_schema() {
3474        assert_snapshot!(goto("
3475set search_path to public;
3476create function foo() returns int as $$ select 1 $$ language sql;
3477drop function public.foo$0();
3478"), @r"
3479          ╭▸ 
3480        3 │ create function foo() returns int as $$ select 1 $$ language sql;
3481          │                 ─── 2. destination
3482        4 │ drop function public.foo();
3483          ╰╴                       ─ 1. source
3484        ");
3485    }
3486
3487    #[test]
3488    fn goto_drop_function_defined_after() {
3489        assert_snapshot!(goto("
3490drop function foo$0();
3491create function foo() returns int as $$ select 1 $$ language sql;
3492"), @r"
3493          ╭▸ 
3494        2 │ drop function foo();
3495          │                 ─ 1. source
3496        3 │ create function foo() returns int as $$ select 1 $$ language sql;
3497          ╰╴                ─── 2. destination
3498        ");
3499    }
3500
3501    #[test]
3502    fn goto_function_definition_returns_self() {
3503        assert_snapshot!(goto("
3504create function foo$0() returns int as $$ select 1 $$ language sql;
3505"), @r"
3506          ╭▸ 
3507        2 │ create function foo() returns int as $$ select 1 $$ language sql;
3508          │                 ┬─┬
3509          │                 │ │
3510          │                 │ 1. source
3511          ╰╴                2. destination
3512        ");
3513    }
3514
3515    #[test]
3516    fn goto_drop_function_with_search_path() {
3517        assert_snapshot!(goto("
3518create function foo() returns int as $$ select 1 $$ language sql;
3519set search_path to bar;
3520create function foo() returns int as $$ select 1 $$ language sql;
3521set search_path to default;
3522drop function foo$0();
3523"), @r"
3524          ╭▸ 
3525        2 │ create function foo() returns int as $$ select 1 $$ language sql;
3526          │                 ─── 2. destination
35273528        6 │ drop function foo();
3529          ╰╴                ─ 1. source
3530        ");
3531    }
3532
3533    #[test]
3534    fn goto_drop_function_multiple() {
3535        assert_snapshot!(goto("
3536create function foo() returns int as $$ select 1 $$ language sql;
3537create function bar() returns int as $$ select 1 $$ language sql;
3538drop function foo(), bar$0();
3539"), @r"
3540          ╭▸ 
3541        3 │ create function bar() returns int as $$ select 1 $$ language sql;
3542          │                 ─── 2. destination
3543        4 │ drop function foo(), bar();
3544          ╰╴                       ─ 1. source
3545        ");
3546    }
3547
3548    #[test]
3549    fn goto_drop_function_overloaded() {
3550        assert_snapshot!(goto("
3551create function add(complex) returns complex as $$ select null $$ language sql;
3552create function add(bigint) returns bigint as $$ select 1 $$ language sql;
3553drop function add$0(complex);
3554"), @r"
3555          ╭▸ 
3556        2 │ create function add(complex) returns complex as $$ select null $$ language sql;
3557          │                 ─── 2. destination
3558        3 │ create function add(bigint) returns bigint as $$ select 1 $$ language sql;
3559        4 │ drop function add(complex);
3560          ╰╴                ─ 1. source
3561        ");
3562    }
3563
3564    #[test]
3565    fn goto_drop_function_second_overload() {
3566        assert_snapshot!(goto("
3567create function add(complex) returns complex as $$ select null $$ language sql;
3568create function add(bigint) returns bigint as $$ select 1 $$ language sql;
3569drop function add$0(bigint);
3570"), @r"
3571          ╭▸ 
3572        3 │ create function add(bigint) returns bigint as $$ select 1 $$ language sql;
3573          │                 ─── 2. destination
3574        4 │ drop function add(bigint);
3575          ╰╴                ─ 1. source
3576        ");
3577    }
3578
3579    #[test]
3580    fn goto_select_function_call() {
3581        assert_snapshot!(goto("
3582create function foo() returns int as $$ select 1 $$ language sql;
3583select foo$0();
3584"), @r"
3585          ╭▸ 
3586        2 │ create function foo() returns int as $$ select 1 $$ language sql;
3587          │                 ─── 2. destination
3588        3 │ select foo();
3589          ╰╴         ─ 1. source
3590        ");
3591    }
3592
3593    #[test]
3594    fn goto_select_aggregate_call() {
3595        assert_snapshot!(goto("
3596create aggregate foo(int) (
3597  sfunc = int4pl,
3598  stype = int,
3599  initcond = '0'
3600);
3601
3602select foo$0(1);
3603"), @r"
3604          ╭▸ 
3605        2 │ create aggregate foo(int) (
3606          │                  ─── 2. destination
36073608        8 │ select foo(1);
3609          ╰╴         ─ 1. source
3610        ");
3611    }
3612
3613    #[test]
3614    fn goto_default_constraint_function_call() {
3615        assert_snapshot!(goto("
3616create function f() returns int as 'select 1' language sql;
3617create table t(
3618  a int default f$0()
3619);
3620"), @r"
3621          ╭▸ 
3622        2 │ create function f() returns int as 'select 1' language sql;
3623          │                 ─ 2. destination
3624        3 │ create table t(
3625        4 │   a int default f()
3626          ╰╴                ─ 1. source
3627        ");
3628    }
3629
3630    #[test]
3631    fn goto_select_function_call_with_schema() {
3632        assert_snapshot!(goto("
3633create function public.foo() returns int as $$ select 1 $$ language sql;
3634select public.foo$0();
3635"), @r"
3636          ╭▸ 
3637        2 │ create function public.foo() returns int as $$ select 1 $$ language sql;
3638          │                        ─── 2. destination
3639        3 │ select public.foo();
3640          ╰╴                ─ 1. source
3641        ");
3642    }
3643
3644    #[test]
3645    fn goto_select_function_call_with_search_path() {
3646        assert_snapshot!(goto("
3647set search_path to myschema;
3648create function foo() returns int as $$ select 1 $$ language sql;
3649select myschema.foo$0();
3650"), @r"
3651          ╭▸ 
3652        3 │ create function foo() returns int as $$ select 1 $$ language sql;
3653          │                 ─── 2. destination
3654        4 │ select myschema.foo();
3655          ╰╴                  ─ 1. source
3656        ");
3657    }
3658
3659    #[test]
3660    fn goto_function_call_style_column_access() {
3661        assert_snapshot!(goto("
3662create table t(a int, b int);
3663select a$0(t) from t;
3664"), @r"
3665          ╭▸ 
3666        2 │ create table t(a int, b int);
3667          │                ─ 2. destination
3668        3 │ select a(t) from t;
3669          ╰╴       ─ 1. source
3670        ");
3671    }
3672
3673    #[test]
3674    fn goto_function_call_style_column_access_with_function_precedence() {
3675        assert_snapshot!(goto("
3676create table t(a int, b int);
3677create function b(t) returns int as 'select 1' LANGUAGE sql;
3678select b$0(t) from t;
3679"), @r"
3680          ╭▸ 
3681        3 │ create function b(t) returns int as 'select 1' LANGUAGE sql;
3682          │                 ─ 2. destination
3683        4 │ select b(t) from t;
3684          ╰╴       ─ 1. source
3685        ");
3686    }
3687
3688    #[test]
3689    fn goto_function_call_style_column_access_table_arg() {
3690        assert_snapshot!(goto("
3691create table t(a int, b int);
3692select a(t$0) from t;
3693"), @r"
3694          ╭▸ 
3695        2 │ create table t(a int, b int);
3696          │              ─ 2. destination
3697        3 │ select a(t) from t;
3698          ╰╴         ─ 1. source
3699        ");
3700    }
3701
3702    #[test]
3703    fn goto_function_call_style_column_access_table_arg_with_function() {
3704        assert_snapshot!(goto("
3705create table t(a int, b int);
3706create function b(t) returns int as 'select 1' LANGUAGE sql;
3707select b(t$0) from t;
3708"), @r"
3709          ╭▸ 
3710        2 │ create table t(a int, b int);
3711          │              ─ 2. destination
3712        3 │ create function b(t) returns int as 'select 1' LANGUAGE sql;
3713        4 │ select b(t) from t;
3714          ╰╴         ─ 1. source
3715        ");
3716    }
3717
3718    #[test]
3719    fn goto_function_call_multiple_args_not_column_access() {
3720        goto_not_found(
3721            "
3722create table t(a int, b int);
3723select a$0(t, 1) from t;
3724",
3725        );
3726    }
3727
3728    #[test]
3729    fn goto_function_call_nested() {
3730        assert_snapshot!(goto("
3731create function f() returns int8
3732  as 'select 1'
3733  language sql;
3734select format('foo%d', f$0());
3735"), @r"
3736          ╭▸ 
3737        2 │ create function f() returns int8
3738          │                 ─ 2. destination
37393740        5 │ select format('foo%d', f());
3741          ╰╴                       ─ 1. source
3742        ");
3743    }
3744
3745    #[test]
3746    fn goto_field_style_function_call() {
3747        assert_snapshot!(goto("
3748create table t(a int);
3749create function b(t) returns int as 'select 1' language sql;
3750select t.b$0 from t;
3751"), @r"
3752          ╭▸ 
3753        3 │ create function b(t) returns int as 'select 1' language sql;
3754          │                 ─ 2. destination
3755        4 │ select t.b from t;
3756          ╰╴         ─ 1. source
3757        ");
3758    }
3759
3760    #[test]
3761    fn goto_field_style_function_call_column_precedence() {
3762        assert_snapshot!(goto("
3763create table t(a int, b int);
3764create function b(t) returns int as 'select 1' language sql;
3765select t.b$0 from t;
3766"), @r"
3767          ╭▸ 
3768        2 │ create table t(a int, b int);
3769          │                       ─ 2. destination
3770        3 │ create function b(t) returns int as 'select 1' language sql;
3771        4 │ select t.b from t;
3772          ╰╴         ─ 1. source
3773        ");
3774    }
3775
3776    #[test]
3777    fn goto_field_style_function_call_table_ref() {
3778        assert_snapshot!(goto("
3779create table t(a int);
3780create function b(t) returns int as 'select 1' language sql;
3781select t$0.b from t;
3782"), @r"
3783          ╭▸ 
3784        2 │ create table t(a int);
3785          │              ─ 2. destination
3786        3 │ create function b(t) returns int as 'select 1' language sql;
3787        4 │ select t.b from t;
3788          ╰╴       ─ 1. source
3789        ");
3790    }
3791
3792    #[test]
3793    fn goto_function_call_style_in_where() {
3794        assert_snapshot!(goto("
3795create table t(a int, b int);
3796select * from t where a$0(t) > 0;
3797"), @r"
3798          ╭▸ 
3799        2 │ create table t(a int, b int);
3800          │                ─ 2. destination
3801        3 │ select * from t where a(t) > 0;
3802          ╰╴                      ─ 1. source
3803        ");
3804    }
3805
3806    #[test]
3807    fn goto_function_call_style_in_where_function_precedence() {
3808        assert_snapshot!(goto("
3809create table t(a int, b int);
3810create function b(t) returns int as 'select 1' language sql;
3811select * from t where b$0(t) > 0;
3812"), @r"
3813          ╭▸ 
3814        3 │ create function b(t) returns int as 'select 1' language sql;
3815          │                 ─ 2. destination
3816        4 │ select * from t where b(t) > 0;
3817          ╰╴                      ─ 1. source
3818        ");
3819    }
3820
3821    #[test]
3822    fn goto_field_style_function_call_in_where() {
3823        assert_snapshot!(goto("
3824create table t(a int);
3825create function b(t) returns int as 'select 1' language sql;
3826select * from t where t.b$0 > 0;
3827"), @r"
3828          ╭▸ 
3829        3 │ create function b(t) returns int as 'select 1' language sql;
3830          │                 ─ 2. destination
3831        4 │ select * from t where t.b > 0;
3832          ╰╴                        ─ 1. source
3833        ");
3834    }
3835
3836    #[test]
3837    fn goto_field_style_in_where_column_precedence() {
3838        assert_snapshot!(goto("
3839create table t(a int, b int);
3840create function b(t) returns int as 'select 1' language sql;
3841select * from t where t.b$0 > 0;
3842"), @r"
3843          ╭▸ 
3844        2 │ create table t(a int, b int);
3845          │                       ─ 2. destination
3846        3 │ create function b(t) returns int as 'select 1' language sql;
3847        4 │ select * from t where t.b > 0;
3848          ╰╴                        ─ 1. source
3849        ");
3850    }
3851
3852    #[test]
3853    fn goto_function_call_style_table_arg_in_where() {
3854        assert_snapshot!(goto("
3855create table t(a int);
3856select * from t where a(t$0) > 2;
3857"), @r"
3858          ╭▸ 
3859        2 │ create table t(a int);
3860          │              ─ 2. destination
3861        3 │ select * from t where a(t) > 2;
3862          ╰╴                        ─ 1. source
3863        ");
3864    }
3865
3866    #[test]
3867    fn goto_qualified_table_ref_in_where() {
3868        assert_snapshot!(goto("
3869create table t(a int);
3870create function b(t) returns int as 'select 1' language sql;
3871select * from t where t$0.b > 2;
3872"), @r"
3873          ╭▸ 
3874        2 │ create table t(a int);
3875          │              ─ 2. destination
3876        3 │ create function b(t) returns int as 'select 1' language sql;
3877        4 │ select * from t where t.b > 2;
3878          ╰╴                      ─ 1. source
3879        ");
3880    }
3881
3882    #[test]
3883    fn goto_function_call_style_in_order_by() {
3884        assert_snapshot!(goto("
3885create table t(a int, b int);
3886create function b(t) returns int as 'select 1' language sql;
3887select * from t order by b$0(t);
3888"), @r"
3889          ╭▸ 
3890        3 │ create function b(t) returns int as 'select 1' language sql;
3891          │                 ─ 2. destination
3892        4 │ select * from t order by b(t);
3893          ╰╴                         ─ 1. source
3894        ");
3895    }
3896
3897    #[test]
3898    fn goto_field_style_in_order_by() {
3899        assert_snapshot!(goto("
3900create table t(a int);
3901create function b(t) returns int as 'select 1' language sql;
3902select * from t order by t.b$0;
3903"), @r"
3904          ╭▸ 
3905        3 │ create function b(t) returns int as 'select 1' language sql;
3906          │                 ─ 2. destination
3907        4 │ select * from t order by t.b;
3908          ╰╴                           ─ 1. source
3909        ");
3910    }
3911
3912    #[test]
3913    fn goto_function_call_style_in_group_by() {
3914        assert_snapshot!(goto("
3915create table t(a int, b int);
3916select * from t group by a$0(t);
3917"), @r"
3918          ╭▸ 
3919        2 │ create table t(a int, b int);
3920          │                ─ 2. destination
3921        3 │ select * from t group by a(t);
3922          ╰╴                         ─ 1. source
3923        ");
3924    }
3925
3926    #[test]
3927    fn goto_field_style_in_group_by() {
3928        assert_snapshot!(goto("
3929create table t(a int);
3930create function b(t) returns int as 'select 1' language sql;
3931select * from t group by t.b$0;
3932"), @r"
3933          ╭▸ 
3934        3 │ create function b(t) returns int as 'select 1' language sql;
3935          │                 ─ 2. destination
3936        4 │ select * from t group by t.b;
3937          ╰╴                           ─ 1. source
3938        ");
3939    }
3940
3941    #[test]
3942    fn goto_cte_table() {
3943        assert_snapshot!(goto("
3944with x as (select 1 as a)
3945select a from x$0;
3946"), @r"
3947          ╭▸ 
3948        2 │ with x as (select 1 as a)
3949          │      ─ 2. destination
3950        3 │ select a from x;
3951          ╰╴              ─ 1. source
3952        ");
3953    }
3954
3955    #[test]
3956    fn goto_cte_column() {
3957        assert_snapshot!(goto("
3958with x as (select 1 as a)
3959select a$0 from x;
3960"), @r"
3961          ╭▸ 
3962        2 │ with x as (select 1 as a)
3963          │                        ─ 2. destination
3964        3 │ select a from x;
3965          ╰╴       ─ 1. source
3966        ");
3967    }
3968
3969    #[test]
3970    fn goto_cte_qualified_column_prefers_cte_over_table() {
3971        assert_snapshot!(goto("
3972create table u(id int, b int);
3973with u as (select 1 id, 2 b)
3974select u.id$0 from u;
3975"), @r"
3976          ╭▸ 
3977        3 │ with u as (select 1 id, 2 b)
3978          │                     ── 2. destination
3979        4 │ select u.id from u;
3980          ╰╴          ─ 1. source
3981        ");
3982    }
3983
3984    #[test]
3985    fn goto_subquery_qualified_column() {
3986        assert_snapshot!(goto("
3987select t.a$0 from (select 1 a) t;
3988"), @r"
3989          ╭▸ 
3990        2 │ select t.a from (select 1 a) t;
3991          ╰╴         ─ 1. source      ─ 2. destination
3992        ");
3993    }
3994
3995    #[test]
3996    fn goto_cte_multiple_columns() {
3997        assert_snapshot!(goto("
3998with x as (select 1 as a, 2 as b)
3999select b$0 from x;
4000"), @r"
4001          ╭▸ 
4002        2 │ with x as (select 1 as a, 2 as b)
4003          │                                ─ 2. destination
4004        3 │ select b from x;
4005          ╰╴       ─ 1. source
4006        ");
4007    }
4008
4009    #[test]
4010    fn goto_cte_nested() {
4011        assert_snapshot!(goto("
4012with x as (select 1 as a),
4013     y as (select a from x)
4014select a$0 from y;
4015"), @r"
4016          ╭▸ 
4017        3 │      y as (select a from x)
4018          │                   ─ 2. destination
4019        4 │ select a from y;
4020          ╰╴       ─ 1. source
4021        ");
4022    }
4023
4024    #[test]
4025    fn goto_cte_unnamed_column() {
4026        assert_snapshot!(goto(r#"
4027with x as (select 1)
4028select "?column?"$0 from x;
4029"#), @r#"
4030          ╭▸ 
4031        2 │ with x as (select 1)
4032          │                   ─ 2. destination
4033        3 │ select "?column?" from x;
4034          ╰╴                ─ 1. source
4035        "#);
4036    }
4037
4038    #[test]
4039    fn goto_cte_star_expansion() {
4040        assert_snapshot!(goto("
4041with t as (select 1 a),
4042     y as (select * from t)
4043select a$0 from y;
4044"), @r"
4045          ╭▸ 
4046        2 │ with t as (select 1 a),
4047          │                     ─ 2. destination
4048        3 │      y as (select * from t)
4049        4 │ select a from y;
4050          ╰╴       ─ 1. source
4051        ");
4052    }
4053
4054    #[test]
4055    fn goto_cte_qualified_star_join_column() {
4056        assert_snapshot!(goto("
4057create table u(id int, b int);
4058create table t(id int, a int);
4059
4060with k as (
4061    select u.* from t join u on a = b
4062)
4063select b$0 from k;
4064"), @r"
4065          ╭▸ 
4066        2 │ create table u(id int, b int);
4067          │                        ─ 2. destination
40684069        8 │ select b from k;
4070          ╰╴       ─ 1. source
4071        ");
4072    }
4073
4074    #[test]
4075    fn goto_cte_qualified_star_join_column_with_partial_column_list() {
4076        assert_snapshot!(goto("
4077with
4078  u as (
4079    select 1 id, 2 b
4080  ),
4081  t as (
4082    select 1 id, 2 a
4083  ),
4084  k(x) as (
4085    select u.* from t join u on a = b
4086  )
4087select b$0 from k;
4088"), @r"
4089          ╭▸ 
4090        4 │     select 1 id, 2 b
4091          │                    ─ 2. destination
40924093       12 │ select b from k;
4094          ╰╴       ─ 1. source
4095        ");
4096    }
4097
4098    #[test]
4099    fn goto_cte_reference_inside_cte() {
4100        assert_snapshot!(goto("
4101with t as (select 1 a),
4102     y as (select a$0 from t)
4103select a from y;
4104"), @r"
4105          ╭▸ 
4106        2 │ with t as (select 1 a),
4107          │                     ─ 2. destination
4108        3 │      y as (select a from t)
4109          ╰╴                  ─ 1. source
4110        ");
4111    }
4112
4113    #[test]
4114    fn goto_recursive_cte_reference_inside_cte() {
4115        assert_snapshot!(goto("
4116with recursive nums as (
4117  select 1 as n
4118  union all
4119  select n + 1 from nums$0 where n < 5
4120)
4121select * from nums;
4122"), @r"
4123          ╭▸ 
4124        2 │ with recursive nums as (
4125          │                ──── 2. destination
41264127        5 │   select n + 1 from nums where n < 5
4128          ╰╴                       ─ 1. source
4129        ");
4130    }
4131
4132    #[test]
4133    fn goto_cte_with_column_list() {
4134        assert_snapshot!(goto("
4135with t(a) as (select 1)
4136select a$0 from t;
4137"), @r"
4138          ╭▸ 
4139        2 │ with t(a) as (select 1)
4140          │        ─ 2. destination
4141        3 │ select a from t;
4142          ╰╴       ─ 1. source
4143        ");
4144    }
4145
4146    #[test]
4147    fn goto_cte_with_partial_column_list() {
4148        assert_snapshot!(goto("
4149with t(x) as (select 1 as a, 2 as b)
4150select b$0 from t;
4151"), @r"
4152          ╭▸ 
4153        2 │ with t(x) as (select 1 as a, 2 as b)
4154          │                                   ─ 2. destination
4155        3 │ select b from t;
4156          ╰╴       ─ 1. source
4157        ");
4158    }
4159
4160    #[test]
4161    fn goto_cte_with_partial_column_list_renamed() {
4162        assert_snapshot!(goto("
4163with t(x) as (select 1 as a, 2 as b)
4164select x$0 from t;
4165"), @r"
4166          ╭▸ 
4167        2 │ with t(x) as (select 1 as a, 2 as b)
4168          │        ─ 2. destination
4169        3 │ select x from t;
4170          ╰╴       ─ 1. source
4171        ");
4172    }
4173
4174    #[test]
4175    fn goto_cte_insert_returning_star_column() {
4176        assert_snapshot!(goto("
4177create table t(a int, b int);
4178with inserted as (
4179  insert into t values (1, 2), (3, 4)
4180  returning *
4181)
4182select a$0 from inserted;
4183"), @r"
4184          ╭▸ 
4185        2 │ create table t(a int, b int);
4186          │                ─ 2. destination
41874188        7 │ select a from inserted;
4189          ╰╴       ─ 1. source
4190        ");
4191    }
4192
4193    #[test]
4194    fn goto_cte_delete_returning_star_column() {
4195        assert_snapshot!(goto("
4196create table t(a int, b int);
4197with deleted as (
4198  delete from t
4199  returning *
4200)
4201select a$0 from deleted;
4202"), @r"
4203          ╭▸ 
4204        2 │ create table t(a int, b int);
4205          │                ─ 2. destination
42064207        7 │ select a from deleted;
4208          ╰╴       ─ 1. source
4209        ");
4210    }
4211
4212    #[test]
4213    fn goto_cte_update_returning_star_column() {
4214        assert_snapshot!(goto("
4215create table t(a int, b int);
4216with updated as (
4217  update t set a = 42
4218  returning *
4219)
4220select a$0 from updated;
4221"), @r"
4222          ╭▸ 
4223        2 │ create table t(a int, b int);
4224          │                ─ 2. destination
42254226        7 │ select a from updated;
4227          ╰╴       ─ 1. source
4228        ");
4229    }
4230
4231    #[test]
4232    fn goto_cte_update_returning_column_list_overwrites_column() {
4233        goto_not_found(
4234            "
4235create table t(a int, b int);
4236with updated(c) as (
4237  update t set a = 10
4238  returning a
4239)
4240select a$0 from updated;
4241",
4242        );
4243    }
4244
4245    #[test]
4246    fn goto_cte_column_list_overwrites_column() {
4247        goto_not_found(
4248            "
4249with t(x) as (select 1 as a)
4250select a$0 from t;
4251",
4252        );
4253    }
4254
4255    #[test]
4256    fn goto_cte_shadows_table() {
4257        assert_snapshot!(goto("
4258create table t(a int);
4259with t as (select a$0 from t)
4260select a from t;
4261"), @r"
4262          ╭▸ 
4263        2 │ create table t(a int);
4264          │                ─ 2. destination
4265        3 │ with t as (select a from t)
4266          ╰╴                  ─ 1. source
4267        ");
4268    }
4269
4270    #[test]
4271    fn goto_subquery_column() {
4272        assert_snapshot!(goto("
4273select a$0 from (select 1 a);
4274"), @r"
4275          ╭▸ 
4276        2 │ select a from (select 1 a);
4277          ╰╴       ─ 1. source      ─ 2. destination
4278        ");
4279    }
4280
4281    #[test]
4282    fn goto_subquery_column_with_as() {
4283        assert_snapshot!(goto("
4284select a$0 from (select 1 as a);
4285"), @r"
4286          ╭▸ 
4287        2 │ select a from (select 1 as a);
4288          ╰╴       ─ 1. source         ─ 2. destination
4289        ");
4290    }
4291
4292    #[test]
4293    fn goto_subquery_column_multiple_columns() {
4294        assert_snapshot!(goto("
4295select b$0 from (select 1 a, 2 b);
4296"), @r"
4297          ╭▸ 
4298        2 │ select b from (select 1 a, 2 b);
4299          ╰╴       ─ 1. source           ─ 2. destination
4300        ");
4301    }
4302
4303    #[test]
4304    fn goto_subquery_column_nested_parens() {
4305        assert_snapshot!(goto("
4306select a$0 from ((select 1 a));
4307"), @r"
4308          ╭▸ 
4309        2 │ select a from ((select 1 a));
4310          ╰╴       ─ 1. source       ─ 2. destination
4311        ");
4312    }
4313
4314    #[test]
4315    fn goto_subquery_column_star_table() {
4316        assert_snapshot!(goto("
4317create table foo.t(a int);
4318select a$0 from (select * from foo.t);
4319"), @r"
4320          ╭▸ 
4321        2 │ create table foo.t(a int);
4322          │                    ─ 2. destination
4323        3 │ select a from (select * from foo.t);
4324          ╰╴       ─ 1. source
4325        ");
4326    }
4327
4328    #[test]
4329    fn goto_subquery_column_qualified_star_join() {
4330        assert_snapshot!(goto("
4331create table t(a int);
4332create table u(b int);
4333select b$0 from (select u.* from t join u on a = b);
4334"), @r"
4335          ╭▸ 
4336        3 │ create table u(b int);
4337          │                ─ 2. destination
4338        4 │ select b from (select u.* from t join u on a = b);
4339          ╰╴       ─ 1. source
4340        ");
4341    }
4342
4343    #[test]
4344    fn goto_subquery_column_qualified_star_join_not_found() {
4345        goto_not_found(
4346            "
4347create table t(a int);
4348create table u(b int);
4349select a$0 from (select u.* from t join u on a = b);
4350",
4351        );
4352    }
4353
4354    #[test]
4355    fn goto_subquery_column_alias_list() {
4356        assert_snapshot!(goto("
4357select c$0, t.c from (select 1) t(c);
4358"), @r"
4359          ╭▸ 
4360        2 │ select c, t.c from (select 1) t(c);
4361          ╰╴       ─ 1. source              ─ 2. destination
4362        ");
4363    }
4364
4365    #[test]
4366    fn goto_subquery_column_alias_list_qualified() {
4367        assert_snapshot!(goto("
4368select t.c$0 from (select 1) t(c);
4369"), @r"
4370          ╭▸ 
4371        2 │ select t.c from (select 1) t(c);
4372          ╰╴         ─ 1. source         ─ 2. destination
4373        ");
4374    }
4375
4376    #[test]
4377    fn goto_subquery_column_alias_list_multiple() {
4378        assert_snapshot!(goto("
4379select b$0 from (select 1, 2) t(a, b);
4380"), @r"
4381          ╭▸ 
4382        2 │ select b from (select 1, 2) t(a, b);
4383          ╰╴       ─ 1. source               ─ 2. destination
4384        ");
4385    }
4386
4387    #[test]
4388    fn goto_cte_column_alias_list() {
4389        assert_snapshot!(goto("
4390with x as (select 1)
4391select c$0 from x t(c);
4392"), @r"
4393          ╭▸ 
4394        3 │ select c from x t(c);
4395          │        ┬          ─ 2. destination
4396          │        │
4397          ╰╴       1. source
4398        ");
4399    }
4400
4401    #[test]
4402    fn goto_cte_column_alias_list_qualified() {
4403        assert_snapshot!(goto("
4404with x as (select 1)
4405select t.c$0 from x t(c);
4406"), @r"
4407          ╭▸ 
4408        3 │ select t.c from x t(c);
4409          │          ┬          ─ 2. destination
4410          │          │
4411          ╰╴         1. source
4412        ");
4413    }
4414
4415    #[test]
4416    fn goto_cte_column_alias_list_multiple() {
4417        assert_snapshot!(goto("
4418with x as (select 1, 2)
4419select b$0 from x t(a, b);
4420"), @r"
4421          ╭▸ 
4422        3 │ select b from x t(a, b);
4423          ╰╴       ─ 1. source   ─ 2. destination
4424        ");
4425    }
4426
4427    #[test]
4428    fn goto_values_column_alias_list() {
4429        assert_snapshot!(goto("
4430select c$0 from (values (1)) t(c);
4431"), @r"
4432          ╭▸ 
4433        2 │ select c from (values (1)) t(c);
4434          ╰╴       ─ 1. source           ─ 2. destination
4435        ");
4436    }
4437
4438    #[test]
4439    fn goto_values_column_alias_list_qualified() {
4440        assert_snapshot!(goto("
4441select t.c$0 from (values (1)) t(c);
4442"), @r"
4443          ╭▸ 
4444        2 │ select t.c from (values (1)) t(c);
4445          ╰╴         ─ 1. source           ─ 2. destination
4446        ");
4447    }
4448
4449    #[test]
4450    fn goto_values_column_alias_list_multiple() {
4451        assert_snapshot!(goto("
4452select b$0 from (values (1, 2)) t(a, b);
4453"), @r"
4454          ╭▸ 
4455        2 │ select b from (values (1, 2)) t(a, b);
4456          ╰╴       ─ 1. source                 ─ 2. destination
4457        ");
4458    }
4459
4460    #[test]
4461    fn goto_table_expr_column() {
4462        assert_snapshot!(goto("
4463create table t(a int, b int);
4464select a$0 from (table t);
4465"), @r"
4466          ╭▸ 
4467        2 │ create table t(a int, b int);
4468          │                ─ 2. destination
4469        3 │ select a from (table t);
4470          ╰╴       ─ 1. source
4471        ");
4472    }
4473
4474    #[test]
4475    fn goto_table_expr_column_with_cte() {
4476        assert_snapshot!(goto("
4477with x as (select 1 a)
4478select a$0 from (table x);
4479"), @r"
4480          ╭▸ 
4481        2 │ with x as (select 1 a)
4482          │                     ─ 2. destination
4483        3 │ select a from (table x);
4484          ╰╴       ─ 1. source
4485        ");
4486    }
4487
4488    #[test]
4489    fn goto_table_expr_partial_column_alias_list() {
4490        assert_snapshot!(goto("
4491with t as (select 1 a, 2 b)
4492select c, b$0 from (table t) u(c);
4493"), @r"
4494          ╭▸ 
4495        2 │ with t as (select 1 a, 2 b)
4496          │                          ─ 2. destination
4497        3 │ select c, b from (table t) u(c);
4498          ╰╴          ─ 1. source
4499        ");
4500    }
4501
4502    #[test]
4503    fn goto_subquery_partial_column_alias_list() {
4504        assert_snapshot!(goto("
4505select x, b$0 from (select 1 a, 2 b) t(x);
4506"), @r"
4507          ╭▸ 
4508        2 │ select x, b from (select 1 a, 2 b) t(x);
4509          ╰╴          ─ 1. source           ─ 2. destination
4510        ");
4511    }
4512
4513    #[test]
4514    fn goto_table_expr_values_cte_partial_alias() {
4515        assert_snapshot!(goto("
4516with t as (values (1, 2), (3, 4))
4517select column2$0 from (table t) u(a);
4518"), @r"
4519          ╭▸ 
4520        2 │ with t as (values (1, 2), (3, 4))
4521          │                       ─ 2. destination
4522        3 │ select column2 from (table t) u(a);
4523          ╰╴             ─ 1. source
4524        ");
4525    }
4526
4527    #[test]
4528    fn goto_cte_with_table_expr() {
4529        assert_snapshot!(goto("
4530create table t(a int, b int);
4531with u as (table t)
4532select a$0 from u;
4533"), @r"
4534          ╭▸ 
4535        2 │ create table t(a int, b int);
4536          │                ─ 2. destination
4537        3 │ with u as (table t)
4538        4 │ select a from u;
4539          ╰╴       ─ 1. source
4540        ");
4541    }
4542
4543    #[test]
4544    fn goto_cte_with_table_expr_nested() {
4545        assert_snapshot!(goto("
4546with t as (select 1 a, 2 b),
4547     u as (table t)
4548select b$0 from u;
4549"), @r"
4550          ╭▸ 
4551        2 │ with t as (select 1 a, 2 b),
4552          │                          ─ 2. destination
4553        3 │      u as (table t)
4554        4 │ select b from u;
4555          ╰╴       ─ 1. source
4556        ");
4557    }
4558
4559    #[test]
4560    fn goto_insert_table() {
4561        assert_snapshot!(goto("
4562create table users(id int, email text);
4563insert into users$0(id, email) values (1, 'test@example.com');
4564"), @r"
4565          ╭▸ 
4566        2 │ create table users(id int, email text);
4567          │              ───── 2. destination
4568        3 │ insert into users(id, email) values (1, 'test@example.com');
4569          ╰╴                ─ 1. source
4570        ");
4571    }
4572
4573    #[test]
4574    fn goto_insert_table_with_schema() {
4575        assert_snapshot!(goto("
4576create table public.users(id int, email text);
4577insert into public.users$0(id, email) values (1, 'test@example.com');
4578"), @r"
4579          ╭▸ 
4580        2 │ create table public.users(id int, email text);
4581          │                     ───── 2. destination
4582        3 │ insert into public.users(id, email) values (1, 'test@example.com');
4583          ╰╴                       ─ 1. source
4584        ");
4585    }
4586
4587    #[test]
4588    fn goto_insert_column() {
4589        assert_snapshot!(goto("
4590create table users(id int, email text);
4591insert into users(id$0, email) values (1, 'test@example.com');
4592"), @r"
4593          ╭▸ 
4594        2 │ create table users(id int, email text);
4595          │                    ── 2. destination
4596        3 │ insert into users(id, email) values (1, 'test@example.com');
4597          ╰╴                   ─ 1. source
4598        ");
4599    }
4600
4601    #[test]
4602    fn goto_insert_column_second() {
4603        assert_snapshot!(goto("
4604create table users(id int, email text);
4605insert into users(id, email$0) values (1, 'test@example.com');
4606"), @r"
4607          ╭▸ 
4608        2 │ create table users(id int, email text);
4609          │                            ───── 2. destination
4610        3 │ insert into users(id, email) values (1, 'test@example.com');
4611          ╰╴                          ─ 1. source
4612        ");
4613    }
4614
4615    #[test]
4616    fn goto_insert_column_with_schema() {
4617        assert_snapshot!(goto("
4618create table public.users(id int, email text);
4619insert into public.users(email$0) values ('test@example.com');
4620"), @r"
4621          ╭▸ 
4622        2 │ create table public.users(id int, email text);
4623          │                                   ───── 2. destination
4624        3 │ insert into public.users(email) values ('test@example.com');
4625          ╰╴                             ─ 1. source
4626        ");
4627    }
4628
4629    #[test]
4630    fn goto_insert_table_with_search_path() {
4631        assert_snapshot!(goto("
4632set search_path to foo;
4633create table foo.users(id int, email text);
4634insert into users$0(id, email) values (1, 'test@example.com');
4635"), @r"
4636          ╭▸ 
4637        3 │ create table foo.users(id int, email text);
4638          │                  ───── 2. destination
4639        4 │ insert into users(id, email) values (1, 'test@example.com');
4640          ╰╴                ─ 1. source
4641        ");
4642    }
4643
4644    #[test]
4645    fn goto_insert_column_with_search_path() {
4646        assert_snapshot!(goto("
4647set search_path to myschema;
4648create table myschema.users(id int, email text, name text);
4649insert into users(email$0, name) values ('test@example.com', 'Test');
4650"), @r"
4651          ╭▸ 
4652        3 │ create table myschema.users(id int, email text, name text);
4653          │                                     ───── 2. destination
4654        4 │ insert into users(email, name) values ('test@example.com', 'Test');
4655          ╰╴                      ─ 1. source
4656        ");
4657    }
4658
4659    #[test]
4660    fn goto_delete_table() {
4661        assert_snapshot!(goto("
4662create table users(id int, email text);
4663delete from users$0 where id = 1;
4664"), @r"
4665          ╭▸ 
4666        2 │ create table users(id int, email text);
4667          │              ───── 2. destination
4668        3 │ delete from users where id = 1;
4669          ╰╴                ─ 1. source
4670        ");
4671    }
4672
4673    #[test]
4674    fn goto_delete_table_with_schema() {
4675        assert_snapshot!(goto("
4676create table public.users(id int, email text);
4677delete from public.users$0 where id = 1;
4678"), @r"
4679          ╭▸ 
4680        2 │ create table public.users(id int, email text);
4681          │                     ───── 2. destination
4682        3 │ delete from public.users where id = 1;
4683          ╰╴                       ─ 1. source
4684        ");
4685    }
4686
4687    #[test]
4688    fn goto_delete_table_with_search_path() {
4689        assert_snapshot!(goto("
4690set search_path to foo;
4691create table foo.users(id int, email text);
4692delete from users$0 where id = 1;
4693"), @r"
4694          ╭▸ 
4695        3 │ create table foo.users(id int, email text);
4696          │                  ───── 2. destination
4697        4 │ delete from users where id = 1;
4698          ╰╴                ─ 1. source
4699        ");
4700    }
4701
4702    #[test]
4703    fn goto_delete_temp_table() {
4704        assert_snapshot!(goto("
4705create temp table users(id int, email text);
4706delete from users$0 where id = 1;
4707"), @r"
4708          ╭▸ 
4709        2 │ create temp table users(id int, email text);
4710          │                   ───── 2. destination
4711        3 │ delete from users where id = 1;
4712          ╰╴                ─ 1. source
4713        ");
4714    }
4715
4716    #[test]
4717    fn goto_delete_where_column() {
4718        assert_snapshot!(goto("
4719create table users(id int, email text);
4720delete from users where id$0 = 1;
4721"), @r"
4722          ╭▸ 
4723        2 │ create table users(id int, email text);
4724          │                    ── 2. destination
4725        3 │ delete from users where id = 1;
4726          ╰╴                         ─ 1. source
4727        ");
4728    }
4729
4730    #[test]
4731    fn goto_delete_where_column_second() {
4732        assert_snapshot!(goto("
4733create table users(id int, email text);
4734delete from users where email$0 = 'test@example.com';
4735"), @r"
4736          ╭▸ 
4737        2 │ create table users(id int, email text);
4738          │                            ───── 2. destination
4739        3 │ delete from users where email = 'test@example.com';
4740          ╰╴                            ─ 1. source
4741        ");
4742    }
4743
4744    #[test]
4745    fn goto_delete_where_column_with_schema() {
4746        assert_snapshot!(goto("
4747create table public.users(id int, email text, name text);
4748delete from public.users where name$0 = 'Test';
4749"), @r"
4750          ╭▸ 
4751        2 │ create table public.users(id int, email text, name text);
4752          │                                               ──── 2. destination
4753        3 │ delete from public.users where name = 'Test';
4754          ╰╴                                  ─ 1. source
4755        ");
4756    }
4757
4758    #[test]
4759    fn goto_delete_where_column_with_search_path() {
4760        assert_snapshot!(goto("
4761set search_path to myschema;
4762create table myschema.users(id int, email text, active boolean);
4763delete from users where active$0 = true;
4764"), @r"
4765          ╭▸ 
4766        3 │ create table myschema.users(id int, email text, active boolean);
4767          │                                                 ────── 2. destination
4768        4 │ delete from users where active = true;
4769          ╰╴                             ─ 1. source
4770        ");
4771    }
4772
4773    #[test]
4774    fn goto_delete_where_multiple_columns() {
4775        assert_snapshot!(goto("
4776create table users(id int, email text, active boolean);
4777delete from users where id$0 = 1 and active = true;
4778"), @r"
4779          ╭▸ 
4780        2 │ create table users(id int, email text, active boolean);
4781          │                    ── 2. destination
4782        3 │ delete from users where id = 1 and active = true;
4783          ╰╴                         ─ 1. source
4784        ");
4785    }
4786
4787    #[test]
4788    fn goto_delete_using_table() {
4789        assert_snapshot!(goto("
4790create table t(id int, f_id int);
4791create table f(id int, name text);
4792delete from t using f$0 where f_id = f.id and f.name = 'foo';
4793"), @r"
4794          ╭▸ 
4795        3 │ create table f(id int, name text);
4796          │              ─ 2. destination
4797        4 │ delete from t using f where f_id = f.id and f.name = 'foo';
4798          ╰╴                    ─ 1. source
4799        ");
4800    }
4801
4802    #[test]
4803    fn goto_delete_using_table_with_schema() {
4804        assert_snapshot!(goto("
4805create table t(id int, f_id int);
4806create table public.f(id int, name text);
4807delete from t using public.f$0 where f_id = f.id;
4808"), @r"
4809          ╭▸ 
4810        3 │ create table public.f(id int, name text);
4811          │                     ─ 2. destination
4812        4 │ delete from t using public.f where f_id = f.id;
4813          ╰╴                           ─ 1. source
4814        ");
4815    }
4816
4817    #[test]
4818    fn goto_delete_using_column_in_where() {
4819        assert_snapshot!(goto("
4820create table t(id int, f_id int);
4821create table f(id int, name text);
4822delete from t using f where f_id = f.id$0 and f.name = 'foo';
4823"), @r"
4824          ╭▸ 
4825        2 │ create table t(id int, f_id int);
4826          │                ── 2. destination
4827        3 │ create table f(id int, name text);
4828        4 │ delete from t using f where f_id = f.id and f.name = 'foo';
4829          ╰╴                                      ─ 1. source
4830        ");
4831    }
4832
4833    #[test]
4834    fn goto_select_from_table() {
4835        assert_snapshot!(goto("
4836create table users(id int, email text);
4837select * from users$0;
4838"), @r"
4839          ╭▸ 
4840        2 │ create table users(id int, email text);
4841          │              ───── 2. destination
4842        3 │ select * from users;
4843          ╰╴                  ─ 1. source
4844        ");
4845    }
4846
4847    #[test]
4848    fn goto_select_from_table_with_schema() {
4849        assert_snapshot!(goto("
4850create table public.users(id int, email text);
4851select * from public.users$0;
4852"), @r"
4853          ╭▸ 
4854        2 │ create table public.users(id int, email text);
4855          │                     ───── 2. destination
4856        3 │ select * from public.users;
4857          ╰╴                         ─ 1. source
4858        ");
4859    }
4860
4861    #[test]
4862    fn goto_select_from_table_with_search_path() {
4863        assert_snapshot!(goto("
4864set search_path to foo;
4865create table foo.users(id int, email text);
4866select * from users$0;
4867"), @r"
4868          ╭▸ 
4869        3 │ create table foo.users(id int, email text);
4870          │                  ───── 2. destination
4871        4 │ select * from users;
4872          ╰╴                  ─ 1. source
4873        ");
4874    }
4875
4876    #[test]
4877    fn goto_select_from_temp_table() {
4878        assert_snapshot!(goto("
4879create temp table users(id int, email text);
4880select * from users$0;
4881"), @r"
4882          ╭▸ 
4883        2 │ create temp table users(id int, email text);
4884          │                   ───── 2. destination
4885        3 │ select * from users;
4886          ╰╴                  ─ 1. source
4887        ");
4888    }
4889
4890    #[test]
4891    fn goto_select_from_table_defined_after() {
4892        assert_snapshot!(goto("
4893select * from users$0;
4894create table users(id int, email text);
4895"), @r"
4896          ╭▸ 
4897        2 │ select * from users;
4898          │                   ─ 1. source
4899        3 │ create table users(id int, email text);
4900          ╰╴             ───── 2. destination
4901        ");
4902    }
4903
4904    #[test]
4905    fn goto_select_column() {
4906        assert_snapshot!(goto("
4907create table users(id int, email text);
4908select id$0 from users;
4909"), @r"
4910          ╭▸ 
4911        2 │ create table users(id int, email text);
4912          │                    ── 2. destination
4913        3 │ select id from users;
4914          ╰╴        ─ 1. source
4915        ");
4916    }
4917
4918    #[test]
4919    fn goto_select_column_second() {
4920        assert_snapshot!(goto("
4921create table users(id int, email text);
4922select id, email$0 from users;
4923"), @r"
4924          ╭▸ 
4925        2 │ create table users(id int, email text);
4926          │                            ───── 2. destination
4927        3 │ select id, email from users;
4928          ╰╴               ─ 1. source
4929        ");
4930    }
4931
4932    #[test]
4933    fn goto_select_column_with_schema() {
4934        assert_snapshot!(goto("
4935create table public.users(id int, email text);
4936select email$0 from public.users;
4937"), @r"
4938          ╭▸ 
4939        2 │ create table public.users(id int, email text);
4940          │                                   ───── 2. destination
4941        3 │ select email from public.users;
4942          ╰╴           ─ 1. source
4943        ");
4944    }
4945
4946    #[test]
4947    fn goto_select_column_with_search_path() {
4948        assert_snapshot!(goto("
4949set search_path to foo;
4950create table foo.users(id int, email text);
4951select id$0 from users;
4952"), @r"
4953          ╭▸ 
4954        3 │ create table foo.users(id int, email text);
4955          │                        ── 2. destination
4956        4 │ select id from users;
4957          ╰╴        ─ 1. source
4958        ");
4959    }
4960
4961    #[test]
4962    fn goto_select_table_as_column() {
4963        assert_snapshot!(goto("
4964create table t(x bigint, y bigint);
4965select t$0 from t;
4966"), @r"
4967          ╭▸ 
4968        2 │ create table t(x bigint, y bigint);
4969          │              ─ 2. destination
4970        3 │ select t from t;
4971          ╰╴       ─ 1. source
4972        ");
4973    }
4974
4975    #[test]
4976    fn goto_select_table_star_expansion() {
4977        assert_snapshot!(goto("
4978create table t(id int, a int);
4979select t$0.* from t;
4980"), @r"
4981          ╭▸ 
4982        2 │ create table t(id int, a int);
4983          │              ─ 2. destination
4984        3 │ select t.* from t;
4985          ╰╴       ─ 1. source
4986        ");
4987    }
4988
4989    #[test]
4990    fn goto_select_table_as_column_with_schema() {
4991        assert_snapshot!(goto("
4992create table public.t(x bigint, y bigint);
4993select t$0 from public.t;
4994"), @r"
4995          ╭▸ 
4996        2 │ create table public.t(x bigint, y bigint);
4997          │                     ─ 2. destination
4998        3 │ select t from public.t;
4999          ╰╴       ─ 1. source
5000        ");
5001    }
5002
5003    #[test]
5004    fn goto_select_table_as_column_with_search_path() {
5005        assert_snapshot!(goto("
5006set search_path to foo;
5007create table foo.users(id int, email text);
5008select users$0 from users;
5009"), @r"
5010          ╭▸ 
5011        3 │ create table foo.users(id int, email text);
5012          │                  ───── 2. destination
5013        4 │ select users from users;
5014          ╰╴           ─ 1. source
5015        ");
5016    }
5017
5018    #[test]
5019    fn goto_select_column_with_same_name_as_table() {
5020        assert_snapshot!(goto("
5021create table t(t int);
5022select t$0 from t;
5023"), @r"
5024          ╭▸ 
5025        2 │ create table t(t int);
5026          │                ─ 2. destination
5027        3 │ select t from t;
5028          ╰╴       ─ 1. source
5029        ");
5030    }
5031
5032    #[test]
5033    fn goto_drop_schema() {
5034        assert_snapshot!(goto("
5035create schema foo;
5036drop schema foo$0;
5037"), @r"
5038          ╭▸ 
5039        2 │ create schema foo;
5040          │               ─── 2. destination
5041        3 │ drop schema foo;
5042          ╰╴              ─ 1. source
5043        ");
5044    }
5045
5046    #[test]
5047    fn goto_create_schema_authorization() {
5048        assert_snapshot!(goto("
5049create schema authorization foo$0;
5050"), @r"
5051          ╭▸ 
5052        2 │ create schema authorization foo;
5053          │                             ┬─┬
5054          │                             │ │
5055          │                             │ 1. source
5056          ╰╴                            2. destination
5057        ");
5058    }
5059
5060    #[test]
5061    fn goto_drop_schema_authorization() {
5062        assert_snapshot!(goto("
5063create schema authorization foo;
5064drop schema foo$0;
5065"), @r"
5066          ╭▸ 
5067        2 │ create schema authorization foo;
5068          │                             ─── 2. destination
5069        3 │ drop schema foo;
5070          ╰╴              ─ 1. source
5071        ");
5072    }
5073
5074    #[test]
5075    fn goto_drop_schema_defined_after() {
5076        assert_snapshot!(goto("
5077drop schema foo$0;
5078create schema foo;
5079"), @r"
5080          ╭▸ 
5081        2 │ drop schema foo;
5082          │               ─ 1. source
5083        3 │ create schema foo;
5084          ╰╴              ─── 2. destination
5085        ");
5086    }
5087
5088    #[test]
5089    fn goto_schema_qualifier_in_table() {
5090        assert_snapshot!(goto("
5091create schema foo;
5092create table foo$0.t(a int);
5093"), @r"
5094          ╭▸ 
5095        2 │ create schema foo;
5096          │               ─── 2. destination
5097        3 │ create table foo.t(a int);
5098          ╰╴               ─ 1. source
5099        ");
5100    }
5101
5102    #[test]
5103    fn goto_schema_qualifier_in_drop_table() {
5104        assert_snapshot!(goto("
5105create schema foo;
5106create table foo.t(a int);
5107drop table foo$0.t;
5108"), @r"
5109          ╭▸ 
5110        2 │ create schema foo;
5111          │               ─── 2. destination
5112        3 │ create table foo.t(a int);
5113        4 │ drop table foo.t;
5114          ╰╴             ─ 1. source
5115        ");
5116    }
5117
5118    #[test]
5119    fn goto_schema_qualifier_multiple_schemas() {
5120        assert_snapshot!(goto("
5121create schema foo;
5122create schema bar;
5123create table bar$0.t(a int);
5124"), @r"
5125          ╭▸ 
5126        3 │ create schema bar;
5127          │               ─── 2. destination
5128        4 │ create table bar.t(a int);
5129          ╰╴               ─ 1. source
5130        ");
5131    }
5132
5133    #[test]
5134    fn goto_schema_qualifier_in_function_call() {
5135        assert_snapshot!(goto(r#"
5136create schema foo;
5137create function foo.bar() returns int as $$ begin return 1; end; $$ language plpgsql;
5138select foo$0.bar();
5139"#), @r"
5140          ╭▸ 
5141        2 │ create schema foo;
5142          │               ─── 2. destination
5143        3 │ create function foo.bar() returns int as $$ begin return 1; end; $$ language plpgsql;
5144        4 │ select foo.bar();
5145          ╰╴         ─ 1. source
5146        ");
5147    }
5148
5149    #[test]
5150    fn goto_schema_qualifier_in_function_call_from_clause() {
5151        assert_snapshot!(goto(r#"
5152create schema myschema;
5153create function myschema.get_data() returns table(id int) as $$ begin return query select 1; end; $$ language plpgsql;
5154select * from myschema$0.get_data();
5155"#), @r"
5156          ╭▸ 
5157        2 │ create schema myschema;
5158          │               ──────── 2. destination
5159        3 │ create function myschema.get_data() returns table(id int) as $$ begin return query select 1; end; $$ language plpgsql;
5160        4 │ select * from myschema.get_data();
5161          ╰╴                     ─ 1. source
5162        ");
5163    }
5164
5165    #[test]
5166    fn goto_schema_qualifier_in_select_from() {
5167        assert_snapshot!(goto("
5168create schema foo;
5169create table foo.t(x int);
5170select x from foo$0.t;
5171"), @r"
5172          ╭▸ 
5173        2 │ create schema foo;
5174          │               ─── 2. destination
5175        3 │ create table foo.t(x int);
5176        4 │ select x from foo.t;
5177          ╰╴                ─ 1. source
5178        ");
5179    }
5180
5181    #[test]
5182    fn goto_qualified_column_table() {
5183        assert_snapshot!(goto("
5184create table t(a int);
5185select t$0.a from t;
5186"), @r"
5187          ╭▸ 
5188        2 │ create table t(a int);
5189          │              ─ 2. destination
5190        3 │ select t.a from t;
5191          ╰╴       ─ 1. source
5192        ");
5193    }
5194
5195    #[test]
5196    fn goto_qualified_column_column() {
5197        assert_snapshot!(goto("
5198create table t(a int);
5199select t.a$0 from t;
5200"), @r"
5201          ╭▸ 
5202        2 │ create table t(a int);
5203          │                ─ 2. destination
5204        3 │ select t.a from t;
5205          ╰╴         ─ 1. source
5206        ");
5207    }
5208
5209    #[test]
5210    fn goto_three_part_qualified_column_schema() {
5211        assert_snapshot!(goto("
5212create schema foo;
5213create table foo.t(a int);
5214select foo$0.t.a from t;
5215"), @r"
5216          ╭▸ 
5217        2 │ create schema foo;
5218          │               ─── 2. destination
5219        3 │ create table foo.t(a int);
5220        4 │ select foo.t.a from t;
5221          ╰╴         ─ 1. source
5222        ");
5223    }
5224
5225    #[test]
5226    fn goto_three_part_qualified_column_table() {
5227        assert_snapshot!(goto("
5228create schema foo;
5229create table foo.t(a int);
5230select foo.t$0.a from t;
5231"), @r"
5232          ╭▸ 
5233        3 │ create table foo.t(a int);
5234          │                  ─ 2. destination
5235        4 │ select foo.t.a from t;
5236          ╰╴           ─ 1. source
5237        ");
5238    }
5239
5240    #[test]
5241    fn goto_three_part_qualified_column_column() {
5242        assert_snapshot!(goto("
5243create schema foo;
5244create table foo.t(a int);
5245select foo.t.a$0 from t;
5246"), @r"
5247          ╭▸ 
5248        3 │ create table foo.t(a int);
5249          │                    ─ 2. destination
5250        4 │ select foo.t.a from t;
5251          ╰╴             ─ 1. source
5252        ");
5253    }
5254
5255    #[test]
5256    fn goto_cte_values_column1() {
5257        assert_snapshot!(goto("
5258with t as (
5259    values (1, 2), (3, 4)
5260)
5261select column1$0, column2 from t;
5262"), @r"
5263          ╭▸ 
5264        3 │     values (1, 2), (3, 4)
5265          │             ─ 2. destination
5266        4 │ )
5267        5 │ select column1, column2 from t;
5268          ╰╴             ─ 1. source
5269        ");
5270    }
5271
5272    #[test]
5273    fn goto_cte_values_column2() {
5274        assert_snapshot!(goto("
5275with t as (
5276    values (1, 2), (3, 4)
5277)
5278select column1, column2$0 from t;
5279"), @r"
5280          ╭▸ 
5281        3 │     values (1, 2), (3, 4)
5282          │                ─ 2. destination
5283        4 │ )
5284        5 │ select column1, column2 from t;
5285          ╰╴                      ─ 1. source
5286        ");
5287    }
5288
5289    #[test]
5290    fn goto_cte_values_single_column() {
5291        assert_snapshot!(goto("
5292with t as (
5293    values (1), (2), (3)
5294)
5295select column1$0 from t;
5296"), @r"
5297          ╭▸ 
5298        3 │     values (1), (2), (3)
5299          │             ─ 2. destination
5300        4 │ )
5301        5 │ select column1 from t;
5302          ╰╴             ─ 1. source
5303        ");
5304    }
5305
5306    #[test]
5307    fn goto_cte_values_multiple_rows() {
5308        assert_snapshot!(goto("
5309with t as (
5310    values
5311        (1, 2, 3),
5312        (4, 5, 6),
5313        (7, 8, 9)
5314)
5315select column3$0 from t;
5316"), @r"
5317          ╭▸ 
5318        4 │         (1, 2, 3),
5319          │                ─ 2. destination
53205321        8 │ select column3 from t;
5322          ╰╴             ─ 1. source
5323        ");
5324    }
5325
5326    #[test]
5327    fn goto_cte_values_uppercase_column_names() {
5328        assert_snapshot!(goto("
5329with t as (
5330    values (1, 2), (3, 4)
5331)
5332select COLUMN1$0, COLUMN2 from t;
5333"), @r"
5334          ╭▸ 
5335        3 │     values (1, 2), (3, 4)
5336          │             ─ 2. destination
5337        4 │ )
5338        5 │ select COLUMN1, COLUMN2 from t;
5339          ╰╴             ─ 1. source
5340        ");
5341    }
5342
5343    #[test]
5344    fn goto_qualified_column_with_schema_in_from_table() {
5345        assert_snapshot!(goto("
5346create table foo.t(a int, b int);
5347select t$0.a from foo.t;
5348"), @r"
5349          ╭▸ 
5350        2 │ create table foo.t(a int, b int);
5351          │                  ─ 2. destination
5352        3 │ select t.a from foo.t;
5353          ╰╴       ─ 1. source
5354        ");
5355    }
5356
5357    #[test]
5358    fn goto_qualified_column_with_schema_in_from_column() {
5359        assert_snapshot!(goto("
5360create table foo.t(a int, b int);
5361select t.a$0 from foo.t;
5362"), @r"
5363          ╭▸ 
5364        2 │ create table foo.t(a int, b int);
5365          │                    ─ 2. destination
5366        3 │ select t.a from foo.t;
5367          ╰╴         ─ 1. source
5368        ");
5369    }
5370
5371    #[test]
5372    fn goto_cte_union_all_column() {
5373        assert_snapshot!(goto("
5374with t as (
5375    select 1 as a, 2 as b
5376    union all
5377    select 3, 4
5378)
5379select a$0, b from t;
5380"), @r"
5381          ╭▸ 
5382        3 │     select 1 as a, 2 as b
5383          │                 ─ 2. destination
53845385        7 │ select a, b from t;
5386          ╰╴       ─ 1. source
5387        ");
5388    }
5389
5390    #[test]
5391    fn goto_cte_union_all_column_second() {
5392        assert_snapshot!(goto("
5393with t as (
5394    select 1 as a, 2 as b
5395    union all
5396    select 3, 4
5397)
5398select a, b$0 from t;
5399"), @r"
5400          ╭▸ 
5401        3 │     select 1 as a, 2 as b
5402          │                         ─ 2. destination
54035404        7 │ select a, b from t;
5405          ╰╴          ─ 1. source
5406        ");
5407    }
5408
5409    #[test]
5410    fn goto_cte_union_column() {
5411        assert_snapshot!(goto("
5412with t as (
5413    select 1 as a, 2 as b
5414    union
5415    select 3, 4
5416)
5417select a$0 from t;
5418"), @r"
5419          ╭▸ 
5420        3 │     select 1 as a, 2 as b
5421          │                 ─ 2. destination
54225423        7 │ select a from t;
5424          ╰╴       ─ 1. source
5425        ");
5426    }
5427
5428    #[test]
5429    fn goto_cte_insert_returning_column() {
5430        assert_snapshot!(goto("
5431create table t(a int, b int);
5432with inserted as (
5433  insert into t values (1, 2), (3, 4)
5434  returning a, b
5435)
5436select a$0 from inserted;
5437"), @r"
5438          ╭▸ 
5439        5 │   returning a, b
5440          │             ─ 2. destination
5441        6 │ )
5442        7 │ select a from inserted;
5443          ╰╴       ─ 1. source
5444        ");
5445    }
5446
5447    #[test]
5448    fn goto_cte_insert_returning_aliased_column() {
5449        assert_snapshot!(goto("
5450create table t(a int, b int);
5451with inserted as (
5452  insert into t values (1, 2), (3, 4)
5453  returning a as x
5454)
5455select x$0 from inserted;
5456"), @r"
5457          ╭▸ 
5458        5 │   returning a as x
5459          │                  ─ 2. destination
5460        6 │ )
5461        7 │ select x from inserted;
5462          ╰╴       ─ 1. source
5463        ");
5464    }
5465
5466    #[test]
5467    fn goto_drop_aggregate() {
5468        assert_snapshot!(goto("
5469create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5470drop aggregate myavg$0(int);
5471"), @r"
5472          ╭▸ 
5473        2 │ create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5474          │                  ───── 2. destination
5475        3 │ drop aggregate myavg(int);
5476          ╰╴                   ─ 1. source
5477        ");
5478    }
5479
5480    #[test]
5481    fn goto_drop_aggregate_with_schema() {
5482        assert_snapshot!(goto("
5483set search_path to public;
5484create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5485drop aggregate public.myavg$0(int);
5486"), @r"
5487          ╭▸ 
5488        3 │ create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5489          │                  ───── 2. destination
5490        4 │ drop aggregate public.myavg(int);
5491          ╰╴                          ─ 1. source
5492        ");
5493    }
5494
5495    #[test]
5496    fn goto_drop_aggregate_defined_after() {
5497        assert_snapshot!(goto("
5498drop aggregate myavg$0(int);
5499create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5500"), @r"
5501          ╭▸ 
5502        2 │ drop aggregate myavg(int);
5503          │                    ─ 1. source
5504        3 │ create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5505          ╰╴                 ───── 2. destination
5506        ");
5507    }
5508
5509    #[test]
5510    fn goto_aggregate_definition_returns_self() {
5511        assert_snapshot!(goto("
5512create aggregate myavg$0(int) (sfunc = int4_avg_accum, stype = _int8);
5513"), @r"
5514          ╭▸ 
5515        2 │ create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5516          │                  ┬───┬
5517          │                  │   │
5518          │                  │   1. source
5519          ╰╴                 2. destination
5520        ");
5521    }
5522
5523    #[test]
5524    fn goto_drop_aggregate_with_search_path() {
5525        assert_snapshot!(goto("
5526create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5527set search_path to bar;
5528create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5529set search_path to default;
5530drop aggregate myavg$0(int);
5531"), @r"
5532          ╭▸ 
5533        2 │ create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5534          │                  ───── 2. destination
55355536        6 │ drop aggregate myavg(int);
5537          ╰╴                   ─ 1. source
5538        ");
5539    }
5540
5541    #[test]
5542    fn goto_drop_aggregate_multiple() {
5543        assert_snapshot!(goto("
5544create aggregate avg1(int) (sfunc = int4_avg_accum, stype = _int8);
5545create aggregate avg2(int) (sfunc = int4_avg_accum, stype = _int8);
5546drop aggregate avg1(int), avg2$0(int);
5547"), @r"
5548          ╭▸ 
5549        3 │ create aggregate avg2(int) (sfunc = int4_avg_accum, stype = _int8);
5550          │                  ──── 2. destination
5551        4 │ drop aggregate avg1(int), avg2(int);
5552          ╰╴                             ─ 1. source
5553        ");
5554    }
5555
5556    #[test]
5557    fn goto_drop_aggregate_overloaded() {
5558        assert_snapshot!(goto("
5559create aggregate sum(complex) (sfunc = complex_add, stype = complex, initcond = '(0,0)');
5560create aggregate sum(bigint) (sfunc = bigint_add, stype = bigint, initcond = '0');
5561drop aggregate sum$0(complex);
5562"), @r"
5563          ╭▸ 
5564        2 │ create aggregate sum(complex) (sfunc = complex_add, stype = complex, initcond = '(0,0)');
5565          │                  ─── 2. destination
5566        3 │ create aggregate sum(bigint) (sfunc = bigint_add, stype = bigint, initcond = '0');
5567        4 │ drop aggregate sum(complex);
5568          ╰╴                 ─ 1. source
5569        ");
5570    }
5571
5572    #[test]
5573    fn goto_drop_aggregate_second_overload() {
5574        assert_snapshot!(goto("
5575create aggregate sum(complex) (sfunc = complex_add, stype = complex, initcond = '(0,0)');
5576create aggregate sum(bigint) (sfunc = bigint_add, stype = bigint, initcond = '0');
5577drop aggregate sum$0(bigint);
5578"), @r"
5579          ╭▸ 
5580        3 │ create aggregate sum(bigint) (sfunc = bigint_add, stype = bigint, initcond = '0');
5581          │                  ─── 2. destination
5582        4 │ drop aggregate sum(bigint);
5583          ╰╴                 ─ 1. source
5584        ");
5585    }
5586
5587    #[test]
5588    fn goto_drop_routine_function() {
5589        assert_snapshot!(goto("
5590create function foo() returns int as $$ select 1 $$ language sql;
5591drop routine foo$0();
5592"), @r"
5593          ╭▸ 
5594        2 │ create function foo() returns int as $$ select 1 $$ language sql;
5595          │                 ─── 2. destination
5596        3 │ drop routine foo();
5597          ╰╴               ─ 1. source
5598        ");
5599    }
5600
5601    #[test]
5602    fn goto_drop_routine_aggregate() {
5603        assert_snapshot!(goto("
5604create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5605drop routine myavg$0(int);
5606"), @r"
5607          ╭▸ 
5608        2 │ create aggregate myavg(int) (sfunc = int4_avg_accum, stype = _int8);
5609          │                  ───── 2. destination
5610        3 │ drop routine myavg(int);
5611          ╰╴                 ─ 1. source
5612        ");
5613    }
5614
5615    #[test]
5616    fn goto_drop_routine_with_schema() {
5617        assert_snapshot!(goto("
5618set search_path to public;
5619create function foo() returns int as $$ select 1 $$ language sql;
5620drop routine public.foo$0();
5621"), @r"
5622          ╭▸ 
5623        3 │ create function foo() returns int as $$ select 1 $$ language sql;
5624          │                 ─── 2. destination
5625        4 │ drop routine public.foo();
5626          ╰╴                      ─ 1. source
5627        ");
5628    }
5629
5630    #[test]
5631    fn goto_drop_routine_defined_after() {
5632        assert_snapshot!(goto("
5633drop routine foo$0();
5634create function foo() returns int as $$ select 1 $$ language sql;
5635"), @r"
5636          ╭▸ 
5637        2 │ drop routine foo();
5638          │                ─ 1. source
5639        3 │ create function foo() returns int as $$ select 1 $$ language sql;
5640          ╰╴                ─── 2. destination
5641        ");
5642    }
5643
5644    #[test]
5645    fn goto_drop_routine_with_search_path() {
5646        assert_snapshot!(goto("
5647create function foo() returns int as $$ select 1 $$ language sql;
5648set search_path to bar;
5649create function foo() returns int as $$ select 1 $$ language sql;
5650set search_path to default;
5651drop routine foo$0();
5652"), @r"
5653          ╭▸ 
5654        2 │ create function foo() returns int as $$ select 1 $$ language sql;
5655          │                 ─── 2. destination
56565657        6 │ drop routine foo();
5658          ╰╴               ─ 1. source
5659        ");
5660    }
5661
5662    #[test]
5663    fn goto_drop_routine_overloaded() {
5664        assert_snapshot!(goto("
5665create function add(complex) returns complex as $$ select null $$ language sql;
5666create function add(bigint) returns bigint as $$ select 1 $$ language sql;
5667drop routine add$0(complex);
5668"), @r"
5669          ╭▸ 
5670        2 │ create function add(complex) returns complex as $$ select null $$ language sql;
5671          │                 ─── 2. destination
5672        3 │ create function add(bigint) returns bigint as $$ select 1 $$ language sql;
5673        4 │ drop routine add(complex);
5674          ╰╴               ─ 1. source
5675        ");
5676    }
5677
5678    #[test]
5679    fn goto_drop_routine_second_overload() {
5680        assert_snapshot!(goto("
5681create function add(complex) returns complex as $$ select null $$ language sql;
5682create function add(bigint) returns bigint as $$ select 1 $$ language sql;
5683drop routine add$0(bigint);
5684"), @r"
5685          ╭▸ 
5686        3 │ create function add(bigint) returns bigint as $$ select 1 $$ language sql;
5687          │                 ─── 2. destination
5688        4 │ drop routine add(bigint);
5689          ╰╴               ─ 1. source
5690        ");
5691    }
5692
5693    #[test]
5694    fn goto_drop_routine_aggregate_overloaded() {
5695        assert_snapshot!(goto("
5696create aggregate sum(complex) (sfunc = complex_add, stype = complex, initcond = '(0,0)');
5697create aggregate sum(bigint) (sfunc = bigint_add, stype = bigint, initcond = '0');
5698drop routine sum$0(complex);
5699"), @r"
5700          ╭▸ 
5701        2 │ create aggregate sum(complex) (sfunc = complex_add, stype = complex, initcond = '(0,0)');
5702          │                  ─── 2. destination
5703        3 │ create aggregate sum(bigint) (sfunc = bigint_add, stype = bigint, initcond = '0');
5704        4 │ drop routine sum(complex);
5705          ╰╴               ─ 1. source
5706        ");
5707    }
5708
5709    #[test]
5710    fn goto_drop_routine_multiple() {
5711        assert_snapshot!(goto("
5712create function foo() returns int as $$ select 1 $$ language sql;
5713create function bar() returns int as $$ select 1 $$ language sql;
5714drop routine foo(), bar$0();
5715"), @r"
5716          ╭▸ 
5717        3 │ create function bar() returns int as $$ select 1 $$ language sql;
5718          │                 ─── 2. destination
5719        4 │ drop routine foo(), bar();
5720          ╰╴                      ─ 1. source
5721        ");
5722    }
5723
5724    #[test]
5725    fn goto_drop_procedure() {
5726        assert_snapshot!(goto("
5727create procedure foo() language sql as $$ select 1 $$;
5728drop procedure foo$0();
5729"), @r"
5730          ╭▸ 
5731        2 │ create procedure foo() language sql as $$ select 1 $$;
5732          │                  ─── 2. destination
5733        3 │ drop procedure foo();
5734          ╰╴                 ─ 1. source
5735        ");
5736    }
5737
5738    #[test]
5739    fn goto_drop_procedure_with_schema() {
5740        assert_snapshot!(goto("
5741set search_path to public;
5742create procedure foo() language sql as $$ select 1 $$;
5743drop procedure public.foo$0();
5744"), @r"
5745          ╭▸ 
5746        3 │ create procedure foo() language sql as $$ select 1 $$;
5747          │                  ─── 2. destination
5748        4 │ drop procedure public.foo();
5749          ╰╴                        ─ 1. source
5750        ");
5751    }
5752
5753    #[test]
5754    fn goto_drop_procedure_defined_after() {
5755        assert_snapshot!(goto("
5756drop procedure foo$0();
5757create procedure foo() language sql as $$ select 1 $$;
5758"), @r"
5759          ╭▸ 
5760        2 │ drop procedure foo();
5761          │                  ─ 1. source
5762        3 │ create procedure foo() language sql as $$ select 1 $$;
5763          ╰╴                 ─── 2. destination
5764        ");
5765    }
5766
5767    #[test]
5768    fn goto_drop_procedure_with_search_path() {
5769        assert_snapshot!(goto("
5770create procedure foo() language sql as $$ select 1 $$;
5771set search_path to bar;
5772create procedure foo() language sql as $$ select 1 $$;
5773set search_path to default;
5774drop procedure foo$0();
5775"), @r"
5776          ╭▸ 
5777        2 │ create procedure foo() language sql as $$ select 1 $$;
5778          │                  ─── 2. destination
57795780        6 │ drop procedure foo();
5781          ╰╴                 ─ 1. source
5782        ");
5783    }
5784
5785    #[test]
5786    fn goto_drop_procedure_overloaded() {
5787        assert_snapshot!(goto("
5788create procedure add(complex) language sql as $$ select null $$;
5789create procedure add(bigint) language sql as $$ select 1 $$;
5790drop procedure add$0(complex);
5791"), @r"
5792          ╭▸ 
5793        2 │ create procedure add(complex) language sql as $$ select null $$;
5794          │                  ─── 2. destination
5795        3 │ create procedure add(bigint) language sql as $$ select 1 $$;
5796        4 │ drop procedure add(complex);
5797          ╰╴                 ─ 1. source
5798        ");
5799    }
5800
5801    #[test]
5802    fn goto_drop_procedure_second_overload() {
5803        assert_snapshot!(goto("
5804create procedure add(complex) language sql as $$ select null $$;
5805create procedure add(bigint) language sql as $$ select 1 $$;
5806drop procedure add$0(bigint);
5807"), @r"
5808          ╭▸ 
5809        3 │ create procedure add(bigint) language sql as $$ select 1 $$;
5810          │                  ─── 2. destination
5811        4 │ drop procedure add(bigint);
5812          ╰╴                 ─ 1. source
5813        ");
5814    }
5815
5816    #[test]
5817    fn goto_drop_procedure_multiple() {
5818        assert_snapshot!(goto("
5819create procedure foo() language sql as $$ select 1 $$;
5820create procedure bar() language sql as $$ select 1 $$;
5821drop procedure foo(), bar$0();
5822"), @r"
5823          ╭▸ 
5824        3 │ create procedure bar() language sql as $$ select 1 $$;
5825          │                  ─── 2. destination
5826        4 │ drop procedure foo(), bar();
5827          ╰╴                        ─ 1. source
5828        ");
5829    }
5830
5831    #[test]
5832    fn goto_procedure_definition_returns_self() {
5833        assert_snapshot!(goto("
5834create procedure foo$0() language sql as $$ select 1 $$;
5835"), @r"
5836          ╭▸ 
5837        2 │ create procedure foo() language sql as $$ select 1 $$;
5838          │                  ┬─┬
5839          │                  │ │
5840          │                  │ 1. source
5841          ╰╴                 2. destination
5842        ");
5843    }
5844
5845    #[test]
5846    fn goto_call_procedure() {
5847        assert_snapshot!(goto("
5848create procedure foo() language sql as $$ select 1 $$;
5849call foo$0();
5850"), @r"
5851          ╭▸ 
5852        2 │ create procedure foo() language sql as $$ select 1 $$;
5853          │                  ─── 2. destination
5854        3 │ call foo();
5855          ╰╴       ─ 1. source
5856        ");
5857    }
5858
5859    #[test]
5860    fn goto_call_procedure_with_schema() {
5861        assert_snapshot!(goto("
5862create procedure public.foo() language sql as $$ select 1 $$;
5863call public.foo$0();
5864"), @r"
5865          ╭▸ 
5866        2 │ create procedure public.foo() language sql as $$ select 1 $$;
5867          │                         ─── 2. destination
5868        3 │ call public.foo();
5869          ╰╴              ─ 1. source
5870        ");
5871    }
5872
5873    #[test]
5874    fn goto_call_procedure_with_search_path() {
5875        assert_snapshot!(goto("
5876set search_path to myschema;
5877create procedure foo() language sql as $$ select 1 $$;
5878call myschema.foo$0();
5879"), @r"
5880          ╭▸ 
5881        3 │ create procedure foo() language sql as $$ select 1 $$;
5882          │                  ─── 2. destination
5883        4 │ call myschema.foo();
5884          ╰╴                ─ 1. source
5885        ");
5886    }
5887
5888    #[test]
5889    fn goto_drop_routine_procedure() {
5890        assert_snapshot!(goto("
5891create procedure foo() language sql as $$ select 1 $$;
5892drop routine foo$0();
5893"), @r"
5894          ╭▸ 
5895        2 │ create procedure foo() language sql as $$ select 1 $$;
5896          │                  ─── 2. destination
5897        3 │ drop routine foo();
5898          ╰╴               ─ 1. source
5899        ");
5900    }
5901
5902    #[test]
5903    fn goto_drop_routine_prefers_function_over_procedure() {
5904        assert_snapshot!(goto("
5905create function foo() returns int as $$ select 1 $$ language sql;
5906create procedure foo() language sql as $$ select 1 $$;
5907drop routine foo$0();
5908"), @r"
5909          ╭▸ 
5910        2 │ create function foo() returns int as $$ select 1 $$ language sql;
5911          │                 ─── 2. destination
5912        3 │ create procedure foo() language sql as $$ select 1 $$;
5913        4 │ drop routine foo();
5914          ╰╴               ─ 1. source
5915        ");
5916    }
5917
5918    #[test]
5919    fn goto_drop_routine_prefers_aggregate_over_procedure() {
5920        assert_snapshot!(goto("
5921create aggregate foo(int) (sfunc = int4_avg_accum, stype = _int8);
5922create procedure foo(int) language sql as $$ select 1 $$;
5923drop routine foo$0(int);
5924"), @r"
5925          ╭▸ 
5926        2 │ create aggregate foo(int) (sfunc = int4_avg_accum, stype = _int8);
5927          │                  ─── 2. destination
5928        3 │ create procedure foo(int) language sql as $$ select 1 $$;
5929        4 │ drop routine foo(int);
5930          ╰╴               ─ 1. source
5931        ");
5932    }
5933
5934    #[test]
5935    fn goto_table_alias_in_qualified_column() {
5936        assert_snapshot!(goto("
5937create table t(a int8, b text);
5938select f$0.a from t as f;
5939"), @r"
5940          ╭▸ 
5941        3 │ select f.a from t as f;
5942          ╰╴       ─ 1. source   ─ 2. destination
5943        ");
5944    }
5945
5946    #[test]
5947    fn goto_column_through_table_alias() {
5948        assert_snapshot!(goto("
5949create table t(a int8, b text);
5950select f.a$0 from t as f;
5951"), @r"
5952          ╭▸ 
5953        2 │ create table t(a int8, b text);
5954          │                ─ 2. destination
5955        3 │ select f.a from t as f;
5956          ╰╴         ─ 1. source
5957        ");
5958    }
5959
5960    #[test]
5961    fn goto_cte_alias_renamed_column() {
5962        assert_snapshot!(goto("
5963with t as (select 1 a, 2 b)
5964select f.x$0 from t as f(x);
5965"), @r"
5966          ╭▸ 
5967        3 │ select f.x from t as f(x);
5968          ╰╴         ─ 1. source   ─ 2. destination
5969        ");
5970    }
5971
5972    #[test]
5973    fn goto_cte_alias_unrenamed_column() {
5974        assert_snapshot!(goto("
5975with t as (select 1 a, 2 b)
5976select f.b$0 from t as f(x);
5977"), @r"
5978          ╭▸ 
5979        2 │ with t as (select 1 a, 2 b)
5980          │                          ─ 2. destination
5981        3 │ select f.b from t as f(x);
5982          ╰╴         ─ 1. source
5983        ");
5984    }
5985
5986    #[test]
5987    fn goto_join_table() {
5988        assert_snapshot!(goto("
5989create table users(id int, email text);
5990create table messages(id int, user_id int, message text);
5991select * from users join messages$0 on users.id = messages.user_id;
5992"), @r"
5993          ╭▸ 
5994        3 │ create table messages(id int, user_id int, message text);
5995          │              ──────── 2. destination
5996        4 │ select * from users join messages on users.id = messages.user_id;
5997          ╰╴                                ─ 1. source
5998        ");
5999    }
6000
6001    #[test]
6002    fn goto_join_qualified_column_from_joined_table() {
6003        assert_snapshot!(goto("
6004create table users(id int, email text);
6005create table messages(id int, user_id int, message text);
6006select messages.user_id$0 from users join messages on users.id = messages.user_id;
6007"), @r"
6008          ╭▸ 
6009        3 │ create table messages(id int, user_id int, message text);
6010          │                               ─────── 2. destination
6011        4 │ select messages.user_id from users join messages on users.id = messages.user_id;
6012          ╰╴                      ─ 1. source
6013        ");
6014    }
6015
6016    #[test]
6017    fn goto_join_qualified_column_from_base_table() {
6018        assert_snapshot!(goto("
6019create table users(id int, email text);
6020create table messages(id int, user_id int, message text);
6021select users.id$0 from users join messages on users.id = messages.user_id;
6022"), @r"
6023          ╭▸ 
6024        2 │ create table users(id int, email text);
6025          │                    ── 2. destination
6026        3 │ create table messages(id int, user_id int, message text);
6027        4 │ select users.id from users join messages on users.id = messages.user_id;
6028          ╰╴              ─ 1. source
6029        ");
6030    }
6031
6032    #[test]
6033    fn goto_join_multiple_joins() {
6034        assert_snapshot!(goto("
6035create table users(id int, name text);
6036create table messages(id int, user_id int, message text);
6037create table comments(id int, message_id int, text text);
6038select comments.text$0 from users
6039  join messages on users.id = messages.user_id
6040  join comments on messages.id = comments.message_id;
6041"), @r"
6042          ╭▸ 
6043        4 │ create table comments(id int, message_id int, text text);
6044          │                                               ──── 2. destination
6045        5 │ select comments.text from users
6046          ╰╴                   ─ 1. source
6047        ");
6048    }
6049
6050    #[test]
6051    fn goto_join_with_aliases() {
6052        assert_snapshot!(goto("
6053create table users(id int, name text);
6054create table messages(id int, user_id int, message text);
6055select m.message$0 from users as u join messages as m on u.id = m.user_id;
6056"), @r"
6057          ╭▸ 
6058        3 │ create table messages(id int, user_id int, message text);
6059          │                                            ─────── 2. destination
6060        4 │ select m.message from users as u join messages as m on u.id = m.user_id;
6061          ╰╴               ─ 1. source
6062        ");
6063    }
6064
6065    #[test]
6066    fn goto_join_unqualified_column() {
6067        assert_snapshot!(goto("
6068create table users(id int, email text);
6069create table messages(id int, user_id int, message text);
6070select message$0 from users join messages on users.id = messages.user_id;
6071"), @r"
6072          ╭▸ 
6073        3 │ create table messages(id int, user_id int, message text);
6074          │                                            ─────── 2. destination
6075        4 │ select message from users join messages on users.id = messages.user_id;
6076          ╰╴             ─ 1. source
6077        ");
6078    }
6079
6080    #[test]
6081    fn goto_join_with_many_tables() {
6082        assert_snapshot!(goto("
6083create table users(id int, email text);
6084create table messages(id int, user_id int, message text);
6085create table logins(id int, user_id int, at timestamptz);
6086create table posts(id int, user_id int, post text);
6087
6088select post$0 
6089  from users
6090    join messages 
6091      on users.id = messages.user_id
6092      join logins
6093        on users.id = logins.user_id
6094        join posts
6095          on users.id = posts.user_id
6096"), @r"
6097          ╭▸ 
6098        5 │ create table posts(id int, user_id int, post text);
6099          │                                         ──── 2. destination
6100        6 │
6101        7 │ select post 
6102          ╰╴          ─ 1. source
6103        ");
6104    }
6105
6106    #[test]
6107    fn goto_join_with_schema() {
6108        assert_snapshot!(goto("
6109create schema foo;
6110create table foo.users(id int, email text);
6111create table foo.messages(id int, user_id int, message text);
6112select foo.messages.message$0 from foo.users join foo.messages on foo.users.id = foo.messages.user_id;
6113"), @r"
6114          ╭▸ 
6115        4 │ create table foo.messages(id int, user_id int, message text);
6116          │                                                ─────── 2. destination
6117        5 │ select foo.messages.message from foo.users join foo.messages on foo.users.id = foo.messages.user_id;
6118          ╰╴                          ─ 1. source
6119        ");
6120    }
6121
6122    #[test]
6123    fn goto_join_left_join() {
6124        assert_snapshot!(goto("
6125create table users(id int, email text);
6126create table messages(id int, user_id int, message text);
6127select messages.message$0 from users left join messages on users.id = messages.user_id;
6128"), @r"
6129          ╭▸ 
6130        3 │ create table messages(id int, user_id int, message text);
6131          │                                            ─────── 2. destination
6132        4 │ select messages.message from users left join messages on users.id = messages.user_id;
6133          ╰╴                      ─ 1. source
6134        ");
6135    }
6136
6137    #[test]
6138    fn goto_join_on_table_qualifier() {
6139        assert_snapshot!(goto("
6140create table t(a int);
6141create table u(a int);
6142select * from t join u on u$0.a = t.a;
6143"), @r"
6144          ╭▸ 
6145        3 │ create table u(a int);
6146          │              ─ 2. destination
6147        4 │ select * from t join u on u.a = t.a;
6148          ╰╴                          ─ 1. source
6149        ");
6150    }
6151
6152    #[test]
6153    fn goto_join_on_column() {
6154        assert_snapshot!(goto("
6155create table t(a int);
6156create table u(a int);
6157select * from t join u on u.a$0 = t.a;
6158"), @r"
6159          ╭▸ 
6160        3 │ create table u(a int);
6161          │                ─ 2. destination
6162        4 │ select * from t join u on u.a = t.a;
6163          ╰╴                            ─ 1. source
6164        ");
6165    }
6166
6167    #[test]
6168    fn goto_join_using_column() {
6169        assert_snapshot!(goto("
6170create table t(a int);
6171create table u(a int);
6172select * from t join u using (a$0);
6173"), @r"
6174          ╭▸ 
6175        2 │ create table t(a int);
6176          │                ─ 2. destination
6177        3 │ create table u(a int);
6178          │                ─ 3. destination
6179        4 │ select * from t join u using (a);
6180          ╰╴                              ─ 1. source
6181        ");
6182    }
6183
6184    #[test]
6185    fn goto_insert_select_cte_column() {
6186        assert_snapshot!(goto("
6187create table users(id int, email text);
6188with new_data as (
6189    select 1 as id, 'test@example.com' as email
6190)
6191insert into users (id, email)
6192select id$0, email from new_data;
6193"), @r"
6194          ╭▸ 
6195        4 │     select 1 as id, 'test@example.com' as email
6196          │                 ── 2. destination
61976198        7 │ select id, email from new_data;
6199          ╰╴        ─ 1. source
6200        ");
6201    }
6202
6203    #[test]
6204    fn goto_insert_select_cte_column_second() {
6205        assert_snapshot!(goto("
6206create table users(id int, email text);
6207with new_data as (
6208    select 1 as id, 'test@example.com' as email
6209)
6210insert into users (id, email)
6211select id, email$0 from new_data;
6212"), @r"
6213          ╭▸ 
6214        4 │     select 1 as id, 'test@example.com' as email
6215          │                                           ───── 2. destination
62166217        7 │ select id, email from new_data;
6218          ╰╴               ─ 1. source
6219        ");
6220    }
6221
6222    #[test]
6223    fn goto_insert_select_cte_table() {
6224        assert_snapshot!(goto("
6225create table users(id int, email text);
6226with new_data as (
6227    select 1 as id, 'test@example.com' as email
6228)
6229insert into users (id, email)
6230select id, email from new_data$0;
6231"), @r"
6232          ╭▸ 
6233        3 │ with new_data as (
6234          │      ──────── 2. destination
62356236        7 │ select id, email from new_data;
6237          ╰╴                             ─ 1. source
6238        ");
6239    }
6240
6241    #[test]
6242    fn goto_delete_cte_column() {
6243        assert_snapshot!(goto("
6244create table users(id int, email text);
6245with old_data as (
6246    select 1 as id
6247)
6248delete from users where id in (select id$0 from old_data);
6249"), @r"
6250          ╭▸ 
6251        4 │     select 1 as id
6252          │                 ── 2. destination
6253        5 │ )
6254        6 │ delete from users where id in (select id from old_data);
6255          ╰╴                                       ─ 1. source
6256        ");
6257    }
6258
6259    #[test]
6260    fn goto_update_table() {
6261        assert_snapshot!(goto("
6262create table users(id int, email text);
6263update users$0 set email = 'new@example.com';
6264"), @r"
6265          ╭▸ 
6266        2 │ create table users(id int, email text);
6267          │              ───── 2. destination
6268        3 │ update users set email = 'new@example.com';
6269          ╰╴           ─ 1. source
6270        ");
6271    }
6272
6273    #[test]
6274    fn goto_update_table_with_schema() {
6275        assert_snapshot!(goto("
6276create table public.users(id int, email text);
6277update public.users$0 set email = 'new@example.com';
6278"), @r"
6279          ╭▸ 
6280        2 │ create table public.users(id int, email text);
6281          │                     ───── 2. destination
6282        3 │ update public.users set email = 'new@example.com';
6283          ╰╴                  ─ 1. source
6284        ");
6285    }
6286
6287    #[test]
6288    fn goto_update_table_with_search_path() {
6289        assert_snapshot!(goto("
6290set search_path to foo;
6291create table foo.users(id int, email text);
6292update users$0 set email = 'new@example.com';
6293"), @r"
6294          ╭▸ 
6295        3 │ create table foo.users(id int, email text);
6296          │                  ───── 2. destination
6297        4 │ update users set email = 'new@example.com';
6298          ╰╴           ─ 1. source
6299        ");
6300    }
6301
6302    #[test]
6303    fn goto_update_where_column() {
6304        assert_snapshot!(goto("
6305create table users(id int, email text);
6306update users set email = 'new@example.com' where id$0 = 1;
6307"), @r"
6308          ╭▸ 
6309        2 │ create table users(id int, email text);
6310          │                    ── 2. destination
6311        3 │ update users set email = 'new@example.com' where id = 1;
6312          ╰╴                                                  ─ 1. source
6313        ");
6314    }
6315
6316    #[test]
6317    fn goto_update_where_column_with_schema() {
6318        assert_snapshot!(goto("
6319create table public.users(id int, email text);
6320update public.users set email = 'new@example.com' where id$0 = 1;
6321"), @r"
6322          ╭▸ 
6323        2 │ create table public.users(id int, email text);
6324          │                           ── 2. destination
6325        3 │ update public.users set email = 'new@example.com' where id = 1;
6326          ╰╴                                                         ─ 1. source
6327        ");
6328    }
6329
6330    #[test]
6331    fn goto_update_where_column_with_search_path() {
6332        assert_snapshot!(goto("
6333set search_path to foo;
6334create table foo.users(id int, email text);
6335update users set email = 'new@example.com' where id$0 = 1;
6336"), @r"
6337          ╭▸ 
6338        3 │ create table foo.users(id int, email text);
6339          │                        ── 2. destination
6340        4 │ update users set email = 'new@example.com' where id = 1;
6341          ╰╴                                                  ─ 1. source
6342        ");
6343    }
6344
6345    #[test]
6346    fn goto_update_set_column() {
6347        assert_snapshot!(goto("
6348create table users(id int, email text);
6349update users set email$0 = 'new@example.com' where id = 1;
6350"), @r"
6351          ╭▸ 
6352        2 │ create table users(id int, email text);
6353          │                            ───── 2. destination
6354        3 │ update users set email = 'new@example.com' where id = 1;
6355          ╰╴                     ─ 1. source
6356        ");
6357    }
6358
6359    #[test]
6360    fn goto_update_set_column_with_schema() {
6361        assert_snapshot!(goto("
6362create table public.users(id int, email text);
6363update public.users set email$0 = 'new@example.com' where id = 1;
6364"), @r"
6365          ╭▸ 
6366        2 │ create table public.users(id int, email text);
6367          │                                   ───── 2. destination
6368        3 │ update public.users set email = 'new@example.com' where id = 1;
6369          ╰╴                            ─ 1. source
6370        ");
6371    }
6372
6373    #[test]
6374    fn goto_update_set_column_with_search_path() {
6375        assert_snapshot!(goto("
6376set search_path to foo;
6377create table foo.users(id int, email text);
6378update users set email$0 = 'new@example.com' where id = 1;
6379"), @r"
6380          ╭▸ 
6381        3 │ create table foo.users(id int, email text);
6382          │                                ───── 2. destination
6383        4 │ update users set email = 'new@example.com' where id = 1;
6384          ╰╴                     ─ 1. source
6385        ");
6386    }
6387
6388    #[test]
6389    fn goto_update_from_table() {
6390        assert_snapshot!(goto("
6391create table users(id int, email text);
6392create table messages(id int, user_id int, email text);
6393update users set email = messages.email from messages$0 where users.id = messages.user_id;
6394"), @r"
6395          ╭▸ 
6396        3 │ create table messages(id int, user_id int, email text);
6397          │              ──────── 2. destination
6398        4 │ update users set email = messages.email from messages where users.id = messages.user_id;
6399          ╰╴                                                    ─ 1. source
6400        ");
6401    }
6402
6403    #[test]
6404    fn goto_update_from_table_with_schema() {
6405        assert_snapshot!(goto("
6406create table users(id int, email text);
6407create table public.messages(id int, user_id int, email text);
6408update users set email = messages.email from public.messages$0 where users.id = messages.user_id;
6409"), @r"
6410          ╭▸ 
6411        3 │ create table public.messages(id int, user_id int, email text);
6412          │                     ──────── 2. destination
6413        4 │ update users set email = messages.email from public.messages where users.id = messages.user_id;
6414          ╰╴                                                           ─ 1. source
6415        ");
6416    }
6417
6418    #[test]
6419    fn goto_update_from_table_with_search_path() {
6420        assert_snapshot!(goto("
6421set search_path to foo;
6422create table users(id int, email text);
6423create table foo.messages(id int, user_id int, email text);
6424update users set email = messages.email from messages$0 where users.id = messages.user_id;
6425"), @r"
6426          ╭▸ 
6427        4 │ create table foo.messages(id int, user_id int, email text);
6428          │                  ──────── 2. destination
6429        5 │ update users set email = messages.email from messages where users.id = messages.user_id;
6430          ╰╴                                                    ─ 1. source
6431        ");
6432    }
6433
6434    #[test]
6435    fn goto_update_with_cte_table() {
6436        assert_snapshot!(goto("
6437create table users(id int, email text);
6438with new_data as (
6439    select 1 as id, 'new@example.com' as email
6440)
6441update users set email = new_data.email from new_data$0 where users.id = new_data.id;
6442"), @r"
6443          ╭▸ 
6444        3 │ with new_data as (
6445          │      ──────── 2. destination
64466447        6 │ update users set email = new_data.email from new_data where users.id = new_data.id;
6448          ╰╴                                                    ─ 1. source
6449        ");
6450    }
6451
6452    #[test]
6453    fn goto_update_with_cte_column_in_set() {
6454        assert_snapshot!(goto("
6455create table users(id int, email text);
6456with new_data as (
6457    select 1 as id, 'new@example.com' as email
6458)
6459update users set email = new_data.email$0 from new_data where users.id = new_data.id;
6460"), @r"
6461          ╭▸ 
6462        4 │     select 1 as id, 'new@example.com' as email
6463          │                                          ───── 2. destination
6464        5 │ )
6465        6 │ update users set email = new_data.email from new_data where users.id = new_data.id;
6466          ╰╴                                      ─ 1. source
6467        ");
6468    }
6469
6470    #[test]
6471    fn goto_update_with_cte_column_in_where() {
6472        assert_snapshot!(goto("
6473create table users(id int, email text);
6474with new_data as (
6475    select 1 as id, 'new@example.com' as email
6476)
6477update users set email = new_data.email from new_data where new_data.id$0 = users.id;
6478"), @r"
6479          ╭▸ 
6480        4 │     select 1 as id, 'new@example.com' as email
6481          │                 ── 2. destination
6482        5 │ )
6483        6 │ update users set email = new_data.email from new_data where new_data.id = users.id;
6484          ╰╴                                                                      ─ 1. source
6485        ");
6486    }
6487
6488    #[test]
6489    fn goto_update_with_cte_values() {
6490        assert_snapshot!(goto("
6491create table users(id int, email text);
6492with new_data as (
6493    values (1, 'new@example.com')
6494)
6495update users set email = new_data.column2$0 from new_data where users.id = new_data.column1;
6496"), @r"
6497          ╭▸ 
6498        4 │     values (1, 'new@example.com')
6499          │                ───────────────── 2. destination
6500        5 │ )
6501        6 │ update users set email = new_data.column2 from new_data where users.id = new_data.column1;
6502          ╰╴                                        ─ 1. source
6503        ");
6504    }
6505
6506    #[test]
6507    fn goto_truncate_table() {
6508        assert_snapshot!(goto("
6509create table t();
6510truncate table t$0;
6511"), @r"
6512          ╭▸ 
6513        2 │ create table t();
6514          │              ─ 2. destination
6515        3 │ truncate table t;
6516          ╰╴               ─ 1. source
6517        ");
6518    }
6519
6520    #[test]
6521    fn goto_truncate_table_without_table_keyword() {
6522        assert_snapshot!(goto("
6523create table t();
6524truncate t$0;
6525"), @r"
6526          ╭▸ 
6527        2 │ create table t();
6528          │              ─ 2. destination
6529        3 │ truncate t;
6530          ╰╴         ─ 1. source
6531        ");
6532    }
6533
6534    #[test]
6535    fn goto_truncate_multiple_tables() {
6536        assert_snapshot!(goto("
6537create table t1();
6538create table t2();
6539truncate t1, t2$0;
6540"), @r"
6541          ╭▸ 
6542        3 │ create table t2();
6543          │              ── 2. destination
6544        4 │ truncate t1, t2;
6545          ╰╴              ─ 1. source
6546        ");
6547    }
6548
6549    #[test]
6550    fn goto_lock_table() {
6551        assert_snapshot!(goto("
6552create table t();
6553lock table t$0;
6554"), @r"
6555          ╭▸ 
6556        2 │ create table t();
6557          │              ─ 2. destination
6558        3 │ lock table t;
6559          ╰╴           ─ 1. source
6560        ");
6561    }
6562
6563    #[test]
6564    fn goto_lock_table_without_table_keyword() {
6565        assert_snapshot!(goto("
6566create table t();
6567lock t$0;
6568"), @r"
6569          ╭▸ 
6570        2 │ create table t();
6571          │              ─ 2. destination
6572        3 │ lock t;
6573          ╰╴     ─ 1. source
6574        ");
6575    }
6576
6577    #[test]
6578    fn goto_lock_multiple_tables() {
6579        assert_snapshot!(goto("
6580create table t1();
6581create table t2();
6582lock t1, t2$0;
6583"), @r"
6584          ╭▸ 
6585        3 │ create table t2();
6586          │              ── 2. destination
6587        4 │ lock t1, t2;
6588          ╰╴          ─ 1. source
6589        ");
6590    }
6591
6592    #[test]
6593    fn goto_vacuum_table() {
6594        assert_snapshot!(goto("
6595create table users(id int, email text);
6596vacuum users$0;
6597"), @r"
6598          ╭▸ 
6599        2 │ create table users(id int, email text);
6600          │              ───── 2. destination
6601        3 │ vacuum users;
6602          ╰╴           ─ 1. source
6603        ");
6604    }
6605
6606    #[test]
6607    fn goto_vacuum_multiple_tables() {
6608        assert_snapshot!(goto("
6609create table t1();
6610create table t2();
6611vacuum t1, t2$0;
6612"), @r"
6613          ╭▸ 
6614        3 │ create table t2();
6615          │              ── 2. destination
6616        4 │ vacuum t1, t2;
6617          ╰╴            ─ 1. source
6618        ");
6619    }
6620
6621    #[test]
6622    fn goto_alter_table() {
6623        assert_snapshot!(goto("
6624create table users(id int, email text);
6625alter table users$0 alter email set not null;
6626"), @r"
6627          ╭▸ 
6628        2 │ create table users(id int, email text);
6629          │              ───── 2. destination
6630        3 │ alter table users alter email set not null;
6631          ╰╴                ─ 1. source
6632        ");
6633    }
6634
6635    #[test]
6636    fn goto_alter_table_column() {
6637        assert_snapshot!(goto("
6638create table users(id int, email text);
6639alter table users alter email$0 set not null;
6640"), @r"
6641          ╭▸ 
6642        2 │ create table users(id int, email text);
6643          │                            ───── 2. destination
6644        3 │ alter table users alter email set not null;
6645          ╰╴                            ─ 1. source
6646        ");
6647    }
6648
6649    #[test]
6650    fn goto_alter_table_column_with_column_keyword() {
6651        assert_snapshot!(goto("
6652create table users(id int, email text);
6653alter table users alter column email$0 set not null;
6654"), @r"
6655          ╭▸ 
6656        2 │ create table users(id int, email text);
6657          │                            ───── 2. destination
6658        3 │ alter table users alter column email set not null;
6659          ╰╴                                   ─ 1. source
6660        ");
6661    }
6662
6663    #[test]
6664    fn goto_alter_table_add_column() {
6665        assert_snapshot!(goto("
6666create table users(id int);
6667alter table users$0 add column email text;
6668"), @r"
6669          ╭▸ 
6670        2 │ create table users(id int);
6671          │              ───── 2. destination
6672        3 │ alter table users add column email text;
6673          ╰╴                ─ 1. source
6674        ");
6675    }
6676
6677    #[test]
6678    fn goto_alter_table_drop_column() {
6679        assert_snapshot!(goto("
6680create table users(id int, email text);
6681alter table users drop column email$0;
6682"), @r"
6683          ╭▸ 
6684        2 │ create table users(id int, email text);
6685          │                            ───── 2. destination
6686        3 │ alter table users drop column email;
6687          ╰╴                                  ─ 1. source
6688        ");
6689    }
6690
6691    #[test]
6692    fn goto_alter_table_drop_column_table_name() {
6693        assert_snapshot!(goto("
6694create table users(id int, email text);
6695alter table users$0 drop column email;
6696"), @r"
6697          ╭▸ 
6698        2 │ create table users(id int, email text);
6699          │              ───── 2. destination
6700        3 │ alter table users drop column email;
6701          ╰╴                ─ 1. source
6702        ");
6703    }
6704
6705    #[test]
6706    fn goto_alter_table_add_constraint_using_index() {
6707        assert_snapshot!(goto("
6708create table u(id int);
6709create index my_index on u (id);
6710alter table u add constraint uq unique using index my_in$0dex;
6711"), @r"
6712          ╭▸ 
6713        3 │ create index my_index on u (id);
6714          │              ──────── 2. destination
6715        4 │ alter table u add constraint uq unique using index my_index;
6716          ╰╴                                                       ─ 1. source
6717        ");
6718    }
6719
6720    #[test]
6721    fn goto_alter_table_owner_to_role() {
6722        assert_snapshot!(goto("
6723create role reader;
6724create table t(id int);
6725alter table t owner to read$0er;
6726"), @r"
6727          ╭▸ 
6728        2 │ create role reader;
6729          │             ────── 2. destination
6730        3 │ create table t(id int);
6731        4 │ alter table t owner to reader;
6732          ╰╴                          ─ 1. source
6733        ");
6734    }
6735
6736    #[test]
6737    fn goto_alter_table_set_tablespace() {
6738        assert_snapshot!(goto("
6739create tablespace ts location '/tmp/ts';
6740create table t(id int);
6741alter table t set tablespace t$0s;
6742"), @r"
6743          ╭▸ 
6744        2 │ create tablespace ts location '/tmp/ts';
6745          │                   ── 2. destination
6746        3 │ create table t(id int);
6747        4 │ alter table t set tablespace ts;
6748          ╰╴                             ─ 1. source
6749        ");
6750    }
6751
6752    #[test]
6753    fn goto_alter_table_set_schema() {
6754        assert_snapshot!(goto("
6755create schema foo;
6756create table t(id int);
6757alter table t set schema fo$0o;
6758"), @r"
6759          ╭▸ 
6760        2 │ create schema foo;
6761          │               ─── 2. destination
6762        3 │ create table t(id int);
6763        4 │ alter table t set schema foo;
6764          ╰╴                          ─ 1. source
6765        ");
6766    }
6767
6768    #[test]
6769    fn goto_alter_table_attach_partition() {
6770        assert_snapshot!(goto("
6771create table parent (id int) partition by range (id);
6772create table child (id int);
6773alter table parent attach partition ch$0ild for values from (1) to (10);
6774"), @r"
6775          ╭▸ 
6776        3 │ create table child (id int);
6777          │              ───── 2. destination
6778        4 │ alter table parent attach partition child for values from (1) to (10);
6779          ╰╴                                     ─ 1. source
6780        ");
6781    }
6782
6783    #[test]
6784    fn goto_alter_table_detach_partition() {
6785        assert_snapshot!(goto("
6786create table parent (id int) partition by range (id);
6787create table child partition of parent for values from (1) to (10);
6788alter table parent detach partition ch$0ild;
6789"), @r"
6790          ╭▸ 
6791        3 │ create table child partition of parent for values from (1) to (10);
6792          │              ───── 2. destination
6793        4 │ alter table parent detach partition child;
6794          ╰╴                                     ─ 1. source
6795        ");
6796    }
6797
6798    #[test]
6799    fn goto_comment_on_table() {
6800        assert_snapshot!(goto("
6801create table t(id int);
6802comment on table t$0 is '';
6803"), @r"
6804          ╭▸ 
6805        2 │ create table t(id int);
6806          │              ─ 2. destination
6807        3 │ comment on table t is '';
6808          ╰╴                 ─ 1. source
6809        ");
6810    }
6811
6812    #[test]
6813    fn goto_comment_on_column() {
6814        assert_snapshot!(goto("
6815create table t(id int);
6816comment on column t.id$0 is '';
6817"), @r"
6818          ╭▸ 
6819        2 │ create table t(id int);
6820          │                ── 2. destination
6821        3 │ comment on column t.id is '';
6822          ╰╴                     ─ 1. source
6823        ");
6824    }
6825
6826    #[test]
6827    fn goto_refresh_materialized_view() {
6828        assert_snapshot!(goto("
6829create materialized view mv as select 1;
6830refresh materialized view mv$0;
6831"), @r"
6832          ╭▸ 
6833        2 │ create materialized view mv as select 1;
6834          │                          ── 2. destination
6835        3 │ refresh materialized view mv;
6836          ╰╴                           ─ 1. source
6837        ");
6838    }
6839
6840    #[test]
6841    fn goto_refresh_materialized_view_concurrently() {
6842        assert_snapshot!(goto("
6843create materialized view mv as select 1;
6844refresh materialized view concurrently mv$0;
6845"), @r"
6846          ╭▸ 
6847        2 │ create materialized view mv as select 1;
6848          │                          ── 2. destination
6849        3 │ refresh materialized view concurrently mv;
6850          ╰╴                                        ─ 1. source
6851        ");
6852    }
6853
6854    #[test]
6855    fn goto_reindex_table() {
6856        assert_snapshot!(goto("
6857create table users(id int);
6858reindex table users$0;
6859"), @r"
6860          ╭▸ 
6861        2 │ create table users(id int);
6862          │              ───── 2. destination
6863        3 │ reindex table users;
6864          ╰╴                  ─ 1. source
6865        ");
6866    }
6867
6868    #[test]
6869    fn goto_reindex_index() {
6870        assert_snapshot!(goto("
6871create table t(c int);
6872create index idx on t(c);
6873reindex index idx$0;
6874"), @r"
6875          ╭▸ 
6876        3 │ create index idx on t(c);
6877          │              ─── 2. destination
6878        4 │ reindex index idx;
6879          ╰╴                ─ 1. source
6880        ");
6881    }
6882
6883    #[test]
6884    fn goto_select_exists_column() {
6885        assert_snapshot!(goto("
6886select exists$0 from (
6887  select exists(select 1)
6888);
6889"), @r"
6890          ╭▸ 
6891        2 │ select exists from (
6892          │             ─ 1. source
6893        3 │   select exists(select 1)
6894          ╰╴         ──────────────── 2. destination
6895        ");
6896    }
6897
6898    #[test]
6899    fn goto_reindex_schema() {
6900        assert_snapshot!(goto("
6901create schema app;
6902reindex schema app$0;
6903"), @r"
6904          ╭▸ 
6905        2 │ create schema app;
6906          │               ─── 2. destination
6907        3 │ reindex schema app;
6908          ╰╴                 ─ 1. source
6909        ");
6910    }
6911
6912    #[test]
6913    fn goto_reindex_database() {
6914        assert_snapshot!(goto("
6915create database appdb;
6916reindex database appdb$0;
6917"), @r"
6918          ╭▸ 
6919        2 │ create database appdb;
6920          │                 ───── 2. destination
6921        3 │ reindex database appdb;
6922          ╰╴                     ─ 1. source
6923        ");
6924    }
6925
6926    #[test]
6927    fn goto_reindex_system() {
6928        assert_snapshot!(goto("
6929create database systemdb;
6930reindex system systemdb$0;
6931"), @r"
6932          ╭▸ 
6933        2 │ create database systemdb;
6934          │                 ──────── 2. destination
6935        3 │ reindex system systemdb;
6936          ╰╴                      ─ 1. source
6937        ");
6938    }
6939
6940    #[test]
6941    fn goto_merge_returning_aliased_column() {
6942        assert_snapshot!(goto(
6943            "
6944create table t(a int, b int);
6945with u(x, y) as (
6946  select 1, 2
6947),
6948merged as (
6949  merge into t
6950    using u
6951      on t.a = u.x
6952  when matched then
6953    do nothing
6954  when not matched then
6955    do nothing
6956  returning a as x, b as y
6957)
6958select x$0 from merged;
6959",
6960        ), @r"
6961           ╭▸ 
6962        14 │   returning a as x, b as y
6963           │                  ─ 2. destination
6964        15 │ )
6965        16 │ select x from merged;
6966           ╰╴       ─ 1. source
6967        ");
6968    }
6969
6970    #[test]
6971    fn goto_cte_update_returning_column() {
6972        assert_snapshot!(goto("
6973create table t(a int, b int);
6974with updated(c) as (
6975  update t set a = 10
6976  returning a, b
6977)
6978select c, b$0 from updated;"
6979        ), @r"
6980          ╭▸ 
6981        5 │   returning a, b
6982          │                ─ 2. destination
6983        6 │ )
6984        7 │ select c, b from updated;
6985          ╰╴          ─ 1. source
6986        ");
6987    }
6988
6989    #[test]
6990    fn goto_update_returning_column_to_table_def() {
6991        assert_snapshot!(goto("
6992create table t(a int, b int);
6993with updated(c) as (
6994  update t set a = 10
6995  returning a, b$0
6996)
6997select c, b from updated;"
6998        ), @r"
6999          ╭▸ 
7000        2 │ create table t(a int, b int);
7001          │                       ─ 2. destination
70027003        5 │   returning a, b
7004          ╰╴               ─ 1. source
7005        ");
7006    }
7007
7008    #[test]
7009    fn goto_insert_returning_column_to_table_def() {
7010        assert_snapshot!(goto("
7011create table t(a int, b int);
7012with inserted as (
7013  insert into t values (1, 2)
7014  returning a$0, b
7015)
7016select a, b from inserted;"
7017        ), @r"
7018          ╭▸ 
7019        2 │ create table t(a int, b int);
7020          │                ─ 2. destination
70217022        5 │   returning a, b
7023          ╰╴            ─ 1. source
7024        ");
7025    }
7026
7027    #[test]
7028    fn goto_delete_returning_column_to_table_def() {
7029        assert_snapshot!(goto("
7030create table t(a int, b int);
7031with deleted as (
7032  delete from t
7033  returning a, b$0
7034)
7035select a, b from deleted;"
7036        ), @r"
7037          ╭▸ 
7038        2 │ create table t(a int, b int);
7039          │                       ─ 2. destination
70407041        5 │   returning a, b
7042          ╰╴               ─ 1. source
7043        ");
7044    }
7045
7046    #[test]
7047    fn goto_update_returning_qualified_star_table() {
7048        assert_snapshot!(goto("
7049create table t(a int, b int);
7050update t set a = 10
7051returning t$0.*;"
7052        ), @r"
7053          ╭▸ 
7054        2 │ create table t(a int, b int);
7055          │              ─ 2. destination
7056        3 │ update t set a = 10
7057        4 │ returning t.*;
7058          ╰╴          ─ 1. source
7059        ");
7060    }
7061
7062    #[test]
7063    fn goto_insert_returning_qualified_star_table() {
7064        assert_snapshot!(goto("
7065create table t(a int, b int);
7066insert into t values (1, 2)
7067returning t$0.*;"
7068        ), @r"
7069          ╭▸ 
7070        2 │ create table t(a int, b int);
7071          │              ─ 2. destination
7072        3 │ insert into t values (1, 2)
7073        4 │ returning t.*;
7074          ╰╴          ─ 1. source
7075        ");
7076    }
7077
7078    #[test]
7079    fn goto_delete_returning_qualified_star_table() {
7080        assert_snapshot!(goto("
7081create table t(a int, b int);
7082delete from t
7083returning t$0.*;"
7084        ), @r"
7085          ╭▸ 
7086        2 │ create table t(a int, b int);
7087          │              ─ 2. destination
7088        3 │ delete from t
7089        4 │ returning t.*;
7090          ╰╴          ─ 1. source
7091        ");
7092    }
7093
7094    #[test]
7095    fn goto_update_alias_in_set_clause() {
7096        assert_snapshot!(goto("
7097create table t(a int, b int);
7098update t as f set f$0.a = 10;"
7099        ), @r"
7100          ╭▸ 
7101        3 │ update t as f set f.a = 10;
7102          │             ┬     ─ 1. source
7103          │             │
7104          ╰╴            2. destination
7105        ");
7106    }
7107
7108    #[test]
7109    fn goto_update_alias_in_where_clause() {
7110        assert_snapshot!(goto("
7111create table t(a int, b int);
7112update t as f set a = 10 where f$0.b = 5;"
7113        ), @r"
7114          ╭▸ 
7115        3 │ update t as f set a = 10 where f.b = 5;
7116          ╰╴            ─ 2. destination   ─ 1. source
7117        ");
7118    }
7119
7120    #[test]
7121    fn goto_update_alias_in_from_clause() {
7122        assert_snapshot!(goto("
7123create table t(a int, b int);
7124create table u(c int);
7125update t as f set a = 10 from u where f$0.b = u.c;"
7126        ), @r"
7127          ╭▸ 
7128        4 │ update t as f set a = 10 from u where f.b = u.c;
7129          ╰╴            ─ 2. destination          ─ 1. source
7130        ");
7131    }
7132
7133    #[test]
7134    fn goto_insert_alias_in_on_conflict() {
7135        assert_snapshot!(goto("
7136create table t(a int primary key, b int);
7137insert into t as f values (1, 2) on conflict (f$0.a) do nothing;"
7138        ), @r"
7139          ╭▸ 
7140        3 │ insert into t as f values (1, 2) on conflict (f.a) do nothing;
7141          ╰╴                 ─ 2. destination             ─ 1. source
7142        ");
7143    }
7144
7145    #[test]
7146    fn goto_insert_alias_in_returning() {
7147        assert_snapshot!(goto("
7148create table t(a int, b int);
7149insert into t as f values (1, 2) returning f$0.a;"
7150        ), @r"
7151          ╭▸ 
7152        3 │ insert into t as f values (1, 2) returning f.a;
7153          ╰╴                 ─ 2. destination          ─ 1. source
7154        ");
7155    }
7156
7157    #[test]
7158    fn goto_insert_alias_returning_column() {
7159        assert_snapshot!(goto("
7160create table t(a int, b int);
7161insert into t as f values (1, 2) returning f.a$0;"
7162        ), @r"
7163          ╭▸ 
7164        2 │ create table t(a int, b int);
7165          │                ─ 2. destination
7166        3 │ insert into t as f values (1, 2) returning f.a;
7167          ╰╴                                             ─ 1. source
7168        ");
7169    }
7170
7171    #[test]
7172    fn goto_insert_on_conflict_target_column() {
7173        assert_snapshot!(goto("
7174create table t(c text);
7175insert into t values ('c') on conflict (c$0) do nothing;"
7176        ), @r"
7177          ╭▸ 
7178        2 │ create table t(c text);
7179          │                ─ 2. destination
7180        3 │ insert into t values ('c') on conflict (c) do nothing;
7181          ╰╴                                        ─ 1. source
7182        ");
7183    }
7184
7185    #[test]
7186    fn goto_insert_on_conflict_set_column() {
7187        assert_snapshot!(goto("
7188create table t(c text, d text);
7189insert into t values ('c', 'd') on conflict (c) do update set c$0 = excluded.c;"
7190        ), @r"
7191          ╭▸ 
7192        2 │ create table t(c text, d text);
7193          │                ─ 2. destination
7194        3 │ insert into t values ('c', 'd') on conflict (c) do update set c = excluded.c;
7195          ╰╴                                                              ─ 1. source
7196        ");
7197    }
7198
7199    #[test]
7200    fn goto_insert_on_conflict_excluded_column() {
7201        assert_snapshot!(goto("
7202create table t(c text, d text);
7203insert into t values ('c', 'd') on conflict (c) do update set c = excluded.c$0;"
7204        ), @r"
7205          ╭▸ 
7206        2 │ create table t(c text, d text);
7207          │                ─ 2. destination
7208        3 │ insert into t values ('c', 'd') on conflict (c) do update set c = excluded.c;
7209          ╰╴                                                                           ─ 1. source
7210        ");
7211    }
7212
7213    #[test]
7214    fn goto_delete_from_alias() {
7215        assert_snapshot!(goto("
7216create table t(a int, b int);
7217delete from t as f where f$0.a = 10;"
7218        ), @r"
7219          ╭▸ 
7220        3 │ delete from t as f where f.a = 10;
7221          │                  ┬       ─ 1. source
7222          │                  │
7223          ╰╴                 2. destination
7224        ");
7225    }
7226
7227    #[test]
7228    fn goto_delete_from_alias_column() {
7229        assert_snapshot!(goto("
7230create table t(a int, b int);
7231delete from t as f where f.a$0 = 10;"
7232        ), @r"
7233          ╭▸ 
7234        2 │ create table t(a int, b int);
7235          │                ─ 2. destination
7236        3 │ delete from t as f where f.a = 10;
7237          ╰╴                           ─ 1. source
7238        ");
7239    }
7240
7241    #[test]
7242    fn goto_delete_from_alias_returning() {
7243        assert_snapshot!(goto("
7244create table t(a int, b int);
7245delete from t as f returning f$0.a"
7246        ), @r"
7247          ╭▸ 
7248        3 │ delete from t as f returning f.a
7249          │                  ┬           ─ 1. source
7250          │                  │
7251          ╰╴                 2. destination
7252        ");
7253
7254        assert_snapshot!(goto("
7255create table t(a int, b int);
7256delete from t as f returning f.a$0"
7257        ), @r"
7258          ╭▸ 
7259        2 │ create table t(a int, b int);
7260          │                ─ 2. destination
7261        3 │ delete from t as f returning f.a
7262          ╰╴                               ─ 1. source
7263        ");
7264    }
7265
7266    #[test]
7267    fn goto_merge_alias_on_table() {
7268        assert_snapshot!(goto("
7269create table t(a int, b int);
7270create table u(a int, b int);
7271merge into t as f
7272  using u on u.a = f$0.a
7273  when matched then do nothing;
7274"
7275
7276        ), @r"
7277          ╭▸ 
7278        4 │ merge into t as f
7279          │                 ─ 2. destination
7280        5 │   using u on u.a = f.a
7281          ╰╴                   ─ 1. source
7282        ");
7283    }
7284
7285    #[test]
7286    fn goto_merge_alias_on_column() {
7287        assert_snapshot!(goto("
7288create table t(a int, b int);
7289create table u(a int, b int);
7290merge into t as f
7291  using u on u.a = f.a$0
7292  when matched then do nothing;
7293"
7294
7295        ), @r"
7296          ╭▸ 
7297        2 │ create table t(a int, b int);
7298          │                ─ 2. destination
72997300        5 │   using u on u.a = f.a
7301          ╰╴                     ─ 1. source
7302        ");
7303    }
7304
7305    #[test]
7306    fn goto_merge_alias_returning() {
7307        assert_snapshot!(goto("
7308create table t(a int, b int);
7309create table u(a int, b int);
7310merge into t as f
7311  using u on u.a = f.a
7312  when matched then do nothing
7313  returning f$0.a;
7314"
7315
7316        ), @r"
7317          ╭▸ 
7318        4 │ merge into t as f
7319          │                 ─ 2. destination
73207321        7 │   returning f.a;
7322          ╰╴            ─ 1. source
7323        ");
7324
7325        assert_snapshot!(goto("
7326create table t(a int, b int);
7327create table u(a int, b int);
7328merge into t as f
7329  using u on u.a = f.a
7330  when matched then do nothing
7331  returning f.a$0;
7332"
7333        ), @r"
7334          ╭▸ 
7335        2 │ create table t(a int, b int);
7336          │                ─ 2. destination
73377338        7 │   returning f.a;
7339          ╰╴              ─ 1. source
7340        ");
7341    }
7342
7343    #[test]
7344    fn goto_merge_using_table_in_when_clause() {
7345        assert_snapshot!(goto("
7346create table t(a int, b int);
7347create table u(a int, b int);
7348merge into t
7349  using u on true
7350  when matched and u$0.a = t.a
7351    then do nothing;
7352"
7353        ), @r"
7354          ╭▸ 
7355        3 │ create table u(a int, b int);
7356          │              ─ 2. destination
73577358        6 │   when matched and u.a = t.a
7359          ╰╴                   ─ 1. source
7360        ");
7361    }
7362
7363    #[test]
7364    fn goto_merge_using_table_column_in_when_clause() {
7365        assert_snapshot!(goto("
7366create table t(a int, b int);
7367create table u(a int, b int);
7368merge into t
7369  using u on true
7370  when matched and u.a$0 = t.a
7371    then do nothing;
7372"
7373        ), @r"
7374          ╭▸ 
7375        3 │ create table u(a int, b int);
7376          │                ─ 2. destination
73777378        6 │   when matched and u.a = t.a
7379          ╰╴                     ─ 1. source
7380        ");
7381    }
7382
7383    #[test]
7384    fn goto_merge_unqualified_column_target_table() {
7385        assert_snapshot!(goto("
7386create table x(a int, b int);
7387create table y(c int, d int);
7388merge into x
7389  using y
7390    on true
7391  when matched and a$0 = c
7392    then do nothing;
7393"
7394        ), @r"
7395          ╭▸ 
7396        2 │ create table x(a int, b int);
7397          │                ─ 2. destination
73987399        7 │   when matched and a = c
7400          ╰╴                   ─ 1. source
7401        ");
7402    }
7403
7404    #[test]
7405    fn goto_merge_unqualified_column_source_table() {
7406        assert_snapshot!(goto("
7407create table x(a int, b int);
7408create table y(c int, d int);
7409merge into x
7410  using y
7411    on true
7412  when matched and a = c$0
7413    then do nothing;
7414"
7415        ), @r"
7416          ╭▸ 
7417        3 │ create table y(c int, d int);
7418          │                ─ 2. destination
74197420        7 │   when matched and a = c
7421          ╰╴                       ─ 1. source
7422        ");
7423    }
7424
7425    #[test]
7426    fn goto_merge_into_table() {
7427        assert_snapshot!(goto("
7428create table x(a int, b int);
7429create table y(c int, d int);
7430merge into x$0
7431  using y
7432    on true
7433  when matched and a = c
7434    then do nothing;
7435"
7436        ), @r"
7437          ╭▸ 
7438        2 │ create table x(a int, b int);
7439          │              ─ 2. destination
7440        3 │ create table y(c int, d int);
7441        4 │ merge into x
7442          ╰╴           ─ 1. source
7443        ");
7444    }
7445
7446    #[test]
7447    fn goto_merge_using_clause_table() {
7448        assert_snapshot!(goto("
7449create table x(a int, b int);
7450create table y(c int, d int);
7451merge into x
7452  using y$0
7453    on true
7454  when matched and a = c
7455    then do nothing;
7456"
7457        ), @r"
7458          ╭▸ 
7459        3 │ create table y(c int, d int);
7460          │              ─ 2. destination
7461        4 │ merge into x
7462        5 │   using y
7463          ╰╴        ─ 1. source
7464        ");
7465    }
7466
7467    #[test]
7468    fn goto_merge_using_clause_alias() {
7469        assert_snapshot!(goto("
7470create table x(a int, b int);
7471create table y(c int, d int);
7472merge into x as g
7473  using y as k
7474    on true
7475  when matched and a = k.c$0
7476    then do nothing;
7477"
7478        ), @r"
7479          ╭▸ 
7480        3 │ create table y(c int, d int);
7481          │                ─ 2. destination
74827483        7 │   when matched and a = k.c
7484          ╰╴                         ─ 1. source
7485        ");
7486    }
7487
7488    #[test]
7489    fn goto_merge_on_clause_unqualified_source_column() {
7490        assert_snapshot!(goto("
7491create table x(a int, b int);
7492create table y(c int, d int);
7493merge into x as g
7494  using y as k
7495    on g.a = c$0 and a = c
7496  when matched and g.a = k.c
7497    then do nothing;
7498"
7499        ), @r"
7500          ╭▸ 
7501        3 │ create table y(c int, d int);
7502          │                ─ 2. destination
75037504        6 │     on g.a = c and a = c
7505          ╰╴             ─ 1. source
7506        ");
7507    }
7508
7509    #[test]
7510    fn goto_merge_returning_old_table() {
7511        assert_snapshot!(goto("
7512create table x(a int, b int);
7513create table y(c int, d int);
7514merge into x as g
7515  using y as k
7516    on g.a = c and a = k.c
7517  when matched and g.a = k.c
7518    then do nothing
7519  returning old$0.a, new.a;
7520"
7521        ), @r"
7522          ╭▸ 
7523        2 │ create table x(a int, b int);
7524          │              ─ 2. destination
75257526        9 │   returning old.a, new.a;
7527          ╰╴              ─ 1. source
7528        ");
7529    }
7530
7531    #[test]
7532    fn goto_merge_returning_old_column() {
7533        assert_snapshot!(goto("
7534create table x(a int, b int);
7535create table y(c int, d int);
7536merge into x as g
7537  using y as k
7538    on g.a = c and a = k.c
7539  when matched and g.a = k.c
7540    then do nothing
7541  returning old.a$0, new.a;
7542"
7543        ), @r"
7544          ╭▸ 
7545        2 │ create table x(a int, b int);
7546          │                ─ 2. destination
75477548        9 │   returning old.a, new.a;
7549          ╰╴                ─ 1. source
7550        ");
7551    }
7552
7553    #[test]
7554    fn goto_merge_returning_new_table() {
7555        assert_snapshot!(goto("
7556create table x(a int, b int);
7557create table y(c int, d int);
7558merge into x as g
7559  using y as k
7560    on g.a = c and a = k.c
7561  when matched and g.a = k.c
7562    then do nothing
7563  returning old.a, new$0.a;
7564"
7565        ), @r"
7566          ╭▸ 
7567        2 │ create table x(a int, b int);
7568          │              ─ 2. destination
75697570        9 │   returning old.a, new.a;
7571          ╰╴                     ─ 1. source
7572        ");
7573    }
7574
7575    #[test]
7576    fn goto_merge_returning_new_column() {
7577        assert_snapshot!(goto("
7578create table x(a int, b int);
7579create table y(c int, d int);
7580merge into x as g
7581  using y as k
7582    on g.a = c and a = k.c
7583  when matched and g.a = k.c
7584    then do nothing
7585  returning old.a, new.a$0;
7586"
7587        ), @r"
7588          ╭▸ 
7589        2 │ create table x(a int, b int);
7590          │                ─ 2. destination
75917592        9 │   returning old.a, new.a;
7593          ╰╴                       ─ 1. source
7594        ");
7595    }
7596
7597    #[test]
7598    fn goto_merge_with_tables_named_old_new_old_table() {
7599        assert_snapshot!(goto("
7600create table old(a int, b int);
7601create table new(c int, d int);
7602merge into old
7603  using new
7604    on true
7605  when matched
7606    then do nothing
7607  returning old$0.a, new.d;
7608"
7609        ), @r"
7610          ╭▸ 
7611        2 │ create table old(a int, b int);
7612          │              ─── 2. destination
76137614        9 │   returning old.a, new.d;
7615          ╰╴              ─ 1. source
7616        ");
7617    }
7618
7619    #[test]
7620    fn goto_merge_with_tables_named_old_new_old_column() {
7621        assert_snapshot!(goto("
7622create table old(a int, b int);
7623create table new(c int, d int);
7624merge into old
7625  using new
7626    on true
7627  when matched
7628    then do nothing
7629  returning old.a$0, new.d;
7630"
7631        ), @r"
7632          ╭▸ 
7633        2 │ create table old(a int, b int);
7634          │                  ─ 2. destination
76357636        9 │   returning old.a, new.d;
7637          ╰╴                ─ 1. source
7638        ");
7639    }
7640
7641    #[test]
7642    fn goto_merge_with_tables_named_old_new_new_table() {
7643        assert_snapshot!(goto("
7644create table old(a int, b int);
7645create table new(c int, d int);
7646merge into old
7647  using new
7648    on true
7649  when matched
7650    then do nothing
7651  returning old.a, new$0.d;
7652"
7653        ), @r"
7654          ╭▸ 
7655        3 │ create table new(c int, d int);
7656          │              ─── 2. destination
76577658        9 │   returning old.a, new.d;
7659          ╰╴                     ─ 1. source
7660        ");
7661    }
7662
7663    #[test]
7664    fn goto_merge_with_tables_named_old_new_new_column() {
7665        assert_snapshot!(goto("
7666create table old(a int, b int);
7667create table new(c int, d int);
7668merge into old
7669  using new
7670    on true
7671  when matched
7672    then do nothing
7673  returning old.a, new.d$0;
7674"
7675        ), @r"
7676          ╭▸ 
7677        3 │ create table new(c int, d int);
7678          │                         ─ 2. destination
76797680        9 │   returning old.a, new.d;
7681          ╰╴                       ─ 1. source
7682        ");
7683    }
7684
7685    #[test]
7686    fn goto_merge_returning_with_aliases_before_table() {
7687        assert_snapshot!(goto("
7688create table x(a int, b int);
7689create table y(c int, d int);
7690merge into x
7691  using y on true
7692  when matched then do nothing
7693  returning
7694    with (old as before, new as after)
7695      before$0.a, after.a;
7696"
7697        ), @r"
7698          ╭▸ 
7699        8 │     with (old as before, new as after)
7700          │                  ────── 2. destination
7701        9 │       before.a, after.a;
7702          ╰╴           ─ 1. source
7703        ");
7704    }
7705
7706    #[test]
7707    fn goto_merge_returning_with_aliases_before_column() {
7708        assert_snapshot!(goto("
7709create table x(a int, b int);
7710create table y(c int, d int);
7711merge into x
7712  using y on true
7713  when matched then do nothing
7714  returning
7715    with (old as before, new as after)
7716      before.a$0, after.a;
7717"
7718        ), @r"
7719          ╭▸ 
7720        2 │ create table x(a int, b int);
7721          │                ─ 2. destination
77227723        9 │       before.a, after.a;
7724          ╰╴             ─ 1. source
7725        ");
7726    }
7727
7728    #[test]
7729    fn goto_merge_returning_with_aliases_after_table() {
7730        assert_snapshot!(goto("
7731create table x(a int, b int);
7732create table y(c int, d int);
7733merge into x
7734  using y on true
7735  when matched then do nothing
7736  returning
7737    with (old as before, new as after)
7738      before.a, after$0.a;
7739"
7740        ), @r"
7741          ╭▸ 
7742        8 │     with (old as before, new as after)
7743          │                                 ───── 2. destination
7744        9 │       before.a, after.a;
7745          ╰╴                    ─ 1. source
7746        ");
7747    }
7748
7749    #[test]
7750    fn goto_merge_returning_with_aliases_after_column() {
7751        assert_snapshot!(goto("
7752create table x(a int, b int);
7753create table y(c int, d int);
7754merge into x
7755  using y on true
7756  when matched then do nothing
7757  returning
7758    with (old as before, new as after)
7759      before.a, after.a$0;
7760"
7761        ), @r"
7762          ╭▸ 
7763        2 │ create table x(a int, b int);
7764          │                ─ 2. destination
77657766        9 │       before.a, after.a;
7767          ╰╴                      ─ 1. source
7768        ");
7769    }
7770
7771    #[test]
7772    fn goto_merge_when_not_matched_insert_values_qualified_column() {
7773        assert_snapshot!(goto("
7774create table inventory (
7775    product_id int,
7776    quantity int,
7777    updated_at timestamp
7778);
7779create table orders (
7780    id int,
7781    product_id int,
7782    qty int
7783);
7784merge into inventory as t
7785using orders as o
7786  on t.product_id = o.product_id
7787when matched then
7788  do nothing
7789when not matched then
7790  insert values (o$0.product_id, o.qty, now());
7791"
7792        ), @r"
7793           ╭▸ 
7794        13 │ using orders as o
7795           │                 ─ 2. destination
77967797        18 │   insert values (o.product_id, o.qty, now());
7798           ╰╴                 ─ 1. source
7799        ");
7800    }
7801
7802    #[test]
7803    fn goto_merge_when_not_matched_insert_values_qualified_column_field() {
7804        assert_snapshot!(goto("
7805create table inventory (
7806    product_id int,
7807    quantity int,
7808    updated_at timestamp
7809);
7810create table orders (
7811    id int,
7812    product_id int,
7813    qty int
7814);
7815merge into inventory as t
7816using orders as o
7817  on t.product_id = o.product_id
7818when matched then
7819  do nothing
7820when not matched then
7821  insert values (o.product_id$0, o.qty, now());
7822"
7823        ), @r"
7824           ╭▸ 
7825         9 │     product_id int,
7826           │     ────────── 2. destination
78277828        18 │   insert values (o.product_id, o.qty, now());
7829           ╰╴                            ─ 1. source
7830        ");
7831    }
7832
7833    #[test]
7834    fn goto_merge_when_not_matched_insert_values_unqualified_column() {
7835        assert_snapshot!(goto("
7836create table inventory (
7837    product_id int,
7838    quantity int
7839);
7840create table orders (
7841    product_id int,
7842    qty int
7843);
7844merge into inventory as t
7845using orders as o
7846  on t.product_id = o.product_id
7847when not matched then
7848  insert values (product_id$0, qty);
7849"
7850        ), @r"
7851           ╭▸ 
7852         7 │     product_id int,
7853           │     ────────── 2. destination
78547855        14 │   insert values (product_id, qty);
7856           ╰╴                          ─ 1. source
7857        ");
7858    }
7859
7860    #[test]
7861    fn goto_insert_returning_old_table() {
7862        assert_snapshot!(goto("
7863create table t(a int, b int);
7864insert into t values (1, 2), (3, 4)
7865returning old$0.a, new.b;
7866"
7867        ), @r"
7868          ╭▸ 
7869        2 │ create table t(a int, b int);
7870          │              ─ 2. destination
7871        3 │ insert into t values (1, 2), (3, 4)
7872        4 │ returning old.a, new.b;
7873          ╰╴            ─ 1. source
7874        ");
7875    }
7876
7877    #[test]
7878    fn goto_insert_returning_old_column() {
7879        assert_snapshot!(goto("
7880create table t(a int, b int);
7881insert into t values (1, 2), (3, 4)
7882returning old.a$0, new.b;
7883"
7884        ), @r"
7885          ╭▸ 
7886        2 │ create table t(a int, b int);
7887          │                ─ 2. destination
7888        3 │ insert into t values (1, 2), (3, 4)
7889        4 │ returning old.a, new.b;
7890          ╰╴              ─ 1. source
7891        ");
7892    }
7893
7894    #[test]
7895    fn goto_insert_returning_new_table() {
7896        assert_snapshot!(goto("
7897create table t(a int, b int);
7898insert into t values (1, 2), (3, 4)
7899returning old.a, new$0.b;
7900"
7901        ), @r"
7902          ╭▸ 
7903        2 │ create table t(a int, b int);
7904          │              ─ 2. destination
7905        3 │ insert into t values (1, 2), (3, 4)
7906        4 │ returning old.a, new.b;
7907          ╰╴                   ─ 1. source
7908        ");
7909    }
7910
7911    #[test]
7912    fn goto_insert_returning_new_column() {
7913        assert_snapshot!(goto("
7914create table t(a int, b int);
7915insert into t values (1, 2), (3, 4)
7916returning old.a, new.b$0;
7917"
7918        ), @r"
7919          ╭▸ 
7920        2 │ create table t(a int, b int);
7921          │                       ─ 2. destination
7922        3 │ insert into t values (1, 2), (3, 4)
7923        4 │ returning old.a, new.b;
7924          ╰╴                     ─ 1. source
7925        ");
7926    }
7927
7928    #[test]
7929    fn goto_update_returning_old_table() {
7930        assert_snapshot!(goto("
7931create table t(a int, b int);
7932update t set a = 42
7933returning old$0.a, new.b;
7934"
7935        ), @r"
7936          ╭▸ 
7937        2 │ create table t(a int, b int);
7938          │              ─ 2. destination
7939        3 │ update t set a = 42
7940        4 │ returning old.a, new.b;
7941          ╰╴            ─ 1. source
7942        ");
7943    }
7944
7945    #[test]
7946    fn goto_update_returning_old_column() {
7947        assert_snapshot!(goto("
7948create table t(a int, b int);
7949update t set a = 42
7950returning old.a$0, new.b;
7951"
7952        ), @r"
7953          ╭▸ 
7954        2 │ create table t(a int, b int);
7955          │                ─ 2. destination
7956        3 │ update t set a = 42
7957        4 │ returning old.a, new.b;
7958          ╰╴              ─ 1. source
7959        ");
7960    }
7961
7962    #[test]
7963    fn goto_update_returning_new_table() {
7964        assert_snapshot!(goto("
7965create table t(a int, b int);
7966update t set a = 42
7967returning old.a, new$0.b;
7968"
7969        ), @r"
7970          ╭▸ 
7971        2 │ create table t(a int, b int);
7972          │              ─ 2. destination
7973        3 │ update t set a = 42
7974        4 │ returning old.a, new.b;
7975          ╰╴                   ─ 1. source
7976        ");
7977    }
7978
7979    #[test]
7980    fn goto_update_returning_new_column() {
7981        assert_snapshot!(goto("
7982create table t(a int, b int);
7983update t set a = 42
7984returning old.a, new.b$0;
7985"
7986        ), @r"
7987          ╭▸ 
7988        2 │ create table t(a int, b int);
7989          │                       ─ 2. destination
7990        3 │ update t set a = 42
7991        4 │ returning old.a, new.b;
7992          ╰╴                     ─ 1. source
7993        ");
7994    }
7995
7996    #[test]
7997    fn goto_delete_returning_old_table() {
7998        assert_snapshot!(goto("
7999create table t(a int, b int);
8000delete from t
8001returning old$0.a, new.b;
8002"
8003        ), @r"
8004          ╭▸ 
8005        2 │ create table t(a int, b int);
8006          │              ─ 2. destination
8007        3 │ delete from t
8008        4 │ returning old.a, new.b;
8009          ╰╴            ─ 1. source
8010        ");
8011    }
8012
8013    #[test]
8014    fn goto_delete_returning_old_column() {
8015        assert_snapshot!(goto("
8016create table t(a int, b int);
8017delete from t
8018returning old.a$0, new.b;
8019"
8020        ), @r"
8021          ╭▸ 
8022        2 │ create table t(a int, b int);
8023          │                ─ 2. destination
8024        3 │ delete from t
8025        4 │ returning old.a, new.b;
8026          ╰╴              ─ 1. source
8027        ");
8028    }
8029
8030    #[test]
8031    fn goto_delete_returning_new_table() {
8032        assert_snapshot!(goto("
8033create table t(a int, b int);
8034delete from t
8035returning old.a, new$0.b;
8036"
8037        ), @r"
8038          ╭▸ 
8039        2 │ create table t(a int, b int);
8040          │              ─ 2. destination
8041        3 │ delete from t
8042        4 │ returning old.a, new.b;
8043          ╰╴                   ─ 1. source
8044        ");
8045    }
8046
8047    #[test]
8048    fn goto_delete_returning_new_column() {
8049        assert_snapshot!(goto("
8050create table t(a int, b int);
8051delete from t
8052returning old.a, new.b$0;
8053"
8054        ), @r"
8055          ╭▸ 
8056        2 │ create table t(a int, b int);
8057          │                       ─ 2. destination
8058        3 │ delete from t
8059        4 │ returning old.a, new.b;
8060          ╰╴                     ─ 1. source
8061        ");
8062    }
8063
8064    #[test]
8065    fn goto_insert_as_old_alias() {
8066        assert_snapshot!(goto("
8067create table t(a int, b int);
8068insert into t as old values (1, 2)
8069returning old$0.a, new.a;
8070"
8071        ), @r"
8072          ╭▸ 
8073        3 │ insert into t as old values (1, 2)
8074          │                  ─── 2. destination
8075        4 │ returning old.a, new.a;
8076          ╰╴            ─ 1. source
8077        ");
8078    }
8079
8080    #[test]
8081    fn goto_delete_as_old_alias() {
8082        assert_snapshot!(goto("
8083create table t(a int, b int);
8084delete from t as old
8085returning old$0.a, new.a;
8086"
8087        ), @r"
8088          ╭▸ 
8089        3 │ delete from t as old
8090          │                  ─── 2. destination
8091        4 │ returning old.a, new.a;
8092          ╰╴            ─ 1. source
8093        ");
8094    }
8095
8096    #[test]
8097    fn goto_update_as_old_alias() {
8098        assert_snapshot!(goto("
8099create table t(a int, b int);
8100update t as old set a = 42
8101returning old$0.a, new.a;
8102"
8103        ), @r"
8104          ╭▸ 
8105        3 │ update t as old set a = 42
8106          │             ─── 2. destination
8107        4 │ returning old.a, new.a;
8108          ╰╴            ─ 1. source
8109        ");
8110    }
8111
8112    #[test]
8113    fn goto_merge_returning_cte_column_unqualified() {
8114        assert_snapshot!(goto("
8115create table t(a int, b int);
8116with u(x, y) as (
8117  select 1, 2
8118)
8119merge into t
8120  using u on true
8121when matched then
8122  do nothing
8123when not matched then
8124  do nothing
8125returning x$0, u.y;
8126"
8127        ), @r"
8128           ╭▸ 
8129         3 │ with u(x, y) as (
8130           │        ─ 2. destination
81318132        12 │ returning x, u.y;
8133           ╰╴          ─ 1. source
8134        ");
8135    }
8136
8137    #[test]
8138    fn goto_merge_returning_cte_column_qualified_table() {
8139        assert_snapshot!(goto("
8140create table t(a int, b int);
8141with u(x, y) as (
8142  select 1, 2
8143)
8144merge into t
8145  using u on true
8146when matched then
8147  do nothing
8148when not matched then
8149  do nothing
8150returning x, u$0.y;
8151"
8152        ), @r"
8153           ╭▸ 
8154         3 │ with u(x, y) as (
8155           │      ─ 2. destination
81568157        12 │ returning x, u.y;
8158           ╰╴             ─ 1. source
8159        ");
8160    }
8161
8162    #[test]
8163    fn goto_merge_returning_cte_column_qualified_column() {
8164        assert_snapshot!(goto("
8165create table t(a int, b int);
8166with u(x, y) as (
8167  select 1, 2
8168)
8169merge into t
8170  using u on true
8171when matched then
8172  do nothing
8173when not matched then
8174  do nothing
8175returning x, u.y$0;
8176"
8177        ), @r"
8178           ╭▸ 
8179         3 │ with u(x, y) as (
8180           │           ─ 2. destination
81818182        12 │ returning x, u.y;
8183           ╰╴               ─ 1. source
8184        ");
8185    }
8186
8187    #[test]
8188    fn goto_overlay_with_cte_column() {
8189        assert_snapshot!(goto("
8190with t as (
8191  select '1' a, '2' b, 3 start
8192)
8193select overlay(a placing b$0 from start) from t;
8194        "), @r"
8195          ╭▸ 
8196        3 │   select '1' a, '2' b, 3 start
8197          │                     ─ 2. destination
8198        4 │ )
8199        5 │ select overlay(a placing b from start) from t;
8200          ╰╴                         ─ 1. source
8201        ");
8202    }
8203
8204    #[test]
8205    fn goto_overlay_with_cte_column_first_arg() {
8206        assert_snapshot!(goto("
8207with t as (
8208  select '1' a, '2' b, 3 start
8209)
8210select overlay(a$0 placing b from start) from t;
8211        "), @r"
8212          ╭▸ 
8213        3 │   select '1' a, '2' b, 3 start
8214          │              ─ 2. destination
8215        4 │ )
8216        5 │ select overlay(a placing b from start) from t;
8217          ╰╴               ─ 1. source
8218        ");
8219    }
8220
8221    #[test]
8222    fn goto_overlay_with_cte_column_from_arg() {
8223        assert_snapshot!(goto("
8224with t as (
8225  select '1' a, '2' b, 3 start
8226)
8227select overlay(a placing b from start$0) from t;
8228        "), @r"
8229          ╭▸ 
8230        3 │   select '1' a, '2' b, 3 start
8231          │                          ───── 2. destination
8232        4 │ )
8233        5 │ select overlay(a placing b from start) from t;
8234          ╰╴                                    ─ 1. source
8235        ");
8236    }
8237
8238    #[test]
8239    fn goto_named_arg_to_param() {
8240        assert_snapshot!(goto("
8241create function foo(bar_param int) returns int as 'select 1' language sql;
8242select foo(bar_param$0 := 5);
8243"), @r"
8244          ╭▸ 
8245        2 │ create function foo(bar_param int) returns int as 'select 1' language sql;
8246          │                     ───────── 2. destination
8247        3 │ select foo(bar_param := 5);
8248          ╰╴                   ─ 1. source
8249        ");
8250    }
8251
8252    #[test]
8253    fn goto_named_arg_schema_qualified() {
8254        assert_snapshot!(goto("
8255create schema s;
8256create function s.foo(my_param int) returns int as 'select 1' language sql;
8257select s.foo(my_param$0 := 10);
8258"), @r"
8259          ╭▸ 
8260        3 │ create function s.foo(my_param int) returns int as 'select 1' language sql;
8261          │                       ──────── 2. destination
8262        4 │ select s.foo(my_param := 10);
8263          ╰╴                    ─ 1. source
8264        ");
8265    }
8266
8267    #[test]
8268    fn goto_named_arg_multiple_params() {
8269        assert_snapshot!(goto("
8270create function foo(a int, b int, c int) returns int as 'select 1' language sql;
8271select foo(b$0 := 2, a := 1);
8272"), @r"
8273          ╭▸ 
8274        2 │ create function foo(a int, b int, c int) returns int as 'select 1' language sql;
8275          │                            ─ 2. destination
8276        3 │ select foo(b := 2, a := 1);
8277          ╰╴           ─ 1. source
8278        ");
8279    }
8280
8281    #[test]
8282    fn goto_named_arg_procedure() {
8283        assert_snapshot!(goto("
8284create procedure proc(param_x int) as 'select 1' language sql;
8285call proc(param_x$0 := 42);
8286"), @r"
8287          ╭▸ 
8288        2 │ create procedure proc(param_x int) as 'select 1' language sql;
8289          │                       ─────── 2. destination
8290        3 │ call proc(param_x := 42);
8291          ╰╴                ─ 1. source
8292        ");
8293    }
8294
8295    #[test]
8296    fn goto_named_arg_not_found_unnamed_param() {
8297        goto_not_found(
8298            "
8299create function foo(int) returns int as 'select 1' language sql;
8300select foo(bar$0 := 5);
8301",
8302        );
8303    }
8304
8305    #[test]
8306    fn goto_named_arg_not_found_wrong_name() {
8307        goto_not_found(
8308            "
8309create function foo(correct_param int) returns int as 'select 1' language sql;
8310select foo(wrong_param$0 := 5);
8311",
8312        );
8313    }
8314
8315    #[test]
8316    fn goto_operator_function_ref() {
8317        assert_snapshot!(goto("
8318create function pg_catalog.tsvector_concat(tsvector, tsvector) returns tsvector language internal;
8319create operator pg_catalog.|| (leftarg = tsvector, rightarg = tsvector, function = pg_catalog.tsvector_concat$0);
8320"), @r"
8321          ╭▸ 
8322        2 │ create function pg_catalog.tsvector_concat(tsvector, tsvector) returns tsvector language internal;
8323          │                            ─────────────── 2. destination
8324        3 │ create operator pg_catalog.|| (leftarg = tsvector, rightarg = tsvector, function = pg_catalog.tsvector_concat);
8325          ╰╴                                                                                                            ─ 1. source
8326        ");
8327    }
8328
8329    #[test]
8330    fn goto_operator_procedure_ref() {
8331        assert_snapshot!(goto("
8332create function f(int, int) returns int language internal;
8333create operator ||| (leftarg = int, rightarg = int, procedure = f$0);
8334"), @r"
8335          ╭▸ 
8336        2 │ create function f(int, int) returns int language internal;
8337          │                 ─ 2. destination
8338        3 │ create operator ||| (leftarg = int, rightarg = int, procedure = f);
8339          ╰╴                                                                ─ 1. source
8340        ");
8341    }
8342}