diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index ebb509be..a10ba5ea 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -1540,6 +1540,7 @@ pub enum SyntaxKind { PLPGSQL_EXEC_SQL_STMT, PLPGSQL_EXIT_STMT, PLPGSQL_EXIT_WHEN, + PLPGSQL_EXPR, PLPGSQL_FETCH_STMT, PLPGSQL_FOR_CURSOR_STMT, PLPGSQL_FOR_DYN_STMT, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 970b026f..917bb2a6 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -3555,6 +3555,27 @@ pub(crate) fn perform_select(p: &mut Parser<'_>) -> CompletedMarker { select_tail(p, m, &SelectRestrictions::default(), SELECT) } +// PLpgSQL_Expr: opt_distinct_clause opt_target_list +// from_clause where_clause +// group_clause having_clause window_clause +// opt_sort_clause opt_select_limit opt_for_locking_clause +pub(crate) fn plpgsql_expr(p: &mut Parser<'_>) -> Option { + let m = p.start(); + let mut found = opt_select_all_or_distinct(p).is_some(); + found |= opt_target_list(p).is_some(); + found |= opt_from_clause(p).is_some(); + found |= opt_where_clause(p).is_some(); + found |= opt_group_by_clause(p).is_some(); + found |= opt_having_clause(p).is_some(); + found |= opt_window_clause(p).is_some(); + found |= opt_select_trailing_clauses(p); + if !found { + m.abandon(p); + return None; + } + Some(m.complete(p, PLPGSQL_EXPR)) +} + fn select_tail( p: &mut Parser, m: Marker, @@ -6222,14 +6243,13 @@ fn opt_offset_clause(p: &mut Parser<'_>) -> Option { } /// all is the default, distinct removes duplicate rows -fn opt_select_all_or_distinct(p: &mut Parser) { +fn opt_select_all_or_distinct(p: &mut Parser) -> Option { // TODO: we probably don't want to be so specific here, we can be more // generous with parsing and handle error reporting later on. if p.at(ALL_KW) { let m = p.start(); p.bump(ALL_KW); - m.complete(p, ALL); - return; + return Some(m.complete(p, ALL)); } // ``` // select DISTINCT [ ON ( expression [, ...] ) ] @@ -6265,9 +6285,10 @@ fn opt_select_all_or_distinct(p: &mut Parser) { paren_expr_list(p); m.complete(p, DISTINCT_ON); } - m.complete(p, DISTINCT_CLAUSE); + Some(m.complete(p, DISTINCT_CLAUSE)) } else { m.abandon(p); + None } } @@ -6473,10 +6494,10 @@ fn opt_target_list(p: &mut Parser) -> Option { break; } if !p.eat(COMMA) { - if p.at(FORMAT_KW) && p.nth_at(1, JSON_KW) { + if p.at_ts(TARGET_FOLLOW) { break; } - if p.at(RETURNING_KW) && p.nth_at(1, TEXT_KW) { + if p.at(FORMAT_KW) && p.nth_at(1, JSON_KW) { break; } if p.at_ts(TARGET_FIRST) { diff --git a/crates/squawk_parser/src/lib.rs b/crates/squawk_parser/src/lib.rs index 146f8ff9..c294519a 100644 --- a/crates/squawk_parser/src/lib.rs +++ b/crates/squawk_parser/src/lib.rs @@ -700,7 +700,13 @@ impl<'t> Parser<'t> { /// Checks if the nth token is a contextual keyword in `kinds`. #[must_use] pub(crate) fn nth_at_contextual_ts(&self, n: usize, kinds: TokenSet) -> bool { - kinds.contains(self.contextual_kind_at(self.pos + n)) + kinds.contains(self.nth_contextual_kind(n)) + } + + /// The contextual keyword kind of the nth token. + #[must_use] + pub(crate) fn nth_contextual_kind(&self, n: usize) -> SyntaxKind { + self.contextual_kind_at(self.pos + n) } #[must_use] diff --git a/crates/squawk_parser/src/plpgsql_grammar.rs b/crates/squawk_parser/src/plpgsql_grammar.rs index 090f61a9..56807b5d 100644 --- a/crates/squawk_parser/src/plpgsql_grammar.rs +++ b/crates/squawk_parser/src/plpgsql_grammar.rs @@ -283,16 +283,71 @@ fn opt_var_init(p: &mut Parser) { if !p.eat(COLON_EQ) && !p.eat(EQ) { p.bump(DEFAULT_KW); } - expr(p); + expr_until_semi(p); m.complete(p, PLPGSQL_VAR_INIT); } fn expr(p: &mut Parser) { - if grammar::expr(p).is_none() { + if grammar::plpgsql_expr(p).is_none() { p.error("expected an expression"); } } +fn expr_until(p: &mut Parser, terminator: Option<(SyntaxKind, usize)>) { + match terminator { + None => expr(p), + Some((_, 0)) => p.error("expected an expression"), + Some((_, n)) => p.with_limit(n, expr), + } +} + +const SEMICOLON_TERMINATOR: TokenSet = TokenSet::new(&[SEMICOLON]); +const COMMA_TERMINATOR: TokenSet = TokenSet::new(&[COMMA, SEMICOLON]); +const COMMA_OR_USING_TERMINATOR: TokenSet = TokenSet::new(&[COMMA, SEMICOLON, USING_KW]); +const LOOP_TERMINATOR: TokenSet = TokenSet::new(&[LOOP_KW]); +const DOT_DOT_TERMINATOR: TokenSet = TokenSet::new(&[DOT_DOT, SEMICOLON]); +const BY_TERMINATOR: TokenSet = TokenSet::new(&[BY_KW, SEMICOLON]); +const THEN_TERMINATOR: TokenSet = TokenSet::new(&[THEN_KW]); +const WHEN_TERMINATOR: TokenSet = TokenSet::new(&[WHEN_KW]); +const USING_TERMINATOR: TokenSet = TokenSet::new(&[USING_KW, SEMICOLON]); +const INTO_OR_USING_TERMINATOR: TokenSet = TokenSet::new(&[INTO_KW, USING_KW, SEMICOLON]); +const RECOVERY_TERMINATORS: TokenSet = + TokenSet::new(&[THEN_KW, WHEN_KW, USING_KW, ELSE_KW, END_KW, SEMICOLON]); + +fn expr_until_ts(p: &mut Parser, stop: TokenSet, contextual_stop: TokenSet) { + let terminator = top_level_terminator(p, stop, contextual_stop) + .or_else(|| top_level_terminator(p, RECOVERY_TERMINATORS, contextual_stop)); + expr_until(p, terminator); +} + +fn expr_until_semi(p: &mut Parser) { + expr_until_ts(p, SEMICOLON_TERMINATOR, TokenSet::EMPTY); +} + +fn expr_until_then(p: &mut Parser) { + expr_until_ts(p, THEN_TERMINATOR, TokenSet::EMPTY); +} + +fn expr_until_when(p: &mut Parser) { + expr_until_ts(p, WHEN_TERMINATOR, TokenSet::EMPTY); +} + +fn expr_until_using(p: &mut Parser) { + expr_until_ts(p, USING_TERMINATOR, TokenSet::EMPTY); +} + +fn comma_expr(p: &mut Parser) { + expr_until_ts(p, COMMA_TERMINATOR, TokenSet::EMPTY); +} + +fn comma_expr_until_loop(p: &mut Parser) { + expr_until_ts(p, COMMA_TERMINATOR, LOOP_TERMINATOR); +} + +fn comma_expr_until_using(p: &mut Parser) { + expr_until_ts(p, COMMA_OR_USING_TERMINATOR, TokenSet::EMPTY); +} + #[derive(Clone, Copy, PartialEq)] enum BodyKind { Block, @@ -434,14 +489,14 @@ fn return_stmt(p: &mut Parser) { let kind = if p.at(NEXT_KW) && !composite { p.bump(NEXT_KW); if !p.at(SEMICOLON) { - expr(p); + expr_until_semi(p); } PLPGSQL_RETURN_NEXT_STMT } else if p.nth_at_contextual_kw(0, QUERY_KW) && !composite && p.nth_at(1, EXECUTE_KW) { p.bump_remap(QUERY_KW); p.bump(EXECUTE_KW); - expr(p); - opt_using_clause(p, expr); + expr_until_using(p); + opt_using_clause(p, comma_expr); PLPGSQL_RETURN_QUERY_EXECUTE_STMT } else if p.nth_at_contextual_kw(0, QUERY_KW) && !composite { p.bump_remap(QUERY_KW); @@ -451,7 +506,7 @@ fn return_stmt(p: &mut Parser) { PLPGSQL_RETURN_QUERY_STMT } else { if !p.at(SEMICOLON) { - expr(p); + expr_until_semi(p); } PLPGSQL_RETURN_STMT }; @@ -463,9 +518,9 @@ fn assert_stmt(p: &mut Parser) { assert!(p.nth_at_contextual_kw(0, ASSERT_KW)); let m = p.start(); p.bump_remap(ASSERT_KW); - expr(p); + comma_expr(p); if p.eat(COMMA) { - expr(p); + expr_until_semi(p); } p.expect(SEMICOLON); m.complete(p, PLPGSQL_ASSERT_STMT); @@ -513,7 +568,7 @@ fn raise_stmt(p: &mut Parser) { opt_raise_level(p); if opt_raise_message(p) { while !p.at(EOF) && p.eat(COMMA) { - expr(p); + comma_expr_until_using(p); } } else if !p.at(USING_KW) { condition(p); @@ -575,7 +630,7 @@ fn raise_option(p: &mut Parser) { if !p.eat(COLON_EQ) { p.expect(EQ); } - expr(p); + comma_expr(p); m.complete(p, kind); } @@ -703,8 +758,8 @@ fn open_stmt(p: &mut Parser) { let m = p.start(); p.bump(FOR_KW); let kind = if p.eat(EXECUTE_KW) { - expr(p); - opt_using_clause(p, expr); + expr_until_using(p); + opt_using_clause(p, comma_expr); PLPGSQL_OPEN_EXECUTE } else { if grammar::stmt(p, &grammar::StmtRestrictions::default()).is_none() { @@ -742,7 +797,7 @@ fn dyn_execute_stmt(p: &mut Parser) { into_clause(p); } else if !using && p.at(USING_KW) { using = true; - opt_using_clause(p, expr); + opt_using_clause(p, comma_expr); } else { break; } @@ -828,7 +883,7 @@ fn assign_stmt(p: &mut Parser) { if !p.eat(COLON_EQ) { p.expect(EQ); } - expr(p); + expr_until_semi(p); p.expect(SEMICOLON); m.complete(p, PLPGSQL_ASSIGN_STMT); } @@ -844,7 +899,7 @@ fn if_stmt(p: &mut Parser) { assert!(p.at(IF_KW)); let m = p.start(); p.bump(IF_KW); - expr(p); + expr_until_then(p); p.expect(THEN_KW); body(p, BodyKind::IfThen); while !p.at(EOF) && opt_elsif_clause(p) {} @@ -860,7 +915,7 @@ fn case_stmt(p: &mut Parser) { let m = p.start(); p.bump(CASE_KW); if !p.at(WHEN_KW) { - expr(p); + expr_until_when(p); if !p.at(WHEN_KW) { p.error("expected `when`"); } @@ -879,10 +934,7 @@ fn case_when(p: &mut Parser) { assert!(p.at(WHEN_KW)); let m = p.start(); p.bump(WHEN_KW); - expr(p); - while !p.at(EOF) && p.eat(COMMA) { - expr(p); - } + expr_until_then(p); p.expect(THEN_KW); body(p, BodyKind::CaseWhen); m.complete(p, PLPGSQL_CASE_WHEN); @@ -894,7 +946,7 @@ fn loop_stmt(p: &mut Parser) { opt_label(p); let kind = if p.nth_at_contextual_kw(0, WHILE_KW) { p.bump_remap(WHILE_KW); - expr(p); + expr_until_loop(p, TokenSet::EMPTY); PLPGSQL_WHILE_STMT } else if p.at(FOR_KW) { for_head(p) @@ -918,8 +970,8 @@ fn for_head(p: &mut Parser) -> SyntaxKind { for_variable_list(p); p.expect(IN_KW); if p.eat(EXECUTE_KW) { - expr_until_loop(p); - opt_using_clause(p, expr_until_loop); + expr_until_loop_or_using(p); + opt_using_clause(p, comma_expr_until_loop); return PLPGSQL_FOR_DYN_STMT; } if at_for_cursor(p, 0) { @@ -932,13 +984,13 @@ fn for_head(p: &mut Parser) -> SyntaxKind { if at_for_reverse(p, 0) { p.bump_remap(REVERSE_KW); } - match for_header_terminator(p, 0) { + match top_level_terminator(p, DOT_DOT_TERMINATOR, LOOP_TERMINATOR) { Some((DOT_DOT, _)) => { for_range(p); PLPGSQL_FOR_I_STMT } terminator => { - for_query(p, terminator.map(|(_, n)| n)); + for_query(p, terminator); PLPGSQL_FOR_QUERY_STMT } } @@ -951,7 +1003,7 @@ fn foreach_head(p: &mut Parser) -> SyntaxKind { opt_foreach_slice(p); p.expect(IN_KW); p.expect(ARRAY_KW); - expr_until_loop(p); + expr_until_loop(p, TokenSet::EMPTY); PLPGSQL_FOR_EACH_STMT } @@ -972,17 +1024,17 @@ fn opt_foreach_slice(p: &mut Parser) { m.complete(p, PLPGSQL_FOR_EACH_SLICE); } -fn for_query(p: &mut Parser, loop_at: Option) { - match loop_at { - Some(0) => p.error("expected a query"), - Some(n) => { +fn for_query(p: &mut Parser, terminator: Option<(SyntaxKind, usize)>) { + match terminator { + Some((SEMICOLON, _)) | None => { + grammar::stmt(p, &grammar::StmtRestrictions::default()); + } + Some((_, 0)) => p.error("expected a query"), + Some((_, n)) => { p.with_limit(n, |p| { grammar::stmt(p, &grammar::StmtRestrictions::default()); }); } - None => { - grammar::stmt(p, &grammar::StmtRestrictions::default()); - } } } @@ -1003,37 +1055,25 @@ fn for_variable(p: &mut Parser) { fn for_range(p: &mut Parser) { let m = p.start(); - range_bound(p); + expr_until_loop(p, DOT_DOT_TERMINATOR); p.expect(DOT_DOT); - range_bound(p); + expr_until_loop(p, BY_TERMINATOR); if p.eat(BY_KW) { - range_bound(p); + expr_until_loop(p, TokenSet::EMPTY); } m.complete(p, PLPGSQL_FOR_RANGE); } -fn range_bound(p: &mut Parser) { - if p.nth_at_contextual_kw(0, LOOP_KW) || p.at(BY_KW) { - p.error("expected an expression"); - return; - } - expr(p); +fn expr_until_into_or_using(p: &mut Parser) { + expr_until_ts(p, INTO_OR_USING_TERMINATOR, TokenSet::EMPTY); } -fn expr_until_into_or_using(p: &mut Parser) { - if p.at(INTO_KW) || p.at(USING_KW) || p.at(SEMICOLON) { - p.error("expected an expression"); - return; - } - expr(p); +fn expr_until_loop(p: &mut Parser, extra_follow: TokenSet) { + expr_until_ts(p, SEMICOLON_TERMINATOR.union(extra_follow), LOOP_TERMINATOR); } -fn expr_until_loop(p: &mut Parser) { - if p.nth_at_contextual_kw(0, LOOP_KW) || p.at(USING_KW) { - p.error("expected an expression"); - return; - } - expr(p); +fn expr_until_loop_or_using(p: &mut Parser) { + expr_until_ts(p, USING_TERMINATOR, LOOP_TERMINATOR); } fn exit_stmt(p: &mut Parser) { @@ -1057,7 +1097,7 @@ fn opt_exit_when(p: &mut Parser) { } let m = p.start(); p.bump(WHEN_KW); - expr(p); + expr_until_semi(p); m.complete(p, PLPGSQL_EXIT_WHEN); } @@ -1079,7 +1119,7 @@ fn opt_elsif_clause(p: &mut Parser) -> bool { } else { p.bump_remap(ELSIF_KW); } - expr(p); + expr_until_then(p); p.expect(THEN_KW); body(p, BodyKind::IfThen); m.complete(p, PLPGSQL_ELSIF_CLAUSE); @@ -1233,15 +1273,26 @@ fn at_for_reverse(p: &Parser, n: usize) -> bool { } // postgres does a similar thing to look ahead until it sees a loop token -fn for_header_terminator(p: &Parser, mut n: usize) -> Option<(SyntaxKind, usize)> { +fn top_level_terminator( + p: &Parser, + stop: TokenSet, + contextual_stop: TokenSet, +) -> Option<(SyntaxKind, usize)> { let mut depth = 0i32; + let mut case_depth = 0i32; + let mut n = 0; while !p.nth_at(n, EOF) { match p.nth(n) { L_PAREN | L_BRACK => depth += 1, - R_PAREN | R_BRACK => depth -= 1, - SEMICOLON if depth == 0 => return None, - DOT_DOT if depth == 0 => return Some((DOT_DOT, n)), - _ if depth == 0 && p.nth_at_contextual_kw(n, LOOP_KW) => return Some((LOOP_KW, n)), + R_PAREN | R_BRACK if depth > 0 => depth -= 1, + CASE_KW => case_depth += 1, + END_KW if case_depth > 0 => case_depth -= 1, + kind if depth == 0 && case_depth == 0 && stop.contains(kind) => { + return Some((kind, n)); + } + _ if depth == 0 && case_depth == 0 && p.nth_at_contextual_ts(n, contextual_stop) => { + return Some((p.nth_contextual_kind(n), n)); + } _ => (), } n += 1; diff --git a/crates/squawk_parser/tests/data/plpgsql/err/case_stmt.sql b/crates/squawk_parser/tests/data/plpgsql/err/case_stmt.sql index 15736778..62017dd7 100644 --- a/crates/squawk_parser/tests/data/plpgsql/err/case_stmt.sql +++ b/crates/squawk_parser/tests/data/plpgsql/err/case_stmt.sql @@ -22,6 +22,8 @@ begin null; when x = 2, case when x = 3 then true end then null; + when case when x = 4 then true end, case when x = 5 then true end then + null; end case; end $$; diff --git a/crates/squawk_parser/tests/data/plpgsql/err/if_stmt.sql b/crates/squawk_parser/tests/data/plpgsql/err/if_stmt.sql index ee739201..a84b1df5 100644 --- a/crates/squawk_parser/tests/data/plpgsql/err/if_stmt.sql +++ b/crates/squawk_parser/tests/data/plpgsql/err/if_stmt.sql @@ -12,7 +12,6 @@ begin null; end if; - -- `expr_until_then` ends the condition at the case's own `then` if case when true then 1 end = 1 then null; elsif 1 = case when true then 1 end then diff --git a/crates/squawk_parser/tests/data/plpgsql/ok/if_stmt.sql b/crates/squawk_parser/tests/data/plpgsql/ok/if_stmt.sql index d7249c44..e15d18ec 100644 --- a/crates/squawk_parser/tests/data/plpgsql/ok/if_stmt.sql +++ b/crates/squawk_parser/tests/data/plpgsql/ok/if_stmt.sql @@ -36,5 +36,34 @@ begin if (array[case when x = 1 then 1 end])[1] = 1 then null; end if; + + -- PL/pgSQL expressions accept nearly everything that can follow SELECT. + if true as condition then + null; + end if; + + if true condition, false other then + null; + end if; + + if flag from (values (true)) as v(flag) where flag then + null; + end if; + + if bool_and(flag) from (values (true)) as v(flag) group by flag having bool_and(flag) then + null; + end if; + + if bool_and(flag) over w from (values (true)) as v(flag) window w as () then + null; + end if; + + if distinct flag from (values (true)) as v(flag) order by flag limit 1 offset 0 then + null; + end if; + + if flag from (values (true)) as v(flag) for update then + null; + end if; end $$; diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index 540214ab..57862b6b 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -19578,7 +19578,7 @@ impl PlpgsqlCaseStmt { support::child(&self.syntax) } #[inline] - pub fn subject(&self) -> Option { + pub fn subject(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -19609,8 +19609,8 @@ impl PlpgsqlCaseWhen { support::child(&self.syntax) } #[inline] - pub fn conds(&self) -> AstChildren { - support::children(&self.syntax) + pub fn cond(&self) -> Option { + support::child(&self.syntax) } #[inline] pub fn then_token(&self) -> Option { @@ -20014,7 +20014,7 @@ impl PlpgsqlDynExecuteStmt { support::child(&self.syntax) } #[inline] - pub fn query(&self) -> Option { + pub fn query(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20056,7 +20056,7 @@ impl PlpgsqlElsifClause { support::child(&self.syntax) } #[inline] - pub fn cond(&self) -> Option { + pub fn cond(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20155,7 +20155,7 @@ pub struct PlpgsqlExitWhen { } impl PlpgsqlExitWhen { #[inline] - pub fn cond(&self) -> Option { + pub fn cond(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20164,6 +20164,45 @@ impl PlpgsqlExitWhen { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct PlpgsqlExpr { + pub(crate) syntax: SyntaxNode, +} +impl PlpgsqlExpr { + #[inline] + pub fn from_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn group_by_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn having_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn select_quantifier(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn tail_clauses(&self) -> AstChildren { + support::children(&self.syntax) + } + #[inline] + pub fn target_list(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn where_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn window_clause(&self) -> Option { + support::child(&self.syntax) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct PlpgsqlFetchStmt { pub(crate) syntax: SyntaxNode, @@ -20268,7 +20307,7 @@ impl PlpgsqlForDynStmt { support::child(&self.syntax) } #[inline] - pub fn query(&self) -> Option { + pub fn query(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20326,7 +20365,7 @@ pub struct PlpgsqlForEachStmt { } impl PlpgsqlForEachStmt { #[inline] - pub fn array(&self) -> Option { + pub fn array(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20540,7 +20579,7 @@ pub struct PlpgsqlIfStmt { } impl PlpgsqlIfStmt { #[inline] - pub fn cond(&self) -> Option { + pub fn cond(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20765,7 +20804,7 @@ pub struct PlpgsqlOpenExecute { } impl PlpgsqlOpenExecute { #[inline] - pub fn query(&self) -> Option { + pub fn query(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20941,7 +20980,7 @@ pub struct PlpgsqlRaiseOptionColumn { } impl PlpgsqlRaiseOptionColumn { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20964,7 +21003,7 @@ pub struct PlpgsqlRaiseOptionConstraint { } impl PlpgsqlRaiseOptionConstraint { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -20987,7 +21026,7 @@ pub struct PlpgsqlRaiseOptionDatatype { } impl PlpgsqlRaiseOptionDatatype { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21010,7 +21049,7 @@ pub struct PlpgsqlRaiseOptionDetail { } impl PlpgsqlRaiseOptionDetail { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21033,7 +21072,7 @@ pub struct PlpgsqlRaiseOptionErrcode { } impl PlpgsqlRaiseOptionErrcode { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21056,7 +21095,7 @@ pub struct PlpgsqlRaiseOptionHint { } impl PlpgsqlRaiseOptionHint { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21079,7 +21118,7 @@ pub struct PlpgsqlRaiseOptionMessage { } impl PlpgsqlRaiseOptionMessage { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21102,7 +21141,7 @@ pub struct PlpgsqlRaiseOptionSchema { } impl PlpgsqlRaiseOptionSchema { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21125,7 +21164,7 @@ pub struct PlpgsqlRaiseOptionTable { } impl PlpgsqlRaiseOptionTable { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21160,7 +21199,7 @@ impl PlpgsqlRaiseStmt { support::child(&self.syntax) } #[inline] - pub fn params(&self) -> AstChildren { + pub fn params(&self) -> AstChildren { support::children(&self.syntax) } #[inline] @@ -21198,7 +21237,7 @@ pub struct PlpgsqlReturnNextStmt { } impl PlpgsqlReturnNextStmt { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21221,7 +21260,7 @@ pub struct PlpgsqlReturnQueryExecuteStmt { } impl PlpgsqlReturnQueryExecuteStmt { #[inline] - pub fn query(&self) -> Option { + pub fn query(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21275,7 +21314,7 @@ pub struct PlpgsqlReturnStmt { } impl PlpgsqlReturnStmt { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21313,7 +21352,7 @@ pub struct PlpgsqlUsingClause { } impl PlpgsqlUsingClause { #[inline] - pub fn exprs(&self) -> AstChildren { + pub fn exprs(&self) -> AstChildren { support::children(&self.syntax) } #[inline] @@ -21363,7 +21402,7 @@ pub struct PlpgsqlVarInit { } impl PlpgsqlVarInit { #[inline] - pub fn expr(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -21420,7 +21459,7 @@ impl PlpgsqlWhileStmt { support::child(&self.syntax) } #[inline] - pub fn cond(&self) -> Option { + pub fn cond(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -48821,6 +48860,24 @@ impl AstNode for PlpgsqlExitWhen { &self.syntax } } +impl AstNode for PlpgsqlExpr { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::PLPGSQL_EXPR + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for PlpgsqlFetchStmt { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/ast/node_ext.rs b/crates/squawk_syntax/src/ast/node_ext.rs index c18f72ec..eba7454f 100644 --- a/crates/squawk_syntax/src/ast/node_ext.rs +++ b/crates/squawk_syntax/src/ast/node_ext.rs @@ -864,29 +864,29 @@ impl ast::PlpgsqlDiagItem { impl ast::PlpgsqlAssertStmt { #[inline] - pub fn cond(&self) -> Option { + pub fn cond(&self) -> Option { support::children(&self.syntax).next() } #[inline] - pub fn message(&self) -> Option { + pub fn message(&self) -> Option { support::children(&self.syntax).nth(1) } } impl ast::PlpgsqlForRange { #[inline] - pub fn lower(&self) -> Option { + pub fn lower(&self) -> Option { support::children(&self.syntax).next() } #[inline] - pub fn upper(&self) -> Option { + pub fn upper(&self) -> Option { support::children(&self.syntax).nth(1) } #[inline] - pub fn step(&self) -> Option { + pub fn step(&self) -> Option { support::children(&self.syntax).nth(2) } } diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 6026125c..55dc4f7f 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -2043,6 +2043,16 @@ Plpgsql = comp_options:(PlpgsqlCompOption*) block:PlpgsqlBlock? +PlpgsqlExpr = + SelectQuantifier? + TargetList? + FromClause? + WhereClause? + GroupByClause? + HavingClause? + WindowClause? + tail_clauses:SelectTailClause* + PlpgsqlCompOption = PlpgsqlCompOptionDump | PlpgsqlCompOptionVariableConflict @@ -2131,7 +2141,7 @@ PlpgsqlVarName = PlpgsqlVarInit = (':=' | '=' | 'default') - Expr + expr:PlpgsqlExpr PlpgsqlAliasDecl = name:PlpgsqlVarName @@ -2213,12 +2223,12 @@ PlpgsqlPerformStmt = PlpgsqlReturnStmt = 'return' - Expr? + expr:PlpgsqlExpr? ';' PlpgsqlReturnNextStmt = 'return' 'next' - Expr? + expr:PlpgsqlExpr? ';' PlpgsqlReturnQueryStmt = @@ -2228,19 +2238,19 @@ PlpgsqlReturnQueryStmt = PlpgsqlReturnQueryExecuteStmt = 'return' 'query' 'execute' - query:Expr + query:PlpgsqlExpr using_clause:PlpgsqlUsingClause? ';' PlpgsqlUsingClause = - 'using' (Expr (',' Expr)*) + 'using' exprs:(PlpgsqlExpr (',' PlpgsqlExpr)*) PlpgsqlRaiseStmt = 'raise' level:PlpgsqlRaiseLevel? condition_name:PlpgsqlCondition? message:PlpgsqlRaiseMessage? - params:(Expr (',' Expr)*) + params:(PlpgsqlExpr (',' PlpgsqlExpr)*) using_clause:PlpgsqlRaiseUsingClause? ';' @@ -2265,36 +2275,36 @@ PlpgsqlRaiseOption = | PlpgsqlRaiseOptionSchema PlpgsqlRaiseOptionErrcode = - 'errcode' (':=' | '=') Expr + 'errcode' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionMessage = - 'message' (':=' | '=') Expr + 'message' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionDetail = - 'detail' (':=' | '=') Expr + 'detail' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionHint = - 'hint' (':=' | '=') Expr + 'hint' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionColumn = - 'column' (':=' | '=') Expr + 'column' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionConstraint = - 'constraint' (':=' | '=') Expr + 'constraint' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionDatatype = - 'datatype' (':=' | '=') Expr + 'datatype' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionTable = - 'table' (':=' | '=') Expr + 'table' (':=' | '=') expr:PlpgsqlExpr PlpgsqlRaiseOptionSchema = - 'schema' (':=' | '=') Expr + 'schema' (':=' | '=') expr:PlpgsqlExpr PlpgsqlAssertStmt = 'assert' - cond:Expr - message:Expr? + cond:PlpgsqlExpr + message:PlpgsqlExpr? ';' PlpgsqlCommitStmt = @@ -2309,7 +2319,7 @@ PlpgsqlRollbackStmt = PlpgsqlIfStmt = 'if' - cond:Expr + cond:PlpgsqlExpr 'then' then_body:PlpgsqlBody elsifs:(PlpgsqlElsifClause*) @@ -2318,7 +2328,7 @@ PlpgsqlIfStmt = PlpgsqlElsifClause = ('elsif' | 'elseif') - cond:Expr + cond:PlpgsqlExpr 'then' body:PlpgsqlBody @@ -2328,14 +2338,14 @@ PlpgsqlElseClause = PlpgsqlCaseStmt = 'case' - subject:Expr? + subject:PlpgsqlExpr? whens:(PlpgsqlCaseWhen*) else_clause:PlpgsqlElseClause? 'end' 'case' ';' PlpgsqlCaseWhen = 'when' - conds:(Expr (',' Expr)*) + cond:PlpgsqlExpr 'then' body:PlpgsqlBody @@ -2350,7 +2360,7 @@ PlpgsqlLoopStmt = PlpgsqlWhileStmt = label:PlpgsqlLabel? 'while' - cond:Expr + cond:PlpgsqlExpr 'loop' body:PlpgsqlBody 'end' 'loop' @@ -2371,12 +2381,12 @@ PlpgsqlContinueStmt = PlpgsqlExitWhen = 'when' - cond:Expr + cond:PlpgsqlExpr PlpgsqlAssignStmt = target:PlpgsqlAssignTarget (':=' | '=') - value:Expr + value:PlpgsqlExpr ';' PlpgsqlAssignTarget = @@ -2454,17 +2464,17 @@ PlpgsqlForVariable = FieldAccessor* PlpgsqlForRange = - lower:Expr + lower:PlpgsqlExpr '..' - upper:Expr - ('by' step:Expr)? + upper:PlpgsqlExpr + ('by' step:PlpgsqlExpr)? PlpgsqlForDynStmt = label:PlpgsqlLabel? 'for' vars:(PlpgsqlForVariable (',' PlpgsqlForVariable)*) 'in' 'execute' - query:Expr + query:PlpgsqlExpr using_clause:PlpgsqlUsingClause? 'loop' body:PlpgsqlBody @@ -2504,7 +2514,7 @@ PlpgsqlForEachStmt = vars:(PlpgsqlForVariable (',' PlpgsqlForVariable)*) slice:PlpgsqlForEachSlice? 'in' 'array' - array:Expr + array:PlpgsqlExpr 'loop' body:PlpgsqlBody 'end' 'loop' @@ -2529,7 +2539,7 @@ PlpgsqlExecSqlStmt = PlpgsqlDynExecuteStmt = 'execute' - query:Expr + query:PlpgsqlExpr into_clause:PlpgsqlIntoClause? using_clause:PlpgsqlUsingClause? ';' @@ -2564,7 +2574,7 @@ PlpgsqlOpenQuery = PlpgsqlOpenExecute = 'for' 'execute' - query:Expr + query:PlpgsqlExpr using_clause:PlpgsqlUsingClause? PlpgsqlCursorVariableRef = diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_err.snap index b765aa40..e8f809fe 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_err.snap @@ -15,14 +15,17 @@ PLPGSQL@0..39 PLPGSQL_ASSERT_STMT@19..34 ASSERT_KW@19..25 "assert" WHITESPACE@25..26 " " - BIN_EXPR@26..31 - LITERAL@26..27 - INT_NUMBER@26..27 "1" - WHITESPACE@27..28 " " - EQ@28..29 "=" - WHITESPACE@29..30 " " - LITERAL@30..31 - INT_NUMBER@30..31 "1" + PLPGSQL_EXPR@26..31 + TARGET_LIST@26..31 + TARGET@26..31 + BIN_EXPR@26..31 + LITERAL@26..27 + INT_NUMBER@26..27 "1" + WHITESPACE@27..28 " " + EQ@28..29 "=" + WHITESPACE@29..30 " " + LITERAL@30..31 + INT_NUMBER@30..31 "1" COMMA@31..32 "," WHITESPACE@32..33 " " SEMICOLON@33..34 ";" @@ -30,18 +33,10 @@ PLPGSQL@0..39 END_KW@35..38 "end" WHITESPACE@38..39 "\n" -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -3 │ assert; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 3 │ assert; ╰╴ ━ -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -4 │ assert 1 = 1, ; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 4 │ assert 1 = 1, ; diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_ok.snap index 09edb7f1..57c601f7 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assert_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..154 PLPGSQL_VAR_INIT@22..26 COLON_EQ@22..24 ":=" WHITESPACE@24..25 " " - LITERAL@25..26 - INT_NUMBER@25..26 "1" + PLPGSQL_EXPR@25..26 + TARGET_LIST@25..26 + TARGET@25..26 + LITERAL@25..26 + INT_NUMBER@25..26 "1" SEMICOLON@26..27 ";" WHITESPACE@27..28 "\n" BEGIN_KW@28..33 "begin" @@ -30,73 +33,88 @@ PLPGSQL@0..154 PLPGSQL_ASSERT_STMT@36..48 ASSERT_KW@36..42 "assert" WHITESPACE@42..43 " " - LITERAL@43..47 - TRUE_KW@43..47 "true" + PLPGSQL_EXPR@43..47 + TARGET_LIST@43..47 + TARGET@43..47 + LITERAL@43..47 + TRUE_KW@43..47 "true" SEMICOLON@47..48 ";" WHITESPACE@48..51 "\n " PLPGSQL_ASSERT_STMT@51..72 ASSERT_KW@51..57 "assert" WHITESPACE@57..58 " " - BIN_EXPR@58..63 - LITERAL@58..59 - INT_NUMBER@58..59 "1" - WHITESPACE@59..60 " " - EQ@60..61 "=" - WHITESPACE@61..62 " " - LITERAL@62..63 - INT_NUMBER@62..63 "1" + PLPGSQL_EXPR@58..63 + TARGET_LIST@58..63 + TARGET@58..63 + BIN_EXPR@58..63 + LITERAL@58..59 + INT_NUMBER@58..59 "1" + WHITESPACE@59..60 " " + EQ@60..61 "=" + WHITESPACE@61..62 " " + LITERAL@62..63 + INT_NUMBER@62..63 "1" COMMA@63..64 "," WHITESPACE@64..65 " " - LITERAL@65..71 - STRING@65..71 "'boom'" + PLPGSQL_EXPR@65..71 + TARGET_LIST@65..71 + TARGET@65..71 + LITERAL@65..71 + STRING@65..71 "'boom'" SEMICOLON@71..72 ";" WHITESPACE@72..75 "\n " PLPGSQL_ASSERT_STMT@75..134 ASSERT_KW@75..81 "assert" WHITESPACE@81..82 " " - BIN_EXPR@82..115 - PAREN_EXPR@82..111 - L_PAREN@82..83 "(" - SELECT@83..110 - SELECT_CLAUSE@83..98 - SELECT_KW@83..89 "select" - WHITESPACE@89..90 " " - TARGET_LIST@90..98 - TARGET@90..98 - CALL_EXPR@90..98 - NAME_REF@90..95 - IDENT@90..95 "count" - ARG_LIST@95..98 - L_PAREN@95..96 "(" - STAR@96..97 "*" - R_PAREN@97..98 ")" - WHITESPACE@98..99 " " - FROM_CLAUSE@99..110 - FROM_KW@99..103 "from" - WHITESPACE@103..104 " " - RELATION_FROM_ITEM@104..110 - RELATION_NAME_REF@104..110 - PATH_REF@104..110 - PATH_SEGMENT_REF@104..110 - IDENT@104..110 "onecol" - R_PAREN@110..111 ")" - WHITESPACE@111..112 " " - R_ANGLE@112..113 ">" - WHITESPACE@113..114 " " - LITERAL@114..115 - INT_NUMBER@114..115 "0" + PLPGSQL_EXPR@82..115 + TARGET_LIST@82..115 + TARGET@82..115 + BIN_EXPR@82..115 + PAREN_EXPR@82..111 + L_PAREN@82..83 "(" + SELECT@83..110 + SELECT_CLAUSE@83..98 + SELECT_KW@83..89 "select" + WHITESPACE@89..90 " " + TARGET_LIST@90..98 + TARGET@90..98 + CALL_EXPR@90..98 + NAME_REF@90..95 + IDENT@90..95 "count" + ARG_LIST@95..98 + L_PAREN@95..96 "(" + STAR@96..97 "*" + R_PAREN@97..98 ")" + WHITESPACE@98..99 " " + FROM_CLAUSE@99..110 + FROM_KW@99..103 "from" + WHITESPACE@103..104 " " + RELATION_FROM_ITEM@104..110 + RELATION_NAME_REF@104..110 + PATH_REF@104..110 + PATH_SEGMENT_REF@104..110 + IDENT@104..110 "onecol" + R_PAREN@110..111 ")" + WHITESPACE@111..112 " " + R_ANGLE@112..113 ">" + WHITESPACE@113..114 " " + LITERAL@114..115 + INT_NUMBER@114..115 "0" COMMA@115..116 "," WHITESPACE@116..117 " " - BIN_EXPR@117..133 - LITERAL@117..126 - STRING@117..126 "'empty: '" - WHITESPACE@126..127 " " - CUSTOM_OP@127..129 - PIPE@127..128 "|" - PIPE@128..129 "|" - WHITESPACE@129..130 " " - LITERAL@130..133 - STRING@130..133 "'x'" + PLPGSQL_EXPR@117..133 + TARGET_LIST@117..133 + TARGET@117..133 + BIN_EXPR@117..133 + LITERAL@117..126 + STRING@117..126 "'empty: '" + WHITESPACE@126..127 " " + CUSTOM_OP@127..129 + PIPE@127..128 "|" + PIPE@128..129 "|" + WHITESPACE@129..130 " " + LITERAL@130..133 + STRING@130..133 "'x'" SEMICOLON@133..134 ";" WHITESPACE@134..137 "\n " PLPGSQL_ASSIGN_STMT@137..149 @@ -106,8 +124,11 @@ PLPGSQL@0..154 WHITESPACE@143..144 " " COLON_EQ@144..146 ":=" WHITESPACE@146..147 " " - LITERAL@147..148 - INT_NUMBER@147..148 "2" + PLPGSQL_EXPR@147..148 + TARGET_LIST@147..148 + TARGET@147..148 + LITERAL@147..148 + INT_NUMBER@147..148 "2" SEMICOLON@148..149 ";" WHITESPACE@149..150 "\n" END_KW@150..153 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_err.snap index e5d02d32..3b2fc295 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_err.snap @@ -64,10 +64,6 @@ PLPGSQL@0..66 END_KW@62..65 "end" WHITESPACE@65..66 "\n" -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -3 │ x := ; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 3 │ x := ; @@ -84,10 +80,6 @@ error[syntax-error]: expected EQ ╭▸ 4 │ a[1 := 2; ╰╴ ━ -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -4 │ a[1 := 2; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 4 │ a[1 := 2; diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_ok.snap index 223e32d0..8bc69502 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_assign_stmt_ok.snap @@ -42,8 +42,11 @@ PLPGSQL@0..286 WHITESPACE@41..42 " " COLON_EQ@42..44 ":=" WHITESPACE@44..45 " " - LITERAL@45..46 - INT_NUMBER@45..46 "1" + PLPGSQL_EXPR@45..46 + TARGET_LIST@45..46 + TARGET@45..46 + LITERAL@45..46 + INT_NUMBER@45..46 "1" SEMICOLON@46..47 ";" WHITESPACE@47..50 "\n " PLPGSQL_ASSIGN_STMT@50..56 @@ -53,8 +56,11 @@ PLPGSQL@0..286 WHITESPACE@51..52 " " EQ@52..53 "=" WHITESPACE@53..54 " " - LITERAL@54..55 - INT_NUMBER@54..55 "1" + PLPGSQL_EXPR@54..55 + TARGET_LIST@54..55 + TARGET@54..55 + LITERAL@54..55 + INT_NUMBER@54..55 "1" SEMICOLON@55..56 ";" WHITESPACE@56..59 "\n " PLPGSQL_ASSIGN_STMT@59..69 @@ -69,8 +75,11 @@ PLPGSQL@0..286 WHITESPACE@63..64 " " COLON_EQ@64..66 ":=" WHITESPACE@66..67 " " - LITERAL@67..68 - INT_NUMBER@67..68 "2" + PLPGSQL_EXPR@67..68 + TARGET_LIST@67..68 + TARGET@67..68 + LITERAL@67..68 + INT_NUMBER@67..68 "2" SEMICOLON@68..69 ";" WHITESPACE@69..72 "\n " PLPGSQL_ASSIGN_STMT@72..93 @@ -88,15 +97,18 @@ PLPGSQL@0..286 WHITESPACE@78..79 " " COLON_EQ@79..81 ":=" WHITESPACE@81..82 " " - ARRAY_EXPR@82..92 - ARRAY_KW@82..87 "array" - L_BRACK@87..88 "[" - LITERAL@88..89 - INT_NUMBER@88..89 "1" - COMMA@89..90 "," - LITERAL@90..91 - INT_NUMBER@90..91 "2" - R_BRACK@91..92 "]" + PLPGSQL_EXPR@82..92 + TARGET_LIST@82..92 + TARGET@82..92 + ARRAY_EXPR@82..92 + ARRAY_KW@82..87 "array" + L_BRACK@87..88 "[" + LITERAL@88..89 + INT_NUMBER@88..89 "1" + COMMA@89..90 "," + LITERAL@90..91 + INT_NUMBER@90..91 "2" + R_BRACK@91..92 "]" SEMICOLON@92..93 ";" WHITESPACE@93..96 "\n " PLPGSQL_ASSIGN_STMT@96..121 @@ -118,15 +130,18 @@ PLPGSQL@0..286 WHITESPACE@104..105 " " COLON_EQ@105..107 ":=" WHITESPACE@107..108 " " - ARRAY_EXPR@108..120 - ARRAY_KW@108..113 "array" - L_BRACK@113..114 "[" - LITERAL@114..116 - INT_NUMBER@114..116 "11" - COMMA@116..117 "," - LITERAL@117..119 - INT_NUMBER@117..119 "12" - R_BRACK@119..120 "]" + PLPGSQL_EXPR@108..120 + TARGET_LIST@108..120 + TARGET@108..120 + ARRAY_EXPR@108..120 + ARRAY_KW@108..113 "array" + L_BRACK@113..114 "[" + LITERAL@114..116 + INT_NUMBER@114..116 "11" + COMMA@116..117 "," + LITERAL@117..119 + INT_NUMBER@117..119 "12" + R_BRACK@119..120 "]" SEMICOLON@120..121 ";" WHITESPACE@121..124 "\n " PLPGSQL_ASSIGN_STMT@124..134 @@ -140,8 +155,11 @@ PLPGSQL@0..286 WHITESPACE@128..129 " " COLON_EQ@129..131 ":=" WHITESPACE@131..132 " " - LITERAL@132..133 - INT_NUMBER@132..133 "3" + PLPGSQL_EXPR@132..133 + TARGET_LIST@132..133 + TARGET@132..133 + LITERAL@132..133 + INT_NUMBER@132..133 "3" SEMICOLON@133..134 ";" WHITESPACE@134..137 "\n " PLPGSQL_ASSIGN_STMT@137..153 @@ -164,8 +182,11 @@ PLPGSQL@0..286 WHITESPACE@146..147 " " COLON_EQ@147..149 ":=" WHITESPACE@149..150 " " - LITERAL@150..152 - INT_NUMBER@150..152 "11" + PLPGSQL_EXPR@150..152 + TARGET_LIST@150..152 + TARGET@150..152 + LITERAL@150..152 + INT_NUMBER@150..152 "11" SEMICOLON@152..153 ";" WHITESPACE@153..156 "\n " PLPGSQL_ASSIGN_STMT@156..164 @@ -175,8 +196,11 @@ PLPGSQL@0..286 WHITESPACE@158..159 " " COLON_EQ@159..161 ":=" WHITESPACE@161..162 " " - LITERAL@162..163 - INT_NUMBER@162..163 "4" + PLPGSQL_EXPR@162..163 + TARGET_LIST@162..163 + TARGET@162..163 + LITERAL@162..163 + INT_NUMBER@162..163 "4" SEMICOLON@163..164 ";" WHITESPACE@164..167 "\n " PLPGSQL_ASSIGN_STMT@167..179 @@ -186,8 +210,11 @@ PLPGSQL@0..286 WHITESPACE@173..174 " " COLON_EQ@174..176 ":=" WHITESPACE@176..177 " " - LITERAL@177..178 - INT_NUMBER@177..178 "5" + PLPGSQL_EXPR@177..178 + TARGET_LIST@177..178 + TARGET@177..178 + LITERAL@177..178 + INT_NUMBER@177..178 "5" SEMICOLON@178..179 ";" WHITESPACE@179..182 "\n " PLPGSQL_ASSIGN_STMT@182..195 @@ -197,8 +224,11 @@ PLPGSQL@0..286 WHITESPACE@189..190 " " COLON_EQ@190..192 ":=" WHITESPACE@192..193 " " - LITERAL@193..194 - INT_NUMBER@193..194 "6" + PLPGSQL_EXPR@193..194 + TARGET_LIST@193..194 + TARGET@193..194 + LITERAL@193..194 + INT_NUMBER@193..194 "6" SEMICOLON@194..195 ";" WHITESPACE@195..198 "\n " PLPGSQL_ASSIGN_STMT@198..244 @@ -208,38 +238,41 @@ PLPGSQL@0..286 WHITESPACE@199..200 " " COLON_EQ@200..202 ":=" WHITESPACE@202..203 " " - CASE_EXPR@203..243 - CASE_KW@203..207 "case" - WHITESPACE@207..208 " " - WHEN_CLAUSE_LIST@208..230 - WHEN_CLAUSE@208..230 - WHEN_KW@208..212 "when" - WHITESPACE@212..213 " " - BIN_EXPR@213..221 - FIELD_EXPR@213..217 - NAME_REF@213..214 - IDENT@213..214 "r" - DOT@214..215 "." - NAME_REF@215..217 - IDENT@215..217 "f1" - WHITESPACE@217..218 " " - EQ@218..219 "=" - WHITESPACE@219..220 " " - LITERAL@220..221 - INT_NUMBER@220..221 "1" - WHITESPACE@221..222 " " - THEN_KW@222..226 "then" - WHITESPACE@226..227 " " - LITERAL@227..230 - STRING@227..230 "'a'" - WHITESPACE@230..231 " " - ELSE_CLAUSE@231..239 - ELSE_KW@231..235 "else" - WHITESPACE@235..236 " " - LITERAL@236..239 - STRING@236..239 "'b'" - WHITESPACE@239..240 " " - END_KW@240..243 "end" + PLPGSQL_EXPR@203..243 + TARGET_LIST@203..243 + TARGET@203..243 + CASE_EXPR@203..243 + CASE_KW@203..207 "case" + WHITESPACE@207..208 " " + WHEN_CLAUSE_LIST@208..230 + WHEN_CLAUSE@208..230 + WHEN_KW@208..212 "when" + WHITESPACE@212..213 " " + BIN_EXPR@213..221 + FIELD_EXPR@213..217 + NAME_REF@213..214 + IDENT@213..214 "r" + DOT@214..215 "." + NAME_REF@215..217 + IDENT@215..217 "f1" + WHITESPACE@217..218 " " + EQ@218..219 "=" + WHITESPACE@219..220 " " + LITERAL@220..221 + INT_NUMBER@220..221 "1" + WHITESPACE@221..222 " " + THEN_KW@222..226 "then" + WHITESPACE@226..227 " " + LITERAL@227..230 + STRING@227..230 "'a'" + WHITESPACE@230..231 " " + ELSE_CLAUSE@231..239 + ELSE_KW@231..235 "else" + WHITESPACE@235..236 " " + LITERAL@236..239 + STRING@236..239 "'b'" + WHITESPACE@239..240 " " + END_KW@240..243 "end" SEMICOLON@243..244 ";" WHITESPACE@244..247 "\n " PLPGSQL_ASSIGN_STMT@247..281 @@ -249,33 +282,36 @@ PLPGSQL@0..286 WHITESPACE@248..249 " " COLON_EQ@249..251 ":=" WHITESPACE@251..252 " " - PAREN_EXPR@252..280 - L_PAREN@252..253 "(" - SELECT@253..279 - SELECT_CLAUSE@253..267 - SELECT_KW@253..259 "select" - WHITESPACE@259..260 " " - TARGET_LIST@260..267 - TARGET@260..267 - CALL_EXPR@260..267 - NAME_REF@260..263 - IDENT@260..263 "max" - ARG_LIST@263..267 - L_PAREN@263..264 "(" - ARG@264..266 - NAME_REF@264..266 - IDENT@264..266 "f1" - R_PAREN@266..267 ")" - WHITESPACE@267..268 " " - FROM_CLAUSE@268..279 - FROM_KW@268..272 "from" - WHITESPACE@272..273 " " - RELATION_FROM_ITEM@273..279 - RELATION_NAME_REF@273..279 - PATH_REF@273..279 - PATH_SEGMENT_REF@273..279 - IDENT@273..279 "onecol" - R_PAREN@279..280 ")" + PLPGSQL_EXPR@252..280 + TARGET_LIST@252..280 + TARGET@252..280 + PAREN_EXPR@252..280 + L_PAREN@252..253 "(" + SELECT@253..279 + SELECT_CLAUSE@253..267 + SELECT_KW@253..259 "select" + WHITESPACE@259..260 " " + TARGET_LIST@260..267 + TARGET@260..267 + CALL_EXPR@260..267 + NAME_REF@260..263 + IDENT@260..263 "max" + ARG_LIST@263..267 + L_PAREN@263..264 "(" + ARG@264..266 + NAME_REF@264..266 + IDENT@264..266 "f1" + R_PAREN@266..267 ")" + WHITESPACE@267..268 " " + FROM_CLAUSE@268..279 + FROM_KW@268..272 "from" + WHITESPACE@272..273 " " + RELATION_FROM_ITEM@273..279 + RELATION_NAME_REF@273..279 + PATH_REF@273..279 + PATH_SEGMENT_REF@273..279 + IDENT@273..279 "onecol" + R_PAREN@279..280 ")" SEMICOLON@280..281 ";" WHITESPACE@281..282 "\n" END_KW@282..285 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_call_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_call_stmt_ok.snap index b795058c..6862c802 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_call_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_call_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..121 PLPGSQL_VAR_INIT@20..24 COLON_EQ@20..22 ":=" WHITESPACE@22..23 " " - LITERAL@23..24 - INT_NUMBER@23..24 "1" + PLPGSQL_EXPR@23..24 + TARGET_LIST@23..24 + TARGET@23..24 + LITERAL@23..24 + INT_NUMBER@23..24 "1" SEMICOLON@24..25 ";" WHITESPACE@25..26 "\n" BEGIN_KW@26..31 "begin" @@ -101,8 +104,11 @@ PLPGSQL@0..121 WHITESPACE@110..111 " " COLON_EQ@111..113 ":=" WHITESPACE@113..114 " " - LITERAL@114..115 - INT_NUMBER@114..115 "2" + PLPGSQL_EXPR@114..115 + TARGET_LIST@114..115 + TARGET@114..115 + LITERAL@114..115 + INT_NUMBER@114..115 "2" SEMICOLON@115..116 ";" WHITESPACE@116..117 "\n" END_KW@117..120 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_err.snap index 4d3c0ace..0e838413 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_err.snap @@ -2,9 +2,9 @@ source: crates/squawk_syntax/src/test.rs input_file: crates/squawk_parser/tests/data/plpgsql/err/case_stmt.sql --- -PLPGSQL@0..338 +PLPGSQL@0..425 WHITESPACE@0..1 "\n" - PLPGSQL_BLOCK@1..337 + PLPGSQL_BLOCK@1..424 PLPGSQL_DECLARE_SECTION@1..22 DECLARE_KW@1..8 "declare" WHITESPACE@8..11 "\n " @@ -20,18 +20,24 @@ PLPGSQL@0..338 PLPGSQL_VAR_INIT@17..21 COLON_EQ@17..19 ":=" WHITESPACE@19..20 " " - LITERAL@20..21 - INT_NUMBER@20..21 "1" + PLPGSQL_EXPR@20..21 + TARGET_LIST@20..21 + TARGET@20..21 + LITERAL@20..21 + INT_NUMBER@20..21 "1" SEMICOLON@21..22 ";" WHITESPACE@22..23 "\n" BEGIN_KW@23..28 "begin" WHITESPACE@28..31 "\n " - PLPGSQL_BODY@31..333 + PLPGSQL_BODY@31..420 PLPGSQL_CASE_STMT@31..70 CASE_KW@31..35 "case" WHITESPACE@35..36 " " - NAME_REF@36..37 - IDENT@36..37 "x" + PLPGSQL_EXPR@36..37 + TARGET_LIST@36..37 + TARGET@36..37 + NAME_REF@36..37 + IDENT@36..37 "x" WHITESPACE@37..42 "\n " PLPGSQL_ELSE_CLAUSE@42..58 ELSE_KW@42..46 "else" @@ -49,14 +55,20 @@ PLPGSQL@0..338 PLPGSQL_CASE_STMT@74..119 CASE_KW@74..78 "case" WHITESPACE@78..79 " " - NAME_REF@79..80 - IDENT@79..80 "x" + PLPGSQL_EXPR@79..80 + TARGET_LIST@79..80 + TARGET@79..80 + NAME_REF@79..80 + IDENT@79..80 "x" WHITESPACE@80..85 "\n " PLPGSQL_CASE_WHEN@85..108 WHEN_KW@85..89 "when" WHITESPACE@89..90 " " - LITERAL@90..91 - INT_NUMBER@90..91 "1" + PLPGSQL_EXPR@90..91 + TARGET_LIST@90..91 + TARGET@90..91 + LITERAL@90..91 + INT_NUMBER@90..91 "1" WHITESPACE@91..92 " " THEN_KW@92..96 "then" WHITESPACE@96..103 "\n " @@ -72,34 +84,40 @@ PLPGSQL@0..338 PLPGSQL_CASE_STMT@123..194 CASE_KW@123..127 "case" WHITESPACE@127..128 " " - CASE_EXPR@128..154 - CASE_KW@128..132 "case" - WHITESPACE@132..133 " " - WHEN_CLAUSE_LIST@133..150 - WHEN_CLAUSE@133..150 - WHEN_KW@133..137 "when" - WHITESPACE@137..138 " " - BIN_EXPR@138..143 - NAME_REF@138..139 - IDENT@138..139 "x" - WHITESPACE@139..140 " " - EQ@140..141 "=" - WHITESPACE@141..142 " " - LITERAL@142..143 - INT_NUMBER@142..143 "1" - WHITESPACE@143..144 " " - THEN_KW@144..148 "then" - WHITESPACE@148..149 " " - LITERAL@149..150 - INT_NUMBER@149..150 "1" - WHITESPACE@150..151 " " - END_KW@151..154 "end" + PLPGSQL_EXPR@128..154 + TARGET_LIST@128..154 + TARGET@128..154 + CASE_EXPR@128..154 + CASE_KW@128..132 "case" + WHITESPACE@132..133 " " + WHEN_CLAUSE_LIST@133..150 + WHEN_CLAUSE@133..150 + WHEN_KW@133..137 "when" + WHITESPACE@137..138 " " + BIN_EXPR@138..143 + NAME_REF@138..139 + IDENT@138..139 "x" + WHITESPACE@139..140 " " + EQ@140..141 "=" + WHITESPACE@141..142 " " + LITERAL@142..143 + INT_NUMBER@142..143 "1" + WHITESPACE@143..144 " " + THEN_KW@144..148 "then" + WHITESPACE@148..149 " " + LITERAL@149..150 + INT_NUMBER@149..150 "1" + WHITESPACE@150..151 " " + END_KW@151..154 "end" WHITESPACE@154..159 "\n " PLPGSQL_CASE_WHEN@159..182 WHEN_KW@159..163 "when" WHITESPACE@163..164 " " - LITERAL@164..165 - INT_NUMBER@164..165 "1" + PLPGSQL_EXPR@164..165 + TARGET_LIST@164..165 + TARGET@164..165 + LITERAL@164..165 + INT_NUMBER@164..165 "1" WHITESPACE@165..166 " " THEN_KW@166..170 "then" WHITESPACE@170..177 "\n " @@ -113,34 +131,37 @@ PLPGSQL@0..338 CASE_KW@189..193 "case" SEMICOLON@193..194 ";" WHITESPACE@194..198 "\n\n " - PLPGSQL_CASE_STMT@198..333 + PLPGSQL_CASE_STMT@198..420 CASE_KW@198..202 "case" WHITESPACE@202..207 "\n " PLPGSQL_CASE_WHEN@207..258 WHEN_KW@207..211 "when" WHITESPACE@211..212 " " - CASE_EXPR@212..241 - CASE_KW@212..216 "case" - WHITESPACE@216..217 " " - WHEN_CLAUSE_LIST@217..237 - WHEN_CLAUSE@217..237 - WHEN_KW@217..221 "when" - WHITESPACE@221..222 " " - BIN_EXPR@222..227 - NAME_REF@222..223 - IDENT@222..223 "x" - WHITESPACE@223..224 " " - EQ@224..225 "=" - WHITESPACE@225..226 " " - LITERAL@226..227 - INT_NUMBER@226..227 "1" - WHITESPACE@227..228 " " - THEN_KW@228..232 "then" - WHITESPACE@232..233 " " - LITERAL@233..237 - TRUE_KW@233..237 "true" - WHITESPACE@237..238 " " - END_KW@238..241 "end" + PLPGSQL_EXPR@212..241 + TARGET_LIST@212..241 + TARGET@212..241 + CASE_EXPR@212..241 + CASE_KW@212..216 "case" + WHITESPACE@216..217 " " + WHEN_CLAUSE_LIST@217..237 + WHEN_CLAUSE@217..237 + WHEN_KW@217..221 "when" + WHITESPACE@221..222 " " + BIN_EXPR@222..227 + NAME_REF@222..223 + IDENT@222..223 "x" + WHITESPACE@223..224 " " + EQ@224..225 "=" + WHITESPACE@225..226 " " + LITERAL@226..227 + INT_NUMBER@226..227 "1" + WHITESPACE@227..228 " " + THEN_KW@228..232 "then" + WHITESPACE@232..233 " " + LITERAL@233..237 + TRUE_KW@233..237 "true" + WHITESPACE@237..238 " " + END_KW@238..241 "end" WHITESPACE@241..242 " " THEN_KW@242..246 "then" WHITESPACE@246..253 "\n " @@ -152,38 +173,42 @@ PLPGSQL@0..338 PLPGSQL_CASE_WHEN@263..321 WHEN_KW@263..267 "when" WHITESPACE@267..268 " " - BIN_EXPR@268..273 - NAME_REF@268..269 - IDENT@268..269 "x" - WHITESPACE@269..270 " " - EQ@270..271 "=" - WHITESPACE@271..272 " " - LITERAL@272..273 - INT_NUMBER@272..273 "2" - COMMA@273..274 "," - WHITESPACE@274..275 " " - CASE_EXPR@275..304 - CASE_KW@275..279 "case" - WHITESPACE@279..280 " " - WHEN_CLAUSE_LIST@280..300 - WHEN_CLAUSE@280..300 - WHEN_KW@280..284 "when" - WHITESPACE@284..285 " " - BIN_EXPR@285..290 - NAME_REF@285..286 - IDENT@285..286 "x" - WHITESPACE@286..287 " " - EQ@287..288 "=" - WHITESPACE@288..289 " " - LITERAL@289..290 - INT_NUMBER@289..290 "3" - WHITESPACE@290..291 " " - THEN_KW@291..295 "then" - WHITESPACE@295..296 " " - LITERAL@296..300 - TRUE_KW@296..300 "true" - WHITESPACE@300..301 " " - END_KW@301..304 "end" + PLPGSQL_EXPR@268..304 + TARGET_LIST@268..304 + TARGET@268..273 + BIN_EXPR@268..273 + NAME_REF@268..269 + IDENT@268..269 "x" + WHITESPACE@269..270 " " + EQ@270..271 "=" + WHITESPACE@271..272 " " + LITERAL@272..273 + INT_NUMBER@272..273 "2" + COMMA@273..274 "," + WHITESPACE@274..275 " " + TARGET@275..304 + CASE_EXPR@275..304 + CASE_KW@275..279 "case" + WHITESPACE@279..280 " " + WHEN_CLAUSE_LIST@280..300 + WHEN_CLAUSE@280..300 + WHEN_KW@280..284 "when" + WHITESPACE@284..285 " " + BIN_EXPR@285..290 + NAME_REF@285..286 + IDENT@285..286 "x" + WHITESPACE@286..287 " " + EQ@287..288 "=" + WHITESPACE@288..289 " " + LITERAL@289..290 + INT_NUMBER@289..290 "3" + WHITESPACE@290..291 " " + THEN_KW@291..295 "then" + WHITESPACE@295..296 " " + LITERAL@296..300 + TRUE_KW@296..300 "true" + WHITESPACE@300..301 " " + END_KW@301..304 "end" WHITESPACE@304..305 " " THEN_KW@305..309 "then" WHITESPACE@309..316 "\n " @@ -191,14 +216,75 @@ PLPGSQL@0..338 PLPGSQL_NULL_STMT@316..321 NULL_KW@316..320 "null" SEMICOLON@320..321 ";" - WHITESPACE@321..324 "\n " - END_KW@324..327 "end" - WHITESPACE@327..328 " " - CASE_KW@328..332 "case" - SEMICOLON@332..333 ";" - WHITESPACE@333..334 "\n" - END_KW@334..337 "end" - WHITESPACE@337..338 "\n" + WHITESPACE@321..326 "\n " + PLPGSQL_CASE_WHEN@326..408 + WHEN_KW@326..330 "when" + WHITESPACE@330..331 " " + PLPGSQL_EXPR@331..391 + TARGET_LIST@331..391 + TARGET@331..360 + CASE_EXPR@331..360 + CASE_KW@331..335 "case" + WHITESPACE@335..336 " " + WHEN_CLAUSE_LIST@336..356 + WHEN_CLAUSE@336..356 + WHEN_KW@336..340 "when" + WHITESPACE@340..341 " " + BIN_EXPR@341..346 + NAME_REF@341..342 + IDENT@341..342 "x" + WHITESPACE@342..343 " " + EQ@343..344 "=" + WHITESPACE@344..345 " " + LITERAL@345..346 + INT_NUMBER@345..346 "4" + WHITESPACE@346..347 " " + THEN_KW@347..351 "then" + WHITESPACE@351..352 " " + LITERAL@352..356 + TRUE_KW@352..356 "true" + WHITESPACE@356..357 " " + END_KW@357..360 "end" + COMMA@360..361 "," + WHITESPACE@361..362 " " + TARGET@362..391 + CASE_EXPR@362..391 + CASE_KW@362..366 "case" + WHITESPACE@366..367 " " + WHEN_CLAUSE_LIST@367..387 + WHEN_CLAUSE@367..387 + WHEN_KW@367..371 "when" + WHITESPACE@371..372 " " + BIN_EXPR@372..377 + NAME_REF@372..373 + IDENT@372..373 "x" + WHITESPACE@373..374 " " + EQ@374..375 "=" + WHITESPACE@375..376 " " + LITERAL@376..377 + INT_NUMBER@376..377 "5" + WHITESPACE@377..378 " " + THEN_KW@378..382 "then" + WHITESPACE@382..383 " " + LITERAL@383..387 + TRUE_KW@383..387 "true" + WHITESPACE@387..388 " " + END_KW@388..391 "end" + WHITESPACE@391..392 " " + THEN_KW@392..396 "then" + WHITESPACE@396..403 "\n " + PLPGSQL_BODY@403..408 + PLPGSQL_NULL_STMT@403..408 + NULL_KW@403..407 "null" + SEMICOLON@407..408 ";" + WHITESPACE@408..411 "\n " + END_KW@411..414 "end" + WHITESPACE@414..415 " " + CASE_KW@415..419 "case" + SEMICOLON@419..420 ";" + WHITESPACE@420..421 "\n" + END_KW@421..424 "end" + WHITESPACE@424..425 "\n" error[syntax-error]: expected `when` ╭▸ @@ -220,3 +306,11 @@ error[syntax-error]: CASE expression must be parenthesized ╭▸ 23 │ when x = 2, case when x = 3 then true end then ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +error[syntax-error]: CASE expression must be parenthesized + ╭▸ +25 │ when case when x = 4 then true end, case when x = 5 then true end then + ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +error[syntax-error]: CASE expression must be parenthesized + ╭▸ +25 │ when case when x = 4 then true end, case when x = 5 then true end then + ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_ok.snap index 95513fb6..a7ba2997 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_case_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..483 PLPGSQL_VAR_INIT@17..21 COLON_EQ@17..19 ":=" WHITESPACE@19..20 " " - LITERAL@20..21 - INT_NUMBER@20..21 "1" + PLPGSQL_EXPR@20..21 + TARGET_LIST@20..21 + TARGET@20..21 + LITERAL@20..21 + INT_NUMBER@20..21 "1" SEMICOLON@21..22 ";" WHITESPACE@22..23 "\n" BEGIN_KW@23..28 "begin" @@ -30,14 +33,20 @@ PLPGSQL@0..483 PLPGSQL_CASE_STMT@31..77 CASE_KW@31..35 "case" WHITESPACE@35..36 " " - NAME_REF@36..37 - IDENT@36..37 "x" + PLPGSQL_EXPR@36..37 + TARGET_LIST@36..37 + TARGET@36..37 + NAME_REF@36..37 + IDENT@36..37 "x" WHITESPACE@37..42 "\n " PLPGSQL_CASE_WHEN@42..65 WHEN_KW@42..46 "when" WHITESPACE@46..47 " " - LITERAL@47..48 - INT_NUMBER@47..48 "1" + PLPGSQL_EXPR@47..48 + TARGET_LIST@47..48 + TARGET@47..48 + LITERAL@47..48 + INT_NUMBER@47..48 "1" WHITESPACE@48..49 " " THEN_KW@49..53 "then" WHITESPACE@53..60 "\n " @@ -54,18 +63,25 @@ PLPGSQL@0..483 PLPGSQL_CASE_STMT@81..179 CASE_KW@81..85 "case" WHITESPACE@85..86 " " - NAME_REF@86..87 - IDENT@86..87 "x" + PLPGSQL_EXPR@86..87 + TARGET_LIST@86..87 + TARGET@86..87 + NAME_REF@86..87 + IDENT@86..87 "x" WHITESPACE@87..92 "\n " PLPGSQL_CASE_WHEN@92..118 WHEN_KW@92..96 "when" WHITESPACE@96..97 " " - LITERAL@97..98 - INT_NUMBER@97..98 "1" - COMMA@98..99 "," - WHITESPACE@99..100 " " - LITERAL@100..101 - INT_NUMBER@100..101 "2" + PLPGSQL_EXPR@97..101 + TARGET_LIST@97..101 + TARGET@97..98 + LITERAL@97..98 + INT_NUMBER@97..98 "1" + COMMA@98..99 "," + WHITESPACE@99..100 " " + TARGET@100..101 + LITERAL@100..101 + INT_NUMBER@100..101 "2" WHITESPACE@101..102 " " THEN_KW@102..106 "then" WHITESPACE@106..113 "\n " @@ -77,8 +93,11 @@ PLPGSQL@0..483 PLPGSQL_CASE_WHEN@123..146 WHEN_KW@123..127 "when" WHITESPACE@127..128 " " - LITERAL@128..129 - INT_NUMBER@128..129 "3" + PLPGSQL_EXPR@128..129 + TARGET_LIST@128..129 + TARGET@128..129 + LITERAL@128..129 + INT_NUMBER@128..129 "3" WHITESPACE@129..130 " " THEN_KW@130..134 "then" WHITESPACE@134..141 "\n " @@ -106,14 +125,17 @@ PLPGSQL@0..483 PLPGSQL_CASE_WHEN@192..272 WHEN_KW@192..196 "when" WHITESPACE@196..197 " " - BIN_EXPR@197..202 - NAME_REF@197..198 - IDENT@197..198 "x" - WHITESPACE@198..199 " " - EQ@199..200 "=" - WHITESPACE@200..201 " " - LITERAL@201..202 - INT_NUMBER@201..202 "1" + PLPGSQL_EXPR@197..202 + TARGET_LIST@197..202 + TARGET@197..202 + BIN_EXPR@197..202 + NAME_REF@197..198 + IDENT@197..198 "x" + WHITESPACE@198..199 " " + EQ@199..200 "=" + WHITESPACE@200..201 " " + LITERAL@201..202 + INT_NUMBER@201..202 "1" WHITESPACE@202..203 " " THEN_KW@203..207 "then" WHITESPACE@207..214 "\n " @@ -121,14 +143,20 @@ PLPGSQL@0..483 PLPGSQL_CASE_STMT@214..272 CASE_KW@214..218 "case" WHITESPACE@218..219 " " - NAME_REF@219..220 - IDENT@219..220 "x" + PLPGSQL_EXPR@219..220 + TARGET_LIST@219..220 + TARGET@219..220 + NAME_REF@219..220 + IDENT@219..220 "x" WHITESPACE@220..229 "\n " PLPGSQL_CASE_WHEN@229..256 WHEN_KW@229..233 "when" WHITESPACE@233..234 " " - LITERAL@234..235 - INT_NUMBER@234..235 "1" + PLPGSQL_EXPR@234..235 + TARGET_LIST@234..235 + TARGET@234..235 + LITERAL@234..235 + INT_NUMBER@234..235 "1" WHITESPACE@235..236 " " THEN_KW@236..240 "then" WHITESPACE@240..251 "\n " @@ -145,14 +173,17 @@ PLPGSQL@0..483 PLPGSQL_CASE_WHEN@277..304 WHEN_KW@277..281 "when" WHITESPACE@281..282 " " - BIN_EXPR@282..287 - NAME_REF@282..283 - IDENT@282..283 "x" - WHITESPACE@283..284 " " - EQ@284..285 "=" - WHITESPACE@285..286 " " - LITERAL@286..287 - INT_NUMBER@286..287 "2" + PLPGSQL_EXPR@282..287 + TARGET_LIST@282..287 + TARGET@282..287 + BIN_EXPR@282..287 + NAME_REF@282..283 + IDENT@282..283 "x" + WHITESPACE@283..284 " " + EQ@284..285 "=" + WHITESPACE@285..286 " " + LITERAL@286..287 + INT_NUMBER@286..287 "2" WHITESPACE@287..288 " " THEN_KW@288..292 "then" WHITESPACE@292..299 "\n " @@ -173,37 +204,43 @@ PLPGSQL@0..483 PLPGSQL_CASE_STMT@329..390 CASE_KW@329..333 "case" WHITESPACE@333..334 " " - PAREN_EXPR@334..362 - L_PAREN@334..335 "(" - CASE_EXPR@335..361 - CASE_KW@335..339 "case" - WHITESPACE@339..340 " " - WHEN_CLAUSE_LIST@340..357 - WHEN_CLAUSE@340..357 - WHEN_KW@340..344 "when" - WHITESPACE@344..345 " " - BIN_EXPR@345..350 - NAME_REF@345..346 - IDENT@345..346 "x" - WHITESPACE@346..347 " " - EQ@347..348 "=" - WHITESPACE@348..349 " " - LITERAL@349..350 - INT_NUMBER@349..350 "1" - WHITESPACE@350..351 " " - THEN_KW@351..355 "then" - WHITESPACE@355..356 " " - LITERAL@356..357 - INT_NUMBER@356..357 "1" - WHITESPACE@357..358 " " - END_KW@358..361 "end" - R_PAREN@361..362 ")" + PLPGSQL_EXPR@334..362 + TARGET_LIST@334..362 + TARGET@334..362 + PAREN_EXPR@334..362 + L_PAREN@334..335 "(" + CASE_EXPR@335..361 + CASE_KW@335..339 "case" + WHITESPACE@339..340 " " + WHEN_CLAUSE_LIST@340..357 + WHEN_CLAUSE@340..357 + WHEN_KW@340..344 "when" + WHITESPACE@344..345 " " + BIN_EXPR@345..350 + NAME_REF@345..346 + IDENT@345..346 "x" + WHITESPACE@346..347 " " + EQ@347..348 "=" + WHITESPACE@348..349 " " + LITERAL@349..350 + INT_NUMBER@349..350 "1" + WHITESPACE@350..351 " " + THEN_KW@351..355 "then" + WHITESPACE@355..356 " " + LITERAL@356..357 + INT_NUMBER@356..357 "1" + WHITESPACE@357..358 " " + END_KW@358..361 "end" + R_PAREN@361..362 ")" WHITESPACE@362..367 "\n " PLPGSQL_CASE_WHEN@367..381 WHEN_KW@367..371 "when" WHITESPACE@371..372 " " - LITERAL@372..373 - INT_NUMBER@372..373 "1" + PLPGSQL_EXPR@372..373 + TARGET_LIST@372..373 + TARGET@372..373 + LITERAL@372..373 + INT_NUMBER@372..373 "1" WHITESPACE@373..374 " " THEN_KW@374..378 "then" WHITESPACE@378..381 "\n " @@ -216,46 +253,52 @@ PLPGSQL@0..483 PLPGSQL_CASE_STMT@394..478 CASE_KW@394..398 "case" WHITESPACE@398..399 " " - CALL_EXPR@399..438 - NAME_REF@399..407 - COALESCE_KW@399..407 "coalesce" - ARG_LIST@407..438 - L_PAREN@407..408 "(" - ARG@408..434 - CASE_EXPR@408..434 - CASE_KW@408..412 "case" - WHITESPACE@412..413 " " - WHEN_CLAUSE_LIST@413..430 - WHEN_CLAUSE@413..430 - WHEN_KW@413..417 "when" - WHITESPACE@417..418 " " - BIN_EXPR@418..423 - NAME_REF@418..419 - IDENT@418..419 "x" - WHITESPACE@419..420 " " - EQ@420..421 "=" - WHITESPACE@421..422 " " - LITERAL@422..423 - INT_NUMBER@422..423 "1" - WHITESPACE@423..424 " " - THEN_KW@424..428 "then" - WHITESPACE@428..429 " " - LITERAL@429..430 - INT_NUMBER@429..430 "1" - WHITESPACE@430..431 " " - END_KW@431..434 "end" - COMMA@434..435 "," - WHITESPACE@435..436 " " - ARG@436..437 - LITERAL@436..437 - INT_NUMBER@436..437 "0" - R_PAREN@437..438 ")" + PLPGSQL_EXPR@399..438 + TARGET_LIST@399..438 + TARGET@399..438 + CALL_EXPR@399..438 + NAME_REF@399..407 + COALESCE_KW@399..407 "coalesce" + ARG_LIST@407..438 + L_PAREN@407..408 "(" + ARG@408..434 + CASE_EXPR@408..434 + CASE_KW@408..412 "case" + WHITESPACE@412..413 " " + WHEN_CLAUSE_LIST@413..430 + WHEN_CLAUSE@413..430 + WHEN_KW@413..417 "when" + WHITESPACE@417..418 " " + BIN_EXPR@418..423 + NAME_REF@418..419 + IDENT@418..419 "x" + WHITESPACE@419..420 " " + EQ@420..421 "=" + WHITESPACE@421..422 " " + LITERAL@422..423 + INT_NUMBER@422..423 "1" + WHITESPACE@423..424 " " + THEN_KW@424..428 "then" + WHITESPACE@428..429 " " + LITERAL@429..430 + INT_NUMBER@429..430 "1" + WHITESPACE@430..431 " " + END_KW@431..434 "end" + COMMA@434..435 "," + WHITESPACE@435..436 " " + ARG@436..437 + LITERAL@436..437 + INT_NUMBER@436..437 "0" + R_PAREN@437..438 ")" WHITESPACE@438..443 "\n " PLPGSQL_CASE_WHEN@443..466 WHEN_KW@443..447 "when" WHITESPACE@447..448 " " - LITERAL@448..449 - INT_NUMBER@448..449 "1" + PLPGSQL_EXPR@448..449 + TARGET_LIST@448..449 + TARGET@448..449 + LITERAL@448..449 + INT_NUMBER@448..449 "1" WHITESPACE@449..450 " " THEN_KW@450..454 "then" WHITESPACE@454..461 "\n " diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_close_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_close_stmt_ok.snap index 8ed0b308..a89faf7d 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_close_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_close_stmt_ok.snap @@ -156,8 +156,11 @@ PLPGSQL@0..51 WHITESPACE@40..41 " " COLON_EQ@41..43 ":=" WHITESPACE@43..44 " " - LITERAL@44..45 - INT_NUMBER@44..45 "1" + PLPGSQL_EXPR@44..45 + TARGET_LIST@44..45 + TARGET@44..45 + LITERAL@44..45 + INT_NUMBER@44..45 "1" SEMICOLON@45..46 ";" WHITESPACE@46..47 "\n" END_KW@47..50 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_err.snap index e874eed1..294799d6 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_err.snap @@ -61,8 +61,11 @@ PLPGSQL@0..30 PLPGSQL_USING_CLAUSE@17..24 USING_KW@17..22 "using" WHITESPACE@22..23 " " - LITERAL@23..24 - INT_NUMBER@23..24 "1" + PLPGSQL_EXPR@23..24 + TARGET_LIST@23..24 + TARGET@23..24 + LITERAL@23..24 + INT_NUMBER@23..24 "1" SEMICOLON@24..25 ";" WHITESPACE@25..26 "\n" END_KW@26..29 "end" @@ -86,8 +89,11 @@ PLPGSQL@0..61 PLPGSQL_VAR_INIT@18..31 COLON_EQ@18..20 ":=" WHITESPACE@20..21 " " - LITERAL@21..31 - STRING@21..31 "'select 1'" + PLPGSQL_EXPR@21..31 + TARGET_LIST@21..31 + TARGET@21..31 + LITERAL@21..31 + STRING@21..31 "'select 1'" SEMICOLON@31..32 ";" WHITESPACE@32..33 "\n" BEGIN_KW@33..38 "begin" @@ -96,8 +102,11 @@ PLPGSQL@0..61 PLPGSQL_DYN_EXECUTE_STMT@41..56 EXECUTE_KW@41..48 "execute" WHITESPACE@48..49 " " - NAME_REF@49..50 - IDENT@49..50 "q" + PLPGSQL_EXPR@49..50 + TARGET_LIST@49..50 + TARGET@49..50 + NAME_REF@49..50 + IDENT@49..50 "q" WHITESPACE@50..51 " " PLPGSQL_INTO_CLAUSE@51..55 INTO_KW@51..55 "into" @@ -125,8 +134,11 @@ PLPGSQL@0..88 PLPGSQL_VAR_INIT@18..31 COLON_EQ@18..20 ":=" WHITESPACE@20..21 " " - LITERAL@21..31 - STRING@21..31 "'select 1'" + PLPGSQL_EXPR@21..31 + TARGET_LIST@21..31 + TARGET@21..31 + LITERAL@21..31 + STRING@21..31 "'select 1'" SEMICOLON@31..32 ";" WHITESPACE@32..35 "\n " PLPGSQL_VAR_DECL@35..41 @@ -155,8 +167,11 @@ PLPGSQL@0..88 PLPGSQL_DYN_EXECUTE_STMT@59..75 EXECUTE_KW@59..66 "execute" WHITESPACE@66..67 " " - NAME_REF@67..68 - IDENT@67..68 "q" + PLPGSQL_EXPR@67..68 + TARGET_LIST@67..68 + TARGET@67..68 + NAME_REF@67..68 + IDENT@67..68 "q" WHITESPACE@68..69 " " PLPGSQL_INTO_CLAUSE@69..75 INTO_KW@69..73 "into" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_ok.snap index 3a7409bd..a7b6faab 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_dyn_execute_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..559 PLPGSQL_VAR_INIT@18..31 COLON_EQ@18..20 ":=" WHITESPACE@20..21 " " - LITERAL@21..31 - STRING@21..31 "'select 1'" + PLPGSQL_EXPR@21..31 + TARGET_LIST@21..31 + TARGET@21..31 + LITERAL@21..31 + STRING@21..31 "'select 1'" SEMICOLON@31..32 ";" WHITESPACE@32..35 "\n " PLPGSQL_VAR_DECL@35..57 @@ -36,8 +39,11 @@ PLPGSQL@0..559 PLPGSQL_VAR_INIT@42..56 COLON_EQ@42..44 ":=" WHITESPACE@44..45 " " - LITERAL@45..56 - STRING@45..56 "'dynexec_t'" + PLPGSQL_EXPR@45..56 + TARGET_LIST@45..56 + TARGET@45..56 + LITERAL@45..56 + STRING@45..56 "'dynexec_t'" SEMICOLON@56..57 ";" WHITESPACE@57..60 "\n " PLPGSQL_VAR_DECL@60..66 @@ -76,44 +82,56 @@ PLPGSQL@0..559 PLPGSQL_DYN_EXECUTE_STMT@96..115 EXECUTE_KW@96..103 "execute" WHITESPACE@103..104 " " - LITERAL@104..114 - STRING@104..114 "'select 1'" + PLPGSQL_EXPR@104..114 + TARGET_LIST@104..114 + TARGET@104..114 + LITERAL@104..114 + STRING@104..114 "'select 1'" SEMICOLON@114..115 ";" WHITESPACE@115..118 "\n " PLPGSQL_DYN_EXECUTE_STMT@118..128 EXECUTE_KW@118..125 "execute" WHITESPACE@125..126 " " - NAME_REF@126..127 - IDENT@126..127 "q" + PLPGSQL_EXPR@126..127 + TARGET_LIST@126..127 + TARGET@126..127 + NAME_REF@126..127 + IDENT@126..127 "q" SEMICOLON@127..128 ";" WHITESPACE@128..131 "\n " PLPGSQL_DYN_EXECUTE_STMT@131..174 EXECUTE_KW@131..138 "execute" WHITESPACE@138..139 " " - BIN_EXPR@139..173 - LITERAL@139..155 - STRING@139..155 "'select a from '" - WHITESPACE@155..156 " " - CUSTOM_OP@156..158 - PIPE@156..157 "|" - PIPE@157..158 "|" - WHITESPACE@158..159 " " - CALL_EXPR@159..173 - NAME_REF@159..170 - IDENT@159..170 "quote_ident" - ARG_LIST@170..173 - L_PAREN@170..171 "(" - ARG@171..172 - NAME_REF@171..172 - IDENT@171..172 "t" - R_PAREN@172..173 ")" + PLPGSQL_EXPR@139..173 + TARGET_LIST@139..173 + TARGET@139..173 + BIN_EXPR@139..173 + LITERAL@139..155 + STRING@139..155 "'select a from '" + WHITESPACE@155..156 " " + CUSTOM_OP@156..158 + PIPE@156..157 "|" + PIPE@157..158 "|" + WHITESPACE@158..159 " " + CALL_EXPR@159..173 + NAME_REF@159..170 + IDENT@159..170 "quote_ident" + ARG_LIST@170..173 + L_PAREN@170..171 "(" + ARG@171..172 + NAME_REF@171..172 + IDENT@171..172 "t" + R_PAREN@172..173 ")" SEMICOLON@173..174 ";" WHITESPACE@174..177 "\n " PLPGSQL_DYN_EXECUTE_STMT@177..194 EXECUTE_KW@177..184 "execute" WHITESPACE@184..185 " " - NAME_REF@185..186 - IDENT@185..186 "q" + PLPGSQL_EXPR@185..186 + TARGET_LIST@185..186 + TARGET@185..186 + NAME_REF@185..186 + IDENT@185..186 "q" WHITESPACE@186..187 " " PLPGSQL_INTO_CLAUSE@187..193 INTO_KW@187..191 "into" @@ -127,8 +145,11 @@ PLPGSQL@0..559 PLPGSQL_DYN_EXECUTE_STMT@197..221 EXECUTE_KW@197..204 "execute" WHITESPACE@204..205 " " - NAME_REF@205..206 - IDENT@205..206 "q" + PLPGSQL_EXPR@205..206 + TARGET_LIST@205..206 + TARGET@205..206 + NAME_REF@205..206 + IDENT@205..206 "q" WHITESPACE@206..207 " " PLPGSQL_INTO_CLAUSE@207..220 INTO_KW@207..211 "into" @@ -144,8 +165,11 @@ PLPGSQL@0..559 PLPGSQL_DYN_EXECUTE_STMT@224..241 EXECUTE_KW@224..231 "execute" WHITESPACE@231..232 " " - NAME_REF@232..233 - IDENT@232..233 "q" + PLPGSQL_EXPR@232..233 + TARGET_LIST@232..233 + TARGET@232..233 + NAME_REF@232..233 + IDENT@232..233 "q" WHITESPACE@233..234 " " PLPGSQL_INTO_CLAUSE@234..240 INTO_KW@234..238 "into" @@ -159,8 +183,11 @@ PLPGSQL@0..559 PLPGSQL_DYN_EXECUTE_STMT@244..263 EXECUTE_KW@244..251 "execute" WHITESPACE@251..252 " " - NAME_REF@252..253 - IDENT@252..253 "q" + PLPGSQL_EXPR@252..253 + TARGET_LIST@252..253 + TARGET@252..253 + NAME_REF@252..253 + IDENT@252..253 "q" WHITESPACE@253..254 " " PLPGSQL_INTO_CLAUSE@254..262 INTO_KW@254..258 "into" @@ -178,38 +205,56 @@ PLPGSQL@0..559 PLPGSQL_DYN_EXECUTE_STMT@266..294 EXECUTE_KW@266..273 "execute" WHITESPACE@273..274 " " - LITERAL@274..285 - STRING@274..285 "'select $1'" + PLPGSQL_EXPR@274..285 + TARGET_LIST@274..285 + TARGET@274..285 + LITERAL@274..285 + STRING@274..285 "'select $1'" WHITESPACE@285..286 " " PLPGSQL_USING_CLAUSE@286..293 USING_KW@286..291 "using" WHITESPACE@291..292 " " - LITERAL@292..293 - INT_NUMBER@292..293 "1" + PLPGSQL_EXPR@292..293 + TARGET_LIST@292..293 + TARGET@292..293 + LITERAL@292..293 + INT_NUMBER@292..293 "1" SEMICOLON@293..294 ";" WHITESPACE@294..297 "\n " PLPGSQL_DYN_EXECUTE_STMT@297..332 EXECUTE_KW@297..304 "execute" WHITESPACE@304..305 " " - LITERAL@305..320 - STRING@305..320 "'select $1, $2'" + PLPGSQL_EXPR@305..320 + TARGET_LIST@305..320 + TARGET@305..320 + LITERAL@305..320 + STRING@305..320 "'select $1, $2'" WHITESPACE@320..321 " " PLPGSQL_USING_CLAUSE@321..331 USING_KW@321..326 "using" WHITESPACE@326..327 " " - LITERAL@327..328 - INT_NUMBER@327..328 "1" + PLPGSQL_EXPR@327..328 + TARGET_LIST@327..328 + TARGET@327..328 + LITERAL@327..328 + INT_NUMBER@327..328 "1" COMMA@328..329 "," WHITESPACE@329..330 " " - LITERAL@330..331 - INT_NUMBER@330..331 "2" + PLPGSQL_EXPR@330..331 + TARGET_LIST@330..331 + TARGET@330..331 + LITERAL@330..331 + INT_NUMBER@330..331 "2" SEMICOLON@331..332 ";" WHITESPACE@332..335 "\n " PLPGSQL_DYN_EXECUTE_STMT@335..370 EXECUTE_KW@335..342 "execute" WHITESPACE@342..343 " " - LITERAL@343..354 - STRING@343..354 "'select $1'" + PLPGSQL_EXPR@343..354 + TARGET_LIST@343..354 + TARGET@343..354 + LITERAL@343..354 + STRING@343..354 "'select $1'" WHITESPACE@354..355 " " PLPGSQL_INTO_CLAUSE@355..361 INTO_KW@355..359 "into" @@ -222,8 +267,11 @@ PLPGSQL@0..559 PLPGSQL_USING_CLAUSE@362..369 USING_KW@362..367 "using" WHITESPACE@367..368 " " - LITERAL@368..369 - INT_NUMBER@368..369 "1" + PLPGSQL_EXPR@368..369 + TARGET_LIST@368..369 + TARGET@368..369 + LITERAL@368..369 + INT_NUMBER@368..369 "1" SEMICOLON@369..370 ";" WHITESPACE@370..373 "\n " COMMENT@373..422 "-- postgres takes the ..." @@ -231,14 +279,20 @@ PLPGSQL@0..559 PLPGSQL_DYN_EXECUTE_STMT@425..460 EXECUTE_KW@425..432 "execute" WHITESPACE@432..433 " " - LITERAL@433..444 - STRING@433..444 "'select $1'" + PLPGSQL_EXPR@433..444 + TARGET_LIST@433..444 + TARGET@433..444 + LITERAL@433..444 + STRING@433..444 "'select $1'" WHITESPACE@444..445 " " PLPGSQL_USING_CLAUSE@445..452 USING_KW@445..450 "using" WHITESPACE@450..451 " " - LITERAL@451..452 - INT_NUMBER@451..452 "1" + PLPGSQL_EXPR@451..452 + TARGET_LIST@451..452 + TARGET@451..452 + LITERAL@451..452 + INT_NUMBER@451..452 "1" WHITESPACE@452..453 " " PLPGSQL_INTO_CLAUSE@453..459 INTO_KW@453..457 "into" @@ -252,8 +306,11 @@ PLPGSQL@0..559 PLPGSQL_DYN_EXECUTE_STMT@463..512 EXECUTE_KW@463..470 "execute" WHITESPACE@470..471 " " - LITERAL@471..486 - STRING@471..486 "'select $1, $2'" + PLPGSQL_EXPR@471..486 + TARGET_LIST@471..486 + TARGET@471..486 + LITERAL@471..486 + STRING@471..486 "'select $1, $2'" WHITESPACE@486..487 " " PLPGSQL_INTO_CLAUSE@487..500 INTO_KW@487..491 "into" @@ -268,19 +325,28 @@ PLPGSQL@0..559 PLPGSQL_USING_CLAUSE@501..511 USING_KW@501..506 "using" WHITESPACE@506..507 " " - LITERAL@507..508 - INT_NUMBER@507..508 "1" + PLPGSQL_EXPR@507..508 + TARGET_LIST@507..508 + TARGET@507..508 + LITERAL@507..508 + INT_NUMBER@507..508 "1" COMMA@508..509 "," WHITESPACE@509..510 " " - LITERAL@510..511 - INT_NUMBER@510..511 "2" + PLPGSQL_EXPR@510..511 + TARGET_LIST@510..511 + TARGET@510..511 + LITERAL@510..511 + INT_NUMBER@510..511 "2" SEMICOLON@511..512 ";" WHITESPACE@512..515 "\n " PLPGSQL_DYN_EXECUTE_STMT@515..554 EXECUTE_KW@515..522 "execute" WHITESPACE@522..523 " " - LITERAL@523..536 - STRING@523..536 "'select 1, 2'" + PLPGSQL_EXPR@523..536 + TARGET_LIST@523..536 + TARGET@523..536 + LITERAL@523..536 + STRING@523..536 "'select 1, 2'" WHITESPACE@536..537 " " PLPGSQL_INTO_CLAUSE@537..553 INTO_KW@537..541 "into" @@ -323,8 +389,11 @@ PLPGSQL@0..70 PLPGSQL_DYN_EXECUTE_STMT@26..53 EXECUTE_KW@26..33 "execute" WHITESPACE@33..34 " " - LITERAL@34..36 - POSITIONAL_PARAM@34..36 "$1" + PLPGSQL_EXPR@34..36 + TARGET_LIST@34..36 + TARGET@34..36 + LITERAL@34..36 + POSITIONAL_PARAM@34..36 "$1" WHITESPACE@36..37 " " PLPGSQL_INTO_CLAUSE@37..43 INTO_KW@37..41 "into" @@ -337,15 +406,21 @@ PLPGSQL@0..70 PLPGSQL_USING_CLAUSE@44..52 USING_KW@44..49 "using" WHITESPACE@49..50 " " - LITERAL@50..52 - POSITIONAL_PARAM@50..52 "$1" + PLPGSQL_EXPR@50..52 + TARGET_LIST@50..52 + TARGET@50..52 + LITERAL@50..52 + POSITIONAL_PARAM@50..52 "$1" SEMICOLON@52..53 ";" WHITESPACE@53..56 "\n " PLPGSQL_RETURN_STMT@56..65 RETURN_KW@56..62 "return" WHITESPACE@62..63 " " - NAME_REF@63..64 - IDENT@63..64 "x" + PLPGSQL_EXPR@63..64 + TARGET_LIST@63..64 + TARGET@63..64 + NAME_REF@63..64 + IDENT@63..64 "x" SEMICOLON@64..65 ";" WHITESPACE@65..66 "\n" END_KW@66..69 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_err.snap index 6cf61098..778f1689 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_err.snap @@ -77,12 +77,17 @@ PLPGSQL@0..81 WHITESPACE@35..36 " " EXECUTE_KW@36..43 "execute" WHITESPACE@43..44 " " - LITERAL@44..54 - STRING@44..54 "'select 1'" - WHITESPACE@54..59 "\n " - PLPGSQL_BODY@59..64 - PLPGSQL_NULL_STMT@59..64 - NULL_KW@59..63 "null" + PLPGSQL_EXPR@44..63 + TARGET_LIST@44..63 + TARGET@44..63 + LITERAL@44..54 + STRING@44..54 "'select 1'" + WHITESPACE@54..59 "\n " + AS_NAME@59..63 + COLUMN_NAME@59..63 + NULL_KW@59..63 "null" + PLPGSQL_BODY@63..64 + ERROR@63..64 SEMICOLON@63..64 ";" WHITESPACE@64..67 "\n " END_KW@67..70 "end" @@ -123,8 +128,11 @@ PLPGSQL@0..92 WHITESPACE@35..36 " " EXECUTE_KW@36..43 "execute" WHITESPACE@43..44 " " - LITERAL@44..54 - STRING@44..54 "'select 1'" + PLPGSQL_EXPR@44..54 + TARGET_LIST@44..54 + TARGET@44..54 + LITERAL@44..54 + STRING@44..54 "'select 1'" WHITESPACE@54..55 " " PLPGSQL_USING_CLAUSE@55..60 USING_KW@55..60 "using" @@ -174,14 +182,20 @@ PLPGSQL@0..96 WHITESPACE@35..36 " " EXECUTE_KW@36..43 "execute" WHITESPACE@43..44 " " - LITERAL@44..55 - STRING@44..55 "'select $1'" + PLPGSQL_EXPR@44..55 + TARGET_LIST@44..55 + TARGET@44..55 + LITERAL@44..55 + STRING@44..55 "'select $1'" WHITESPACE@55..56 " " PLPGSQL_USING_CLAUSE@56..64 USING_KW@56..61 "using" WHITESPACE@61..62 " " - LITERAL@62..63 - INT_NUMBER@62..63 "1" + PLPGSQL_EXPR@62..63 + TARGET_LIST@62..63 + TARGET@62..63 + LITERAL@62..63 + INT_NUMBER@62..63 "1" COMMA@63..64 "," WHITESPACE@64..65 " " LOOP_KW@65..69 "loop" @@ -205,8 +219,12 @@ error[syntax-error]: expected an expression ╰╴ ━ error[syntax-error]: expected LOOP_KW ╭▸ -15 │ for r in execute 'select 1' - ╰╴ ━ +16 │ null; + ╰╴ ━ +error[syntax-error]: expected a statement, got SEMICOLON + ╭▸ +16 │ null; + ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 25 │ for r in execute 'select 1' using loop diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_ok.snap index 8dcda3b6..f3cfaa6c 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_dyn_stmt_ok.snap @@ -30,8 +30,11 @@ PLPGSQL@0..469 PLPGSQL_VAR_INIT@29..33 COLON_EQ@29..31 ":=" WHITESPACE@31..32 " " - LITERAL@32..33 - INT_NUMBER@32..33 "1" + PLPGSQL_EXPR@32..33 + TARGET_LIST@32..33 + TARGET@32..33 + LITERAL@32..33 + INT_NUMBER@32..33 "1" SEMICOLON@33..34 ";" WHITESPACE@34..35 "\n" BEGIN_KW@35..40 "begin" @@ -48,8 +51,11 @@ PLPGSQL@0..469 WHITESPACE@51..52 " " EXECUTE_KW@52..59 "execute" WHITESPACE@59..60 " " - LITERAL@60..75 - STRING@60..75 "'select 1 as x'" + PLPGSQL_EXPR@60..75 + TARGET_LIST@60..75 + TARGET@60..75 + LITERAL@60..75 + STRING@60..75 "'select 1 as x'" WHITESPACE@75..76 " " LOOP_KW@76..80 "loop" WHITESPACE@80..85 "\n " @@ -74,14 +80,20 @@ PLPGSQL@0..469 WHITESPACE@113..114 " " EXECUTE_KW@114..121 "execute" WHITESPACE@121..122 " " - LITERAL@122..138 - STRING@122..138 "'select $1 as x'" + PLPGSQL_EXPR@122..138 + TARGET_LIST@122..138 + TARGET@122..138 + LITERAL@122..138 + STRING@122..138 "'select $1 as x'" WHITESPACE@138..139 " " PLPGSQL_USING_CLAUSE@139..146 USING_KW@139..144 "using" WHITESPACE@144..145 " " - LITERAL@145..146 - INT_NUMBER@145..146 "1" + PLPGSQL_EXPR@145..146 + TARGET_LIST@145..146 + TARGET@145..146 + LITERAL@145..146 + INT_NUMBER@145..146 "1" WHITESPACE@146..147 " " LOOP_KW@147..151 "loop" WHITESPACE@151..156 "\n " @@ -106,24 +118,33 @@ PLPGSQL@0..469 WHITESPACE@184..185 " " EXECUTE_KW@185..192 "execute" WHITESPACE@192..193 " " - LITERAL@193..208 - STRING@193..208 "'select $1, $2'" + PLPGSQL_EXPR@193..208 + TARGET_LIST@193..208 + TARGET@193..208 + LITERAL@193..208 + STRING@193..208 "'select $1, $2'" WHITESPACE@208..209 " " PLPGSQL_USING_CLAUSE@209..223 USING_KW@209..214 "using" WHITESPACE@214..215 " " - NAME_REF@215..216 - IDENT@215..216 "n" + PLPGSQL_EXPR@215..216 + TARGET_LIST@215..216 + TARGET@215..216 + NAME_REF@215..216 + IDENT@215..216 "n" COMMA@216..217 "," WHITESPACE@217..218 " " - BIN_EXPR@218..223 - NAME_REF@218..219 - IDENT@218..219 "n" - WHITESPACE@219..220 " " - STAR@220..221 "*" - WHITESPACE@221..222 " " - LITERAL@222..223 - INT_NUMBER@222..223 "2" + PLPGSQL_EXPR@218..223 + TARGET_LIST@218..223 + TARGET@218..223 + BIN_EXPR@218..223 + NAME_REF@218..219 + IDENT@218..219 "n" + WHITESPACE@219..220 " " + STAR@220..221 "*" + WHITESPACE@221..222 " " + LITERAL@222..223 + INT_NUMBER@222..223 "2" WHITESPACE@223..224 " " LOOP_KW@224..228 "loop" WHITESPACE@228..233 "\n " @@ -161,8 +182,11 @@ PLPGSQL@0..469 WHITESPACE@268..269 " " EXECUTE_KW@269..276 "execute" WHITESPACE@276..277 " " - LITERAL@277..290 - STRING@277..290 "'select 1, 2'" + PLPGSQL_EXPR@277..290 + TARGET_LIST@277..290 + TARGET@277..290 + LITERAL@277..290 + STRING@277..290 "'select 1, 2'" WHITESPACE@290..291 " " LOOP_KW@291..295 "loop" WHITESPACE@295..300 "\n " @@ -187,8 +211,11 @@ PLPGSQL@0..469 WHITESPACE@328..329 " " EXECUTE_KW@329..336 "execute" WHITESPACE@336..337 " " - LITERAL@337..358 - DOLLAR_QUOTED_STRING@337..358 "$q$ select 1 as x $q$" + PLPGSQL_EXPR@337..358 + TARGET_LIST@337..358 + TARGET@337..358 + LITERAL@337..358 + DOLLAR_QUOTED_STRING@337..358 "$q$ select 1 as x $q$" WHITESPACE@358..359 " " LOOP_KW@359..363 "loop" WHITESPACE@363..368 "\n " @@ -219,8 +246,11 @@ PLPGSQL@0..469 WHITESPACE@406..407 " " EXECUTE_KW@407..414 "execute" WHITESPACE@414..415 " " - LITERAL@415..425 - STRING@415..425 "'select 1'" + PLPGSQL_EXPR@415..425 + TARGET_LIST@415..425 + TARGET@415..425 + LITERAL@415..425 + STRING@415..425 "'select 1'" WHITESPACE@425..426 " " LOOP_KW@426..430 "loop" WHITESPACE@430..435 "\n " diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_err.snap index d76f8e7f..116c9442 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_err.snap @@ -24,12 +24,15 @@ PLPGSQL@0..99 PLPGSQL_VAR_INIT@21..32 COLON_EQ@21..23 ":=" WHITESPACE@23..24 " " - ARRAY_EXPR@24..32 - ARRAY_KW@24..29 "array" - L_BRACK@29..30 "[" - LITERAL@30..31 - INT_NUMBER@30..31 "1" - R_BRACK@31..32 "]" + PLPGSQL_EXPR@24..32 + TARGET_LIST@24..32 + TARGET@24..32 + ARRAY_EXPR@24..32 + ARRAY_KW@24..29 "array" + L_BRACK@29..30 "[" + LITERAL@30..31 + INT_NUMBER@30..31 "1" + R_BRACK@31..32 "]" SEMICOLON@32..33 ";" WHITESPACE@33..36 "\n " PLPGSQL_VAR_DECL@36..42 @@ -54,8 +57,11 @@ PLPGSQL@0..99 WHITESPACE@60..61 " " IN_KW@61..63 "in" WHITESPACE@63..64 " " - NAME_REF@64..67 - IDENT@64..67 "arr" + PLPGSQL_EXPR@64..67 + TARGET_LIST@64..67 + TARGET@64..67 + NAME_REF@64..67 + IDENT@64..67 "arr" WHITESPACE@67..68 " " LOOP_KW@68..72 "loop" WHITESPACE@72..77 "\n " @@ -94,12 +100,15 @@ PLPGSQL@0..127 PLPGSQL_VAR_INIT@21..32 COLON_EQ@21..23 ":=" WHITESPACE@23..24 " " - ARRAY_EXPR@24..32 - ARRAY_KW@24..29 "array" - L_BRACK@29..30 "[" - LITERAL@30..31 - INT_NUMBER@30..31 "1" - R_BRACK@31..32 "]" + PLPGSQL_EXPR@24..32 + TARGET_LIST@24..32 + TARGET@24..32 + ARRAY_EXPR@24..32 + ARRAY_KW@24..29 "array" + L_BRACK@29..30 "[" + LITERAL@30..31 + INT_NUMBER@30..31 "1" + R_BRACK@31..32 "]" SEMICOLON@32..33 ";" WHITESPACE@33..36 "\n " PLPGSQL_VAR_DECL@36..42 @@ -124,8 +133,11 @@ PLPGSQL@0..127 PLPGSQL_VAR_INIT@51..55 COLON_EQ@51..53 ":=" WHITESPACE@53..54 " " - LITERAL@54..55 - INT_NUMBER@54..55 "1" + PLPGSQL_EXPR@54..55 + TARGET_LIST@54..55 + TARGET@54..55 + LITERAL@54..55 + INT_NUMBER@54..55 "1" SEMICOLON@55..56 ";" WHITESPACE@56..57 "\n" BEGIN_KW@57..62 "begin" @@ -148,8 +160,11 @@ PLPGSQL@0..127 WHITESPACE@85..86 " " ARRAY_KW@86..91 "array" WHITESPACE@91..92 " " - NAME_REF@92..95 - IDENT@92..95 "arr" + PLPGSQL_EXPR@92..95 + TARGET_LIST@92..95 + TARGET@92..95 + NAME_REF@92..95 + IDENT@92..95 "arr" WHITESPACE@95..96 " " LOOP_KW@96..100 "loop" WHITESPACE@100..105 "\n " @@ -188,12 +203,15 @@ PLPGSQL@0..94 PLPGSQL_VAR_INIT@21..32 COLON_EQ@21..23 ":=" WHITESPACE@23..24 " " - ARRAY_EXPR@24..32 - ARRAY_KW@24..29 "array" - L_BRACK@29..30 "[" - LITERAL@30..31 - INT_NUMBER@30..31 "1" - R_BRACK@31..32 "]" + PLPGSQL_EXPR@24..32 + TARGET_LIST@24..32 + TARGET@24..32 + ARRAY_EXPR@24..32 + ARRAY_KW@24..29 "array" + L_BRACK@29..30 "[" + LITERAL@30..31 + INT_NUMBER@30..31 "1" + R_BRACK@31..32 "]" SEMICOLON@32..33 ";" WHITESPACE@33..34 "\n" BEGIN_KW@34..39 "begin" @@ -206,8 +224,11 @@ PLPGSQL@0..94 WHITESPACE@52..53 " " ARRAY_KW@53..58 "array" WHITESPACE@58..59 " " - NAME_REF@59..62 - IDENT@59..62 "arr" + PLPGSQL_EXPR@59..62 + TARGET_LIST@59..62 + TARGET@59..62 + NAME_REF@59..62 + IDENT@59..62 "arr" WHITESPACE@62..63 " " LOOP_KW@63..67 "loop" WHITESPACE@67..72 "\n " diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_ok.snap index 36b52f3b..d10303de 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_each_stmt_ok.snap @@ -24,20 +24,23 @@ PLPGSQL@0..620 PLPGSQL_VAR_INIT@21..38 COLON_EQ@21..23 ":=" WHITESPACE@23..24 " " - ARRAY_EXPR@24..38 - ARRAY_KW@24..29 "array" - L_BRACK@29..30 "[" - LITERAL@30..31 - INT_NUMBER@30..31 "1" - COMMA@31..32 "," - WHITESPACE@32..33 " " - LITERAL@33..34 - INT_NUMBER@33..34 "2" - COMMA@34..35 "," - WHITESPACE@35..36 " " - LITERAL@36..37 - INT_NUMBER@36..37 "3" - R_BRACK@37..38 "]" + PLPGSQL_EXPR@24..38 + TARGET_LIST@24..38 + TARGET@24..38 + ARRAY_EXPR@24..38 + ARRAY_KW@24..29 "array" + L_BRACK@29..30 "[" + LITERAL@30..31 + INT_NUMBER@30..31 "1" + COMMA@31..32 "," + WHITESPACE@32..33 " " + LITERAL@33..34 + INT_NUMBER@33..34 "2" + COMMA@34..35 "," + WHITESPACE@35..36 " " + LITERAL@36..37 + INT_NUMBER@36..37 "3" + R_BRACK@37..38 "]" SEMICOLON@38..39 ";" WHITESPACE@39..42 "\n " PLPGSQL_VAR_DECL@42..81 @@ -59,30 +62,33 @@ PLPGSQL@0..620 PLPGSQL_VAR_INIT@56..80 COLON_EQ@56..58 ":=" WHITESPACE@58..59 " " - ARRAY_EXPR@59..80 - ARRAY_KW@59..64 "array" - L_BRACK@64..65 "[" - ARRAY_EXPR@65..71 - L_BRACK@65..66 "[" - LITERAL@66..67 - INT_NUMBER@66..67 "1" - COMMA@67..68 "," - WHITESPACE@68..69 " " - LITERAL@69..70 - INT_NUMBER@69..70 "2" - R_BRACK@70..71 "]" - COMMA@71..72 "," - WHITESPACE@72..73 " " - ARRAY_EXPR@73..79 - L_BRACK@73..74 "[" - LITERAL@74..75 - INT_NUMBER@74..75 "3" - COMMA@75..76 "," - WHITESPACE@76..77 " " - LITERAL@77..78 - INT_NUMBER@77..78 "4" - R_BRACK@78..79 "]" - R_BRACK@79..80 "]" + PLPGSQL_EXPR@59..80 + TARGET_LIST@59..80 + TARGET@59..80 + ARRAY_EXPR@59..80 + ARRAY_KW@59..64 "array" + L_BRACK@64..65 "[" + ARRAY_EXPR@65..71 + L_BRACK@65..66 "[" + LITERAL@66..67 + INT_NUMBER@66..67 "1" + COMMA@67..68 "," + WHITESPACE@68..69 " " + LITERAL@69..70 + INT_NUMBER@69..70 "2" + R_BRACK@70..71 "]" + COMMA@71..72 "," + WHITESPACE@72..73 " " + ARRAY_EXPR@73..79 + L_BRACK@73..74 "[" + LITERAL@74..75 + INT_NUMBER@74..75 "3" + COMMA@75..76 "," + WHITESPACE@76..77 " " + LITERAL@77..78 + INT_NUMBER@77..78 "4" + R_BRACK@78..79 "]" + R_BRACK@79..80 "]" SEMICOLON@80..81 ";" WHITESPACE@81..84 "\n " PLPGSQL_VAR_DECL@84..90 @@ -153,8 +159,11 @@ PLPGSQL@0..620 WHITESPACE@156..157 " " ARRAY_KW@157..162 "array" WHITESPACE@162..163 " " - NAME_REF@163..166 - IDENT@163..166 "arr" + PLPGSQL_EXPR@163..166 + TARGET_LIST@163..166 + TARGET@163..166 + NAME_REF@163..166 + IDENT@163..166 "arr" WHITESPACE@166..167 " " LOOP_KW@167..171 "loop" WHITESPACE@171..176 "\n " @@ -185,8 +194,11 @@ PLPGSQL@0..620 WHITESPACE@216..217 " " ARRAY_KW@217..222 "array" WHITESPACE@222..223 " " - NAME_REF@223..228 - IDENT@223..228 "pairs" + PLPGSQL_EXPR@223..228 + TARGET_LIST@223..228 + TARGET@223..228 + NAME_REF@223..228 + IDENT@223..228 "pairs" WHITESPACE@228..229 " " LOOP_KW@229..233 "loop" WHITESPACE@233..238 "\n " @@ -217,8 +229,11 @@ PLPGSQL@0..620 WHITESPACE@278..279 " " ARRAY_KW@279..284 "array" WHITESPACE@284..285 " " - NAME_REF@285..288 - IDENT@285..288 "arr" + PLPGSQL_EXPR@285..288 + TARGET_LIST@285..288 + TARGET@285..288 + NAME_REF@285..288 + IDENT@285..288 "arr" WHITESPACE@288..289 " " LOOP_KW@289..293 "loop" WHITESPACE@293..298 "\n " @@ -248,8 +263,11 @@ PLPGSQL@0..620 WHITESPACE@333..334 " " ARRAY_KW@334..339 "array" WHITESPACE@339..340 " " - NAME_REF@340..343 - IDENT@340..343 "arr" + PLPGSQL_EXPR@340..343 + TARGET_LIST@340..343 + TARGET@340..343 + NAME_REF@340..343 + IDENT@340..343 "arr" WHITESPACE@343..344 " " LOOP_KW@344..348 "loop" WHITESPACE@348..353 "\n " @@ -278,8 +296,11 @@ PLPGSQL@0..620 WHITESPACE@387..388 " " ARRAY_KW@388..393 "array" WHITESPACE@393..394 " " - NAME_REF@394..397 - IDENT@394..397 "arr" + PLPGSQL_EXPR@394..397 + TARGET_LIST@394..397 + TARGET@394..397 + NAME_REF@394..397 + IDENT@394..397 "arr" WHITESPACE@397..398 " " LOOP_KW@398..402 "loop" WHITESPACE@402..407 "\n " @@ -306,8 +327,11 @@ PLPGSQL@0..620 WHITESPACE@504..505 " " ARRAY_KW@505..510 "array" WHITESPACE@510..511 " " - NAME_REF@511..514 - IDENT@511..514 "arr" + PLPGSQL_EXPR@511..514 + TARGET_LIST@511..514 + TARGET@511..514 + NAME_REF@511..514 + IDENT@511..514 "arr" WHITESPACE@514..515 " " LOOP_KW@515..519 "loop" WHITESPACE@519..524 "\n " @@ -338,8 +362,11 @@ PLPGSQL@0..620 WHITESPACE@566..567 " " ARRAY_KW@567..572 "array" WHITESPACE@572..573 " " - NAME_REF@573..576 - IDENT@573..576 "arr" + PLPGSQL_EXPR@573..576 + TARGET_LIST@573..576 + TARGET@573..576 + NAME_REF@573..576 + IDENT@573..576 "arr" WHITESPACE@576..577 " " LOOP_KW@577..581 "loop" WHITESPACE@581..586 "\n " @@ -392,8 +419,11 @@ PLPGSQL@0..79 WHITESPACE@38..39 " " ARRAY_KW@39..44 "array" WHITESPACE@44..45 " " - LITERAL@45..47 - POSITIONAL_PARAM@45..47 "$1" + PLPGSQL_EXPR@45..47 + TARGET_LIST@45..47 + TARGET@45..47 + LITERAL@45..47 + POSITIONAL_PARAM@45..47 "$1" WHITESPACE@47..48 " " LOOP_KW@48..52 "loop" WHITESPACE@52..57 "\n " diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_err.snap index 0ef3da56..bd1c3b2d 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_err.snap @@ -49,11 +49,17 @@ PLPGSQL@0..52 IN_KW@13..15 "in" WHITESPACE@15..16 " " PLPGSQL_FOR_RANGE@16..20 - LITERAL@16..17 - INT_NUMBER@16..17 "1" + PLPGSQL_EXPR@16..17 + TARGET_LIST@16..17 + TARGET@16..17 + LITERAL@16..17 + INT_NUMBER@16..17 "1" DOT_DOT@17..19 ".." - LITERAL@19..20 - INT_NUMBER@19..20 "2" + PLPGSQL_EXPR@19..20 + TARGET_LIST@19..20 + TARGET@19..20 + LITERAL@19..20 + INT_NUMBER@19..20 "2" WHITESPACE@20..21 " " LOOP_KW@21..25 "loop" WHITESPACE@25..30 "\n " @@ -86,8 +92,11 @@ PLPGSQL@0..53 IN_KW@15..17 "in" WHITESPACE@17..18 " " PLPGSQL_FOR_RANGE@18..21 - LITERAL@18..19 - INT_NUMBER@18..19 "1" + PLPGSQL_EXPR@18..19 + TARGET_LIST@18..19 + TARGET@18..19 + LITERAL@18..19 + INT_NUMBER@18..19 "1" DOT_DOT@19..21 ".." WHITESPACE@21..22 " " LOOP_KW@22..26 "loop" @@ -120,16 +129,24 @@ PLPGSQL@0..49 WHITESPACE@14..15 " " IN_KW@15..17 "in" WHITESPACE@17..18 " " - PLPGSQL_FOR_RANGE@18..22 - LITERAL@18..19 - INT_NUMBER@18..19 "1" + PLPGSQL_FOR_RANGE@18..31 + PLPGSQL_EXPR@18..19 + TARGET_LIST@18..19 + TARGET@18..19 + LITERAL@18..19 + INT_NUMBER@18..19 "1" DOT_DOT@19..21 ".." - LITERAL@21..22 - INT_NUMBER@21..22 "2" - WHITESPACE@22..27 "\n " - PLPGSQL_BODY@27..32 - PLPGSQL_NULL_STMT@27..32 - NULL_KW@27..31 "null" + PLPGSQL_EXPR@21..31 + TARGET_LIST@21..31 + TARGET@21..31 + LITERAL@21..22 + INT_NUMBER@21..22 "2" + WHITESPACE@22..27 "\n " + AS_NAME@27..31 + COLUMN_NAME@27..31 + NULL_KW@27..31 "null" + PLPGSQL_BODY@31..32 + ERROR@31..32 SEMICOLON@31..32 ";" WHITESPACE@32..35 "\n " END_KW@35..38 "end" @@ -156,11 +173,17 @@ PLPGSQL@0..57 IN_KW@15..17 "in" WHITESPACE@17..18 " " PLPGSQL_FOR_RANGE@18..25 - LITERAL@18..19 - INT_NUMBER@18..19 "1" + PLPGSQL_EXPR@18..19 + TARGET_LIST@18..19 + TARGET@18..19 + LITERAL@18..19 + INT_NUMBER@18..19 "1" DOT_DOT@19..21 ".." - LITERAL@21..22 - INT_NUMBER@21..22 "2" + PLPGSQL_EXPR@21..22 + TARGET_LIST@21..22 + TARGET@21..22 + LITERAL@21..22 + INT_NUMBER@21..22 "2" WHITESPACE@22..23 " " BY_KW@23..25 "by" WHITESPACE@25..26 " " @@ -223,11 +246,17 @@ PLPGSQL@0..83 IN_KW@44..46 "in" WHITESPACE@46..47 " " PLPGSQL_FOR_RANGE@47..51 - LITERAL@47..48 - INT_NUMBER@47..48 "1" + PLPGSQL_EXPR@47..48 + TARGET_LIST@47..48 + TARGET@47..48 + LITERAL@47..48 + INT_NUMBER@47..48 "1" DOT_DOT@48..50 ".." - LITERAL@50..51 - INT_NUMBER@50..51 "2" + PLPGSQL_EXPR@50..51 + TARGET_LIST@50..51 + TARGET@50..51 + LITERAL@50..51 + INT_NUMBER@50..51 "2" WHITESPACE@51..52 " " LOOP_KW@52..56 "loop" WHITESPACE@56..61 "\n " @@ -262,8 +291,12 @@ error[syntax-error]: expected an expression ╰╴ ━ error[syntax-error]: expected LOOP_KW ╭▸ -31 │ for i in 1..2 - ╰╴ ━ +32 │ null; + ╰╴ ━ +error[syntax-error]: expected a statement, got SEMICOLON + ╭▸ +32 │ null; + ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 40 │ for i in 1..2 by loop diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_ok.snap index 12e91c6e..55b45305 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_for_i_stmt_ok.snap @@ -24,20 +24,23 @@ PLPGSQL@0..560 PLPGSQL_VAR_INIT@21..38 COLON_EQ@21..23 ":=" WHITESPACE@23..24 " " - ARRAY_EXPR@24..38 - ARRAY_KW@24..29 "array" - L_BRACK@29..30 "[" - LITERAL@30..31 - INT_NUMBER@30..31 "1" - COMMA@31..32 "," - WHITESPACE@32..33 " " - LITERAL@33..34 - INT_NUMBER@33..34 "2" - COMMA@34..35 "," - WHITESPACE@35..36 " " - LITERAL@36..37 - INT_NUMBER@36..37 "3" - R_BRACK@37..38 "]" + PLPGSQL_EXPR@24..38 + TARGET_LIST@24..38 + TARGET@24..38 + ARRAY_EXPR@24..38 + ARRAY_KW@24..29 "array" + L_BRACK@29..30 "[" + LITERAL@30..31 + INT_NUMBER@30..31 "1" + COMMA@31..32 "," + WHITESPACE@32..33 " " + LITERAL@33..34 + INT_NUMBER@33..34 "2" + COMMA@34..35 "," + WHITESPACE@35..36 " " + LITERAL@36..37 + INT_NUMBER@36..37 "3" + R_BRACK@37..38 "]" SEMICOLON@38..39 ";" WHITESPACE@39..42 "\n " PLPGSQL_VAR_DECL@42..53 @@ -52,8 +55,11 @@ PLPGSQL@0..560 PLPGSQL_VAR_INIT@48..52 COLON_EQ@48..50 ":=" WHITESPACE@50..51 " " - LITERAL@51..52 - INT_NUMBER@51..52 "3" + PLPGSQL_EXPR@51..52 + TARGET_LIST@51..52 + TARGET@51..52 + LITERAL@51..52 + INT_NUMBER@51..52 "3" SEMICOLON@52..53 ";" WHITESPACE@53..56 "\n " PLPGSQL_VAR_DECL@56..65 @@ -79,11 +85,17 @@ PLPGSQL@0..560 IN_KW@80..82 "in" WHITESPACE@82..83 " " PLPGSQL_FOR_RANGE@83..88 - LITERAL@83..84 - INT_NUMBER@83..84 "1" + PLPGSQL_EXPR@83..84 + TARGET_LIST@83..84 + TARGET@83..84 + LITERAL@83..84 + INT_NUMBER@83..84 "1" DOT_DOT@84..86 ".." - LITERAL@86..88 - INT_NUMBER@86..88 "10" + PLPGSQL_EXPR@86..88 + TARGET_LIST@86..88 + TARGET@86..88 + LITERAL@86..88 + INT_NUMBER@86..88 "10" WHITESPACE@88..89 " " LOOP_KW@89..93 "loop" WHITESPACE@93..98 "\n " @@ -109,11 +121,17 @@ PLPGSQL@0..560 REVERSE_KW@127..134 "reverse" WHITESPACE@134..135 " " PLPGSQL_FOR_RANGE@135..140 - LITERAL@135..137 - INT_NUMBER@135..137 "10" + PLPGSQL_EXPR@135..137 + TARGET_LIST@135..137 + TARGET@135..137 + LITERAL@135..137 + INT_NUMBER@135..137 "10" DOT_DOT@137..139 ".." - LITERAL@139..140 - INT_NUMBER@139..140 "1" + PLPGSQL_EXPR@139..140 + TARGET_LIST@139..140 + TARGET@139..140 + LITERAL@139..140 + INT_NUMBER@139..140 "1" WHITESPACE@140..141 " " LOOP_KW@141..145 "loop" WHITESPACE@145..150 "\n " @@ -139,16 +157,25 @@ PLPGSQL@0..560 REVERSE_KW@179..186 "reverse" WHITESPACE@186..187 " " PLPGSQL_FOR_RANGE@187..197 - LITERAL@187..189 - INT_NUMBER@187..189 "10" + PLPGSQL_EXPR@187..189 + TARGET_LIST@187..189 + TARGET@187..189 + LITERAL@187..189 + INT_NUMBER@187..189 "10" DOT_DOT@189..191 ".." - LITERAL@191..192 - INT_NUMBER@191..192 "1" + PLPGSQL_EXPR@191..192 + TARGET_LIST@191..192 + TARGET@191..192 + LITERAL@191..192 + INT_NUMBER@191..192 "1" WHITESPACE@192..193 " " BY_KW@193..195 "by" WHITESPACE@195..196 " " - LITERAL@196..197 - INT_NUMBER@196..197 "2" + PLPGSQL_EXPR@196..197 + TARGET_LIST@196..197 + TARGET@196..197 + LITERAL@196..197 + INT_NUMBER@196..197 "2" WHITESPACE@197..198 " " LOOP_KW@198..202 "loop" WHITESPACE@202..207 "\n " @@ -172,31 +199,37 @@ PLPGSQL@0..560 IN_KW@233..235 "in" WHITESPACE@235..236 " " PLPGSQL_FOR_RANGE@236..264 - BIN_EXPR@236..241 - LITERAL@236..237 - INT_NUMBER@236..237 "1" - WHITESPACE@237..238 " " - PLUS@238..239 "+" - WHITESPACE@239..240 " " - LITERAL@240..241 - INT_NUMBER@240..241 "1" + PLPGSQL_EXPR@236..241 + TARGET_LIST@236..241 + TARGET@236..241 + BIN_EXPR@236..241 + LITERAL@236..237 + INT_NUMBER@236..237 "1" + WHITESPACE@237..238 " " + PLUS@238..239 "+" + WHITESPACE@239..240 " " + LITERAL@240..241 + INT_NUMBER@240..241 "1" WHITESPACE@241..242 " " DOT_DOT@242..244 ".." WHITESPACE@244..245 " " - CALL_EXPR@245..264 - NAME_REF@245..256 - IDENT@245..256 "array_upper" - ARG_LIST@256..264 - L_PAREN@256..257 "(" - ARG@257..260 - NAME_REF@257..260 - IDENT@257..260 "arr" - COMMA@260..261 "," - WHITESPACE@261..262 " " - ARG@262..263 - LITERAL@262..263 - INT_NUMBER@262..263 "1" - R_PAREN@263..264 ")" + PLPGSQL_EXPR@245..264 + TARGET_LIST@245..264 + TARGET@245..264 + CALL_EXPR@245..264 + NAME_REF@245..256 + IDENT@245..256 "array_upper" + ARG_LIST@256..264 + L_PAREN@256..257 "(" + ARG@257..260 + NAME_REF@257..260 + IDENT@257..260 "arr" + COMMA@260..261 "," + WHITESPACE@261..262 " " + ARG@262..263 + LITERAL@262..263 + INT_NUMBER@262..263 "1" + R_PAREN@263..264 ")" WHITESPACE@264..265 " " LOOP_KW@265..269 "loop" WHITESPACE@269..274 "\n " @@ -220,11 +253,17 @@ PLPGSQL@0..560 IN_KW@300..302 "in" WHITESPACE@302..303 " " PLPGSQL_FOR_RANGE@303..307 - LITERAL@303..304 - INT_NUMBER@303..304 "1" + PLPGSQL_EXPR@303..304 + TARGET_LIST@303..304 + TARGET@303..304 + LITERAL@303..304 + INT_NUMBER@303..304 "1" DOT_DOT@304..306 ".." - NAME_REF@306..307 - IDENT@306..307 "n" + PLPGSQL_EXPR@306..307 + TARGET_LIST@306..307 + TARGET@306..307 + NAME_REF@306..307 + IDENT@306..307 "n" WHITESPACE@307..308 " " LOOP_KW@308..312 "loop" WHITESPACE@312..317 "\n " @@ -248,29 +287,35 @@ PLPGSQL@0..560 IN_KW@343..345 "in" WHITESPACE@345..346 " " PLPGSQL_FOR_RANGE@346..368 - PAREN_EXPR@346..356 - L_PAREN@346..347 "(" - SELECT@347..355 - SELECT_CLAUSE@347..355 - SELECT_KW@347..353 "select" - WHITESPACE@353..354 " " - TARGET_LIST@354..355 - TARGET@354..355 - LITERAL@354..355 - INT_NUMBER@354..355 "1" - R_PAREN@355..356 ")" + PLPGSQL_EXPR@346..356 + TARGET_LIST@346..356 + TARGET@346..356 + PAREN_EXPR@346..356 + L_PAREN@346..347 "(" + SELECT@347..355 + SELECT_CLAUSE@347..355 + SELECT_KW@347..353 "select" + WHITESPACE@353..354 " " + TARGET_LIST@354..355 + TARGET@354..355 + LITERAL@354..355 + INT_NUMBER@354..355 "1" + R_PAREN@355..356 ")" DOT_DOT@356..358 ".." - PAREN_EXPR@358..368 - L_PAREN@358..359 "(" - SELECT@359..367 - SELECT_CLAUSE@359..367 - SELECT_KW@359..365 "select" - WHITESPACE@365..366 " " - TARGET_LIST@366..367 - TARGET@366..367 - LITERAL@366..367 - INT_NUMBER@366..367 "2" - R_PAREN@367..368 ")" + PLPGSQL_EXPR@358..368 + TARGET_LIST@358..368 + TARGET@358..368 + PAREN_EXPR@358..368 + L_PAREN@358..359 "(" + SELECT@359..367 + SELECT_CLAUSE@359..367 + SELECT_KW@359..365 "select" + WHITESPACE@365..366 " " + TARGET_LIST@366..367 + TARGET@366..367 + LITERAL@366..367 + INT_NUMBER@366..367 "2" + R_PAREN@367..368 ")" WHITESPACE@368..369 " " LOOP_KW@369..373 "loop" WHITESPACE@373..378 "\n " @@ -298,11 +343,17 @@ PLPGSQL@0..560 IN_KW@406..408 "in" WHITESPACE@408..409 " " PLPGSQL_FOR_RANGE@409..413 - LITERAL@409..410 - INT_NUMBER@409..410 "1" + PLPGSQL_EXPR@409..410 + TARGET_LIST@409..410 + TARGET@409..410 + LITERAL@409..410 + INT_NUMBER@409..410 "1" DOT_DOT@410..412 ".." - LITERAL@412..413 - INT_NUMBER@412..413 "2" + PLPGSQL_EXPR@412..413 + TARGET_LIST@412..413 + TARGET@412..413 + LITERAL@412..413 + INT_NUMBER@412..413 "2" WHITESPACE@413..414 " " LOOP_KW@414..418 "loop" WHITESPACE@418..423 "\n " @@ -332,11 +383,17 @@ PLPGSQL@0..560 IN_KW@459..461 "in" WHITESPACE@461..462 " " PLPGSQL_FOR_RANGE@462..466 - LITERAL@462..463 - INT_NUMBER@462..463 "1" + PLPGSQL_EXPR@462..463 + TARGET_LIST@462..463 + TARGET@462..463 + LITERAL@462..463 + INT_NUMBER@462..463 "1" DOT_DOT@463..465 ".." - LITERAL@465..466 - INT_NUMBER@465..466 "3" + PLPGSQL_EXPR@465..466 + TARGET_LIST@465..466 + TARGET@465..466 + LITERAL@465..466 + INT_NUMBER@465..466 "3" WHITESPACE@466..467 " " LOOP_KW@467..471 "loop" WHITESPACE@471..476 "\n " @@ -351,11 +408,17 @@ PLPGSQL@0..560 IN_KW@482..484 "in" WHITESPACE@484..485 " " PLPGSQL_FOR_RANGE@485..489 - LITERAL@485..486 - INT_NUMBER@485..486 "1" + PLPGSQL_EXPR@485..486 + TARGET_LIST@485..486 + TARGET@485..486 + LITERAL@485..486 + INT_NUMBER@485..486 "1" DOT_DOT@486..488 ".." - LITERAL@488..489 - INT_NUMBER@488..489 "3" + PLPGSQL_EXPR@488..489 + TARGET_LIST@488..489 + TARGET@488..489 + LITERAL@488..489 + INT_NUMBER@488..489 "3" WHITESPACE@489..490 " " LOOP_KW@490..494 "loop" WHITESPACE@494..501 "\n " @@ -369,14 +432,17 @@ PLPGSQL@0..560 PLPGSQL_EXIT_WHEN@512..522 WHEN_KW@512..516 "when" WHITESPACE@516..517 " " - BIN_EXPR@517..522 - NAME_REF@517..518 - IDENT@517..518 "j" - WHITESPACE@518..519 " " - EQ@519..520 "=" - WHITESPACE@520..521 " " - LITERAL@521..522 - INT_NUMBER@521..522 "2" + PLPGSQL_EXPR@517..522 + TARGET_LIST@517..522 + TARGET@517..522 + BIN_EXPR@517..522 + NAME_REF@517..518 + IDENT@517..518 "j" + WHITESPACE@518..519 " " + EQ@519..520 "=" + WHITESPACE@520..521 " " + LITERAL@521..522 + INT_NUMBER@521..522 "2" SEMICOLON@522..523 ";" WHITESPACE@523..528 "\n " END_KW@528..531 "end" @@ -424,17 +490,23 @@ PLPGSQL@0..90 IN_KW@41..43 "in" WHITESPACE@43..44 " " PLPGSQL_FOR_RANGE@44..58 - FIELD_EXPR@44..53 - NAME_REF@44..51 - IDENT@44..51 "reverse" - DOT@51..52 "." - NAME_REF@52..53 - IDENT@52..53 "x" + PLPGSQL_EXPR@44..53 + TARGET_LIST@44..53 + TARGET@44..53 + FIELD_EXPR@44..53 + NAME_REF@44..51 + IDENT@44..51 "reverse" + DOT@51..52 "." + NAME_REF@52..53 + IDENT@52..53 "x" WHITESPACE@53..54 " " DOT_DOT@54..56 ".." WHITESPACE@56..57 " " - LITERAL@57..58 - INT_NUMBER@57..58 "3" + PLPGSQL_EXPR@57..58 + TARGET_LIST@57..58 + TARGET@57..58 + LITERAL@57..58 + INT_NUMBER@57..58 "3" WHITESPACE@58..59 " " LOOP_KW@59..63 "loop" WHITESPACE@63..68 "\n " diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_get_diag_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_get_diag_stmt_ok.snap index 77763473..ca226ee5 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_get_diag_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_get_diag_stmt_ok.snap @@ -201,12 +201,15 @@ PLPGSQL@0..709 WHITESPACE@344..345 " " COLON_EQ@345..347 ":=" WHITESPACE@347..348 " " - TUPLE_EXPR@348..354 - ROW_KW@348..351 "row" - L_PAREN@351..352 "(" - LITERAL@352..353 - INT_NUMBER@352..353 "1" - R_PAREN@353..354 ")" + PLPGSQL_EXPR@348..354 + TARGET_LIST@348..354 + TARGET@348..354 + TUPLE_EXPR@348..354 + ROW_KW@348..351 "row" + L_PAREN@351..352 "(" + LITERAL@352..353 + INT_NUMBER@352..353 "1" + R_PAREN@353..354 ")" SEMICOLON@354..355 ";" WHITESPACE@355..358 "\n " PLPGSQL_GET_DIAG_STMT@358..391 @@ -237,8 +240,11 @@ PLPGSQL@0..709 WHITESPACE@397..398 " " COLON_EQ@398..400 ":=" WHITESPACE@400..401 " " - LITERAL@401..402 - INT_NUMBER@401..402 "1" + PLPGSQL_EXPR@401..402 + TARGET_LIST@401..402 + TARGET@401..402 + LITERAL@401..402 + INT_NUMBER@401..402 "1" SEMICOLON@402..403 ";" WHITESPACE@403..404 "\n" PLPGSQL_EXCEPTION_SECTION@404..704 diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_err.snap index c6041253..54601c87 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_err.snap @@ -2,27 +2,32 @@ source: crates/squawk_syntax/src/test.rs input_file: crates/squawk_parser/tests/data/plpgsql/err/if_stmt.sql --- -PLPGSQL@0..315 +PLPGSQL@0..248 WHITESPACE@0..1 "\n" - PLPGSQL_BLOCK@1..314 + PLPGSQL_BLOCK@1..247 BEGIN_KW@1..6 "begin" WHITESPACE@6..9 "\n " - PLPGSQL_BODY@9..310 + PLPGSQL_BODY@9..243 PLPGSQL_IF_STMT@9..37 IF_KW@9..11 "if" WHITESPACE@11..12 " " - BIN_EXPR@12..17 - LITERAL@12..13 - INT_NUMBER@12..13 "1" - WHITESPACE@13..14 " " - EQ@14..15 "=" - WHITESPACE@15..16 " " - LITERAL@16..17 - INT_NUMBER@16..17 "1" - WHITESPACE@17..22 "\n " - PLPGSQL_BODY@22..27 - PLPGSQL_NULL_STMT@22..27 - NULL_KW@22..26 "null" + PLPGSQL_EXPR@12..26 + TARGET_LIST@12..26 + TARGET@12..26 + BIN_EXPR@12..17 + LITERAL@12..13 + INT_NUMBER@12..13 "1" + WHITESPACE@13..14 " " + EQ@14..15 "=" + WHITESPACE@15..16 " " + LITERAL@16..17 + INT_NUMBER@16..17 "1" + WHITESPACE@17..22 "\n " + AS_NAME@22..26 + COLUMN_NAME@22..26 + NULL_KW@22..26 "null" + PLPGSQL_BODY@26..27 + ERROR@26..27 SEMICOLON@26..27 ";" WHITESPACE@27..30 "\n " END_KW@30..33 "end" @@ -33,14 +38,17 @@ PLPGSQL@0..315 PLPGSQL_IF_STMT@41..120 IF_KW@41..43 "if" WHITESPACE@43..44 " " - BIN_EXPR@44..49 - LITERAL@44..45 - INT_NUMBER@44..45 "1" - WHITESPACE@45..46 " " - EQ@46..47 "=" - WHITESPACE@47..48 " " - LITERAL@48..49 - INT_NUMBER@48..49 "1" + PLPGSQL_EXPR@44..49 + TARGET_LIST@44..49 + TARGET@44..49 + BIN_EXPR@44..49 + LITERAL@44..45 + INT_NUMBER@44..45 "1" + WHITESPACE@45..46 " " + EQ@46..47 "=" + WHITESPACE@47..48 " " + LITERAL@48..49 + INT_NUMBER@48..49 "1" WHITESPACE@49..50 " " THEN_KW@50..54 "then" WHITESPACE@54..59 "\n " @@ -78,90 +86,98 @@ PLPGSQL@0..315 IF_KW@117..119 "if" SEMICOLON@119..120 ";" WHITESPACE@120..124 "\n\n " - COMMENT@124..188 "-- `expr_until_then` ..." - WHITESPACE@188..191 "\n " - PLPGSQL_IF_STMT@191..301 - IF_KW@191..193 "if" - WHITESPACE@193..194 " " - BIN_EXPR@194..223 - CASE_EXPR@194..219 - CASE_KW@194..198 "case" - WHITESPACE@198..199 " " - WHEN_CLAUSE_LIST@199..215 - WHEN_CLAUSE@199..215 - WHEN_KW@199..203 "when" - WHITESPACE@203..204 " " - LITERAL@204..208 - TRUE_KW@204..208 "true" - WHITESPACE@208..209 " " - THEN_KW@209..213 "then" - WHITESPACE@213..214 " " - LITERAL@214..215 - INT_NUMBER@214..215 "1" - WHITESPACE@215..216 " " - END_KW@216..219 "end" - WHITESPACE@219..220 " " - EQ@220..221 "=" - WHITESPACE@221..222 " " - LITERAL@222..223 - INT_NUMBER@222..223 "1" - WHITESPACE@223..224 " " - THEN_KW@224..228 "then" - WHITESPACE@228..233 "\n " - PLPGSQL_BODY@233..238 - PLPGSQL_NULL_STMT@233..238 - NULL_KW@233..237 "null" - SEMICOLON@237..238 ";" - WHITESPACE@238..241 "\n " - PLPGSQL_ELSIF_CLAUSE@241..291 - ELSIF_KW@241..246 "elsif" - WHITESPACE@246..247 " " - BIN_EXPR@247..276 - LITERAL@247..248 - INT_NUMBER@247..248 "1" - WHITESPACE@248..249 " " - EQ@249..250 "=" - WHITESPACE@250..251 " " - CASE_EXPR@251..276 - CASE_KW@251..255 "case" - WHITESPACE@255..256 " " - WHEN_CLAUSE_LIST@256..272 - WHEN_CLAUSE@256..272 - WHEN_KW@256..260 "when" - WHITESPACE@260..261 " " - LITERAL@261..265 - TRUE_KW@261..265 "true" - WHITESPACE@265..266 " " - THEN_KW@266..270 "then" - WHITESPACE@270..271 " " - LITERAL@271..272 - INT_NUMBER@271..272 "1" - WHITESPACE@272..273 " " - END_KW@273..276 "end" - WHITESPACE@276..277 " " - THEN_KW@277..281 "then" - WHITESPACE@281..286 "\n " - PLPGSQL_BODY@286..291 - PLPGSQL_NULL_STMT@286..291 - NULL_KW@286..290 "null" - SEMICOLON@290..291 ";" - WHITESPACE@291..294 "\n " - END_KW@294..297 "end" - WHITESPACE@297..298 " " - IF_KW@298..300 "if" - SEMICOLON@300..301 ";" - WHITESPACE@301..305 "\n\n " - PLPGSQL_NULL_STMT@305..310 - NULL_KW@305..309 "null" - SEMICOLON@309..310 ";" - WHITESPACE@310..311 "\n" - END_KW@311..314 "end" - WHITESPACE@314..315 "\n" + PLPGSQL_IF_STMT@124..234 + IF_KW@124..126 "if" + WHITESPACE@126..127 " " + PLPGSQL_EXPR@127..156 + TARGET_LIST@127..156 + TARGET@127..156 + BIN_EXPR@127..156 + CASE_EXPR@127..152 + CASE_KW@127..131 "case" + WHITESPACE@131..132 " " + WHEN_CLAUSE_LIST@132..148 + WHEN_CLAUSE@132..148 + WHEN_KW@132..136 "when" + WHITESPACE@136..137 " " + LITERAL@137..141 + TRUE_KW@137..141 "true" + WHITESPACE@141..142 " " + THEN_KW@142..146 "then" + WHITESPACE@146..147 " " + LITERAL@147..148 + INT_NUMBER@147..148 "1" + WHITESPACE@148..149 " " + END_KW@149..152 "end" + WHITESPACE@152..153 " " + EQ@153..154 "=" + WHITESPACE@154..155 " " + LITERAL@155..156 + INT_NUMBER@155..156 "1" + WHITESPACE@156..157 " " + THEN_KW@157..161 "then" + WHITESPACE@161..166 "\n " + PLPGSQL_BODY@166..171 + PLPGSQL_NULL_STMT@166..171 + NULL_KW@166..170 "null" + SEMICOLON@170..171 ";" + WHITESPACE@171..174 "\n " + PLPGSQL_ELSIF_CLAUSE@174..224 + ELSIF_KW@174..179 "elsif" + WHITESPACE@179..180 " " + PLPGSQL_EXPR@180..209 + TARGET_LIST@180..209 + TARGET@180..209 + BIN_EXPR@180..209 + LITERAL@180..181 + INT_NUMBER@180..181 "1" + WHITESPACE@181..182 " " + EQ@182..183 "=" + WHITESPACE@183..184 " " + CASE_EXPR@184..209 + CASE_KW@184..188 "case" + WHITESPACE@188..189 " " + WHEN_CLAUSE_LIST@189..205 + WHEN_CLAUSE@189..205 + WHEN_KW@189..193 "when" + WHITESPACE@193..194 " " + LITERAL@194..198 + TRUE_KW@194..198 "true" + WHITESPACE@198..199 " " + THEN_KW@199..203 "then" + WHITESPACE@203..204 " " + LITERAL@204..205 + INT_NUMBER@204..205 "1" + WHITESPACE@205..206 " " + END_KW@206..209 "end" + WHITESPACE@209..210 " " + THEN_KW@210..214 "then" + WHITESPACE@214..219 "\n " + PLPGSQL_BODY@219..224 + PLPGSQL_NULL_STMT@219..224 + NULL_KW@219..223 "null" + SEMICOLON@223..224 ";" + WHITESPACE@224..227 "\n " + END_KW@227..230 "end" + WHITESPACE@230..231 " " + IF_KW@231..233 "if" + SEMICOLON@233..234 ";" + WHITESPACE@234..238 "\n\n " + PLPGSQL_NULL_STMT@238..243 + NULL_KW@238..242 "null" + SEMICOLON@242..243 ";" + WHITESPACE@243..244 "\n" + END_KW@244..247 "end" + WHITESPACE@247..248 "\n" error[syntax-error]: expected THEN_KW ╭▸ -3 │ if 1 = 1 - ╰╴ ━ +4 │ null; + ╰╴ ━ +error[syntax-error]: expected a statement, got SEMICOLON + ╭▸ +4 │ null; + ╰╴ ━ error[syntax-error]: expected command, found IDENT ╭▸ 11 │ elsif 1 = 2 then @@ -172,9 +188,9 @@ error[syntax-error]: expected SEMICOLON, got INT_NUMBER ╰╴ ━ error[syntax-error]: CASE expression must be parenthesized ╭▸ -16 │ if case when true then 1 end = 1 then +15 │ if case when true then 1 end = 1 then ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━ error[syntax-error]: CASE expression must be parenthesized ╭▸ -18 │ elsif 1 = case when true then 1 end then +17 │ elsif 1 = case when true then 1 end then ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_ok.snap index 71c0b080..7caaeb3a 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_if_stmt_ok.snap @@ -2,9 +2,9 @@ source: crates/squawk_syntax/src/test.rs input_file: crates/squawk_parser/tests/data/plpgsql/ok/if_stmt.sql --- -PLPGSQL@0..514 +PLPGSQL@0..1177 WHITESPACE@0..1 "\n" - PLPGSQL_BLOCK@1..513 + PLPGSQL_BLOCK@1..1176 PLPGSQL_DECLARE_SECTION@1..22 DECLARE_KW@1..8 "declare" WHITESPACE@8..11 "\n " @@ -20,24 +20,30 @@ PLPGSQL@0..514 PLPGSQL_VAR_INIT@17..21 COLON_EQ@17..19 ":=" WHITESPACE@19..20 " " - LITERAL@20..21 - INT_NUMBER@20..21 "1" + PLPGSQL_EXPR@20..21 + TARGET_LIST@20..21 + TARGET@20..21 + LITERAL@20..21 + INT_NUMBER@20..21 "1" SEMICOLON@21..22 ";" WHITESPACE@22..23 "\n" BEGIN_KW@23..28 "begin" WHITESPACE@28..31 "\n " - PLPGSQL_BODY@31..509 + PLPGSQL_BODY@31..1172 PLPGSQL_IF_STMT@31..64 IF_KW@31..33 "if" WHITESPACE@33..34 " " - BIN_EXPR@34..39 - NAME_REF@34..35 - IDENT@34..35 "x" - WHITESPACE@35..36 " " - R_ANGLE@36..37 ">" - WHITESPACE@37..38 " " - LITERAL@38..39 - INT_NUMBER@38..39 "0" + PLPGSQL_EXPR@34..39 + TARGET_LIST@34..39 + TARGET@34..39 + BIN_EXPR@34..39 + NAME_REF@34..35 + IDENT@34..35 "x" + WHITESPACE@35..36 " " + R_ANGLE@36..37 ">" + WHITESPACE@37..38 " " + LITERAL@38..39 + INT_NUMBER@38..39 "0" WHITESPACE@39..40 " " THEN_KW@40..44 "then" WHITESPACE@44..49 "\n " @@ -54,14 +60,17 @@ PLPGSQL@0..514 PLPGSQL_IF_STMT@68..118 IF_KW@68..70 "if" WHITESPACE@70..71 " " - BIN_EXPR@71..76 - NAME_REF@71..72 - IDENT@71..72 "x" - WHITESPACE@72..73 " " - EQ@73..74 "=" - WHITESPACE@74..75 " " - LITERAL@75..76 - INT_NUMBER@75..76 "1" + PLPGSQL_EXPR@71..76 + TARGET_LIST@71..76 + TARGET@71..76 + BIN_EXPR@71..76 + NAME_REF@71..72 + IDENT@71..72 "x" + WHITESPACE@72..73 " " + EQ@73..74 "=" + WHITESPACE@74..75 " " + LITERAL@75..76 + INT_NUMBER@75..76 "1" WHITESPACE@76..77 " " THEN_KW@77..81 "then" WHITESPACE@81..86 "\n " @@ -86,14 +95,17 @@ PLPGSQL@0..514 PLPGSQL_IF_STMT@122..329 IF_KW@122..124 "if" WHITESPACE@124..125 " " - BIN_EXPR@125..130 - NAME_REF@125..126 - IDENT@125..126 "x" - WHITESPACE@126..127 " " - EQ@127..128 "=" - WHITESPACE@128..129 " " - LITERAL@129..130 - INT_NUMBER@129..130 "1" + PLPGSQL_EXPR@125..130 + TARGET_LIST@125..130 + TARGET@125..130 + BIN_EXPR@125..130 + NAME_REF@125..126 + IDENT@125..126 "x" + WHITESPACE@126..127 " " + EQ@127..128 "=" + WHITESPACE@128..129 " " + LITERAL@129..130 + INT_NUMBER@129..130 "1" WHITESPACE@130..131 " " THEN_KW@131..135 "then" WHITESPACE@135..140 "\n " @@ -101,14 +113,17 @@ PLPGSQL@0..514 PLPGSQL_IF_STMT@140..177 IF_KW@140..142 "if" WHITESPACE@142..143 " " - BIN_EXPR@143..148 - NAME_REF@143..144 - IDENT@143..144 "x" - WHITESPACE@144..145 " " - EQ@145..146 "=" - WHITESPACE@146..147 " " - LITERAL@147..148 - INT_NUMBER@147..148 "2" + PLPGSQL_EXPR@143..148 + TARGET_LIST@143..148 + TARGET@143..148 + BIN_EXPR@143..148 + NAME_REF@143..144 + IDENT@143..144 "x" + WHITESPACE@144..145 " " + EQ@145..146 "=" + WHITESPACE@146..147 " " + LITERAL@147..148 + INT_NUMBER@147..148 "2" WHITESPACE@148..149 " " THEN_KW@149..153 "then" WHITESPACE@153..160 "\n " @@ -125,14 +140,17 @@ PLPGSQL@0..514 PLPGSQL_ELSIF_CLAUSE@180..206 ELSIF_KW@180..185 "elsif" WHITESPACE@185..186 " " - BIN_EXPR@186..191 - NAME_REF@186..187 - IDENT@186..187 "x" - WHITESPACE@187..188 " " - EQ@188..189 "=" - WHITESPACE@189..190 " " - LITERAL@190..191 - INT_NUMBER@190..191 "2" + PLPGSQL_EXPR@186..191 + TARGET_LIST@186..191 + TARGET@186..191 + BIN_EXPR@186..191 + NAME_REF@186..187 + IDENT@186..187 "x" + WHITESPACE@187..188 " " + EQ@188..189 "=" + WHITESPACE@189..190 " " + LITERAL@190..191 + INT_NUMBER@190..191 "2" WHITESPACE@191..192 " " THEN_KW@192..196 "then" WHITESPACE@196..201 "\n " @@ -144,14 +162,17 @@ PLPGSQL@0..514 PLPGSQL_ELSIF_CLAUSE@209..236 ELSEIF_KW@209..215 "elseif" WHITESPACE@215..216 " " - BIN_EXPR@216..221 - NAME_REF@216..217 - IDENT@216..217 "x" - WHITESPACE@217..218 " " - EQ@218..219 "=" - WHITESPACE@219..220 " " - LITERAL@220..221 - INT_NUMBER@220..221 "3" + PLPGSQL_EXPR@216..221 + TARGET_LIST@216..221 + TARGET@216..221 + BIN_EXPR@216..221 + NAME_REF@216..217 + IDENT@216..217 "x" + WHITESPACE@217..218 " " + EQ@218..219 "=" + WHITESPACE@219..220 " " + LITERAL@220..221 + INT_NUMBER@220..221 "3" WHITESPACE@221..222 " " THEN_KW@222..226 "then" WHITESPACE@226..231 "\n " @@ -163,37 +184,40 @@ PLPGSQL@0..514 PLPGSQL_ELSIF_CLAUSE@239..302 ELSIF_KW@239..244 "elsif" WHITESPACE@244..245 " " - PAREN_EXPR@245..287 - L_PAREN@245..246 "(" - CASE_EXPR@246..286 - CASE_KW@246..250 "case" - WHITESPACE@250..251 " " - WHEN_CLAUSE_LIST@251..271 - WHEN_CLAUSE@251..271 - WHEN_KW@251..255 "when" - WHITESPACE@255..256 " " - BIN_EXPR@256..261 - NAME_REF@256..257 - IDENT@256..257 "x" - WHITESPACE@257..258 " " - EQ@258..259 "=" - WHITESPACE@259..260 " " - LITERAL@260..261 - INT_NUMBER@260..261 "4" - WHITESPACE@261..262 " " - THEN_KW@262..266 "then" - WHITESPACE@266..267 " " - LITERAL@267..271 - TRUE_KW@267..271 "true" - WHITESPACE@271..272 " " - ELSE_CLAUSE@272..282 - ELSE_KW@272..276 "else" - WHITESPACE@276..277 " " - LITERAL@277..282 - FALSE_KW@277..282 "false" - WHITESPACE@282..283 " " - END_KW@283..286 "end" - R_PAREN@286..287 ")" + PLPGSQL_EXPR@245..287 + TARGET_LIST@245..287 + TARGET@245..287 + PAREN_EXPR@245..287 + L_PAREN@245..246 "(" + CASE_EXPR@246..286 + CASE_KW@246..250 "case" + WHITESPACE@250..251 " " + WHEN_CLAUSE_LIST@251..271 + WHEN_CLAUSE@251..271 + WHEN_KW@251..255 "when" + WHITESPACE@255..256 " " + BIN_EXPR@256..261 + NAME_REF@256..257 + IDENT@256..257 "x" + WHITESPACE@257..258 " " + EQ@258..259 "=" + WHITESPACE@259..260 " " + LITERAL@260..261 + INT_NUMBER@260..261 "4" + WHITESPACE@261..262 " " + THEN_KW@262..266 "then" + WHITESPACE@266..267 " " + LITERAL@267..271 + TRUE_KW@267..271 "true" + WHITESPACE@271..272 " " + ELSE_CLAUSE@272..282 + ELSE_KW@272..276 "else" + WHITESPACE@276..277 " " + LITERAL@277..282 + FALSE_KW@277..282 "false" + WHITESPACE@282..283 " " + END_KW@283..286 "end" + R_PAREN@286..287 ")" WHITESPACE@287..288 " " THEN_KW@288..292 "then" WHITESPACE@292..297 "\n " @@ -218,14 +242,17 @@ PLPGSQL@0..514 PLPGSQL_IF_STMT@333..360 IF_KW@333..335 "if" WHITESPACE@335..336 " " - BIN_EXPR@336..345 - NAME_REF@336..337 - IDENT@336..337 "x" - WHITESPACE@337..338 " " - IS_KW@338..340 "is" - WHITESPACE@340..341 " " - LITERAL@341..345 - NULL_KW@341..345 "null" + PLPGSQL_EXPR@336..345 + TARGET_LIST@336..345 + TARGET@336..345 + BIN_EXPR@336..345 + NAME_REF@336..337 + IDENT@336..337 "x" + WHITESPACE@337..338 " " + IS_KW@338..340 "is" + WHITESPACE@340..341 " " + LITERAL@341..345 + NULL_KW@341..345 "null" WHITESPACE@345..346 " " THEN_KW@346..350 "then" WHITESPACE@350..353 "\n " @@ -238,46 +265,49 @@ PLPGSQL@0..514 PLPGSQL_IF_STMT@364..435 IF_KW@364..366 "if" WHITESPACE@366..367 " " - BIN_EXPR@367..410 - CALL_EXPR@367..406 - NAME_REF@367..375 - COALESCE_KW@367..375 "coalesce" - ARG_LIST@375..406 - L_PAREN@375..376 "(" - ARG@376..402 - CASE_EXPR@376..402 - CASE_KW@376..380 "case" - WHITESPACE@380..381 " " - WHEN_CLAUSE_LIST@381..398 - WHEN_CLAUSE@381..398 - WHEN_KW@381..385 "when" - WHITESPACE@385..386 " " - BIN_EXPR@386..391 - NAME_REF@386..387 - IDENT@386..387 "x" - WHITESPACE@387..388 " " - EQ@388..389 "=" - WHITESPACE@389..390 " " - LITERAL@390..391 - INT_NUMBER@390..391 "1" - WHITESPACE@391..392 " " - THEN_KW@392..396 "then" - WHITESPACE@396..397 " " - LITERAL@397..398 - INT_NUMBER@397..398 "1" - WHITESPACE@398..399 " " - END_KW@399..402 "end" - COMMA@402..403 "," - WHITESPACE@403..404 " " - ARG@404..405 - LITERAL@404..405 - INT_NUMBER@404..405 "0" - R_PAREN@405..406 ")" - WHITESPACE@406..407 " " - EQ@407..408 "=" - WHITESPACE@408..409 " " - LITERAL@409..410 - INT_NUMBER@409..410 "1" + PLPGSQL_EXPR@367..410 + TARGET_LIST@367..410 + TARGET@367..410 + BIN_EXPR@367..410 + CALL_EXPR@367..406 + NAME_REF@367..375 + COALESCE_KW@367..375 "coalesce" + ARG_LIST@375..406 + L_PAREN@375..376 "(" + ARG@376..402 + CASE_EXPR@376..402 + CASE_KW@376..380 "case" + WHITESPACE@380..381 " " + WHEN_CLAUSE_LIST@381..398 + WHEN_CLAUSE@381..398 + WHEN_KW@381..385 "when" + WHITESPACE@385..386 " " + BIN_EXPR@386..391 + NAME_REF@386..387 + IDENT@386..387 "x" + WHITESPACE@387..388 " " + EQ@388..389 "=" + WHITESPACE@389..390 " " + LITERAL@390..391 + INT_NUMBER@390..391 "1" + WHITESPACE@391..392 " " + THEN_KW@392..396 "then" + WHITESPACE@396..397 " " + LITERAL@397..398 + INT_NUMBER@397..398 "1" + WHITESPACE@398..399 " " + END_KW@399..402 "end" + COMMA@402..403 "," + WHITESPACE@403..404 " " + ARG@404..405 + LITERAL@404..405 + INT_NUMBER@404..405 "0" + R_PAREN@405..406 ")" + WHITESPACE@406..407 " " + EQ@407..408 "=" + WHITESPACE@408..409 " " + LITERAL@409..410 + INT_NUMBER@409..410 "1" WHITESPACE@410..411 " " THEN_KW@411..415 "then" WHITESPACE@415..420 "\n " @@ -294,46 +324,49 @@ PLPGSQL@0..514 PLPGSQL_IF_STMT@439..509 IF_KW@439..441 "if" WHITESPACE@441..442 " " - BIN_EXPR@442..484 - INDEX_EXPR@442..480 - PAREN_EXPR@442..477 - L_PAREN@442..443 "(" - ARRAY_EXPR@443..476 - ARRAY_KW@443..448 "array" - L_BRACK@448..449 "[" - CASE_EXPR@449..475 - CASE_KW@449..453 "case" - WHITESPACE@453..454 " " - WHEN_CLAUSE_LIST@454..471 - WHEN_CLAUSE@454..471 - WHEN_KW@454..458 "when" - WHITESPACE@458..459 " " - BIN_EXPR@459..464 - NAME_REF@459..460 - IDENT@459..460 "x" - WHITESPACE@460..461 " " - EQ@461..462 "=" - WHITESPACE@462..463 " " - LITERAL@463..464 - INT_NUMBER@463..464 "1" - WHITESPACE@464..465 " " - THEN_KW@465..469 "then" - WHITESPACE@469..470 " " - LITERAL@470..471 - INT_NUMBER@470..471 "1" - WHITESPACE@471..472 " " - END_KW@472..475 "end" - R_BRACK@475..476 "]" - R_PAREN@476..477 ")" - L_BRACK@477..478 "[" - LITERAL@478..479 - INT_NUMBER@478..479 "1" - R_BRACK@479..480 "]" - WHITESPACE@480..481 " " - EQ@481..482 "=" - WHITESPACE@482..483 " " - LITERAL@483..484 - INT_NUMBER@483..484 "1" + PLPGSQL_EXPR@442..484 + TARGET_LIST@442..484 + TARGET@442..484 + BIN_EXPR@442..484 + INDEX_EXPR@442..480 + PAREN_EXPR@442..477 + L_PAREN@442..443 "(" + ARRAY_EXPR@443..476 + ARRAY_KW@443..448 "array" + L_BRACK@448..449 "[" + CASE_EXPR@449..475 + CASE_KW@449..453 "case" + WHITESPACE@453..454 " " + WHEN_CLAUSE_LIST@454..471 + WHEN_CLAUSE@454..471 + WHEN_KW@454..458 "when" + WHITESPACE@458..459 " " + BIN_EXPR@459..464 + NAME_REF@459..460 + IDENT@459..460 "x" + WHITESPACE@460..461 " " + EQ@461..462 "=" + WHITESPACE@462..463 " " + LITERAL@463..464 + INT_NUMBER@463..464 "1" + WHITESPACE@464..465 " " + THEN_KW@465..469 "then" + WHITESPACE@469..470 " " + LITERAL@470..471 + INT_NUMBER@470..471 "1" + WHITESPACE@471..472 " " + END_KW@472..475 "end" + R_BRACK@475..476 "]" + R_PAREN@476..477 ")" + L_BRACK@477..478 "[" + LITERAL@478..479 + INT_NUMBER@478..479 "1" + R_BRACK@479..480 "]" + WHITESPACE@480..481 " " + EQ@481..482 "=" + WHITESPACE@482..483 " " + LITERAL@483..484 + INT_NUMBER@483..484 "1" WHITESPACE@484..485 " " THEN_KW@485..489 "then" WHITESPACE@489..494 "\n " @@ -346,6 +379,406 @@ PLPGSQL@0..514 WHITESPACE@505..506 " " IF_KW@506..508 "if" SEMICOLON@508..509 ";" - WHITESPACE@509..510 "\n" - END_KW@510..513 "end" - WHITESPACE@513..514 "\n" + WHITESPACE@509..513 "\n\n " + COMMENT@513..585 "-- PL/pgSQL expressio ..." + WHITESPACE@585..588 "\n " + PLPGSQL_IF_STMT@588..633 + IF_KW@588..590 "if" + WHITESPACE@590..591 " " + PLPGSQL_EXPR@591..608 + TARGET_LIST@591..608 + TARGET@591..608 + LITERAL@591..595 + TRUE_KW@591..595 "true" + WHITESPACE@595..596 " " + AS_NAME@596..608 + AS_KW@596..598 "as" + WHITESPACE@598..599 " " + COLUMN_NAME@599..608 + IDENT@599..608 "condition" + WHITESPACE@608..609 " " + THEN_KW@609..613 "then" + WHITESPACE@613..618 "\n " + PLPGSQL_BODY@618..623 + PLPGSQL_NULL_STMT@618..623 + NULL_KW@618..622 "null" + SEMICOLON@622..623 ";" + WHITESPACE@623..626 "\n " + END_KW@626..629 "end" + WHITESPACE@629..630 " " + IF_KW@630..632 "if" + SEMICOLON@632..633 ";" + WHITESPACE@633..637 "\n\n " + PLPGSQL_IF_STMT@637..692 + IF_KW@637..639 "if" + WHITESPACE@639..640 " " + PLPGSQL_EXPR@640..667 + TARGET_LIST@640..667 + TARGET@640..654 + LITERAL@640..644 + TRUE_KW@640..644 "true" + WHITESPACE@644..645 " " + AS_NAME@645..654 + COLUMN_NAME@645..654 + IDENT@645..654 "condition" + COMMA@654..655 "," + WHITESPACE@655..656 " " + TARGET@656..667 + LITERAL@656..661 + FALSE_KW@656..661 "false" + WHITESPACE@661..662 " " + AS_NAME@662..667 + COLUMN_NAME@662..667 + IDENT@662..667 "other" + WHITESPACE@667..668 " " + THEN_KW@668..672 "then" + WHITESPACE@672..677 "\n " + PLPGSQL_BODY@677..682 + PLPGSQL_NULL_STMT@677..682 + NULL_KW@677..681 "null" + SEMICOLON@681..682 ";" + WHITESPACE@682..685 "\n " + END_KW@685..688 "end" + WHITESPACE@688..689 " " + IF_KW@689..691 "if" + SEMICOLON@691..692 ";" + WHITESPACE@692..696 "\n\n " + PLPGSQL_IF_STMT@696..771 + IF_KW@696..698 "if" + WHITESPACE@698..699 " " + PLPGSQL_EXPR@699..746 + TARGET_LIST@699..703 + TARGET@699..703 + NAME_REF@699..703 + IDENT@699..703 "flag" + WHITESPACE@703..704 " " + FROM_CLAUSE@704..735 + FROM_KW@704..708 "from" + WHITESPACE@708..709 " " + PAREN_FROM_ITEM@709..735 + PAREN_SELECT@709..724 + L_PAREN@709..710 "(" + VALUES@710..723 + VALUES_KW@710..716 "values" + WHITESPACE@716..717 " " + ROW_LIST@717..723 + ROW@717..723 + L_PAREN@717..718 "(" + LITERAL@718..722 + TRUE_KW@718..722 "true" + R_PAREN@722..723 ")" + R_PAREN@723..724 ")" + WHITESPACE@724..725 " " + FROM_ALIAS@725..735 + AS_KW@725..727 "as" + WHITESPACE@727..728 " " + TABLE_ALIAS@728..729 + IDENT@728..729 "v" + COLUMN_LIST@729..735 + L_PAREN@729..730 "(" + COLUMN_NAME@730..734 + IDENT@730..734 "flag" + R_PAREN@734..735 ")" + WHITESPACE@735..736 " " + WHERE_CLAUSE@736..746 + WHERE_KW@736..741 "where" + WHITESPACE@741..742 " " + NAME_REF@742..746 + IDENT@742..746 "flag" + WHITESPACE@746..747 " " + THEN_KW@747..751 "then" + WHITESPACE@751..756 "\n " + PLPGSQL_BODY@756..761 + PLPGSQL_NULL_STMT@756..761 + NULL_KW@756..760 "null" + SEMICOLON@760..761 ";" + WHITESPACE@761..764 "\n " + END_KW@764..767 "end" + WHITESPACE@767..768 " " + IF_KW@768..770 "if" + SEMICOLON@770..771 ";" + WHITESPACE@771..775 "\n\n " + PLPGSQL_IF_STMT@775..885 + IF_KW@775..777 "if" + WHITESPACE@777..778 " " + PLPGSQL_EXPR@778..860 + TARGET_LIST@778..792 + TARGET@778..792 + CALL_EXPR@778..792 + NAME_REF@778..786 + IDENT@778..786 "bool_and" + ARG_LIST@786..792 + L_PAREN@786..787 "(" + ARG@787..791 + NAME_REF@787..791 + IDENT@787..791 "flag" + R_PAREN@791..792 ")" + WHITESPACE@792..793 " " + FROM_CLAUSE@793..824 + FROM_KW@793..797 "from" + WHITESPACE@797..798 " " + PAREN_FROM_ITEM@798..824 + PAREN_SELECT@798..813 + L_PAREN@798..799 "(" + VALUES@799..812 + VALUES_KW@799..805 "values" + WHITESPACE@805..806 " " + ROW_LIST@806..812 + ROW@806..812 + L_PAREN@806..807 "(" + LITERAL@807..811 + TRUE_KW@807..811 "true" + R_PAREN@811..812 ")" + R_PAREN@812..813 ")" + WHITESPACE@813..814 " " + FROM_ALIAS@814..824 + AS_KW@814..816 "as" + WHITESPACE@816..817 " " + TABLE_ALIAS@817..818 + IDENT@817..818 "v" + COLUMN_LIST@818..824 + L_PAREN@818..819 "(" + COLUMN_NAME@819..823 + IDENT@819..823 "flag" + R_PAREN@823..824 ")" + WHITESPACE@824..825 " " + GROUP_BY_CLAUSE@825..838 + GROUP_KW@825..830 "group" + WHITESPACE@830..831 " " + BY_KW@831..833 "by" + WHITESPACE@833..834 " " + GROUP_BY_LIST@834..838 + GROUPING_EXPR@834..838 + NAME_REF@834..838 + IDENT@834..838 "flag" + WHITESPACE@838..839 " " + HAVING_CLAUSE@839..860 + HAVING_KW@839..845 "having" + WHITESPACE@845..846 " " + CALL_EXPR@846..860 + NAME_REF@846..854 + IDENT@846..854 "bool_and" + ARG_LIST@854..860 + L_PAREN@854..855 "(" + ARG@855..859 + NAME_REF@855..859 + IDENT@855..859 "flag" + R_PAREN@859..860 ")" + WHITESPACE@860..861 " " + THEN_KW@861..865 "then" + WHITESPACE@865..870 "\n " + PLPGSQL_BODY@870..875 + PLPGSQL_NULL_STMT@870..875 + NULL_KW@870..874 "null" + SEMICOLON@874..875 ";" + WHITESPACE@875..878 "\n " + END_KW@878..881 "end" + WHITESPACE@881..882 " " + IF_KW@882..884 "if" + SEMICOLON@884..885 ";" + WHITESPACE@885..889 "\n\n " + PLPGSQL_IF_STMT@889..985 + IF_KW@889..891 "if" + WHITESPACE@891..892 " " + PLPGSQL_EXPR@892..960 + TARGET_LIST@892..913 + TARGET@892..913 + CALL_EXPR@892..913 + NAME_REF@892..900 + IDENT@892..900 "bool_and" + ARG_LIST@900..906 + L_PAREN@900..901 "(" + ARG@901..905 + NAME_REF@901..905 + IDENT@901..905 "flag" + R_PAREN@905..906 ")" + WHITESPACE@906..907 " " + OVER_CLAUSE@907..913 + OVER_KW@907..911 "over" + WHITESPACE@911..912 " " + WINDOW_REF@912..913 + IDENT@912..913 "w" + WHITESPACE@913..914 " " + FROM_CLAUSE@914..945 + FROM_KW@914..918 "from" + WHITESPACE@918..919 " " + PAREN_FROM_ITEM@919..945 + PAREN_SELECT@919..934 + L_PAREN@919..920 "(" + VALUES@920..933 + VALUES_KW@920..926 "values" + WHITESPACE@926..927 " " + ROW_LIST@927..933 + ROW@927..933 + L_PAREN@927..928 "(" + LITERAL@928..932 + TRUE_KW@928..932 "true" + R_PAREN@932..933 ")" + R_PAREN@933..934 ")" + WHITESPACE@934..935 " " + FROM_ALIAS@935..945 + AS_KW@935..937 "as" + WHITESPACE@937..938 " " + TABLE_ALIAS@938..939 + IDENT@938..939 "v" + COLUMN_LIST@939..945 + L_PAREN@939..940 "(" + COLUMN_NAME@940..944 + IDENT@940..944 "flag" + R_PAREN@944..945 ")" + WHITESPACE@945..946 " " + WINDOW_CLAUSE@946..960 + WINDOW_KW@946..952 "window" + WHITESPACE@952..953 " " + WINDOW_DEF@953..960 + WINDOW@953..954 + IDENT@953..954 "w" + WHITESPACE@954..955 " " + AS_KW@955..957 "as" + WHITESPACE@957..958 " " + L_PAREN@958..959 "(" + R_PAREN@959..960 ")" + WHITESPACE@960..961 " " + THEN_KW@961..965 "then" + WHITESPACE@965..970 "\n " + PLPGSQL_BODY@970..975 + PLPGSQL_NULL_STMT@970..975 + NULL_KW@970..974 "null" + SEMICOLON@974..975 ";" + WHITESPACE@975..978 "\n " + END_KW@978..981 "end" + WHITESPACE@981..982 " " + IF_KW@982..984 "if" + SEMICOLON@984..985 ";" + WHITESPACE@985..989 "\n\n " + PLPGSQL_IF_STMT@989..1093 + IF_KW@989..991 "if" + WHITESPACE@991..992 " " + PLPGSQL_EXPR@992..1068 + DISTINCT_CLAUSE@992..1000 + DISTINCT_KW@992..1000 "distinct" + WHITESPACE@1000..1001 " " + TARGET_LIST@1001..1005 + TARGET@1001..1005 + NAME_REF@1001..1005 + IDENT@1001..1005 "flag" + WHITESPACE@1005..1006 " " + FROM_CLAUSE@1006..1037 + FROM_KW@1006..1010 "from" + WHITESPACE@1010..1011 " " + PAREN_FROM_ITEM@1011..1037 + PAREN_SELECT@1011..1026 + L_PAREN@1011..1012 "(" + VALUES@1012..1025 + VALUES_KW@1012..1018 "values" + WHITESPACE@1018..1019 " " + ROW_LIST@1019..1025 + ROW@1019..1025 + L_PAREN@1019..1020 "(" + LITERAL@1020..1024 + TRUE_KW@1020..1024 "true" + R_PAREN@1024..1025 ")" + R_PAREN@1025..1026 ")" + WHITESPACE@1026..1027 " " + FROM_ALIAS@1027..1037 + AS_KW@1027..1029 "as" + WHITESPACE@1029..1030 " " + TABLE_ALIAS@1030..1031 + IDENT@1030..1031 "v" + COLUMN_LIST@1031..1037 + L_PAREN@1031..1032 "(" + COLUMN_NAME@1032..1036 + IDENT@1032..1036 "flag" + R_PAREN@1036..1037 ")" + WHITESPACE@1037..1038 " " + ORDER_BY_CLAUSE@1038..1051 + ORDER_KW@1038..1043 "order" + WHITESPACE@1043..1044 " " + BY_KW@1044..1046 "by" + WHITESPACE@1046..1047 " " + SORT_BY_LIST@1047..1051 + SORT_BY@1047..1051 + NAME_REF@1047..1051 + IDENT@1047..1051 "flag" + WHITESPACE@1051..1052 " " + LIMIT_CLAUSE@1052..1059 + LIMIT_KW@1052..1057 "limit" + WHITESPACE@1057..1058 " " + LITERAL@1058..1059 + INT_NUMBER@1058..1059 "1" + WHITESPACE@1059..1060 " " + OFFSET_CLAUSE@1060..1068 + OFFSET_KW@1060..1066 "offset" + WHITESPACE@1066..1067 " " + LITERAL@1067..1068 + INT_NUMBER@1067..1068 "0" + WHITESPACE@1068..1069 " " + THEN_KW@1069..1073 "then" + WHITESPACE@1073..1078 "\n " + PLPGSQL_BODY@1078..1083 + PLPGSQL_NULL_STMT@1078..1083 + NULL_KW@1078..1082 "null" + SEMICOLON@1082..1083 ";" + WHITESPACE@1083..1086 "\n " + END_KW@1086..1089 "end" + WHITESPACE@1089..1090 " " + IF_KW@1090..1092 "if" + SEMICOLON@1092..1093 ";" + WHITESPACE@1093..1097 "\n\n " + PLPGSQL_IF_STMT@1097..1172 + IF_KW@1097..1099 "if" + WHITESPACE@1099..1100 " " + PLPGSQL_EXPR@1100..1147 + TARGET_LIST@1100..1104 + TARGET@1100..1104 + NAME_REF@1100..1104 + IDENT@1100..1104 "flag" + WHITESPACE@1104..1105 " " + FROM_CLAUSE@1105..1136 + FROM_KW@1105..1109 "from" + WHITESPACE@1109..1110 " " + PAREN_FROM_ITEM@1110..1136 + PAREN_SELECT@1110..1125 + L_PAREN@1110..1111 "(" + VALUES@1111..1124 + VALUES_KW@1111..1117 "values" + WHITESPACE@1117..1118 " " + ROW_LIST@1118..1124 + ROW@1118..1124 + L_PAREN@1118..1119 "(" + LITERAL@1119..1123 + TRUE_KW@1119..1123 "true" + R_PAREN@1123..1124 ")" + R_PAREN@1124..1125 ")" + WHITESPACE@1125..1126 " " + FROM_ALIAS@1126..1136 + AS_KW@1126..1128 "as" + WHITESPACE@1128..1129 " " + TABLE_ALIAS@1129..1130 + IDENT@1129..1130 "v" + COLUMN_LIST@1130..1136 + L_PAREN@1130..1131 "(" + COLUMN_NAME@1131..1135 + IDENT@1131..1135 "flag" + R_PAREN@1135..1136 ")" + WHITESPACE@1136..1137 " " + LOCKING_CLAUSE@1137..1147 + FOR_KW@1137..1140 "for" + WHITESPACE@1140..1141 " " + FOR_UPDATE@1141..1147 + UPDATE_KW@1141..1147 "update" + WHITESPACE@1147..1148 " " + THEN_KW@1148..1152 "then" + WHITESPACE@1152..1157 "\n " + PLPGSQL_BODY@1157..1162 + PLPGSQL_NULL_STMT@1157..1162 + NULL_KW@1157..1161 "null" + SEMICOLON@1161..1162 ";" + WHITESPACE@1162..1165 "\n " + END_KW@1165..1168 "end" + WHITESPACE@1168..1169 " " + IF_KW@1169..1171 "if" + SEMICOLON@1171..1172 ";" + WHITESPACE@1172..1173 "\n" + END_KW@1173..1176 "end" + WHITESPACE@1176..1177 "\n" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_err.snap index a1e7d70d..464e2252 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_err.snap @@ -22,18 +22,23 @@ PLPGSQL@0..114 PLPGSQL_WHILE_STMT@34..67 WHILE_KW@34..39 "while" WHITESPACE@39..40 " " - BIN_EXPR@40..45 - LITERAL@40..41 - INT_NUMBER@40..41 "1" - WHITESPACE@41..42 " " - EQ@42..43 "=" - WHITESPACE@43..44 " " - LITERAL@44..45 - INT_NUMBER@44..45 "1" - WHITESPACE@45..50 "\n " - PLPGSQL_BODY@50..55 - PLPGSQL_NULL_STMT@50..55 - NULL_KW@50..54 "null" + PLPGSQL_EXPR@40..54 + TARGET_LIST@40..54 + TARGET@40..54 + BIN_EXPR@40..45 + LITERAL@40..41 + INT_NUMBER@40..41 "1" + WHITESPACE@41..42 " " + EQ@42..43 "=" + WHITESPACE@43..44 " " + LITERAL@44..45 + INT_NUMBER@44..45 "1" + WHITESPACE@45..50 "\n " + AS_NAME@50..54 + COLUMN_NAME@50..54 + NULL_KW@50..54 "null" + PLPGSQL_BODY@54..55 + ERROR@54..55 SEMICOLON@54..55 ";" WHITESPACE@55..58 "\n " END_KW@58..61 "end" @@ -68,8 +73,12 @@ error[syntax-error]: expected LOOP_KW ╰╴ ━ error[syntax-error]: expected LOOP_KW ╭▸ -7 │ while 1 = 1 - ╰╴ ━ +8 │ null; + ╰╴ ━ +error[syntax-error]: expected a statement, got SEMICOLON + ╭▸ +8 │ null; + ╰╴ ━ error[syntax-error]: expected SEMICOLON ╭▸ 15 │ exit when diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_ok.snap index 8ee5aa13..098ade71 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_loop_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..452 PLPGSQL_VAR_INIT@17..21 COLON_EQ@17..19 ":=" WHITESPACE@19..20 " " - LITERAL@20..21 - INT_NUMBER@20..21 "0" + PLPGSQL_EXPR@20..21 + TARGET_LIST@20..21 + TARGET@20..21 + LITERAL@20..21 + INT_NUMBER@20..21 "0" SEMICOLON@21..22 ";" WHITESPACE@22..23 "\n" BEGIN_KW@23..28 "begin" @@ -50,14 +53,17 @@ PLPGSQL@0..452 PLPGSQL_EXIT_WHEN@75..86 WHEN_KW@75..79 "when" WHITESPACE@79..80 " " - BIN_EXPR@80..86 - NAME_REF@80..81 - IDENT@80..81 "i" - WHITESPACE@81..82 " " - R_ANGLE@82..83 ">" - WHITESPACE@83..84 " " - LITERAL@84..86 - INT_NUMBER@84..86 "10" + PLPGSQL_EXPR@80..86 + TARGET_LIST@80..86 + TARGET@80..86 + BIN_EXPR@80..86 + NAME_REF@80..81 + IDENT@80..81 "i" + WHITESPACE@81..82 " " + R_ANGLE@82..83 ">" + WHITESPACE@83..84 " " + LITERAL@84..86 + INT_NUMBER@84..86 "10" SEMICOLON@86..87 ";" WHITESPACE@87..92 "\n " PLPGSQL_CONTINUE_STMT@92..112 @@ -66,14 +72,17 @@ PLPGSQL@0..452 PLPGSQL_EXIT_WHEN@101..111 WHEN_KW@101..105 "when" WHITESPACE@105..106 " " - BIN_EXPR@106..111 - NAME_REF@106..107 - IDENT@106..107 "i" - WHITESPACE@107..108 " " - EQ@108..109 "=" - WHITESPACE@109..110 " " - LITERAL@110..111 - INT_NUMBER@110..111 "2" + PLPGSQL_EXPR@106..111 + TARGET_LIST@106..111 + TARGET@106..111 + BIN_EXPR@106..111 + NAME_REF@106..107 + IDENT@106..107 "i" + WHITESPACE@107..108 " " + EQ@108..109 "=" + WHITESPACE@109..110 " " + LITERAL@110..111 + INT_NUMBER@110..111 "2" SEMICOLON@111..112 ";" WHITESPACE@112..117 "\n " PLPGSQL_CONTINUE_STMT@117..126 @@ -88,14 +97,17 @@ PLPGSQL@0..452 PLPGSQL_WHILE_STMT@142..181 WHILE_KW@142..147 "while" WHITESPACE@147..148 " " - BIN_EXPR@148..154 - NAME_REF@148..149 - IDENT@148..149 "i" - WHITESPACE@149..150 " " - L_ANGLE@150..151 "<" - WHITESPACE@151..152 " " - LITERAL@152..154 - INT_NUMBER@152..154 "10" + PLPGSQL_EXPR@148..154 + TARGET_LIST@148..154 + TARGET@148..154 + BIN_EXPR@148..154 + NAME_REF@148..149 + IDENT@148..149 "i" + WHITESPACE@149..150 " " + L_ANGLE@150..151 "<" + WHITESPACE@151..152 " " + LITERAL@152..154 + INT_NUMBER@152..154 "10" WHITESPACE@154..155 " " LOOP_KW@155..159 "loop" WHITESPACE@159..164 "\n " @@ -112,34 +124,37 @@ PLPGSQL@0..452 PLPGSQL_WHILE_STMT@185..258 WHILE_KW@185..190 "while" WHITESPACE@190..191 " " - CASE_EXPR@191..231 - CASE_KW@191..195 "case" - WHITESPACE@195..196 " " - WHEN_CLAUSE_LIST@196..216 - WHEN_CLAUSE@196..216 - WHEN_KW@196..200 "when" - WHITESPACE@200..201 " " - BIN_EXPR@201..206 - NAME_REF@201..202 - IDENT@201..202 "i" - WHITESPACE@202..203 " " - EQ@203..204 "=" - WHITESPACE@204..205 " " - LITERAL@205..206 - INT_NUMBER@205..206 "1" - WHITESPACE@206..207 " " - THEN_KW@207..211 "then" - WHITESPACE@211..212 " " - LITERAL@212..216 - TRUE_KW@212..216 "true" - WHITESPACE@216..217 " " - ELSE_CLAUSE@217..227 - ELSE_KW@217..221 "else" - WHITESPACE@221..222 " " - LITERAL@222..227 - FALSE_KW@222..227 "false" - WHITESPACE@227..228 " " - END_KW@228..231 "end" + PLPGSQL_EXPR@191..231 + TARGET_LIST@191..231 + TARGET@191..231 + CASE_EXPR@191..231 + CASE_KW@191..195 "case" + WHITESPACE@195..196 " " + WHEN_CLAUSE_LIST@196..216 + WHEN_CLAUSE@196..216 + WHEN_KW@196..200 "when" + WHITESPACE@200..201 " " + BIN_EXPR@201..206 + NAME_REF@201..202 + IDENT@201..202 "i" + WHITESPACE@202..203 " " + EQ@203..204 "=" + WHITESPACE@204..205 " " + LITERAL@205..206 + INT_NUMBER@205..206 "1" + WHITESPACE@206..207 " " + THEN_KW@207..211 "then" + WHITESPACE@211..212 " " + LITERAL@212..216 + TRUE_KW@212..216 "true" + WHITESPACE@216..217 " " + ELSE_CLAUSE@217..227 + ELSE_KW@217..221 "else" + WHITESPACE@221..222 " " + LITERAL@222..227 + FALSE_KW@222..227 "false" + WHITESPACE@227..228 " " + END_KW@228..231 "end" WHITESPACE@231..232 " " LOOP_KW@232..236 "loop" WHITESPACE@236..241 "\n " @@ -172,14 +187,17 @@ PLPGSQL@0..452 WHITESPACE@292..297 "\n " WHILE_KW@297..302 "while" WHITESPACE@302..303 " " - BIN_EXPR@303..309 - NAME_REF@303..304 - IDENT@303..304 "i" - WHITESPACE@304..305 " " - L_ANGLE@305..306 "<" - WHITESPACE@306..307 " " - LITERAL@307..309 - INT_NUMBER@307..309 "10" + PLPGSQL_EXPR@303..309 + TARGET_LIST@303..309 + TARGET@303..309 + BIN_EXPR@303..309 + NAME_REF@303..304 + IDENT@303..304 "i" + WHITESPACE@304..305 " " + L_ANGLE@305..306 "<" + WHITESPACE@306..307 " " + LITERAL@307..309 + INT_NUMBER@307..309 "10" WHITESPACE@309..310 " " LOOP_KW@310..314 "loop" WHITESPACE@314..321 "\n " @@ -193,14 +211,17 @@ PLPGSQL@0..452 PLPGSQL_EXIT_WHEN@336..346 WHEN_KW@336..340 "when" WHITESPACE@340..341 " " - BIN_EXPR@341..346 - NAME_REF@341..342 - IDENT@341..342 "i" - WHITESPACE@342..343 " " - EQ@343..344 "=" - WHITESPACE@344..345 " " - LITERAL@345..346 - INT_NUMBER@345..346 "2" + PLPGSQL_EXPR@341..346 + TARGET_LIST@341..346 + TARGET@341..346 + BIN_EXPR@341..346 + NAME_REF@341..342 + IDENT@341..342 "i" + WHITESPACE@342..343 " " + EQ@343..344 "=" + WHITESPACE@344..345 " " + LITERAL@345..346 + INT_NUMBER@345..346 "2" SEMICOLON@346..347 ";" WHITESPACE@347..354 "\n " PLPGSQL_EXIT_STMT@354..365 diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_err.snap index c966543f..fdee1ca6 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_err.snap @@ -38,8 +38,11 @@ PLPGSQL@0..201 PLPGSQL_VAR_INIT@42..46 COLON_EQ@42..44 ":=" WHITESPACE@44..45 " " - LITERAL@45..46 - INT_NUMBER@45..46 "2" + PLPGSQL_EXPR@45..46 + TARGET_LIST@45..46 + TARGET@45..46 + LITERAL@45..46 + INT_NUMBER@45..46 "2" SEMICOLON@46..47 ";" WHITESPACE@47..50 "\n " PLPGSQL_VAR_DECL@50..56 diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_ok.snap index 45c76d85..921ee814 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_move_stmt_ok.snap @@ -48,8 +48,11 @@ PLPGSQL@0..456 PLPGSQL_VAR_INIT@58..62 COLON_EQ@58..60 ":=" WHITESPACE@60..61 " " - LITERAL@61..62 - INT_NUMBER@61..62 "2" + PLPGSQL_EXPR@61..62 + TARGET_LIST@61..62 + TARGET@61..62 + LITERAL@61..62 + INT_NUMBER@61..62 "2" SEMICOLON@62..63 ";" WHITESPACE@63..64 "\n" BEGIN_KW@64..69 "begin" @@ -347,8 +350,11 @@ PLPGSQL@0..49 WHITESPACE@38..39 " " COLON_EQ@39..41 ":=" WHITESPACE@41..42 " " - LITERAL@42..43 - INT_NUMBER@42..43 "1" + PLPGSQL_EXPR@42..43 + TARGET_LIST@42..43 + TARGET@42..43 + LITERAL@42..43 + INT_NUMBER@42..43 "1" SEMICOLON@43..44 ";" WHITESPACE@44..45 "\n" END_KW@45..48 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_err.snap index 023f9565..8ff81757 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_err.snap @@ -105,10 +105,6 @@ error[syntax-error]: expected a query ╭▸ 7 │ open rc for; ╰╴ ━ -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -8 │ open rc for execute; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 8 │ open rc for execute; diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_ok.snap index e61b928b..e918e669 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_open_stmt_ok.snap @@ -100,8 +100,11 @@ PLPGSQL@0..462 PLPGSQL_VAR_INIT@123..127 COLON_EQ@123..125 ":=" WHITESPACE@125..126 " " - LITERAL@126..127 - INT_NUMBER@126..127 "1" + PLPGSQL_EXPR@126..127 + TARGET_LIST@126..127 + TARGET@126..127 + LITERAL@126..127 + INT_NUMBER@126..127 "1" SEMICOLON@127..128 ";" WHITESPACE@128..129 "\n" BEGIN_KW@129..134 "begin" @@ -320,14 +323,20 @@ PLPGSQL@0..462 WHITESPACE@382..383 " " EXECUTE_KW@383..390 "execute" WHITESPACE@390..391 " " - LITERAL@391..402 - STRING@391..402 "'select $1'" + PLPGSQL_EXPR@391..402 + TARGET_LIST@391..402 + TARGET@391..402 + LITERAL@391..402 + STRING@391..402 "'select $1'" WHITESPACE@402..403 " " PLPGSQL_USING_CLAUSE@403..410 USING_KW@403..408 "using" WHITESPACE@408..409 " " - NAME_REF@409..410 - IDENT@409..410 "x" + PLPGSQL_EXPR@409..410 + TARGET_LIST@409..410 + TARGET@409..410 + NAME_REF@409..410 + IDENT@409..410 "x" SEMICOLON@410..411 ";" WHITESPACE@411..414 "\n " PLPGSQL_OPEN_STMT@414..457 @@ -341,20 +350,23 @@ PLPGSQL@0..462 WHITESPACE@425..426 " " EXECUTE_KW@426..433 "execute" WHITESPACE@433..434 " " - CALL_EXPR@434..456 - NAME_REF@434..440 - FORMAT_KW@434..440 "format" - ARG_LIST@440..456 - L_PAREN@440..441 "(" - ARG@441..452 - LITERAL@441..452 - STRING@441..452 "'select %s'" - COMMA@452..453 "," - WHITESPACE@453..454 " " - ARG@454..455 - LITERAL@454..455 - INT_NUMBER@454..455 "1" - R_PAREN@455..456 ")" + PLPGSQL_EXPR@434..456 + TARGET_LIST@434..456 + TARGET@434..456 + CALL_EXPR@434..456 + NAME_REF@434..440 + FORMAT_KW@434..440 "format" + ARG_LIST@440..456 + L_PAREN@440..441 "(" + ARG@441..452 + LITERAL@441..452 + STRING@441..452 "'select %s'" + COMMA@452..453 "," + WHITESPACE@453..454 " " + ARG@454..455 + LITERAL@454..455 + INT_NUMBER@454..455 "1" + R_PAREN@455..456 ")" SEMICOLON@456..457 ";" WHITESPACE@457..458 "\n" END_KW@458..461 "end" @@ -431,8 +443,11 @@ PLPGSQL@0..49 WHITESPACE@38..39 " " COLON_EQ@39..41 ":=" WHITESPACE@41..42 " " - LITERAL@42..43 - INT_NUMBER@42..43 "1" + PLPGSQL_EXPR@42..43 + TARGET_LIST@42..43 + TARGET@42..43 + LITERAL@42..43 + INT_NUMBER@42..43 "1" SEMICOLON@43..44 ";" WHITESPACE@44..45 "\n" END_KW@45..48 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_perform_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_perform_stmt_ok.snap index 16d1870e..acd2079c 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_perform_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_perform_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..297 PLPGSQL_VAR_INIT@23..27 COLON_EQ@23..25 ":=" WHITESPACE@25..26 " " - LITERAL@26..27 - INT_NUMBER@26..27 "1" + PLPGSQL_EXPR@26..27 + TARGET_LIST@26..27 + TARGET@26..27 + LITERAL@26..27 + INT_NUMBER@26..27 "1" SEMICOLON@27..28 ";" WHITESPACE@28..29 "\n" BEGIN_KW@29..34 "begin" @@ -228,8 +231,11 @@ PLPGSQL@0..297 WHITESPACE@286..287 " " COLON_EQ@287..289 ":=" WHITESPACE@289..290 " " - LITERAL@290..291 - INT_NUMBER@290..291 "2" + PLPGSQL_EXPR@290..291 + TARGET_LIST@290..291 + TARGET@290..291 + LITERAL@290..291 + INT_NUMBER@290..291 "2" SEMICOLON@291..292 ";" WHITESPACE@292..293 "\n" END_KW@293..296 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_err.snap index 787ffebb..ddc50943 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_err.snap @@ -22,14 +22,17 @@ PLPGSQL@0..155 USING_KW@26..31 "using" WHITESPACE@31..32 " " ERROR@32..41 - BIN_EXPR@32..41 - NAME_REF@32..37 - IDENT@32..37 "bogus" - WHITESPACE@37..38 " " - EQ@38..39 "=" - WHITESPACE@39..40 " " - LITERAL@40..41 - INT_NUMBER@40..41 "1" + PLPGSQL_EXPR@32..41 + TARGET_LIST@32..41 + TARGET@32..41 + BIN_EXPR@32..41 + NAME_REF@32..37 + IDENT@32..37 "bogus" + WHITESPACE@37..38 " " + EQ@38..39 "=" + WHITESPACE@39..40 " " + LITERAL@40..41 + INT_NUMBER@40..41 "1" SEMICOLON@41..42 ";" WHITESPACE@42..45 "\n " PLPGSQL_RAISE_STMT@45..76 @@ -99,18 +102,10 @@ error[syntax-error]: expected EQ ╭▸ 4 │ raise notice 'x' using errcode; ╰╴ ━ -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -4 │ raise notice 'x' using errcode; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 4 │ raise notice 'x' using errcode; ╰╴ ━ -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -5 │ raise notice 'x' using errcode = ; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 5 │ raise notice 'x' using errcode = ; diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_ok.snap index c9301aeb..a6fc8e7d 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_raise_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..519 PLPGSQL_VAR_INIT@21..25 COLON_EQ@21..23 ":=" WHITESPACE@23..24 " " - LITERAL@24..25 - INT_NUMBER@24..25 "1" + PLPGSQL_EXPR@24..25 + TARGET_LIST@24..25 + TARGET@24..25 + LITERAL@24..25 + INT_NUMBER@24..25 "1" SEMICOLON@25..26 ";" WHITESPACE@26..27 "\n" BEGIN_KW@27..32 "begin" @@ -53,12 +56,18 @@ PLPGSQL@0..519 STRING@81..90 "'fmt % %'" COMMA@90..91 "," WHITESPACE@91..92 " " - LITERAL@92..93 - INT_NUMBER@92..93 "1" + PLPGSQL_EXPR@92..93 + TARGET_LIST@92..93 + TARGET@92..93 + LITERAL@92..93 + INT_NUMBER@92..93 "1" COMMA@93..94 "," WHITESPACE@94..95 " " - LITERAL@95..96 - INT_NUMBER@95..96 "2" + PLPGSQL_EXPR@95..96 + TARGET_LIST@95..96 + TARGET@95..96 + LITERAL@95..96 + INT_NUMBER@95..96 "2" SEMICOLON@96..97 ";" WHITESPACE@97..100 "\n " PLPGSQL_RAISE_STMT@100..117 @@ -87,8 +96,11 @@ PLPGSQL@0..519 WHITESPACE@156..157 " " COLON_EQ@157..159 ":=" WHITESPACE@159..160 " " - LITERAL@160..167 - STRING@160..167 "'22012'" + PLPGSQL_EXPR@160..167 + TARGET_LIST@160..167 + TARGET@160..167 + LITERAL@160..167 + STRING@160..167 "'22012'" SEMICOLON@167..168 ";" WHITESPACE@168..171 "\n " PLPGSQL_RAISE_STMT@171..231 @@ -105,8 +117,11 @@ PLPGSQL@0..519 WHITESPACE@198..199 " " EQ@199..200 "=" WHITESPACE@200..201 " " - LITERAL@201..204 - STRING@201..204 "'m'" + PLPGSQL_EXPR@201..204 + TARGET_LIST@201..204 + TARGET@201..204 + LITERAL@201..204 + STRING@201..204 "'m'" COMMA@204..205 "," WHITESPACE@205..206 " " PLPGSQL_RAISE_OPTION_DETAIL@206..218 @@ -114,8 +129,11 @@ PLPGSQL@0..519 WHITESPACE@212..213 " " EQ@213..214 "=" WHITESPACE@214..215 " " - LITERAL@215..218 - STRING@215..218 "'d'" + PLPGSQL_EXPR@215..218 + TARGET_LIST@215..218 + TARGET@215..218 + LITERAL@215..218 + STRING@215..218 "'d'" COMMA@218..219 "," WHITESPACE@219..220 " " PLPGSQL_RAISE_OPTION_HINT@220..230 @@ -123,8 +141,11 @@ PLPGSQL@0..519 WHITESPACE@224..225 " " EQ@225..226 "=" WHITESPACE@226..227 " " - LITERAL@227..230 - STRING@227..230 "'h'" + PLPGSQL_EXPR@227..230 + TARGET_LIST@227..230 + TARGET@227..230 + LITERAL@227..230 + STRING@227..230 "'h'" SEMICOLON@230..231 ";" WHITESPACE@231..234 "\n " PLPGSQL_RAISE_STMT@234..334 @@ -141,8 +162,11 @@ PLPGSQL@0..519 WHITESPACE@262..263 " " EQ@263..264 "=" WHITESPACE@264..265 " " - LITERAL@265..268 - STRING@265..268 "'c'" + PLPGSQL_EXPR@265..268 + TARGET_LIST@265..268 + TARGET@265..268 + LITERAL@265..268 + STRING@265..268 "'c'" COMMA@268..269 "," WHITESPACE@269..270 " " PLPGSQL_RAISE_OPTION_CONSTRAINT@270..286 @@ -150,8 +174,11 @@ PLPGSQL@0..519 WHITESPACE@280..281 " " EQ@281..282 "=" WHITESPACE@282..283 " " - LITERAL@283..286 - STRING@283..286 "'k'" + PLPGSQL_EXPR@283..286 + TARGET_LIST@283..286 + TARGET@283..286 + LITERAL@283..286 + STRING@283..286 "'k'" COMMA@286..287 "," WHITESPACE@287..288 " " PLPGSQL_RAISE_OPTION_DATATYPE@288..302 @@ -159,8 +186,11 @@ PLPGSQL@0..519 WHITESPACE@296..297 " " EQ@297..298 "=" WHITESPACE@298..299 " " - LITERAL@299..302 - STRING@299..302 "'d'" + PLPGSQL_EXPR@299..302 + TARGET_LIST@299..302 + TARGET@299..302 + LITERAL@299..302 + STRING@299..302 "'d'" COMMA@302..303 "," WHITESPACE@303..308 "\n " PLPGSQL_RAISE_OPTION_TABLE@308..319 @@ -168,8 +198,11 @@ PLPGSQL@0..519 WHITESPACE@313..314 " " EQ@314..315 "=" WHITESPACE@315..316 " " - LITERAL@316..319 - STRING@316..319 "'t'" + PLPGSQL_EXPR@316..319 + TARGET_LIST@316..319 + TARGET@316..319 + LITERAL@316..319 + STRING@316..319 "'t'" COMMA@319..320 "," WHITESPACE@320..321 " " PLPGSQL_RAISE_OPTION_SCHEMA@321..333 @@ -177,8 +210,11 @@ PLPGSQL@0..519 WHITESPACE@327..328 " " EQ@328..329 "=" WHITESPACE@329..330 " " - LITERAL@330..333 - STRING@330..333 "'s'" + PLPGSQL_EXPR@330..333 + TARGET_LIST@330..333 + TARGET@330..333 + LITERAL@330..333 + STRING@330..333 "'s'" SEMICOLON@333..334 ";" WHITESPACE@334..337 "\n " PLPGSQL_RAISE_STMT@337..360 @@ -252,8 +288,11 @@ PLPGSQL@0..519 WHITESPACE@489..490 " " EQ@490..491 "=" WHITESPACE@491..492 " " - LITERAL@492..499 - STRING@492..499 "'22012'" + PLPGSQL_EXPR@492..499 + TARGET_LIST@492..499 + TARGET@492..499 + LITERAL@492..499 + STRING@492..499 "'22012'" SEMICOLON@499..500 ";" WHITESPACE@500..503 "\n " PLPGSQL_ASSIGN_STMT@503..514 @@ -263,8 +302,11 @@ PLPGSQL@0..519 WHITESPACE@508..509 " " COLON_EQ@509..511 ":=" WHITESPACE@511..512 " " - LITERAL@512..513 - INT_NUMBER@512..513 "2" + PLPGSQL_EXPR@512..513 + TARGET_LIST@512..513 + TARGET@512..513 + LITERAL@512..513 + INT_NUMBER@512..513 "2" SEMICOLON@513..514 ";" WHITESPACE@514..515 "\n" END_KW@515..518 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_err.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_err.snap index 293a25a3..243a0772 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_err.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_err.snap @@ -12,11 +12,14 @@ PLPGSQL@0..121 RETURN_KW@9..15 "return" WHITESPACE@15..16 " " NEXT_KW@16..20 "next" - ARRAY_EXPR@20..23 - L_BRACK@20..21 "[" - LITERAL@21..22 - INT_NUMBER@21..22 "1" - R_BRACK@22..23 "]" + PLPGSQL_EXPR@20..23 + TARGET_LIST@20..23 + TARGET@20..23 + ARRAY_EXPR@20..23 + L_BRACK@20..21 "[" + LITERAL@21..22 + INT_NUMBER@21..22 "1" + R_BRACK@22..23 "]" SEMICOLON@23..24 ";" WHITESPACE@24..27 "\n " PLPGSQL_RETURN_QUERY_STMT@27..40 @@ -40,8 +43,11 @@ PLPGSQL@0..121 WHITESPACE@79..80 " " EXECUTE_KW@80..87 "execute" WHITESPACE@87..88 " " - LITERAL@88..98 - STRING@88..98 "'select 1'" + PLPGSQL_EXPR@88..98 + TARGET_LIST@88..98 + TARGET@88..98 + LITERAL@88..98 + STRING@88..98 "'select 1'" WHITESPACE@98..99 " " PLPGSQL_USING_CLAUSE@99..104 USING_KW@99..104 "using" @@ -50,8 +56,11 @@ PLPGSQL@0..121 PLPGSQL_RETURN_STMT@108..116 RETURN_KW@108..114 "return" WHITESPACE@114..115 " " - LITERAL@115..116 - INT_NUMBER@115..116 "1" + PLPGSQL_EXPR@115..116 + TARGET_LIST@115..116 + TARGET@115..116 + LITERAL@115..116 + INT_NUMBER@115..116 "1" WHITESPACE@116..117 "\n" END_KW@117..120 "end" WHITESPACE@120..121 "\n" @@ -64,18 +73,10 @@ error[syntax-error]: expected a query ╭▸ 4 │ return query; ╰╴ ━ -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -5 │ return query execute; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 5 │ return query execute; ╰╴ ━ -error[syntax-error]: expected an expression, found SEMICOLON - ╭▸ -6 │ return query execute 'select 1' using; - ╰╴ ━ error[syntax-error]: expected an expression ╭▸ 6 │ return query execute 'select 1' using; diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_ok.snap index 539b54db..8f6542c8 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_return_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..415 PLPGSQL_VAR_INIT@22..26 COLON_EQ@22..24 ":=" WHITESPACE@24..25 " " - LITERAL@25..26 - INT_NUMBER@25..26 "1" + PLPGSQL_EXPR@25..26 + TARGET_LIST@25..26 + TARGET@25..26 + LITERAL@25..26 + INT_NUMBER@25..26 "1" SEMICOLON@26..27 ";" WHITESPACE@27..30 "\n " PLPGSQL_VAR_DECL@30..39 @@ -44,40 +47,46 @@ PLPGSQL@0..415 PLPGSQL_RETURN_STMT@58..67 RETURN_KW@58..64 "return" WHITESPACE@64..65 " " - LITERAL@65..66 - INT_NUMBER@65..66 "1" + PLPGSQL_EXPR@65..66 + TARGET_LIST@65..66 + TARGET@65..66 + LITERAL@65..66 + INT_NUMBER@65..66 "1" SEMICOLON@66..67 ";" WHITESPACE@67..70 "\n " PLPGSQL_RETURN_STMT@70..106 RETURN_KW@70..76 "return" WHITESPACE@76..77 " " - PAREN_EXPR@77..105 - L_PAREN@77..78 "(" - SELECT@78..104 - SELECT_CLAUSE@78..92 - SELECT_KW@78..84 "select" - WHITESPACE@84..85 " " - TARGET_LIST@85..92 - TARGET@85..92 - CALL_EXPR@85..92 - NAME_REF@85..88 - IDENT@85..88 "max" - ARG_LIST@88..92 - L_PAREN@88..89 "(" - ARG@89..91 - NAME_REF@89..91 - IDENT@89..91 "f1" - R_PAREN@91..92 ")" - WHITESPACE@92..93 " " - FROM_CLAUSE@93..104 - FROM_KW@93..97 "from" - WHITESPACE@97..98 " " - RELATION_FROM_ITEM@98..104 - RELATION_NAME_REF@98..104 - PATH_REF@98..104 - PATH_SEGMENT_REF@98..104 - IDENT@98..104 "onecol" - R_PAREN@104..105 ")" + PLPGSQL_EXPR@77..105 + TARGET_LIST@77..105 + TARGET@77..105 + PAREN_EXPR@77..105 + L_PAREN@77..78 "(" + SELECT@78..104 + SELECT_CLAUSE@78..92 + SELECT_KW@78..84 "select" + WHITESPACE@84..85 " " + TARGET_LIST@85..92 + TARGET@85..92 + CALL_EXPR@85..92 + NAME_REF@85..88 + IDENT@85..88 "max" + ARG_LIST@88..92 + L_PAREN@88..89 "(" + ARG@89..91 + NAME_REF@89..91 + IDENT@89..91 "f1" + R_PAREN@91..92 ")" + WHITESPACE@92..93 " " + FROM_CLAUSE@93..104 + FROM_KW@93..97 "from" + WHITESPACE@97..98 " " + RELATION_FROM_ITEM@98..104 + RELATION_NAME_REF@98..104 + PATH_REF@98..104 + PATH_SEGMENT_REF@98..104 + IDENT@98..104 "onecol" + R_PAREN@104..105 ")" SEMICOLON@105..106 ";" WHITESPACE@106..109 "\n " PLPGSQL_RETURN_NEXT_STMT@109..121 @@ -91,19 +100,25 @@ PLPGSQL@0..415 WHITESPACE@130..131 " " NEXT_KW@131..135 "next" WHITESPACE@135..136 " " - LITERAL@136..137 - INT_NUMBER@136..137 "1" + PLPGSQL_EXPR@136..137 + TARGET_LIST@136..137 + TARGET@136..137 + LITERAL@136..137 + INT_NUMBER@136..137 "1" SEMICOLON@137..138 ";" WHITESPACE@138..141 "\n " PLPGSQL_RETURN_STMT@141..155 RETURN_KW@141..147 "return" WHITESPACE@147..148 " " - FIELD_EXPR@148..154 - NAME_REF@148..152 - NEXT_KW@148..152 "next" - DOT@152..153 "." - NAME_REF@153..154 - IDENT@153..154 "x" + PLPGSQL_EXPR@148..154 + TARGET_LIST@148..154 + TARGET@148..154 + FIELD_EXPR@148..154 + NAME_REF@148..152 + NEXT_KW@148..152 "next" + DOT@152..153 "." + NAME_REF@153..154 + IDENT@153..154 "x" SEMICOLON@154..155 ";" WHITESPACE@155..158 "\n " PLPGSQL_RETURN_QUERY_STMT@158..180 @@ -185,8 +200,11 @@ PLPGSQL@0..415 WHITESPACE@280..281 " " EXECUTE_KW@281..288 "execute" WHITESPACE@288..289 " " - LITERAL@289..299 - STRING@289..299 "'select 1'" + PLPGSQL_EXPR@289..299 + TARGET_LIST@289..299 + TARGET@289..299 + LITERAL@289..299 + STRING@289..299 "'select 1'" SEMICOLON@299..300 ";" WHITESPACE@300..303 "\n " PLPGSQL_RETURN_QUERY_EXECUTE_STMT@303..344 @@ -196,14 +214,20 @@ PLPGSQL@0..415 WHITESPACE@315..316 " " EXECUTE_KW@316..323 "execute" WHITESPACE@323..324 " " - LITERAL@324..335 - STRING@324..335 "'select $1'" + PLPGSQL_EXPR@324..335 + TARGET_LIST@324..335 + TARGET@324..335 + LITERAL@324..335 + STRING@324..335 "'select $1'" WHITESPACE@335..336 " " PLPGSQL_USING_CLAUSE@336..343 USING_KW@336..341 "using" WHITESPACE@341..342 " " - LITERAL@342..343 - INT_NUMBER@342..343 "7" + PLPGSQL_EXPR@342..343 + TARGET_LIST@342..343 + TARGET@342..343 + LITERAL@342..343 + INT_NUMBER@342..343 "7" SEMICOLON@343..344 ";" WHITESPACE@344..347 "\n " PLPGSQL_RETURN_QUERY_EXECUTE_STMT@347..395 @@ -213,18 +237,27 @@ PLPGSQL@0..415 WHITESPACE@359..360 " " EXECUTE_KW@360..367 "execute" WHITESPACE@367..368 " " - LITERAL@368..383 - STRING@368..383 "'select $1, $2'" + PLPGSQL_EXPR@368..383 + TARGET_LIST@368..383 + TARGET@368..383 + LITERAL@368..383 + STRING@368..383 "'select $1, $2'" WHITESPACE@383..384 " " PLPGSQL_USING_CLAUSE@384..394 USING_KW@384..389 "using" WHITESPACE@389..390 " " - LITERAL@390..391 - INT_NUMBER@390..391 "7" + PLPGSQL_EXPR@390..391 + TARGET_LIST@390..391 + TARGET@390..391 + LITERAL@390..391 + INT_NUMBER@390..391 "7" COMMA@391..392 "," WHITESPACE@392..393 " " - LITERAL@393..394 - INT_NUMBER@393..394 "8" + PLPGSQL_EXPR@393..394 + TARGET_LIST@393..394 + TARGET@393..394 + LITERAL@393..394 + INT_NUMBER@393..394 "8" SEMICOLON@394..395 ";" WHITESPACE@395..398 "\n " PLPGSQL_ASSIGN_STMT@398..410 @@ -234,8 +267,11 @@ PLPGSQL@0..415 WHITESPACE@404..405 " " COLON_EQ@405..407 ":=" WHITESPACE@407..408 " " - LITERAL@408..409 - INT_NUMBER@408..409 "2" + PLPGSQL_EXPR@408..409 + TARGET_LIST@408..409 + TARGET@408..409 + LITERAL@408..409 + INT_NUMBER@408..409 "2" SEMICOLON@409..410 ";" WHITESPACE@410..411 "\n" END_KW@411..414 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_transaction_stmt_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_transaction_stmt_ok.snap index d4e268dc..845806e4 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_transaction_stmt_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_transaction_stmt_ok.snap @@ -20,8 +20,11 @@ PLPGSQL@0..203 PLPGSQL_VAR_INIT@22..26 COLON_EQ@22..24 ":=" WHITESPACE@24..25 " " - LITERAL@25..26 - INT_NUMBER@25..26 "1" + PLPGSQL_EXPR@25..26 + TARGET_LIST@25..26 + TARGET@25..26 + LITERAL@25..26 + INT_NUMBER@25..26 "1" SEMICOLON@26..27 ";" WHITESPACE@27..30 "\n " PLPGSQL_VAR_DECL@30..48 @@ -36,8 +39,11 @@ PLPGSQL@0..203 PLPGSQL_VAR_INIT@43..47 COLON_EQ@43..45 ":=" WHITESPACE@45..46 " " - LITERAL@46..47 - INT_NUMBER@46..47 "1" + PLPGSQL_EXPR@46..47 + TARGET_LIST@46..47 + TARGET@46..47 + LITERAL@46..47 + INT_NUMBER@46..47 "1" SEMICOLON@47..48 ";" WHITESPACE@48..49 "\n" BEGIN_KW@49..54 "begin" @@ -98,8 +104,11 @@ PLPGSQL@0..203 WHITESPACE@175..176 " " COLON_EQ@176..178 ":=" WHITESPACE@178..179 " " - LITERAL@179..180 - INT_NUMBER@179..180 "2" + PLPGSQL_EXPR@179..180 + TARGET_LIST@179..180 + TARGET@179..180 + LITERAL@179..180 + INT_NUMBER@179..180 "2" SEMICOLON@180..181 ";" WHITESPACE@181..184 "\n " PLPGSQL_ASSIGN_STMT@184..198 @@ -109,8 +118,11 @@ PLPGSQL@0..203 WHITESPACE@192..193 " " COLON_EQ@193..195 ":=" WHITESPACE@195..196 " " - LITERAL@196..197 - INT_NUMBER@196..197 "3" + PLPGSQL_EXPR@196..197 + TARGET_LIST@196..197 + TARGET@196..197 + LITERAL@196..197 + INT_NUMBER@196..197 "3" SEMICOLON@197..198 ";" WHITESPACE@198..199 "\n" END_KW@199..202 "end" diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_var_decl_ok.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_var_decl_ok.snap index 9cadcc79..0964e086 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_var_decl_ok.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__plpgsql_var_decl_ok.snap @@ -32,8 +32,11 @@ PLPGSQL@0..159 PLPGSQL_VAR_INIT@36..42 COLON_EQ@36..38 ":=" WHITESPACE@38..39 " " - LITERAL@39..42 - STRING@39..42 "'x'" + PLPGSQL_EXPR@39..42 + TARGET_LIST@39..42 + TARGET@39..42 + LITERAL@39..42 + STRING@39..42 "'x'" SEMICOLON@42..43 ";" WHITESPACE@43..46 "\n " PLPGSQL_VAR_DECL@46..73 @@ -59,8 +62,11 @@ PLPGSQL@0..159 PLPGSQL_VAR_INIT@63..72 DEFAULT_KW@63..70 "default" WHITESPACE@70..71 " " - LITERAL@71..72 - INT_NUMBER@71..72 "0" + PLPGSQL_EXPR@71..72 + TARGET_LIST@71..72 + TARGET@71..72 + LITERAL@71..72 + INT_NUMBER@71..72 "0" SEMICOLON@72..73 ";" WHITESPACE@73..76 "\n " PLPGSQL_VAR_DECL@76..110 @@ -88,8 +94,11 @@ PLPGSQL@0..159 PLPGSQL_VAR_INIT@104..109 EQ@104..105 "=" WHITESPACE@105..106 " " - LITERAL@106..109 - STRING@106..109 "'y'" + PLPGSQL_EXPR@106..109 + TARGET_LIST@106..109 + TARGET@106..109 + LITERAL@106..109 + STRING@106..109 "'y'" SEMICOLON@109..110 ";" WHITESPACE@110..113 "\n " PLPGSQL_VAR_DECL@113..140 diff --git a/crates/squawk_syntax/src/test.rs b/crates/squawk_syntax/src/test.rs index 204fcdff..251cc850 100644 --- a/crates/squawk_syntax/src/test.rs +++ b/crates/squawk_syntax/src/test.rs @@ -271,8 +271,8 @@ fn plpgsql_suite_score() { assert_snapshot!(table, @" file bodies tokens unparsed err - plpgsql.sql 254 9746 846 73 - plpgsql_array.sql 26 913 42 19 + plpgsql.sql 254 9746 784 65 + plpgsql_array.sql 26 913 0 0 plpgsql_cache.sql 2 59 10 1 plpgsql_call.sql 45 1591 7 1 plpgsql_control.sql 27 1358 0 0 @@ -285,7 +285,7 @@ fn plpgsql_suite_score() { plpgsql_trap.sql 7 340 21 1 plpgsql_trigger.sql 1 55 0 0 plpgsql_varprops.sql 33 699 3 1 - total 549 18673 981 102 + total 549 18673 877 75 "); } diff --git a/crates/squawk_syntax/src/validation.rs b/crates/squawk_syntax/src/validation.rs index 7a7de69c..7e086369 100644 --- a/crates/squawk_syntax/src/validation.rs +++ b/crates/squawk_syntax/src/validation.rs @@ -11,7 +11,7 @@ use either::Either; use crate::ast::{AstNode, LitKind, PrefixOp}; use crate::unescape::{escape_unicode_esc_str, uescape_char}; use crate::{SyntaxNode, SyntaxToken, ast, match_ast, syntax_error::SyntaxError}; -use rowan::{TextRange, TextSize}; +use rowan::{TextRange, TextSize, WalkEvent}; use squawk_parser::{ SyntaxKind::*, is_col_name_keyword, is_reserved_keyword, is_type_func_name_keyword, }; @@ -53,7 +53,7 @@ pub(crate) fn validate(root: &SyntaxNode, errors: &mut Vec) { ast::PlpgsqlCompOptionPrintStrictParams(it) => { validate_print_strict_params(it, errors) }, - ast::PlpgsqlCaseWhen(it) => validate_no_bare_case_in_conds(it, errors), + ast::PlpgsqlCaseWhen(it) => validate_no_bare_case(it.cond(), errors), ast::PlpgsqlElsifClause(it) => validate_no_bare_case(it.cond(), errors), ast::PlpgsqlFetchStmt(it) => { validate_fetch_no_strict(it.into_clause(), errors); @@ -450,22 +450,20 @@ fn validate_for_query_no_reverse(it: ast::PlpgsqlForQueryStmt, acc: &mut Vec) { - for cond in it.conds() { - validate_no_bare_case(Some(cond), acc); - } -} - // -- err // if case when a then 1 end then // -- ok // if (case when a then 1 end) then -fn validate_no_bare_case(cond: Option, acc: &mut Vec) { +fn validate_no_bare_case(cond: Option, acc: &mut Vec) { let Some(cond) = cond else { return; }; let mut depth = 0i32; - for element in cond.syntax().descendants_with_tokens() { + let mut preorder = cond.syntax().preorder_with_tokens(); + while let Some(event) = preorder.next() { + let WalkEvent::Enter(element) = event else { + continue; + }; match element.kind() { L_PAREN | L_BRACK => depth += 1, R_PAREN | R_BRACK => depth -= 1, @@ -474,7 +472,7 @@ fn validate_no_bare_case(cond: Option, acc: &mut Vec) { "CASE expression must be parenthesized", element.text_range(), )); - return; + preorder.skip_subtree(); } _ => (), }