15
15
[\w ] + [\u4e00 -\u9fa5 ] + [0-9a-zA-Z_\u4e00 -\u9fa5 ] * return ' IDENTIFIER'
16
16
[\u4e00 -\u9fa5 ][0-9a-zA-Z_\u4e00 -\u9fa5 ] * return ' IDENTIFIER'
17
17
SELECT return ' SELECT'
18
+ INSERT return ' INSERT'
19
+ DEFAULT return ' DEFAULT'
18
20
ALL return ' ALL'
19
21
ANY return ' ANY'
20
22
DISTINCT return ' DISTINCT'
@@ -67,6 +69,8 @@ ORDER\s+BY return 'ORDER_
67
69
GROUP\s + BY return ' GROUP_BY'
68
70
IGNORE return ' IGNORE'
69
71
LOW_PRIORITY return ' LOW_PRIORITY'
72
+ DELAYED return ' DELAYED'
73
+ HIGH_PRIORITY return ' HIGH_PRIORITY'
70
74
FORCE return ' FORCE'
71
75
INNER return ' INNER'
72
76
CROSS return ' CROSS'
@@ -91,6 +95,12 @@ SHARE return 'SHARE'
91
95
MODE return ' MODE'
92
96
OJ return ' OJ'
93
97
LIMIT return ' LIMIT'
98
+ INTO return ' INTO'
99
+ VALUE return ' VALUE'
100
+ VALUES return ' VALUES'
101
+ DUPLICATE return ' DUPLICATE'
102
+ KEY return ' KEY'
103
+ UPDATE return ' UPDATE'
94
104
95
105
"," return ' ,'
96
106
"=" return ' ='
@@ -168,13 +178,74 @@ main
168
178
query
169
179
: selectClause
170
180
| updateClause
181
+ | insertClause
182
+ ;
183
+
184
+ insertClause
185
+ : INSERT priority_opt ignore_opt
186
+ into_opt simple_table_factor
187
+ partitionOpt
188
+ insert_cols
189
+ insert_source
190
+ on_dup_assigns
191
+ {
192
+ $$ = {
193
+ type: ' Insert' ,
194
+ priority: $2 ,
195
+ ignore: $3 ,
196
+ into: $4 ,
197
+ table: $5 ,
198
+ partitions: $6 ,
199
+ cols: $7 ,
200
+ src: $8 ,
201
+ duplicateAssignments: $9
202
+ }
203
+ }
204
+ ;
205
+
206
+ insert_source
207
+ : insert_value value_list_list { $$ = { type: ' Values' , keyword: $1 , values: $2 } }
208
+ | selectClause
209
+ ;
210
+
211
+ on_dup_assigns
212
+ : { $$ = null }
213
+ | ON DUPLICATE KEY UPDATE assignment_list { $$ = $5 }
214
+ ;
215
+
216
+ insert_cols
217
+ : { $$ = null }
218
+ | '(' identifier_list ')' { $$ = $2 }
219
+ ;
220
+
221
+ value
222
+ : expr | DEFAULT
223
+ ;
224
+
225
+ value_list
226
+ : value_list ',' value { $1 .value .push ($3 ); }
227
+ | value { $$ = { type: ' ValueList' , value: [ $1 ] } }
228
+ ;
229
+
230
+ value_list_list
231
+ : value_list_list ',' '(' value_list ')' { $1 .value .push ($4 ); }
232
+ | '(' value_list ')' { $$ = { type: ' InsertList' , value: [ $2 ] } }
233
+ ;
234
+
235
+ insert_value
236
+ : VALUE | VALUES
237
+ ;
238
+
239
+ into_opt
240
+ : { $$ = null }
241
+ | INTO { $$ = $1 }
171
242
;
172
243
173
244
updateClause
174
245
: UPDATE low_priority_opt ignore_opt
175
246
table_refrences
176
247
SET
177
- assignmentList
248
+ assignment_list
178
249
where_opt
179
250
order_by_opt
180
251
limit_opt
@@ -197,6 +268,13 @@ low_priority_opt
197
268
| LOW_PRIORITY { $$ = $1 }
198
269
;
199
270
271
+ priority_opt
272
+ : { $$ = null }
273
+ | LOW_PRIORITY { $$ = $1 }
274
+ | HIGH_PRIORITY { $$ = $1 }
275
+ | DELAYED { $$ = $1 }
276
+ ;
277
+
200
278
ignore_opt
201
279
: { $$ = null }
202
280
| IGNORE { $$ = $1 }
@@ -206,8 +284,8 @@ assignment
206
284
: identifier '=' expr { $$ = { type: ' Assignment' , left: $1 , right: $3 } }
207
285
;
208
286
209
- assignmentList
210
- : assignmentList ',' assignment { $1 .value .push ($3 ); }
287
+ assignment_list
288
+ : assignment_list ',' assignment { $1 .value .push ($3 ); }
211
289
| assignment { $$ = { type: ' AssignmentList' , value: [ $1 ] } }
212
290
;
213
291
@@ -603,8 +681,11 @@ index_hint
603
681
| IGNORE index_or_key for_opt '(' identifier_list ')' { $$ = { type: ' IgnoreIndexHint' , value: $5 , forOpt: $3 , indexOrKey: $2 } }
604
682
| FORCE index_or_key for_opt '(' identifier_list ')' { $$ = { type: ' ForceIndexHint' , value: $5 , forOpt: $3 , indexOrKey: $2 } }
605
683
;
606
- table_factor
684
+ simple_table_factor
607
685
: identifier partitionOpt aliasOpt index_hint_list_opt { $$ = { type: ' TableFactor' , value: $1 , partition: $2 , alias: $3 .alias , hasAs: $3 .hasAs , indexHintOpt: $4 } }
686
+ ;
687
+ table_factor
688
+ : simple_table_factor
608
689
| '(' selectClause ')' aliasOpt { $$ = { type: ' SubQuery' , value: $2 , alias: $4 .alias , hasAs: $4 .hasAs } }
609
690
| '(' table_refrences ')' { $$ = $2 ; $$ .hasParentheses = true }
610
691
;
0 commit comments