@@ -2380,11 +2380,16 @@ impl fmt::Display for BeginEndStatements {
23802380 end_token : AttachedToken ( end_token) ,
23812381 } = self ;
23822382
2383- write ! ( f, "{begin_token} " ) ?;
2383+ if begin_token. token != Token :: EOF {
2384+ write ! ( f, "{begin_token} " ) ?;
2385+ }
23842386 if !statements. is_empty ( ) {
23852387 format_statement_list ( f, statements) ?;
23862388 }
2387- write ! ( f, " {end_token}" )
2389+ if end_token. token != Token :: EOF {
2390+ write ! ( f, " {end_token}" ) ?;
2391+ }
2392+ Ok ( ( ) )
23882393 }
23892394}
23902395
@@ -3729,6 +3734,7 @@ pub enum Statement {
37293734 /// ```
37303735 ///
37313736 /// Postgres: <https://www.postgresql.org/docs/current/sql-createtrigger.html>
3737+ /// SQL Server: <https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql>
37323738 CreateTrigger {
37333739 /// The `OR REPLACE` clause is used to re-create the trigger if it already exists.
37343740 ///
@@ -3790,7 +3796,9 @@ pub enum Statement {
37903796 /// Triggering conditions
37913797 condition : Option < Expr > ,
37923798 /// Execute logic block
3793- exec_body : TriggerExecBody ,
3799+ exec_body : Option < TriggerExecBody > ,
3800+ /// For SQL dialects with statement(s) for a body
3801+ statements : Option < BeginEndStatements > ,
37943802 /// The characteristic of the trigger, which include whether the trigger is `DEFERRABLE`, `INITIALLY DEFERRED`, or `INITIALLY IMMEDIATE`,
37953803 characteristics : Option < ConstraintCharacteristics > ,
37963804 } ,
@@ -4599,19 +4607,29 @@ impl fmt::Display for Statement {
45994607 condition,
46004608 include_each,
46014609 exec_body,
4610+ statements,
46024611 characteristics,
46034612 } => {
46044613 write ! (
46054614 f,
4606- "CREATE {or_replace}{is_constraint}TRIGGER {name} {period} " ,
4615+ "CREATE {or_replace}{is_constraint}TRIGGER {name} " ,
46074616 or_replace = if * or_replace { "OR REPLACE " } else { "" } ,
46084617 is_constraint = if * is_constraint { "CONSTRAINT " } else { "" } ,
46094618 ) ?;
46104619
4611- if !events. is_empty ( ) {
4612- write ! ( f, " {}" , display_separated( events, " OR " ) ) ?;
4620+ if exec_body. is_some ( ) {
4621+ write ! ( f, "{period}" ) ?;
4622+ if !events. is_empty ( ) {
4623+ write ! ( f, " {}" , display_separated( events, " OR " ) ) ?;
4624+ }
4625+ write ! ( f, " ON {table_name}" ) ?;
4626+ } else {
4627+ write ! ( f, "ON {table_name}" ) ?;
4628+ write ! ( f, " {period}" ) ?;
4629+ if !events. is_empty ( ) {
4630+ write ! ( f, " {}" , display_separated( events, ", " ) ) ?;
4631+ }
46134632 }
4614- write ! ( f, " ON {table_name}" ) ?;
46154633
46164634 if let Some ( referenced_table_name) = referenced_table_name {
46174635 write ! ( f, " FROM {referenced_table_name}" ) ?;
@@ -4627,13 +4645,19 @@ impl fmt::Display for Statement {
46274645
46284646 if * include_each {
46294647 write ! ( f, " FOR EACH {trigger_object}" ) ?;
4630- } else {
4648+ } else if exec_body . is_some ( ) {
46314649 write ! ( f, " FOR {trigger_object}" ) ?;
46324650 }
46334651 if let Some ( condition) = condition {
46344652 write ! ( f, " WHEN {condition}" ) ?;
46354653 }
4636- write ! ( f, " EXECUTE {exec_body}" )
4654+ if let Some ( exec_body) = exec_body {
4655+ write ! ( f, " EXECUTE {exec_body}" ) ?;
4656+ }
4657+ if let Some ( statements) = statements {
4658+ write ! ( f, " AS {statements}" ) ?;
4659+ }
4660+ Ok ( ( ) )
46374661 }
46384662 Statement :: DropTrigger {
46394663 if_exists,
0 commit comments