Skip to content

Commit dc7eef0

Browse files
committed
Move parse_mssql_create_trigger into MsSqlDialect
1 parent d042e88 commit dc7eef0

File tree

2 files changed

+63
-58
lines changed

2 files changed

+63
-58
lines changed

src/dialect/mssql.rs

+63
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

-58
Original file line numberDiff line numberDiff line change
@@ -5265,10 +5265,6 @@ impl<'a> Parser<'a> {
52655265
return self.expected("an object type after CREATE", self.peek_token());
52665266
}
52675267

5268-
if dialect_of!(self is MsSqlDialect) {
5269-
return self.parse_mssql_create_trigger(or_alter, or_replace, is_constraint);
5270-
}
5271-
52725268
let name = self.parse_object_name(false)?;
52735269
let period = self.parse_trigger_period()?;
52745270

@@ -5328,60 +5324,6 @@ impl<'a> Parser<'a> {
53285324
})
53295325
}
53305326

5331-
/// Parse `CREATE TRIGGER` for [MsSql]
5332-
///
5333-
/// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
5334-
pub fn parse_mssql_create_trigger(
5335-
&mut self,
5336-
or_alter: bool,
5337-
or_replace: bool,
5338-
is_constraint: bool,
5339-
) -> Result<Statement, ParserError> {
5340-
let name = self.parse_object_name(false)?;
5341-
self.expect_keyword_is(Keyword::ON)?;
5342-
let table_name = self.parse_object_name(false)?;
5343-
let period = self.parse_trigger_period()?;
5344-
let events = self.parse_comma_separated(Parser::parse_trigger_event)?;
5345-
5346-
self.expect_keyword_is(Keyword::AS)?;
5347-
5348-
let trigger_statements_body = if self.peek_keyword(Keyword::BEGIN) {
5349-
let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5350-
let statements = self.parse_statement_list(&[Keyword::END])?;
5351-
let end_token = self.expect_keyword(Keyword::END)?;
5352-
5353-
BeginEndStatements {
5354-
begin_token: AttachedToken(begin_token),
5355-
statements,
5356-
end_token: AttachedToken(end_token),
5357-
}
5358-
} else {
5359-
BeginEndStatements {
5360-
begin_token: AttachedToken::empty(),
5361-
statements: vec![self.parse_statement()?],
5362-
end_token: AttachedToken::empty(),
5363-
}
5364-
};
5365-
5366-
Ok(Statement::CreateTrigger {
5367-
or_alter,
5368-
or_replace,
5369-
is_constraint,
5370-
name,
5371-
period,
5372-
events,
5373-
table_name,
5374-
referenced_table_name: None,
5375-
referencing: Vec::new(),
5376-
trigger_object: TriggerObject::Statement,
5377-
include_each: false,
5378-
condition: None,
5379-
exec_body: None,
5380-
statements: Some(trigger_statements_body),
5381-
characteristics: None,
5382-
})
5383-
}
5384-
53855327
pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
53865328
Ok(
53875329
match self.expect_one_of_keywords(&[

0 commit comments

Comments
 (0)