@@ -142,7 +142,7 @@ func tableExprToTable(te sqlparser.TableExpr) (sql.Node, error) {
142
142
}
143
143
144
144
func whereToFilter (w * sqlparser.Where , child sql.Node ) (* plan.Filter , error ) {
145
- c , err := boolExprToExpression (w .Expr )
145
+ c , err := exprToExpression (w .Expr )
146
146
if err != nil {
147
147
return nil , err
148
148
}
@@ -153,7 +153,7 @@ func whereToFilter(w *sqlparser.Where, child sql.Node) (*plan.Filter, error) {
153
153
func orderByToSort (ob sqlparser.OrderBy , child sql.Node ) (* plan.Sort , error ) {
154
154
var sortFields []plan.SortField
155
155
for _ , o := range ob {
156
- e , err := valExprToExpression (o .Expr )
156
+ e , err := exprToExpression (o .Expr )
157
157
if err != nil {
158
158
return nil , err
159
159
}
@@ -175,8 +175,8 @@ func orderByToSort(ob sqlparser.OrderBy, child sql.Node) (*plan.Sort, error) {
175
175
return plan .NewSort (sortFields , child ), nil
176
176
}
177
177
178
- func limitToLimit (o sqlparser.ValExpr , child sql.Node ) (* plan.Limit , error ) {
179
- e , err := valExprToExpression (o )
178
+ func limitToLimit (o sqlparser.Expr , child sql.Node ) (* plan.Limit , error ) {
179
+ e , err := exprToExpression (o )
180
180
if err != nil {
181
181
return nil , err
182
182
}
@@ -232,49 +232,61 @@ func selectExprsToExpressions(se sqlparser.SelectExprs) ([]sql.Expression, error
232
232
}
233
233
234
234
func exprToExpression (e sqlparser.Expr ) (sql.Expression , error ) {
235
- be , ok := e .(sqlparser.BoolExpr )
236
- if ok {
237
- return boolExprToExpression (be )
238
- }
239
-
240
- c , ok := e .(* sqlparser.ComparisonExpr )
241
- if ok {
242
- return comparisonExprToExpression (c )
243
- }
244
-
245
- v , ok := e .(sqlparser.ValExpr )
246
- if ok {
247
- return valExprToExpression (v )
248
- }
249
-
250
- return nil , errUnsupported (e )
251
- }
252
-
253
- func boolExprToExpression (be sqlparser.BoolExpr ) (sql.Expression , error ) {
254
- switch b := be .(type ) {
235
+ switch v := e .(type ) {
255
236
default :
256
- return nil , errUnsupported (b )
237
+ return nil , errUnsupported (e )
257
238
case * sqlparser.ComparisonExpr :
258
- return comparisonExprToExpression (b )
239
+ return comparisonExprToExpression (v )
259
240
case * sqlparser.NotExpr :
260
- c , err := boolExprToExpression ( b .Expr )
241
+ c , err := exprToExpression ( v .Expr )
261
242
if err != nil {
262
243
return nil , err
263
244
}
264
245
265
246
return expression .NewNot (c ), nil
247
+ case * sqlparser.SQLVal :
248
+ switch v .Type {
249
+ case sqlparser .StrVal :
250
+ return expression .NewLiteral (string (v .Val ), sql .String ), nil
251
+ case sqlparser .IntVal :
252
+ //TODO: Use smallest integer representation and widen later.
253
+ n , _ := strconv .ParseInt (string (v .Val ), 10 , 64 )
254
+ return expression .NewLiteral (n , sql .BigInteger ), nil
255
+ case sqlparser .HexVal :
256
+ //TODO
257
+ return nil , errUnsupported (v )
258
+ default :
259
+ //TODO
260
+ return nil , errUnsupported (v )
261
+ }
262
+ case sqlparser.BoolVal :
263
+ return expression .NewLiteral (bool (v ), sql .Boolean ), nil
264
+ case * sqlparser.NullVal :
265
+ //TODO
266
+ return expression .NewLiteral (nil , sql .Null ), nil
267
+ case * sqlparser.ColName :
268
+ //TODO: add handling of case sensitiveness.
269
+ return expression .NewUnresolvedColumn (v .Name .Lowered ()), nil
270
+ case * sqlparser.FuncExpr :
271
+ exprs , err := selectExprsToExpressions (v .Exprs )
272
+ if err != nil {
273
+ return nil , err
274
+ }
275
+
276
+ return expression .NewUnresolvedFunction (v .Name .Lowered (),
277
+ v .IsAggregate (), exprs ... ), nil
266
278
}
267
279
}
268
280
269
281
func comparisonExprToExpression (c * sqlparser.ComparisonExpr ) (sql.Expression ,
270
282
error ) {
271
283
272
- left , err := valExprToExpression (c .Left )
284
+ left , err := exprToExpression (c .Left )
273
285
if err != nil {
274
286
return nil , err
275
287
}
276
288
277
- right , err := valExprToExpression (c .Right )
289
+ right , err := exprToExpression (c .Right )
278
290
if err != nil {
279
291
return nil , err
280
292
}
@@ -302,7 +314,7 @@ func comparisonExprToExpression(c *sqlparser.ComparisonExpr) (sql.Expression,
302
314
func groupByToExpressions (g sqlparser.GroupBy ) ([]sql.Expression , error ) {
303
315
es := make ([]sql.Expression , len (g ))
304
316
for i , ve := range g {
305
- e , err := valExprToExpression (ve )
317
+ e , err := exprToExpression (ve )
306
318
if err != nil {
307
319
return nil , err
308
320
}
@@ -313,44 +325,6 @@ func groupByToExpressions(g sqlparser.GroupBy) ([]sql.Expression, error) {
313
325
return es , nil
314
326
}
315
327
316
- func valExprToExpression (ve sqlparser.ValExpr ) (sql.Expression , error ) {
317
- switch v := ve .(type ) {
318
- default :
319
- return nil , errUnsupported (v )
320
- case * sqlparser.SQLVal :
321
- switch v .Type {
322
- case sqlparser .StrVal :
323
- return expression .NewLiteral (string (v .Val ), sql .String ), nil
324
- case sqlparser .IntVal :
325
- //TODO: Use smallest integer representation and widen later.
326
- n , _ := strconv .ParseInt (string (v .Val ), 10 , 64 )
327
- return expression .NewLiteral (n , sql .BigInteger ), nil
328
- case sqlparser .HexVal :
329
- //TODO
330
- return nil , errUnsupported (v )
331
- default :
332
- //TODO
333
- return nil , errUnsupported (v )
334
- }
335
- case sqlparser.BoolVal :
336
- return expression .NewLiteral (bool (v ), sql .Boolean ), nil
337
- case * sqlparser.NullVal :
338
- //TODO
339
- return expression .NewLiteral (nil , sql .Null ), nil
340
- case * sqlparser.ColName :
341
- //TODO: add handling of case sensitiveness.
342
- return expression .NewUnresolvedColumn (v .Name .Lowered ()), nil
343
- case * sqlparser.FuncExpr :
344
- exprs , err := selectExprsToExpressions (v .Exprs )
345
- if err != nil {
346
- return nil , err
347
- }
348
-
349
- return expression .NewUnresolvedFunction (v .Name .Lowered (),
350
- v .IsAggregate (), exprs ... ), nil
351
- }
352
- }
353
-
354
328
func selectExprToExpression (se sqlparser.SelectExpr ) (sql.Expression , error ) {
355
329
switch e := se .(type ) {
356
330
default :
0 commit comments