@@ -42,8 +42,17 @@ func assignIndexes(a *Analyzer, node sql.Node) (map[string]*indexLookup, error)
42
42
return true
43
43
}
44
44
45
+ aliases := make (map [string ]sql.Expression )
46
+ if prj , ok := filter .Child .(* plan.Project ); ok {
47
+ for _ , ex := range prj .Expressions () {
48
+ if alias , ok := ex .(* expression.Alias ); ok {
49
+ aliases [alias .Name ()] = alias .Child
50
+ }
51
+ }
52
+ }
53
+
45
54
var result map [string ]* indexLookup
46
- result , err = getIndexes (filter .Expression , a )
55
+ result , err = getIndexes (filter .Expression , aliases , a )
47
56
if err != nil {
48
57
return false
49
58
}
@@ -60,16 +69,16 @@ func assignIndexes(a *Analyzer, node sql.Node) (map[string]*indexLookup, error)
60
69
return indexes , err
61
70
}
62
71
63
- func getIndexes (e sql.Expression , a * Analyzer ) (map [string ]* indexLookup , error ) {
72
+ func getIndexes (e sql.Expression , aliases map [ string ]sql. Expression , a * Analyzer ) (map [string ]* indexLookup , error ) {
64
73
var result = make (map [string ]* indexLookup )
65
74
switch e := e .(type ) {
66
75
case * expression.Or :
67
- leftIndexes , err := getIndexes (e .Left , a )
76
+ leftIndexes , err := getIndexes (e .Left , aliases , a )
68
77
if err != nil {
69
78
return nil , err
70
79
}
71
80
72
- rightIndexes , err := getIndexes (e .Right , a )
81
+ rightIndexes , err := getIndexes (e .Right , aliases , a )
73
82
if err != nil {
74
83
return nil , err
75
84
}
@@ -101,7 +110,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
101
110
// the right branch is evaluable and the indexlookup supports set
102
111
// operations.
103
112
if ! isEvaluable (c .Left ()) && isEvaluable (c .Right ()) {
104
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), c .Left ())
113
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , c .Left ()) ... )
105
114
if idx != nil {
106
115
var nidx sql.NegateIndex
107
116
if negate {
@@ -178,7 +187,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
178
187
* expression.GreaterThan ,
179
188
* expression.LessThanOrEqual ,
180
189
* expression.GreaterThanOrEqual :
181
- idx , lookup , err := getComparisonIndex (a , e .(expression.Comparer ))
190
+ idx , lookup , err := getComparisonIndex (a , e .(expression.Comparer ), aliases )
182
191
if err != nil || lookup == nil {
183
192
return result , err
184
193
}
@@ -188,7 +197,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
188
197
lookup : lookup ,
189
198
}
190
199
case * expression.Not :
191
- r , err := getNegatedIndexes (a , e )
200
+ r , err := getNegatedIndexes (a , e , aliases )
192
201
if err != nil {
193
202
return nil , err
194
203
}
@@ -198,7 +207,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
198
207
}
199
208
case * expression.Between :
200
209
if ! isEvaluable (e .Val ) && isEvaluable (e .Upper ) && isEvaluable (e .Lower ) {
201
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), e .Val )
210
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , e .Val ) ... )
202
211
if idx != nil {
203
212
// release the index if it was not used
204
213
defer func () {
@@ -238,7 +247,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
238
247
exprs := splitExpression (e )
239
248
used := make (map [sql.Expression ]struct {})
240
249
241
- result , err := getMultiColumnIndexes (exprs , a , used )
250
+ result , err := getMultiColumnIndexes (exprs , a , used , aliases )
242
251
if err != nil {
243
252
return nil , err
244
253
}
@@ -248,7 +257,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
248
257
continue
249
258
}
250
259
251
- indexes , err := getIndexes (e , a )
260
+ indexes , err := getIndexes (e , aliases , a )
252
261
if err != nil {
253
262
return nil , err
254
263
}
@@ -262,6 +271,23 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
262
271
return result , nil
263
272
}
264
273
274
+ func unifyExpressions (aliases map [string ]sql.Expression , expr ... sql.Expression ) []sql.Expression {
275
+ expressions := make ([]sql.Expression , len (expr ))
276
+
277
+ for i , e := range expr {
278
+ uex := e
279
+ if aliases != nil {
280
+ if alias , ok := aliases [e .String ()]; ok {
281
+ uex = alias
282
+ }
283
+ }
284
+
285
+ expressions [i ] = uex
286
+ }
287
+
288
+ return expressions
289
+ }
290
+
265
291
func betweenIndexLookup (index sql.Index , upper , lower []interface {}) (sql.IndexLookup , error ) {
266
292
ai , isAscend := index .(sql.AscendIndex )
267
293
di , isDescend := index .(sql.DescendIndex )
@@ -293,6 +319,7 @@ func betweenIndexLookup(index sql.Index, upper, lower []interface{}) (sql.IndexL
293
319
func getComparisonIndex (
294
320
a * Analyzer ,
295
321
e expression.Comparer ,
322
+ aliases map [string ]sql.Expression ,
296
323
) (sql.Index , sql.IndexLookup , error ) {
297
324
left , right := e .Left (), e .Right ()
298
325
// if the form is SOMETHING OP {INDEXABLE EXPR}, swap it, so it's {INDEXABLE EXPR} OP SOMETHING
@@ -301,7 +328,7 @@ func getComparisonIndex(
301
328
}
302
329
303
330
if ! isEvaluable (left ) && isEvaluable (right ) {
304
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), left )
331
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , left ) ... )
305
332
if idx != nil {
306
333
value , err := right .Eval (sql .NewEmptyContext (), nil )
307
334
if err != nil {
@@ -363,10 +390,10 @@ func comparisonIndexLookup(
363
390
return nil , nil
364
391
}
365
392
366
- func getNegatedIndexes (a * Analyzer , not * expression.Not ) (map [string ]* indexLookup , error ) {
393
+ func getNegatedIndexes (a * Analyzer , not * expression.Not , aliases map [ string ]sql. Expression ) (map [string ]* indexLookup , error ) {
367
394
switch e := not .Child .(type ) {
368
395
case * expression.Not :
369
- return getIndexes (e .Child , a )
396
+ return getIndexes (e .Child , aliases , a )
370
397
case * expression.Equals :
371
398
left , right := e .Left (), e .Right ()
372
399
// if the form is SOMETHING OP {INDEXABLE EXPR}, swap it, so it's {INDEXABLE EXPR} OP SOMETHING
@@ -378,7 +405,7 @@ func getNegatedIndexes(a *Analyzer, not *expression.Not) (map[string]*indexLooku
378
405
return nil , nil
379
406
}
380
407
381
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), left )
408
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , left ) ... )
382
409
if idx == nil {
383
410
return nil , nil
384
411
}
@@ -410,37 +437,37 @@ func getNegatedIndexes(a *Analyzer, not *expression.Not) (map[string]*indexLooku
410
437
return result , nil
411
438
case * expression.GreaterThan :
412
439
lte := expression .NewLessThanOrEqual (e .Left (), e .Right ())
413
- return getIndexes (lte , a )
440
+ return getIndexes (lte , aliases , a )
414
441
case * expression.GreaterThanOrEqual :
415
442
lt := expression .NewLessThan (e .Left (), e .Right ())
416
- return getIndexes (lt , a )
443
+ return getIndexes (lt , aliases , a )
417
444
case * expression.LessThan :
418
445
gte := expression .NewGreaterThanOrEqual (e .Left (), e .Right ())
419
- return getIndexes (gte , a )
446
+ return getIndexes (gte , aliases , a )
420
447
case * expression.LessThanOrEqual :
421
448
gt := expression .NewGreaterThan (e .Left (), e .Right ())
422
- return getIndexes (gt , a )
449
+ return getIndexes (gt , aliases , a )
423
450
case * expression.Between :
424
451
or := expression .NewOr (
425
452
expression .NewLessThan (e .Val , e .Lower ),
426
453
expression .NewGreaterThan (e .Val , e .Upper ),
427
454
)
428
455
429
- return getIndexes (or , a )
456
+ return getIndexes (or , aliases , a )
430
457
case * expression.Or :
431
458
and := expression .NewAnd (
432
459
expression .NewNot (e .Left ),
433
460
expression .NewNot (e .Right ),
434
461
)
435
462
436
- return getIndexes (and , a )
463
+ return getIndexes (and , aliases , a )
437
464
case * expression.And :
438
465
or := expression .NewOr (
439
466
expression .NewNot (e .Left ),
440
467
expression .NewNot (e .Right ),
441
468
)
442
469
443
- return getIndexes (or , a )
470
+ return getIndexes (or , aliases , a )
444
471
default :
445
472
return nil , nil
446
473
@@ -481,6 +508,7 @@ func getMultiColumnIndexes(
481
508
exprs []sql.Expression ,
482
509
a * Analyzer ,
483
510
used map [sql.Expression ]struct {},
511
+ aliases map [string ]sql.Expression ,
484
512
) (map [string ]* indexLookup , error ) {
485
513
result := make (map [string ]* indexLookup )
486
514
columnExprs := columnExprsByTable (exprs )
@@ -502,7 +530,7 @@ func getMultiColumnIndexes(
502
530
}
503
531
504
532
if len (selected ) > 0 {
505
- index , lookup , err := getMultiColumnIndexForExpressions (a , selected , exps , used )
533
+ index , lookup , err := getMultiColumnIndexForExpressions (a , selected , exps , used , aliases )
506
534
if err != nil || lookup == nil {
507
535
if index != nil {
508
536
a .Catalog .ReleaseIndex (index )
@@ -534,8 +562,9 @@ func getMultiColumnIndexForExpressions(
534
562
selected []sql.Expression ,
535
563
exprs []columnExpr ,
536
564
used map [sql.Expression ]struct {},
565
+ aliases map [string ]sql.Expression ,
537
566
) (index sql.Index , lookup sql.IndexLookup , err error ) {
538
- index = a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), selected ... )
567
+ index = a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , selected ... ) ... )
539
568
if index != nil {
540
569
var first sql.Expression
541
570
for _ , e := range exprs {
0 commit comments