@@ -2344,11 +2344,16 @@ impl fmt::Display for BeginEndStatements {
23442344 end_token : AttachedToken ( end_token) ,
23452345 } = self ;
23462346
2347- write ! ( f, "{begin_token} " ) ?;
2347+ if begin_token. token != Token :: EOF {
2348+ write ! ( f, "{begin_token} " ) ?;
2349+ }
23482350 if !statements. is_empty ( ) {
23492351 format_statement_list ( f, statements) ?;
23502352 }
2351- write ! ( f, " {end_token}" )
2353+ if end_token. token != Token :: EOF {
2354+ write ! ( f, " {end_token}" ) ?;
2355+ }
2356+ Ok ( ( ) )
23522357 }
23532358}
23542359
@@ -3658,6 +3663,7 @@ pub enum Statement {
36583663 /// ```
36593664 ///
36603665 /// Postgres: <https://www.postgresql.org/docs/current/sql-createtrigger.html>
3666+ /// SQL Server: <https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql>
36613667 CreateTrigger {
36623668 /// The `OR REPLACE` clause is used to re-create the trigger if it already exists.
36633669 ///
@@ -3719,7 +3725,9 @@ pub enum Statement {
37193725 /// Triggering conditions
37203726 condition : Option < Expr > ,
37213727 /// Execute logic block
3722- exec_body : TriggerExecBody ,
3728+ exec_body : Option < TriggerExecBody > ,
3729+ /// For SQL dialects with statement(s) for a body
3730+ statements : Option < BeginEndStatements > ,
37233731 /// The characteristic of the trigger, which include whether the trigger is `DEFERRABLE`, `INITIALLY DEFERRED`, or `INITIALLY IMMEDIATE`,
37243732 characteristics : Option < ConstraintCharacteristics > ,
37253733 } ,
@@ -4525,19 +4533,29 @@ impl fmt::Display for Statement {
45254533 condition,
45264534 include_each,
45274535 exec_body,
4536+ statements,
45284537 characteristics,
45294538 } => {
45304539 write ! (
45314540 f,
4532- "CREATE {or_replace}{is_constraint}TRIGGER {name} {period} " ,
4541+ "CREATE {or_replace}{is_constraint}TRIGGER {name} " ,
45334542 or_replace = if * or_replace { "OR REPLACE " } else { "" } ,
45344543 is_constraint = if * is_constraint { "CONSTRAINT " } else { "" } ,
45354544 ) ?;
45364545
4537- if !events. is_empty ( ) {
4538- write ! ( f, " {}" , display_separated( events, " OR " ) ) ?;
4546+ if exec_body. is_some ( ) {
4547+ write ! ( f, "{period}" ) ?;
4548+ if !events. is_empty ( ) {
4549+ write ! ( f, " {}" , display_separated( events, " OR " ) ) ?;
4550+ }
4551+ write ! ( f, " ON {table_name}" ) ?;
4552+ } else {
4553+ write ! ( f, "ON {table_name}" ) ?;
4554+ write ! ( f, " {period}" ) ?;
4555+ if !events. is_empty ( ) {
4556+ write ! ( f, " {}" , display_separated( events, ", " ) ) ?;
4557+ }
45394558 }
4540- write ! ( f, " ON {table_name}" ) ?;
45414559
45424560 if let Some ( referenced_table_name) = referenced_table_name {
45434561 write ! ( f, " FROM {referenced_table_name}" ) ?;
@@ -4553,13 +4571,19 @@ impl fmt::Display for Statement {
45534571
45544572 if * include_each {
45554573 write ! ( f, " FOR EACH {trigger_object}" ) ?;
4556- } else {
4574+ } else if exec_body . is_some ( ) {
45574575 write ! ( f, " FOR {trigger_object}" ) ?;
45584576 }
45594577 if let Some ( condition) = condition {
45604578 write ! ( f, " WHEN {condition}" ) ?;
45614579 }
4562- write ! ( f, " EXECUTE {exec_body}" )
4580+ if let Some ( exec_body) = exec_body {
4581+ write ! ( f, " EXECUTE {exec_body}" ) ?;
4582+ }
4583+ if let Some ( statements) = statements {
4584+ write ! ( f, " AS {statements}" ) ?;
4585+ }
4586+ Ok ( ( ) )
45634587 }
45644588 Statement :: DropTrigger {
45654589 if_exists,
0 commit comments