1
1
use std:: fmt:: Display ;
2
2
3
+ use crate :: ParsingError ;
4
+
3
5
use super :: {
4
6
ColumnDefinition , ConflictClause , DeleteStatement , Expression , ForeignKeyClause , Identifier ,
5
- IndexedColumn , InsertStatement , SelectStatement , UpdateStatement ,
7
+ IndexedColumn , InsertStatement , SelectStatement , Statement , UpdateStatement ,
6
8
} ;
7
9
8
10
/// An AST for [CREATE VIRTUAL TABLE](https://www.sqlite.org/lang_createvtab.html) SQL statement.
@@ -110,7 +112,7 @@ impl Display for TableOption {
110
112
}
111
113
112
114
/// An AST for [CREATE TRIGGER](https://www.sqlite.org/lang_createtrigger.html) SQL statement.
113
- #[ derive( Debug , PartialEq ) ]
115
+ #[ derive( Debug , PartialEq , Clone ) ]
114
116
pub struct CreateTriggerStatement {
115
117
pub temporary : bool ,
116
118
@@ -129,7 +131,7 @@ pub struct CreateTriggerStatement {
129
131
pub trigger_statements : Vec < TriggerStatement > ,
130
132
}
131
133
132
- #[ derive( Debug , PartialEq ) ]
134
+ #[ derive( Debug , PartialEq , Clone ) ]
133
135
pub enum TriggerPreCondition {
134
136
Before ,
135
137
@@ -138,21 +140,31 @@ pub enum TriggerPreCondition {
138
140
InsteadOf ,
139
141
}
140
142
141
- #[ derive( Debug , PartialEq ) ]
143
+ impl Display for TriggerPreCondition {
144
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
145
+ match self {
146
+ TriggerPreCondition :: Before => write ! ( f, "BEFORE" ) ,
147
+ TriggerPreCondition :: After => write ! ( f, "AFTER" ) ,
148
+ TriggerPreCondition :: InsteadOf => write ! ( f, "INSTEAD OF" ) ,
149
+ }
150
+ }
151
+ }
152
+
153
+ #[ derive( Debug , PartialEq , Clone ) ]
142
154
pub struct TriggerEvent {
143
155
pub event_type : TriggerEventType ,
144
156
145
157
pub table_name : Identifier ,
146
158
}
147
159
148
- #[ derive( Debug , PartialEq ) ]
160
+ #[ derive( Debug , PartialEq , Clone ) ]
149
161
pub enum TriggerEventType {
150
162
Delete ,
151
163
Insert ,
152
164
Update ( Option < Vec < Identifier > > ) ,
153
165
}
154
166
155
- #[ derive( Debug , PartialEq ) ]
167
+ #[ derive( Debug , PartialEq , Clone ) ]
156
168
pub enum TriggerStatement {
157
169
Update ( UpdateStatement ) ,
158
170
@@ -162,3 +174,20 @@ pub enum TriggerStatement {
162
174
163
175
Select ( SelectStatement ) ,
164
176
}
177
+
178
+ impl TryFrom < Statement > for TriggerStatement {
179
+ type Error = ParsingError ;
180
+
181
+ fn try_from ( statement : Statement ) -> Result < Self , Self :: Error > {
182
+ match statement {
183
+ Statement :: Update ( update_statement) => Ok ( TriggerStatement :: Update ( update_statement) ) ,
184
+ Statement :: Insert ( insert_statement) => Ok ( TriggerStatement :: Insert ( insert_statement) ) ,
185
+ Statement :: Delete ( delete_statement) => Ok ( TriggerStatement :: Delete ( delete_statement) ) ,
186
+ Statement :: Select ( select_statement) => Ok ( TriggerStatement :: Select ( select_statement) ) ,
187
+ _ => Err ( ParsingError :: UnexpectedParsingState ( format ! (
188
+ "Expected UPDATE, INSERT, DELETE or SELECT statement, got: {:?}" ,
189
+ statement
190
+ ) ) ) ,
191
+ }
192
+ }
193
+ }
0 commit comments