Skip to content

Commit 1af22a4

Browse files
committed
Add OR ALTER support for CREATE TRIGGER
1 parent d1dda97 commit 1af22a4

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
@@ -3736,6 +3736,10 @@ pub enum Statement {
37363736
/// Postgres: <https://www.postgresql.org/docs/current/sql-createtrigger.html>
37373737
/// SQL Server: <https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql>
37383738
CreateTrigger {
3739+
/// True if this is a `CREATE OR ALTER TRIGGER` statement
3740+
///
3741+
/// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver16#arguments)
3742+
or_alter: bool,
37393743
/// The `OR REPLACE` clause is used to re-create the trigger if it already exists.
37403744
///
37413745
/// Example:
@@ -4595,6 +4599,7 @@ impl fmt::Display for Statement {
45954599
}
45964600
Statement::CreateFunction(create_function) => create_function.fmt(f),
45974601
Statement::CreateTrigger {
4602+
or_alter,
45984603
or_replace,
45994604
is_constraint,
46004605
name,
@@ -4612,7 +4617,8 @@ impl fmt::Display for Statement {
46124617
} => {
46134618
write!(
46144619
f,
4615-
"CREATE {or_replace}{is_constraint}TRIGGER {name} ",
4620+
"CREATE {or_alter}{or_replace}{is_constraint}TRIGGER {name} ",
4621+
or_alter = if *or_alter { "OR ALTER " } else { "" },
46164622
or_replace = if *or_replace { "OR REPLACE " } else { "" },
46174623
is_constraint = if *is_constraint { "CONSTRAINT " } else { "" },
46184624
)?;

src/parser/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4614,9 +4614,9 @@ impl<'a> Parser<'a> {
46144614
} else if self.parse_keyword(Keyword::FUNCTION) {
46154615
self.parse_create_function(or_alter, or_replace, temporary)
46164616
} else if self.parse_keyword(Keyword::TRIGGER) {
4617-
self.parse_create_trigger(or_replace, false)
4617+
self.parse_create_trigger(or_alter, or_replace, false)
46184618
} else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
4619-
self.parse_create_trigger(or_replace, true)
4619+
self.parse_create_trigger(or_alter, or_replace, true)
46204620
} else if self.parse_keyword(Keyword::MACRO) {
46214621
self.parse_create_macro(or_replace, temporary)
46224622
} else if self.parse_keyword(Keyword::SECRET) {
@@ -5314,6 +5314,7 @@ impl<'a> Parser<'a> {
53145314

53155315
pub fn parse_create_trigger(
53165316
&mut self,
5317+
or_alter: bool,
53175318
or_replace: bool,
53185319
is_constraint: bool,
53195320
) -> Result<Statement, ParserError> {
@@ -5323,7 +5324,7 @@ impl<'a> Parser<'a> {
53235324
}
53245325

53255326
if dialect_of!(self is MsSqlDialect) {
5326-
return self.parse_mssql_create_trigger(or_replace, is_constraint);
5327+
return self.parse_mssql_create_trigger(or_alter, or_replace, is_constraint);
53275328
}
53285329

53295330
let name = self.parse_object_name(false)?;
@@ -5367,6 +5368,7 @@ impl<'a> Parser<'a> {
53675368
let exec_body = self.parse_trigger_exec_body()?;
53685369

53695370
Ok(Statement::CreateTrigger {
5371+
or_alter,
53705372
or_replace,
53715373
is_constraint,
53725374
name,
@@ -5389,6 +5391,7 @@ impl<'a> Parser<'a> {
53895391
/// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
53905392
pub fn parse_mssql_create_trigger(
53915393
&mut self,
5394+
or_alter: bool,
53925395
or_replace: bool,
53935396
is_constraint: bool,
53945397
) -> Result<Statement, ParserError> {
@@ -5419,6 +5422,7 @@ impl<'a> Parser<'a> {
54195422
};
54205423

54215424
Ok(Statement::CreateTrigger {
5425+
or_alter,
54225426
or_replace,
54235427
is_constraint,
54245428
name,

tests/sqlparser_mssql.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2212,7 +2212,7 @@ fn parse_mssql_merge_with_output() {
22122212
#[test]
22132213
fn parse_create_trigger() {
22142214
let create_trigger = "\
2215-
CREATE TRIGGER reminder1 \
2215+
CREATE OR ALTER TRIGGER reminder1 \
22162216
ON Sales.Customer \
22172217
AFTER INSERT, UPDATE \
22182218
AS RAISERROR('Notify Customer Relations', 16, 10);\
@@ -2221,6 +2221,7 @@ fn parse_create_trigger() {
22212221
assert_eq!(
22222222
create_stmt,
22232223
Statement::CreateTrigger {
2224+
or_alter: true,
22242225
or_replace: false,
22252226
is_constraint: false,
22262227
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
@@ -3779,6 +3779,7 @@ fn parse_create_trigger() {
37793779
assert_eq!(
37803780
create_stmt,
37813781
Statement::CreateTrigger {
3782+
or_alter: false,
37823783
or_replace: false,
37833784
is_constraint: false,
37843785
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
@@ -5157,6 +5157,7 @@ fn test_escaped_string_literal() {
51575157
fn parse_create_simple_before_insert_trigger() {
51585158
let sql = "CREATE TRIGGER check_insert BEFORE INSERT ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_insert";
51595159
let expected = Statement::CreateTrigger {
5160+
or_alter: false,
51605161
or_replace: false,
51615162
is_constraint: false,
51625163
name: ObjectName::from(vec![Ident::new("check_insert")]),
@@ -5186,6 +5187,7 @@ fn parse_create_simple_before_insert_trigger() {
51865187
fn parse_create_after_update_trigger_with_condition() {
51875188
let sql = "CREATE TRIGGER check_update AFTER UPDATE ON accounts FOR EACH ROW WHEN (NEW.balance > 10000) EXECUTE FUNCTION check_account_update";
51885189
let expected = Statement::CreateTrigger {
5190+
or_alter: false,
51895191
or_replace: false,
51905192
is_constraint: false,
51915193
name: ObjectName::from(vec![Ident::new("check_update")]),
@@ -5222,6 +5224,7 @@ fn parse_create_after_update_trigger_with_condition() {
52225224
fn parse_create_instead_of_delete_trigger() {
52235225
let sql = "CREATE TRIGGER check_delete INSTEAD OF DELETE ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_deletes";
52245226
let expected = Statement::CreateTrigger {
5227+
or_alter: false,
52255228
or_replace: false,
52265229
is_constraint: false,
52275230
name: ObjectName::from(vec![Ident::new("check_delete")]),
@@ -5251,6 +5254,7 @@ fn parse_create_instead_of_delete_trigger() {
52515254
fn parse_create_trigger_with_multiple_events_and_deferrable() {
52525255
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";
52535256
let expected = Statement::CreateTrigger {
5257+
or_alter: false,
52545258
or_replace: false,
52555259
is_constraint: true,
52565260
name: ObjectName::from(vec![Ident::new("check_multiple_events")]),
@@ -5288,6 +5292,7 @@ fn parse_create_trigger_with_multiple_events_and_deferrable() {
52885292
fn parse_create_trigger_with_referencing() {
52895293
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";
52905294
let expected = Statement::CreateTrigger {
5295+
or_alter: false,
52915296
or_replace: false,
52925297
is_constraint: false,
52935298
name: ObjectName::from(vec![Ident::new("check_referencing")]),
@@ -5595,6 +5600,7 @@ fn parse_trigger_related_functions() {
55955600
assert_eq!(
55965601
create_trigger,
55975602
Statement::CreateTrigger {
5603+
or_alter: false,
55985604
or_replace: false,
55995605
is_constraint: false,
56005606
name: ObjectName::from(vec![Ident::new("emp_stamp")]),

0 commit comments

Comments
 (0)