Skip to content

Commit 77776fc

Browse files
committed
Add OR ALTER support for CREATE TRIGGER
1 parent c10157b commit 77776fc

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

src/ast/mod.rs

+7-1
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:
@@ -4516,6 +4520,7 @@ impl fmt::Display for Statement {
45164520
}
45174521
Statement::CreateFunction(create_function) => create_function.fmt(f),
45184522
Statement::CreateTrigger {
4523+
or_alter,
45194524
or_replace,
45204525
is_constraint,
45214526
name,
@@ -4533,7 +4538,8 @@ impl fmt::Display for Statement {
45334538
} => {
45344539
write!(
45354540
f,
4536-
"CREATE {or_replace}{is_constraint}TRIGGER {name} ",
4541+
"CREATE {or_alter}{or_replace}{is_constraint}TRIGGER {name} ",
4542+
or_alter = if *or_alter { "OR ALTER " } else { "" },
45374543
or_replace = if *or_replace { "OR REPLACE " } else { "" },
45384544
is_constraint = if *is_constraint { "CONSTRAINT " } else { "" },
45394545
)?;

src/parser/mod.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -4565,9 +4565,9 @@ impl<'a> Parser<'a> {
45654565
} else if self.parse_keyword(Keyword::FUNCTION) {
45664566
self.parse_create_function(or_alter, or_replace, temporary)
45674567
} else if self.parse_keyword(Keyword::TRIGGER) {
4568-
self.parse_create_trigger(or_replace, false)
4568+
self.parse_create_trigger(or_alter, or_replace, false)
45694569
} else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
4570-
self.parse_create_trigger(or_replace, true)
4570+
self.parse_create_trigger(or_alter, or_replace, true)
45714571
} else if self.parse_keyword(Keyword::MACRO) {
45724572
self.parse_create_macro(or_replace, temporary)
45734573
} else if self.parse_keyword(Keyword::SECRET) {
@@ -5268,6 +5268,7 @@ impl<'a> Parser<'a> {
52685268

52695269
pub fn parse_create_trigger(
52705270
&mut self,
5271+
or_alter: bool,
52715272
or_replace: bool,
52725273
is_constraint: bool,
52735274
) -> Result<Statement, ParserError> {
@@ -5277,7 +5278,7 @@ impl<'a> Parser<'a> {
52775278
}
52785279

52795280
if dialect_of!(self is MsSqlDialect) {
5280-
return self.parse_mssql_create_trigger(or_replace, is_constraint);
5281+
return self.parse_mssql_create_trigger(or_alter, or_replace, is_constraint);
52815282
}
52825283

52835284
let name = self.parse_object_name(false)?;
@@ -5321,6 +5322,7 @@ impl<'a> Parser<'a> {
53215322
let exec_body = self.parse_trigger_exec_body()?;
53225323

53235324
Ok(Statement::CreateTrigger {
5325+
or_alter,
53245326
or_replace,
53255327
is_constraint,
53265328
name,
@@ -5343,6 +5345,7 @@ impl<'a> Parser<'a> {
53435345
/// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
53445346
pub fn parse_mssql_create_trigger(
53455347
&mut self,
5348+
or_alter: bool,
53465349
or_replace: bool,
53475350
is_constraint: bool,
53485351
) -> Result<Statement, ParserError> {
@@ -5373,6 +5376,7 @@ impl<'a> Parser<'a> {
53735376
};
53745377

53755378
Ok(Statement::CreateTrigger {
5379+
or_alter,
53765380
or_replace,
53775381
is_constraint,
53785382
name,

tests/sqlparser_mssql.rs

+2-1
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

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

+6
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)