1010[-][-] \s . * \n /* skip sql comments */
1111[#] \s . * \n /* skip sql comments */
1212\s + /* skip whitespace */
13-
13+
1414[`][a-zA-Z_\u4e00 -\u9fa5 ][a-zA-Z0-9_\u4e00 -\u9fa5 ] * [`] return ' IDENTIFIER'
1515[\w ] + [\u4e00 -\u9fa5 ] + [0-9a-zA-Z_\u4e00 -\u9fa5 ] * return ' IDENTIFIER'
1616[\u4e00 -\u9fa5 ][0-9a-zA-Z_\u4e00 -\u9fa5 ] * return ' IDENTIFIER'
@@ -66,6 +66,7 @@ JOIN return 'JOIN'
6666ORDER\s + BY return ' ORDER_BY'
6767GROUP\s + BY return ' GROUP_BY'
6868IGNORE return ' IGNORE'
69+ LOW_PRIORITY return ' LOW_PRIORITY'
6970FORCE return ' FORCE'
7071INNER return ' INNER'
7172CROSS return ' CROSS'
@@ -82,6 +83,7 @@ WITH return 'WITH'
8283ROLLUP return ' ROLLUP'
8384HAVING return ' HAVING'
8485OFFSET return ' OFFSET'
86+ SET return ' SET'
8587PROCEDURE return ' PROCEDURE'
8688UPDATE return ' UPDATE'
8789LOCK return ' LOCK'
@@ -116,7 +118,7 @@ LIMIT return 'LIMIT'
116118"{" return ' {'
117119"}" return ' }'
118120";" return ' ;'
119-
121+
120122['] (\\ . | [^ '] )* ['] return ' STRING'
121123["] (\\ . | [^ "] )* ["] return ' STRING'
122124[0][x][0-9a-fA-F] + return ' HEX_NUMERIC'
@@ -126,7 +128,7 @@ LIMIT return 'LIMIT'
126128[a-zA-Z_\u4e00 -\u9fa5 ][a-zA-Z0-9_\u4e00 -\u9fa5 ] * return ' IDENTIFIER'
127129\. return ' DOT'
128130['"][a-zA-Z_\u4e00 -\u9fa5 ][a-zA-Z0-9_\u4e00 -\u9fa5 ] * ["'] return ' QUOTED_IDENTIFIER'
129-
131+
130132<<EOF>> return ' EOF'
131133. return ' INVALID'
132134
@@ -159,12 +161,58 @@ LIMIT return 'LIMIT'
159161%% /* language grammar */
160162
161163main
162- : selectClause EOF { return {nodeType: ' Main' , value: $1 }; }
163- | selectClause ';' EOF { return {nodeType: ' Main' , value: $1 , hasSemicolon: true }; }
164+ : query EOF { return {nodeType: ' Main' , value: $1 }; }
165+ | query ';' EOF { return {nodeType: ' Main' , value: $1 , hasSemicolon: true }; }
166+ ;
167+
168+ query
169+ : selectClause
170+ | updateClause
171+ ;
172+
173+ updateClause
174+ : UPDATE low_priority_opt ignore_opt
175+ table_refrences
176+ SET
177+ assignmentList
178+ where_opt
179+ order_by_opt
180+ limit_opt
181+ {
182+ $$ = {
183+ type: ' Update' ,
184+ lowPriority: $2 ,
185+ ignore: $3 ,
186+ tables: $4 ,
187+ assignments: $6 ,
188+ where: $7 ,
189+ orderBy: $8 ,
190+ limit: $9
191+ }
192+ }
193+ ;
194+
195+ low_priority_opt
196+ : { $$ = null }
197+ | LOW_PRIORITY { $$ = $1 }
198+ ;
199+
200+ ignore_opt
201+ : { $$ = null }
202+ | IGNORE { $$ = $1 }
203+ ;
204+
205+ assignment
206+ : identifier '=' expr { $$ = { type: ' Assignment' , left: $1 , right: $3 } }
207+ ;
208+
209+ assignmentList
210+ : assignmentList ',' assignment { $1 .value .push ($3 ); }
211+ | assignment { $$ = { type: ' AssignmentList' , value: [ $1 ] } }
164212 ;
165213
166214selectClause
167- : SELECT
215+ : SELECT
168216 distinctOpt
169217 highPriorityOpt
170218 maxStateMentTimeOpt
@@ -203,7 +251,7 @@ selectClause
203251 ;
204252
205253distinctOpt
206- : ALL { $$ = $1 }
254+ : ALL { $$ = $1 }
207255 | DISTINCT { $$ = $1 }
208256 | DISTINCTROW { $$ = $1 }
209257 | { $$ = null }
@@ -336,7 +384,7 @@ simple_expr
336384 ;
337385bit_expr
338386 : simple_expr { $$ = $1 }
339- | bit_expr '|' bit_expr { $$ = { type: ' BitExpression' , operator: ' |' , left: $1 , right: $3 } }
387+ | bit_expr '|' bit_expr { $$ = { type: ' BitExpression' , operator: ' |' , left: $1 , right: $3 } }
340388 | bit_expr '&' bit_expr { $$ = { type: ' BitExpression' , operator: ' &' , left: $1 , right: $3 } }
341389 | bit_expr '<<' bit_expr { $$ = { type: ' BitExpression' , operator: ' <<' , left: $1 , right: $3 } }
342390 | bit_expr '>>' bit_expr { $$ = { type: ' BitExpression' , operator: ' >>' , left: $1 , right: $3 } }
0 commit comments