Skip to content

Commit c893bda

Browse files
Introduced TriggerObjectKind and removed include_each in CreateTrigger
1 parent fe0c23f commit c893bda

File tree

8 files changed

+57
-57
lines changed

8 files changed

+57
-57
lines changed

src/ast/ddl.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3178,6 +3178,26 @@ impl Spanned for RenameTableNameKind {
31783178
}
31793179
}
31803180

3181+
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3182+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3183+
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3184+
/// Whether the syntax used for the trigger object (ROW or STATEMENT) is `FOR` or `FOR EACH`.
3185+
pub enum TriggerObjectKind {
3186+
/// The `FOR` syntax is used.
3187+
For(TriggerObject),
3188+
/// The `FOR EACH` syntax is used.
3189+
ForEach(TriggerObject),
3190+
}
3191+
3192+
impl Display for TriggerObjectKind {
3193+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3194+
match self {
3195+
TriggerObjectKind::For(obj) => write!(f, "FOR {obj}"),
3196+
TriggerObjectKind::ForEach(obj) => write!(f, "FOR EACH {obj}"),
3197+
}
3198+
}
3199+
}
3200+
31813201
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
31823202
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
31833203
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -3282,9 +3302,7 @@ pub struct CreateTrigger {
32823302
/// every row affected by the trigger event, or just once per SQL statement.
32833303
/// This is optional in some SQL dialects, such as SQLite, and if not specified, in
32843304
/// those cases, the implied default is `FOR EACH ROW`.
3285-
pub trigger_object: Option<TriggerObject>,
3286-
/// Whether to include the `EACH` term of the `FOR EACH`, as it is optional syntax.
3287-
pub include_each: bool,
3305+
pub trigger_object: Option<TriggerObjectKind>,
32883306
/// Triggering conditions
32893307
pub condition: Option<Expr>,
32903308
/// Execute logic block
@@ -3313,7 +3331,6 @@ impl Display for CreateTrigger {
33133331
referencing,
33143332
trigger_object,
33153333
condition,
3316-
include_each,
33173334
exec_body,
33183335
statements_as,
33193336
statements,
@@ -3355,11 +3372,7 @@ impl Display for CreateTrigger {
33553372
}
33563373

33573374
if let Some(trigger_object) = trigger_object {
3358-
if *include_each {
3359-
write!(f, " FOR EACH {trigger_object}")?;
3360-
} else if exec_body.is_some() {
3361-
write!(f, " FOR {trigger_object}")?;
3362-
}
3375+
write!(f, " {trigger_object}")?;
33633376
}
33643377
if let Some(condition) = condition {
33653378
write!(f, " WHEN {condition}")?;

src/ast/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ pub use self::ddl::{
6969
IdentityProperty, IdentityPropertyFormatKind, IdentityPropertyKind, IdentityPropertyOrder,
7070
IndexColumn, IndexOption, IndexType, KeyOrIndexDisplay, NullsDistinctOption, Owner, Partition,
7171
ProcedureParam, ReferentialAction, RenameTableNameKind, ReplicaIdentity, TableConstraint,
72-
TagsColumnOption, UserDefinedTypeCompositeAttributeDef, UserDefinedTypeRepresentation,
73-
ViewColumnDef,
72+
TagsColumnOption, TriggerObjectKind, UserDefinedTypeCompositeAttributeDef,
73+
UserDefinedTypeRepresentation, ViewColumnDef,
7474
};
7575
pub use self::dml::{Delete, Insert};
7676
pub use self::operator::{BinaryOperator, UnaryOperator};

src/dialect/mssql.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
use crate::ast::helpers::attached_token::AttachedToken;
1919
use crate::ast::{
2020
BeginEndStatements, ConditionalStatementBlock, ConditionalStatements, CreateTrigger,
21-
GranteesType, IfStatement, Statement, TriggerObject,
21+
GranteesType, IfStatement, Statement,
2222
};
2323
use crate::dialect::Dialect;
2424
use crate::keywords::{self, Keyword};
@@ -264,8 +264,7 @@ impl MsSqlDialect {
264264
table_name,
265265
referenced_table_name: None,
266266
referencing: Vec::new(),
267-
trigger_object: Some(TriggerObject::Statement),
268-
include_each: false,
267+
trigger_object: None,
269268
condition: None,
270269
exec_body: None,
271270
statements_as: true,

src/parser/mod.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5609,23 +5609,26 @@ impl<'a> Parser<'a> {
56095609
}
56105610
}
56115611

5612-
let (include_each, trigger_object) = if self.parse_keyword(Keyword::FOR) {
5613-
(
5614-
self.parse_keyword(Keyword::EACH),
5615-
Some(
5616-
match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
5617-
Keyword::ROW => TriggerObject::Row,
5618-
Keyword::STATEMENT => TriggerObject::Statement,
5619-
_ => unreachable!(),
5620-
},
5621-
),
5622-
)
5612+
let trigger_object = if self.parse_keyword(Keyword::FOR) {
5613+
let include_each = self.parse_keyword(Keyword::EACH);
5614+
let trigger_object =
5615+
match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
5616+
Keyword::ROW => TriggerObject::Row,
5617+
Keyword::STATEMENT => TriggerObject::Statement,
5618+
_ => unreachable!(),
5619+
};
5620+
5621+
Some(if include_each {
5622+
TriggerObjectKind::ForEach(trigger_object)
5623+
} else {
5624+
TriggerObjectKind::For(trigger_object)
5625+
})
56235626
} else {
56245627
if !dialect_of!(self is SQLiteDialect ) {
56255628
self.expect_keyword_is(Keyword::FOR)?;
56265629
}
56275630

5628-
(false, None)
5631+
None
56295632
};
56305633

56315634
let condition = self
@@ -5654,7 +5657,6 @@ impl<'a> Parser<'a> {
56545657
referenced_table_name,
56555658
referencing,
56565659
trigger_object,
5657-
include_each,
56585660
condition,
56595661
exec_body,
56605662
statements_as: false,

tests/sqlparser_mssql.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,8 +2396,7 @@ fn parse_create_trigger() {
23962396
table_name: ObjectName::from(vec![Ident::new("Sales"), Ident::new("Customer")]),
23972397
referenced_table_name: None,
23982398
referencing: vec![],
2399-
trigger_object: Some(TriggerObject::Statement),
2400-
include_each: false,
2399+
trigger_object: None,
24012400
condition: None,
24022401
exec_body: None,
24032402
statements_as: true,

tests/sqlparser_mysql.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3934,8 +3934,7 @@ fn parse_create_trigger() {
39343934
table_name: ObjectName::from(vec![Ident::new("emp")]),
39353935
referenced_table_name: None,
39363936
referencing: vec![],
3937-
trigger_object: Some(TriggerObject::Row),
3938-
include_each: true,
3937+
trigger_object: Some(TriggerObjectKind::ForEach(TriggerObject::Row)),
39393938
condition: None,
39403939
exec_body: Some(TriggerExecBody {
39413940
exec_type: TriggerExecBodyType::Function,

tests/sqlparser_postgres.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5683,8 +5683,7 @@ fn parse_create_simple_before_insert_trigger() {
56835683
table_name: ObjectName::from(vec![Ident::new("accounts")]),
56845684
referenced_table_name: None,
56855685
referencing: vec![],
5686-
trigger_object: Some(TriggerObject::Row),
5687-
include_each: true,
5686+
trigger_object: Some(TriggerObjectKind::ForEach(TriggerObject::Row)),
56885687
condition: None,
56895688
exec_body: Some(TriggerExecBody {
56905689
exec_type: TriggerExecBodyType::Function,
@@ -5716,8 +5715,7 @@ fn parse_create_after_update_trigger_with_condition() {
57165715
table_name: ObjectName::from(vec![Ident::new("accounts")]),
57175716
referenced_table_name: None,
57185717
referencing: vec![],
5719-
trigger_object: Some(TriggerObject::Row),
5720-
include_each: true,
5718+
trigger_object: Some(TriggerObjectKind::ForEach(TriggerObject::Row)),
57215719
condition: Some(Expr::Nested(Box::new(Expr::BinaryOp {
57225720
left: Box::new(Expr::CompoundIdentifier(vec![
57235721
Ident::new("NEW"),
@@ -5756,8 +5754,7 @@ fn parse_create_instead_of_delete_trigger() {
57565754
table_name: ObjectName::from(vec![Ident::new("accounts")]),
57575755
referenced_table_name: None,
57585756
referencing: vec![],
5759-
trigger_object: Some(TriggerObject::Row),
5760-
include_each: true,
5757+
trigger_object: Some(TriggerObjectKind::ForEach(TriggerObject::Row)),
57615758
condition: None,
57625759
exec_body: Some(TriggerExecBody {
57635760
exec_type: TriggerExecBodyType::Function,
@@ -5793,8 +5790,7 @@ fn parse_create_trigger_with_multiple_events_and_deferrable() {
57935790
table_name: ObjectName::from(vec![Ident::new("accounts")]),
57945791
referenced_table_name: None,
57955792
referencing: vec![],
5796-
trigger_object: Some(TriggerObject::Row),
5797-
include_each: true,
5793+
trigger_object: Some(TriggerObjectKind::ForEach(TriggerObject::Row)),
57985794
condition: None,
57995795
exec_body: Some(TriggerExecBody {
58005796
exec_type: TriggerExecBodyType::Function,
@@ -5841,8 +5837,7 @@ fn parse_create_trigger_with_referencing() {
58415837
transition_relation_name: ObjectName::from(vec![Ident::new("old_accounts")]),
58425838
},
58435839
],
5844-
trigger_object: Some(TriggerObject::Row),
5845-
include_each: true,
5840+
trigger_object: Some(TriggerObjectKind::ForEach(TriggerObject::Row)),
58465841
condition: None,
58475842
exec_body: Some(TriggerExecBody {
58485843
exec_type: TriggerExecBodyType::Function,
@@ -6147,8 +6142,7 @@ fn parse_trigger_related_functions() {
61476142
table_name: ObjectName::from(vec![Ident::new("emp")]),
61486143
referenced_table_name: None,
61496144
referencing: vec![],
6150-
trigger_object: Some(TriggerObject::Row),
6151-
include_each: true,
6145+
trigger_object: Some(TriggerObjectKind::ForEach(TriggerObject::Row)),
61526146
condition: None,
61536147
exec_body: Some(TriggerExecBody {
61546148
exec_type: TriggerExecBodyType::Function,

tests/sqlparser_sqlite.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,6 @@ fn test_create_trigger() {
628628
referenced_table_name,
629629
referencing,
630630
trigger_object,
631-
include_each,
632631
condition,
633632
exec_body: _,
634633
statements_as,
@@ -646,8 +645,10 @@ fn test_create_trigger() {
646645
assert_eq!(table_name.to_string(), "assets");
647646
assert!(referenced_table_name.is_none());
648647
assert!(referencing.is_empty());
649-
assert_eq!(trigger_object, Some(TriggerObject::Row));
650-
assert!(include_each);
648+
assert_eq!(
649+
trigger_object,
650+
Some(TriggerObjectKind::ForEach(TriggerObject::Row))
651+
);
651652
assert!(condition.is_none());
652653
assert!(!statements_as);
653654
assert!(characteristics.is_none());
@@ -673,7 +674,6 @@ fn test_create_trigger() {
673674
referenced_table_name,
674675
referencing,
675676
trigger_object,
676-
include_each,
677677
condition,
678678
exec_body: _,
679679
statements_as,
@@ -692,7 +692,6 @@ fn test_create_trigger() {
692692
assert!(referenced_table_name.is_none());
693693
assert!(referencing.is_empty());
694694
assert!(trigger_object.is_none());
695-
assert!(!include_each);
696695
assert!(condition.is_none());
697696
assert!(!statements_as);
698697
assert!(characteristics.is_none());
@@ -715,7 +714,6 @@ fn test_create_trigger() {
715714
referenced_table_name,
716715
referencing,
717716
trigger_object,
718-
include_each,
719717
condition,
720718
exec_body: _,
721719
statements_as,
@@ -734,7 +732,6 @@ fn test_create_trigger() {
734732
assert!(referenced_table_name.is_none());
735733
assert!(referencing.is_empty());
736734
assert!(trigger_object.is_none());
737-
assert!(!include_each);
738735
assert!(condition.is_none());
739736
assert!(!statements_as);
740737
assert!(characteristics.is_none());
@@ -757,7 +754,6 @@ fn test_create_trigger() {
757754
referenced_table_name,
758755
referencing,
759756
trigger_object,
760-
include_each,
761757
condition,
762758
exec_body: _,
763759
statements_as,
@@ -775,8 +771,10 @@ fn test_create_trigger() {
775771
assert_eq!(table_name.to_string(), "products");
776772
assert!(referenced_table_name.is_none());
777773
assert!(referencing.is_empty());
778-
assert_eq!(trigger_object, Some(TriggerObject::Row));
779-
assert!(include_each);
774+
assert_eq!(
775+
trigger_object,
776+
Some(TriggerObjectKind::ForEach(TriggerObject::Row))
777+
);
780778
assert!(condition.is_some());
781779
assert!(!statements_as);
782780
assert!(characteristics.is_none());
@@ -800,7 +798,6 @@ fn test_create_trigger() {
800798
referenced_table_name,
801799
referencing,
802800
trigger_object,
803-
include_each,
804801
condition,
805802
exec_body: _,
806803
statements_as,
@@ -819,7 +816,6 @@ fn test_create_trigger() {
819816
assert!(referenced_table_name.is_none());
820817
assert!(referencing.is_empty());
821818
assert!(trigger_object.is_none());
822-
assert!(!include_each);
823819
assert!(condition.is_none());
824820
assert!(!statements_as);
825821
assert!(characteristics.is_none());
@@ -843,7 +839,6 @@ fn test_create_trigger() {
843839
referenced_table_name,
844840
referencing,
845841
trigger_object,
846-
include_each,
847842
condition,
848843
exec_body: _,
849844
statements_as,
@@ -862,7 +857,6 @@ fn test_create_trigger() {
862857
assert!(referenced_table_name.is_none());
863858
assert!(referencing.is_empty());
864859
assert!(trigger_object.is_none());
865-
assert!(!include_each);
866860
assert!(condition.is_none());
867861
assert!(!statements_as);
868862
assert!(characteristics.is_none());

0 commit comments

Comments
 (0)