diff --git a/crates/squawk_linter/src/analyze.rs b/crates/squawk_linter/src/analyze.rs index ef663f45..539dfd9c 100644 --- a/crates/squawk_linter/src/analyze.rs +++ b/crates/squawk_linter/src/analyze.rs @@ -207,6 +207,7 @@ pub fn possibly_slow_stmt(stmt: &ast::Stmt) -> bool { | ast::Stmt::SetSessionAuth(_) | ast::Stmt::SetTransaction(_) | ast::Stmt::Show(_) + | ast::Stmt::Table(_) | ast::Stmt::Unlisten(_) | ast::Stmt::Update(_) | ast::Stmt::Values(_) => false, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 1c3fd1bb..2d851bec 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -11361,7 +11361,7 @@ fn move_(p: &mut Parser<'_>) -> CompletedMarker { opt_direction(p); let _ = p.eat(FROM_KW) || p.eat(IN_KW); // cursor_name - name(p); + name_ref(p); m.complete(p, MOVE) } @@ -11388,7 +11388,7 @@ fn fetch(p: &mut Parser<'_>) -> CompletedMarker { opt_direction(p); let _ = p.eat(FROM_KW) || p.eat(IN_KW); // cursor_name - name(p); + name_ref(p); m.complete(p, FETCH) } @@ -12272,7 +12272,7 @@ fn opt_where_current_of(p: &mut Parser<'_>) { if p.eat(WHERE_KW) { if p.eat(CURRENT_KW) { p.expect(OF_KW); - ident(p); + name_ref(p); } } } diff --git a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap index affaa102..dcf8473a 100644 --- a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap @@ -481,7 +481,8 @@ SOURCE_FILE WHITESPACE " " OF_KW "of" WHITESPACE " " - IDENT "invoice_cursor" + NAME_REF + IDENT "invoice_cursor" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- returning" @@ -934,7 +935,8 @@ SOURCE_FILE WHITESPACE " " OF_KW "OF" WHITESPACE " " - IDENT "c_tasks" + NAME_REF + IDENT "c_tasks" SEMICOLON ";" WHITESPACE "\n\n" DELETE diff --git a/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap b/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap index 1acb9c71..95112918 100644 --- a/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap @@ -12,7 +12,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "from" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -23,7 +23,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "from" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -34,7 +34,7 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -43,7 +43,7 @@ SOURCE_FILE WHITESPACE " " PRIOR_KW "prior" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n\n" @@ -54,7 +54,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -65,7 +65,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -76,7 +76,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -87,7 +87,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -101,7 +101,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -115,7 +115,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -127,7 +127,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -138,7 +138,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -149,7 +149,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -163,7 +163,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -176,7 +176,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -187,7 +187,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -201,7 +201,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -214,7 +214,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__move_ok.snap b/crates/squawk_parser/tests/snapshots/tests__move_ok.snap index 69ca682e..155d233a 100644 --- a/crates/squawk_parser/tests/snapshots/tests__move_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__move_ok.snap @@ -12,7 +12,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "from" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -23,7 +23,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "from" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -34,7 +34,7 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -43,7 +43,7 @@ SOURCE_FILE WHITESPACE " " PRIOR_KW "prior" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n\n" @@ -54,7 +54,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -65,7 +65,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -76,7 +76,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -87,7 +87,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -101,7 +101,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -115,7 +115,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -127,7 +127,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -138,7 +138,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -149,7 +149,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -163,7 +163,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -176,7 +176,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -187,7 +187,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -201,7 +201,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n" @@ -214,7 +214,7 @@ SOURCE_FILE WHITESPACE " " FROM_KW "FROM" WHITESPACE " " - NAME + NAME_REF IDENT "cursor_name" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap index dbedc323..cc237f31 100644 --- a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap @@ -1120,7 +1120,8 @@ SOURCE_FILE WHITESPACE " " OF_KW "OF" WHITESPACE " " - IDENT "c_films" + NAME_REF + IDENT "c_films" SEMICOLON ";" WHITESPACE "\n\n" UPDATE diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index a175d530..e4688ef1 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -3129,10 +3129,50 @@ pub struct Delete { pub(crate) syntax: SyntaxNode, } impl Delete { + #[inline] + pub fn alias(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn relation_name(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn returning_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn using_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn current_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::CURRENT_KW) + } #[inline] pub fn delete_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::DELETE_KW) } + #[inline] + pub fn from_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FROM_KW) + } + #[inline] + pub fn of_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::OF_KW) + } + #[inline] + pub fn where_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WHERE_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -5277,10 +5317,66 @@ pub struct Insert { pub(crate) syntax: SyntaxNode, } impl Insert { + #[inline] + pub fn alias(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn column_list(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn relation_name(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn stmt(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn values(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn conflict_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::CONFLICT_KW) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } #[inline] pub fn insert_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::INSERT_KW) } + #[inline] + pub fn into_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::INTO_KW) + } + #[inline] + pub fn on_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ON_KW) + } + #[inline] + pub fn overriding_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::OVERRIDING_KW) + } + #[inline] + pub fn system_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SYSTEM_KW) + } + #[inline] + pub fn user_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::USER_KW) + } + #[inline] + pub fn value_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::VALUE_KW) + } + #[inline] + pub fn values_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::VALUES_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -6470,7 +6566,7 @@ impl Merge { support::children(&self.syntax) } #[inline] - pub fn name_ref(&self) -> Option { + pub fn relation_name(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -6478,10 +6574,6 @@ impl Merge { support::child(&self.syntax) } #[inline] - pub fn star_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::STAR) - } - #[inline] pub fn into_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::INTO_KW) } @@ -6489,10 +6581,6 @@ impl Merge { pub fn merge_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::MERGE_KW) } - #[inline] - pub fn only_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ONLY_KW) - } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -9491,6 +9579,10 @@ pub struct Table { pub(crate) syntax: SyntaxNode, } impl Table { + #[inline] + pub fn relation_name(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn table_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::TABLE_KW) @@ -10760,6 +10852,7 @@ pub enum Stmt { SetSessionAuth(SetSessionAuth), SetTransaction(SetTransaction), Show(Show), + Table(Table), Truncate(Truncate), Unlisten(Unlisten), Update(Update), @@ -21906,6 +21999,7 @@ impl AstNode for Stmt { | SyntaxKind::SET_SESSION_AUTH | SyntaxKind::SET_TRANSACTION | SyntaxKind::SHOW + | SyntaxKind::TABLE | SyntaxKind::TRUNCATE | SyntaxKind::UNLISTEN | SyntaxKind::UPDATE @@ -22157,6 +22251,7 @@ impl AstNode for Stmt { SyntaxKind::SET_SESSION_AUTH => Stmt::SetSessionAuth(SetSessionAuth { syntax }), SyntaxKind::SET_TRANSACTION => Stmt::SetTransaction(SetTransaction { syntax }), SyntaxKind::SHOW => Stmt::Show(Show { syntax }), + SyntaxKind::TABLE => Stmt::Table(Table { syntax }), SyntaxKind::TRUNCATE => Stmt::Truncate(Truncate { syntax }), SyntaxKind::UNLISTEN => Stmt::Unlisten(Unlisten { syntax }), SyntaxKind::UPDATE => Stmt::Update(Update { syntax }), @@ -22344,6 +22439,7 @@ impl AstNode for Stmt { Stmt::SetSessionAuth(it) => &it.syntax, Stmt::SetTransaction(it) => &it.syntax, Stmt::Show(it) => &it.syntax, + Stmt::Table(it) => &it.syntax, Stmt::Truncate(it) => &it.syntax, Stmt::Unlisten(it) => &it.syntax, Stmt::Update(it) => &it.syntax, @@ -23390,6 +23486,12 @@ impl From for Stmt { Stmt::Show(node) } } +impl From for Stmt { + #[inline] + fn from(node: Table) -> Stmt { + Stmt::Table(node) + } +} impl From for Stmt { #[inline] fn from(node: Truncate) -> Stmt { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 92fe2683..1eba38dc 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -909,10 +909,13 @@ Values = 'values' RowList Table = - 'table' + 'table' RelationName Insert = - 'insert' + 'insert' 'into' RelationName Alias? ColumnList? + ('overriding' ('system' | 'user') 'value')? + ('default' 'values' | Values | Stmt) + ('on' 'conflict')? Update = 'update' @@ -923,7 +926,10 @@ ReturningClause = TargetList? Delete = - 'delete' + 'delete' 'from' RelationName Alias? + UsingClause? + ('where' Expr | 'where' 'current' 'of' NameRef)? + ReturningClause? Notify = 'notify' @@ -964,7 +970,7 @@ MergeAction = | MergeDoNothing Merge = - 'merge' 'into' 'only'? NameRef '*'? Alias? + 'merge' 'into' RelationName Alias? UsingClause MergeWhenClause* @@ -2115,6 +2121,7 @@ Stmt = | Show // We don't include this and instead merge it into Begin // | StartTransaction +| Table | Truncate | Unlisten | Update