@@ -77,7 +77,7 @@ def group_typecasts(tlist):
7777 def match (token ):
7878 return token .match (T .Punctuation , '::' )
7979
80- def valid (token ):
80+ def valid (token , idx ):
8181 return token is not None
8282
8383 def post (tlist , pidx , tidx , nidx ):
@@ -91,10 +91,10 @@ def group_tzcasts(tlist):
9191 def match (token ):
9292 return token .ttype == T .Keyword .TZCast
9393
94- def valid_prev (token ):
94+ def valid_prev (token , idx ):
9595 return token is not None
9696
97- def valid_next (token ):
97+ def valid_next (token , idx ):
9898 return token is not None and (
9999 token .is_whitespace
100100 or token .match (T .Keyword , 'AS' )
@@ -119,13 +119,13 @@ def match(token):
119119 def match_to_extend (token ):
120120 return isinstance (token , sql .TypedLiteral )
121121
122- def valid_prev (token ):
122+ def valid_prev (token , idx ):
123123 return token is not None
124124
125- def valid_next (token ):
125+ def valid_next (token , idx ):
126126 return token is not None and token .match (* sql .TypedLiteral .M_CLOSE )
127127
128- def valid_final (token ):
128+ def valid_final (token , idx ):
129129 return token is not None and token .match (* sql .TypedLiteral .M_EXTEND )
130130
131131 def post (tlist , pidx , tidx , nidx ):
@@ -141,12 +141,12 @@ def group_period(tlist):
141141 def match (token ):
142142 return token .match (T .Punctuation , '.' )
143143
144- def valid_prev (token ):
144+ def valid_prev (token , idx ):
145145 sqlcls = sql .SquareBrackets , sql .Identifier
146146 ttypes = T .Name , T .String .Symbol
147147 return imt (token , i = sqlcls , t = ttypes )
148148
149- def valid_next (token ):
149+ def valid_next (token , idx ):
150150 # issue261, allow invalid next token
151151 return True
152152
@@ -166,10 +166,10 @@ def group_as(tlist):
166166 def match (token ):
167167 return token .is_keyword and token .normalized == 'AS'
168168
169- def valid_prev (token ):
169+ def valid_prev (token , idx ):
170170 return token .normalized == 'NULL' or not token .is_keyword
171171
172- def valid_next (token ):
172+ def valid_next (token , idx ):
173173 ttypes = T .DML , T .DDL , T .CTE
174174 return not imt (token , t = ttypes ) and token is not None
175175
@@ -183,7 +183,7 @@ def group_assignment(tlist):
183183 def match (token ):
184184 return token .match (T .Assignment , ':=' )
185185
186- def valid (token ):
186+ def valid (token , idx ):
187187 return token is not None and token .ttype not in (T .Keyword ,)
188188
189189 def post (tlist , pidx , tidx , nidx ):
@@ -202,9 +202,9 @@ def group_comparison(tlist):
202202 ttypes = T_NUMERICAL + T_STRING + T_NAME
203203
204204 def match (token ):
205- return token . ttype == T .Operator .Comparison
205+ return imt ( token , t = ( T .Operator .Comparison ), m = ( T . Keyword , 'LIKE' ))
206206
207- def valid (token ):
207+ def valid (token , idx ):
208208 if imt (token , t = ttypes , i = sqlcls ):
209209 return True
210210 elif token and token .is_keyword and token .normalized == 'NULL' :
@@ -215,7 +215,22 @@ def valid(token):
215215 def post (tlist , pidx , tidx , nidx ):
216216 return pidx , nidx
217217
218- valid_prev = valid_next = valid
218+ def valid_next (token , idx ):
219+ return valid (token , idx )
220+
221+ def valid_prev (token , idx ):
222+ # https://dev.mysql.com/doc/refman/8.0/en/create-table-like.html
223+ # LIKE is usually a compatarator, except when used in
224+ # `CREATE TABLE x LIKE y` statements, Check if we are
225+ # constructing a table - otherwise assume it is indeed a comparator
226+ two_tokens_back_idx = idx - 3
227+ if two_tokens_back_idx >= 0 :
228+ _ , two_tokens_back = tlist .token_next (two_tokens_back_idx )
229+ if imt (two_tokens_back , m = (T .Keyword , 'TABLE' )):
230+ return False
231+
232+ return valid (token , idx )
233+
219234 _group (tlist , sql .Comparison , match ,
220235 valid_prev , valid_next , post , extend = False )
221236
@@ -237,10 +252,10 @@ def group_arrays(tlist):
237252 def match (token ):
238253 return isinstance (token , sql .SquareBrackets )
239254
240- def valid_prev (token ):
255+ def valid_prev (token , idx ):
241256 return imt (token , i = sqlcls , t = ttypes )
242257
243- def valid_next (token ):
258+ def valid_next (token , idx ):
244259 return True
245260
246261 def post (tlist , pidx , tidx , nidx ):
@@ -258,7 +273,7 @@ def group_operator(tlist):
258273 def match (token ):
259274 return imt (token , t = (T .Operator , T .Wildcard ))
260275
261- def valid (token ):
276+ def valid (token , idx ):
262277 return imt (token , i = sqlcls , t = ttypes ) \
263278 or (token and token .match (
264279 T .Keyword ,
@@ -283,7 +298,7 @@ def group_identifier_list(tlist):
283298 def match (token ):
284299 return token .match (T .Punctuation , ',' )
285300
286- def valid (token ):
301+ def valid (token , idx ):
287302 return imt (token , i = sqlcls , m = m_role , t = ttypes )
288303
289304 def post (tlist , pidx , tidx , nidx ):
@@ -431,8 +446,8 @@ def group(stmt):
431446
432447
433448def _group (tlist , cls , match ,
434- valid_prev = lambda t : True ,
435- valid_next = lambda t : True ,
449+ valid_prev = lambda t , idx : True ,
450+ valid_next = lambda t , idx : True ,
436451 post = None ,
437452 extend = True ,
438453 recurse = True
@@ -454,7 +469,7 @@ def _group(tlist, cls, match,
454469
455470 if match (token ):
456471 nidx , next_ = tlist .token_next (tidx )
457- if prev_ and valid_prev (prev_ ) and valid_next (next_ ):
472+ if prev_ and valid_prev (prev_ , pidx ) and valid_next (next_ , nidx ):
458473 from_idx , to_idx = post (tlist , pidx , tidx , nidx )
459474 grp = tlist .group_tokens (cls , from_idx , to_idx , extend = extend )
460475
0 commit comments