Skip to content

Commit ad33c83

Browse files
committed
Add OR ALTER support for CREATE TRIGGER
1 parent 3a9029a commit ad33c83

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

src/ast/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3660,6 +3660,10 @@ pub enum Statement {
36603660
/// Postgres: <https://www.postgresql.org/docs/current/sql-createtrigger.html>
36613661
/// SQL Server: <https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql>
36623662
CreateTrigger {
3663+
/// True if this is a `CREATE OR ALTER TRIGGER` statement
3664+
///
3665+
/// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver16#arguments)
3666+
or_alter: bool,
36633667
/// The `OR REPLACE` clause is used to re-create the trigger if it already exists.
36643668
///
36653669
/// Example:
@@ -4510,6 +4514,7 @@ impl fmt::Display for Statement {
45104514
}
45114515
Statement::CreateFunction(create_function) => create_function.fmt(f),
45124516
Statement::CreateTrigger {
4517+
or_alter,
45134518
or_replace,
45144519
is_constraint,
45154520
name,
@@ -4527,7 +4532,8 @@ impl fmt::Display for Statement {
45274532
} => {
45284533
write!(
45294534
f,
4530-
"CREATE {or_replace}{is_constraint}TRIGGER {name} ",
4535+
"CREATE {or_alter}{or_replace}{is_constraint}TRIGGER {name} ",
4536+
or_alter = if *or_alter { "OR ALTER " } else { "" },
45314537
or_replace = if *or_replace { "OR REPLACE " } else { "" },
45324538
is_constraint = if *is_constraint { "CONSTRAINT " } else { "" },
45334539
)?;

src/parser/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4572,9 +4572,9 @@ impl<'a> Parser<'a> {
45724572
} else if self.parse_keyword(Keyword::FUNCTION) {
45734573
self.parse_create_function(or_alter, or_replace, temporary)
45744574
} else if self.parse_keyword(Keyword::TRIGGER) {
4575-
self.parse_create_trigger(or_replace, false)
4575+
self.parse_create_trigger(or_alter, or_replace, false)
45764576
} else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
4577-
self.parse_create_trigger(or_replace, true)
4577+
self.parse_create_trigger(or_alter, or_replace, true)
45784578
} else if self.parse_keyword(Keyword::MACRO) {
45794579
self.parse_create_macro(or_replace, temporary)
45804580
} else if self.parse_keyword(Keyword::SECRET) {
@@ -5275,6 +5275,7 @@ impl<'a> Parser<'a> {
52755275

52765276
pub fn parse_create_trigger(
52775277
&mut self,
5278+
or_alter: bool,
52785279
or_replace: bool,
52795280
is_constraint: bool,
52805281
) -> Result<Statement, ParserError> {
@@ -5284,7 +5285,7 @@ impl<'a> Parser<'a> {
52845285
}
52855286

52865287
if dialect_of!(self is MsSqlDialect) {
5287-
return self.parse_mssql_create_trigger(or_replace, is_constraint);
5288+
return self.parse_mssql_create_trigger(or_alter, or_replace, is_constraint);
52885289
}
52895290

52905291
let name = self.parse_object_name(false)?;
@@ -5328,6 +5329,7 @@ impl<'a> Parser<'a> {
53285329
let exec_body = self.parse_trigger_exec_body()?;
53295330

53305331
Ok(Statement::CreateTrigger {
5332+
or_alter,
53315333
or_replace,
53325334
is_constraint,
53335335
name,
@@ -5350,6 +5352,7 @@ impl<'a> Parser<'a> {
53505352
/// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
53515353
pub fn parse_mssql_create_trigger(
53525354
&mut self,
5355+
or_alter: bool,
53535356
or_replace: bool,
53545357
is_constraint: bool,
53555358
) -> Result<Statement, ParserError> {
@@ -5380,6 +5383,7 @@ impl<'a> Parser<'a> {
53805383
};
53815384

53825385
Ok(Statement::CreateTrigger {
5386+
or_alter,
53835387
or_replace,
53845388
is_constraint,
53855389
name,

tests/sqlparser_mssql.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2128,7 +2128,7 @@ fn parse_mssql_merge_with_output() {
21282128
#[test]
21292129
fn parse_create_trigger() {
21302130
let create_trigger = "\
2131-
CREATE TRIGGER reminder1 \
2131+
CREATE OR ALTER TRIGGER reminder1 \
21322132
ON Sales.Customer \
21332133
AFTER INSERT, UPDATE \
21342134
AS RAISERROR('Notify Customer Relations', 16, 10);\
@@ -2137,6 +2137,7 @@ fn parse_create_trigger() {
21372137
assert_eq!(
21382138
create_stmt,
21392139
Statement::CreateTrigger {
2140+
or_alter: true,
21402141
or_replace: false,
21412142
is_constraint: false,
21422143
name: ObjectName::from(vec![Ident::new("reminder1")]),

tests/sqlparser_mysql.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3521,6 +3521,7 @@ fn parse_create_trigger() {
35213521
assert_eq!(
35223522
create_stmt,
35233523
Statement::CreateTrigger {
3524+
or_alter: false,
35243525
or_replace: false,
35253526
is_constraint: false,
35263527
name: ObjectName::from(vec![Ident::new("emp_stamp")]),

tests/sqlparser_postgres.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5084,6 +5084,7 @@ fn test_escaped_string_literal() {
50845084
fn parse_create_simple_before_insert_trigger() {
50855085
let sql = "CREATE TRIGGER check_insert BEFORE INSERT ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_insert";
50865086
let expected = Statement::CreateTrigger {
5087+
or_alter: false,
50875088
or_replace: false,
50885089
is_constraint: false,
50895090
name: ObjectName::from(vec![Ident::new("check_insert")]),
@@ -5113,6 +5114,7 @@ fn parse_create_simple_before_insert_trigger() {
51135114
fn parse_create_after_update_trigger_with_condition() {
51145115
let sql = "CREATE TRIGGER check_update AFTER UPDATE ON accounts FOR EACH ROW WHEN (NEW.balance > 10000) EXECUTE FUNCTION check_account_update";
51155116
let expected = Statement::CreateTrigger {
5117+
or_alter: false,
51165118
or_replace: false,
51175119
is_constraint: false,
51185120
name: ObjectName::from(vec![Ident::new("check_update")]),
@@ -5149,6 +5151,7 @@ fn parse_create_after_update_trigger_with_condition() {
51495151
fn parse_create_instead_of_delete_trigger() {
51505152
let sql = "CREATE TRIGGER check_delete INSTEAD OF DELETE ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_deletes";
51515153
let expected = Statement::CreateTrigger {
5154+
or_alter: false,
51525155
or_replace: false,
51535156
is_constraint: false,
51545157
name: ObjectName::from(vec![Ident::new("check_delete")]),
@@ -5178,6 +5181,7 @@ fn parse_create_instead_of_delete_trigger() {
51785181
fn parse_create_trigger_with_multiple_events_and_deferrable() {
51795182
let sql = "CREATE CONSTRAINT TRIGGER check_multiple_events BEFORE INSERT OR UPDATE OR DELETE ON accounts DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_account_changes";
51805183
let expected = Statement::CreateTrigger {
5184+
or_alter: false,
51815185
or_replace: false,
51825186
is_constraint: true,
51835187
name: ObjectName::from(vec![Ident::new("check_multiple_events")]),
@@ -5215,6 +5219,7 @@ fn parse_create_trigger_with_multiple_events_and_deferrable() {
52155219
fn parse_create_trigger_with_referencing() {
52165220
let sql = "CREATE TRIGGER check_referencing BEFORE INSERT ON accounts REFERENCING NEW TABLE AS new_accounts OLD TABLE AS old_accounts FOR EACH ROW EXECUTE FUNCTION check_account_referencing";
52175221
let expected = Statement::CreateTrigger {
5222+
or_alter: false,
52185223
or_replace: false,
52195224
is_constraint: false,
52205225
name: ObjectName::from(vec![Ident::new("check_referencing")]),
@@ -5528,6 +5533,7 @@ fn parse_trigger_related_functions() {
55285533
assert_eq!(
55295534
create_trigger,
55305535
Statement::CreateTrigger {
5536+
or_alter: false,
55315537
or_replace: false,
55325538
is_constraint: false,
55335539
name: ObjectName::from(vec![Ident::new("emp_stamp")]),

0 commit comments

Comments
 (0)