Skip to content

Commit 782a9de

Browse files
committed
Move parse_mssql_create_trigger into MsSqlDialect
1 parent 1af22a4 commit 782a9de

File tree

2 files changed

+63
-58
lines changed

2 files changed

+63
-58
lines changed

src/dialect/mssql.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use crate::ast::helpers::attached_token::AttachedToken;
1919
use crate::ast::{
2020
BeginEndStatements, ConditionalStatementBlock, ConditionalStatements, IfStatement, Statement,
21+
TriggerObject,
2122
};
2223
use crate::dialect::Dialect;
2324
use crate::keywords::{self, Keyword};
@@ -125,6 +126,15 @@ impl Dialect for MsSqlDialect {
125126
fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
126127
if parser.peek_keyword(Keyword::IF) {
127128
Some(self.parse_if_stmt(parser))
129+
} else if parser.parse_keywords(&[Keyword::CREATE, Keyword::TRIGGER]) {
130+
Some(self.parse_create_trigger(parser, false))
131+
} else if parser.parse_keywords(&[
132+
Keyword::CREATE,
133+
Keyword::OR,
134+
Keyword::ALTER,
135+
Keyword::TRIGGER,
136+
]) {
137+
Some(self.parse_create_trigger(parser, true))
128138
} else {
129139
None
130140
}
@@ -215,6 +225,59 @@ impl MsSqlDialect {
215225
}))
216226
}
217227

228+
/// Parse `CREATE TRIGGER` for [MsSql]
229+
///
230+
/// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
231+
fn parse_create_trigger(
232+
&self,
233+
parser: &mut Parser,
234+
or_alter: bool,
235+
) -> Result<Statement, ParserError> {
236+
let name = parser.parse_object_name(false)?;
237+
parser.expect_keyword_is(Keyword::ON)?;
238+
let table_name = parser.parse_object_name(false)?;
239+
let period = parser.parse_trigger_period()?;
240+
let events = parser.parse_comma_separated(Parser::parse_trigger_event)?;
241+
242+
parser.expect_keyword_is(Keyword::AS)?;
243+
244+
let trigger_statements_body = if parser.peek_keyword(Keyword::BEGIN) {
245+
let begin_token = parser.expect_keyword(Keyword::BEGIN)?;
246+
let statements = parser.parse_statement_list(&[Keyword::END])?;
247+
let end_token = parser.expect_keyword(Keyword::END)?;
248+
249+
BeginEndStatements {
250+
begin_token: AttachedToken(begin_token),
251+
statements,
252+
end_token: AttachedToken(end_token),
253+
}
254+
} else {
255+
BeginEndStatements {
256+
begin_token: AttachedToken::empty(),
257+
statements: vec![parser.parse_statement()?],
258+
end_token: AttachedToken::empty(),
259+
}
260+
};
261+
262+
Ok(Statement::CreateTrigger {
263+
or_alter,
264+
or_replace: false,
265+
is_constraint: false,
266+
name,
267+
period,
268+
events,
269+
table_name,
270+
referenced_table_name: None,
271+
referencing: Vec::new(),
272+
trigger_object: TriggerObject::Statement,
273+
include_each: false,
274+
condition: None,
275+
exec_body: None,
276+
statements: Some(trigger_statements_body),
277+
characteristics: None,
278+
})
279+
}
280+
218281
/// Parse a sequence of statements, optionally separated by semicolon.
219282
///
220283
/// Stops parsing when reaching EOF or the given keyword.

src/parser/mod.rs

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5323,10 +5323,6 @@ impl<'a> Parser<'a> {
53235323
return self.expected("an object type after CREATE", self.peek_token());
53245324
}
53255325

5326-
if dialect_of!(self is MsSqlDialect) {
5327-
return self.parse_mssql_create_trigger(or_alter, or_replace, is_constraint);
5328-
}
5329-
53305326
let name = self.parse_object_name(false)?;
53315327
let period = self.parse_trigger_period()?;
53325328

@@ -5386,60 +5382,6 @@ impl<'a> Parser<'a> {
53865382
})
53875383
}
53885384

5389-
/// Parse `CREATE TRIGGER` for [MsSql]
5390-
///
5391-
/// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
5392-
pub fn parse_mssql_create_trigger(
5393-
&mut self,
5394-
or_alter: bool,
5395-
or_replace: bool,
5396-
is_constraint: bool,
5397-
) -> Result<Statement, ParserError> {
5398-
let name = self.parse_object_name(false)?;
5399-
self.expect_keyword_is(Keyword::ON)?;
5400-
let table_name = self.parse_object_name(false)?;
5401-
let period = self.parse_trigger_period()?;
5402-
let events = self.parse_comma_separated(Parser::parse_trigger_event)?;
5403-
5404-
self.expect_keyword_is(Keyword::AS)?;
5405-
5406-
let trigger_statements_body = if self.peek_keyword(Keyword::BEGIN) {
5407-
let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5408-
let statements = self.parse_statement_list(&[Keyword::END])?;
5409-
let end_token = self.expect_keyword(Keyword::END)?;
5410-
5411-
BeginEndStatements {
5412-
begin_token: AttachedToken(begin_token),
5413-
statements,
5414-
end_token: AttachedToken(end_token),
5415-
}
5416-
} else {
5417-
BeginEndStatements {
5418-
begin_token: AttachedToken::empty(),
5419-
statements: vec![self.parse_statement()?],
5420-
end_token: AttachedToken::empty(),
5421-
}
5422-
};
5423-
5424-
Ok(Statement::CreateTrigger {
5425-
or_alter,
5426-
or_replace,
5427-
is_constraint,
5428-
name,
5429-
period,
5430-
events,
5431-
table_name,
5432-
referenced_table_name: None,
5433-
referencing: Vec::new(),
5434-
trigger_object: TriggerObject::Statement,
5435-
include_each: false,
5436-
condition: None,
5437-
exec_body: None,
5438-
statements: Some(trigger_statements_body),
5439-
characteristics: None,
5440-
})
5441-
}
5442-
54435385
pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
54445386
Ok(
54455387
match self.expect_one_of_keywords(&[

0 commit comments

Comments
 (0)