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