1515[\w ] + [\u4e00 -\u9fa5 ] + [0-9a-zA-Z_\u4e00 -\u9fa5 ] * return ' IDENTIFIER'
1616[\u4e00 -\u9fa5 ][0-9a-zA-Z_\u4e00 -\u9fa5 ] * return ' IDENTIFIER'
1717SELECT return ' SELECT'
18+ INSERT return ' INSERT'
19+ DEFAULT return ' DEFAULT'
1820ALL return ' ALL'
1921ANY return ' ANY'
2022DISTINCT return ' DISTINCT'
@@ -67,6 +69,8 @@ ORDER\s+BY return 'ORDER_
6769GROUP\s + BY return ' GROUP_BY'
6870IGNORE return ' IGNORE'
6971LOW_PRIORITY return ' LOW_PRIORITY'
72+ DELAYED return ' DELAYED'
73+ HIGH_PRIORITY return ' HIGH_PRIORITY'
7074FORCE return ' FORCE'
7175INNER return ' INNER'
7276CROSS return ' CROSS'
@@ -91,6 +95,12 @@ SHARE return 'SHARE'
9195MODE return ' MODE'
9296OJ return ' OJ'
9397LIMIT 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'
94104
95105"," return ' ,'
96106"=" return ' ='
@@ -168,13 +178,74 @@ main
168178query
169179 : selectClause
170180 | 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 }
171242 ;
172243
173244updateClause
174245 : UPDATE low_priority_opt ignore_opt
175246 table_refrences
176247 SET
177- assignmentList
248+ assignment_list
178249 where_opt
179250 order_by_opt
180251 limit_opt
@@ -197,6 +268,13 @@ low_priority_opt
197268 | LOW_PRIORITY { $$ = $1 }
198269 ;
199270
271+ priority_opt
272+ : { $$ = null }
273+ | LOW_PRIORITY { $$ = $1 }
274+ | HIGH_PRIORITY { $$ = $1 }
275+ | DELAYED { $$ = $1 }
276+ ;
277+
200278ignore_opt
201279 : { $$ = null }
202280 | IGNORE { $$ = $1 }
@@ -206,8 +284,8 @@ assignment
206284 : identifier '=' expr { $$ = { type: ' Assignment' , left: $1 , right: $3 } }
207285 ;
208286
209- assignmentList
210- : assignmentList ',' assignment { $1 .value .push ($3 ); }
287+ assignment_list
288+ : assignment_list ',' assignment { $1 .value .push ($3 ); }
211289 | assignment { $$ = { type: ' AssignmentList' , value: [ $1 ] } }
212290 ;
213291
@@ -603,8 +681,11 @@ index_hint
603681 | IGNORE index_or_key for_opt '(' identifier_list ')' { $$ = { type: ' IgnoreIndexHint' , value: $5 , forOpt: $3 , indexOrKey: $2 } }
604682 | FORCE index_or_key for_opt '(' identifier_list ')' { $$ = { type: ' ForceIndexHint' , value: $5 , forOpt: $3 , indexOrKey: $2 } }
605683 ;
606- table_factor
684+ simple_table_factor
607685 : 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
608689 | '(' selectClause ')' aliasOpt { $$ = { type: ' SubQuery' , value: $2 , alias: $4 .alias , hasAs: $4 .hasAs } }
609690 | '(' table_refrences ')' { $$ = $2 ; $$ .hasParentheses = true }
610691 ;
0 commit comments