|
18 | 18 | use crate::ast::helpers::attached_token::AttachedToken;
|
19 | 19 | use crate::ast::{
|
20 | 20 | BeginEndStatements, ConditionalStatementBlock, ConditionalStatements, IfStatement, Statement,
|
| 21 | + TriggerObject, |
21 | 22 | };
|
22 | 23 | use crate::dialect::Dialect;
|
23 | 24 | use crate::keywords::{self, Keyword};
|
@@ -125,6 +126,15 @@ impl Dialect for MsSqlDialect {
|
125 | 126 | fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
|
126 | 127 | if parser.peek_keyword(Keyword::IF) {
|
127 | 128 | 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)) |
128 | 138 | } else {
|
129 | 139 | None
|
130 | 140 | }
|
@@ -215,6 +225,59 @@ impl MsSqlDialect {
|
215 | 225 | }))
|
216 | 226 | }
|
217 | 227 |
|
| 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 | + |
218 | 281 | /// Parse a sequence of statements, optionally separated by semicolon.
|
219 | 282 | ///
|
220 | 283 | /// Stops parsing when reaching EOF or the given keyword.
|
|
0 commit comments