|
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,8 @@ 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.peek_keyword(Keyword::CREATE) { |
| 130 | + self.parse_create(parser) |
128 | 131 | } else {
|
129 | 132 | None
|
130 | 133 | }
|
@@ -215,6 +218,78 @@ impl MsSqlDialect {
|
215 | 218 | }))
|
216 | 219 | }
|
217 | 220 |
|
| 221 | + /// Parse a SQL CREATE statement |
| 222 | + fn parse_create(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> { |
| 223 | + let original_index = parser.index(); |
| 224 | + |
| 225 | + if !parser.parse_keyword(Keyword::CREATE) { |
| 226 | + parser.set_index(original_index); |
| 227 | + return None; |
| 228 | + } |
| 229 | + |
| 230 | + let or_alter = parser.parse_keywords(&[Keyword::OR, Keyword::ALTER]); |
| 231 | + |
| 232 | + if parser.parse_keyword(Keyword::TRIGGER) { |
| 233 | + return Some(self.parse_create_trigger(parser, or_alter)); |
| 234 | + } |
| 235 | + |
| 236 | + parser.set_index(original_index); |
| 237 | + None |
| 238 | + } |
| 239 | + |
| 240 | + /// Parse `CREATE TRIGGER` for [MsSql] |
| 241 | + /// |
| 242 | + /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql |
| 243 | + fn parse_create_trigger( |
| 244 | + &self, |
| 245 | + parser: &mut Parser, |
| 246 | + or_alter: bool, |
| 247 | + ) -> Result<Statement, ParserError> { |
| 248 | + let name = parser.parse_object_name(false)?; |
| 249 | + parser.expect_keyword_is(Keyword::ON)?; |
| 250 | + let table_name = parser.parse_object_name(false)?; |
| 251 | + let period = parser.parse_trigger_period()?; |
| 252 | + let events = parser.parse_comma_separated(Parser::parse_trigger_event)?; |
| 253 | + |
| 254 | + parser.expect_keyword_is(Keyword::AS)?; |
| 255 | + |
| 256 | + let trigger_statements_body = if parser.peek_keyword(Keyword::BEGIN) { |
| 257 | + let begin_token = parser.expect_keyword(Keyword::BEGIN)?; |
| 258 | + let statements = parser.parse_statement_list(&[Keyword::END])?; |
| 259 | + let end_token = parser.expect_keyword(Keyword::END)?; |
| 260 | + |
| 261 | + BeginEndStatements { |
| 262 | + begin_token: AttachedToken(begin_token), |
| 263 | + statements, |
| 264 | + end_token: AttachedToken(end_token), |
| 265 | + } |
| 266 | + } else { |
| 267 | + BeginEndStatements { |
| 268 | + begin_token: AttachedToken::empty(), |
| 269 | + statements: vec![parser.parse_statement()?], |
| 270 | + end_token: AttachedToken::empty(), |
| 271 | + } |
| 272 | + }; |
| 273 | + |
| 274 | + Ok(Statement::CreateTrigger { |
| 275 | + or_alter, |
| 276 | + or_replace: false, |
| 277 | + is_constraint: false, |
| 278 | + name, |
| 279 | + period, |
| 280 | + events, |
| 281 | + table_name, |
| 282 | + referenced_table_name: None, |
| 283 | + referencing: Vec::new(), |
| 284 | + trigger_object: TriggerObject::Statement, |
| 285 | + include_each: false, |
| 286 | + condition: None, |
| 287 | + exec_body: None, |
| 288 | + statements: Some(trigger_statements_body), |
| 289 | + characteristics: None, |
| 290 | + }) |
| 291 | + } |
| 292 | + |
218 | 293 | /// Parse a sequence of statements, optionally separated by semicolon.
|
219 | 294 | ///
|
220 | 295 | /// Stops parsing when reaching EOF or the given keyword.
|
|
0 commit comments