@@ -35,15 +35,42 @@ func assignIndexes(a *Analyzer, node sql.Node) (map[string]*indexLookup, error)
35
35
}
36
36
}()
37
37
38
- var err error
38
+ aliases := make (map [string ]sql.Expression )
39
+ var (
40
+ err error
41
+ fn func (node sql.Node ) bool
42
+ )
43
+ fn = func (n sql.Node ) bool {
44
+ if n == nil {
45
+ return true
46
+ }
47
+
48
+ if prj , ok := n .(* plan.Project ); ok {
49
+ for _ , ex := range prj .Expressions () {
50
+ if alias , ok := ex .(* expression.Alias ); ok {
51
+ if _ , ok := aliases [alias .Name ()]; ! ok {
52
+ aliases [alias .Name ()] = alias .Child
53
+ }
54
+ }
55
+ }
56
+ } else {
57
+ for _ , ch := range n .Children () {
58
+ plan .Inspect (ch , fn )
59
+ }
60
+ }
61
+
62
+ return true
63
+ }
64
+
39
65
plan .Inspect (node , func (node sql.Node ) bool {
40
66
filter , ok := node .(* plan.Filter )
41
67
if ! ok {
42
68
return true
43
69
}
70
+ fn (filter .Child )
44
71
45
72
var result map [string ]* indexLookup
46
- result , err = getIndexes (filter .Expression , a )
73
+ result , err = getIndexes (filter .Expression , aliases , a )
47
74
if err != nil {
48
75
return false
49
76
}
@@ -60,16 +87,16 @@ func assignIndexes(a *Analyzer, node sql.Node) (map[string]*indexLookup, error)
60
87
return indexes , err
61
88
}
62
89
63
- func getIndexes (e sql.Expression , a * Analyzer ) (map [string ]* indexLookup , error ) {
90
+ func getIndexes (e sql.Expression , aliases map [ string ]sql. Expression , a * Analyzer ) (map [string ]* indexLookup , error ) {
64
91
var result = make (map [string ]* indexLookup )
65
92
switch e := e .(type ) {
66
93
case * expression.Or :
67
- leftIndexes , err := getIndexes (e .Left , a )
94
+ leftIndexes , err := getIndexes (e .Left , aliases , a )
68
95
if err != nil {
69
96
return nil , err
70
97
}
71
98
72
- rightIndexes , err := getIndexes (e .Right , a )
99
+ rightIndexes , err := getIndexes (e .Right , aliases , a )
73
100
if err != nil {
74
101
return nil , err
75
102
}
@@ -101,7 +128,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
101
128
// the right branch is evaluable and the indexlookup supports set
102
129
// operations.
103
130
if ! isEvaluable (c .Left ()) && isEvaluable (c .Right ()) {
104
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), c .Left ())
131
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , c .Left ()) ... )
105
132
if idx != nil {
106
133
var nidx sql.NegateIndex
107
134
if negate {
@@ -178,7 +205,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
178
205
* expression.GreaterThan ,
179
206
* expression.LessThanOrEqual ,
180
207
* expression.GreaterThanOrEqual :
181
- idx , lookup , err := getComparisonIndex (a , e .(expression.Comparer ))
208
+ idx , lookup , err := getComparisonIndex (a , e .(expression.Comparer ), aliases )
182
209
if err != nil || lookup == nil {
183
210
return result , err
184
211
}
@@ -188,7 +215,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
188
215
lookup : lookup ,
189
216
}
190
217
case * expression.Not :
191
- r , err := getNegatedIndexes (a , e )
218
+ r , err := getNegatedIndexes (a , e , aliases )
192
219
if err != nil {
193
220
return nil , err
194
221
}
@@ -198,7 +225,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
198
225
}
199
226
case * expression.Between :
200
227
if ! isEvaluable (e .Val ) && isEvaluable (e .Upper ) && isEvaluable (e .Lower ) {
201
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), e .Val )
228
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , e .Val ) ... )
202
229
if idx != nil {
203
230
// release the index if it was not used
204
231
defer func () {
@@ -238,7 +265,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
238
265
exprs := splitExpression (e )
239
266
used := make (map [sql.Expression ]struct {})
240
267
241
- result , err := getMultiColumnIndexes (exprs , a , used )
268
+ result , err := getMultiColumnIndexes (exprs , a , used , aliases )
242
269
if err != nil {
243
270
return nil , err
244
271
}
@@ -248,7 +275,7 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
248
275
continue
249
276
}
250
277
251
- indexes , err := getIndexes (e , a )
278
+ indexes , err := getIndexes (e , aliases , a )
252
279
if err != nil {
253
280
return nil , err
254
281
}
@@ -262,6 +289,28 @@ func getIndexes(e sql.Expression, a *Analyzer) (map[string]*indexLookup, error)
262
289
return result , nil
263
290
}
264
291
292
+ func unifyExpressions (aliases map [string ]sql.Expression , expr ... sql.Expression ) []sql.Expression {
293
+ expressions := make ([]sql.Expression , len (expr ))
294
+
295
+ for i , e := range expr {
296
+ uex := e
297
+ name := e .String ()
298
+ if n , ok := e .(sql.Nameable ); ok {
299
+ name = n .Name ()
300
+ }
301
+
302
+ if aliases != nil && len (aliases ) > 0 {
303
+ if alias , ok := aliases [name ]; ok {
304
+ uex = alias
305
+ }
306
+ }
307
+
308
+ expressions [i ] = uex
309
+ }
310
+
311
+ return expressions
312
+ }
313
+
265
314
func betweenIndexLookup (index sql.Index , upper , lower []interface {}) (sql.IndexLookup , error ) {
266
315
ai , isAscend := index .(sql.AscendIndex )
267
316
di , isDescend := index .(sql.DescendIndex )
@@ -293,6 +342,7 @@ func betweenIndexLookup(index sql.Index, upper, lower []interface{}) (sql.IndexL
293
342
func getComparisonIndex (
294
343
a * Analyzer ,
295
344
e expression.Comparer ,
345
+ aliases map [string ]sql.Expression ,
296
346
) (sql.Index , sql.IndexLookup , error ) {
297
347
left , right := e .Left (), e .Right ()
298
348
// if the form is SOMETHING OP {INDEXABLE EXPR}, swap it, so it's {INDEXABLE EXPR} OP SOMETHING
@@ -301,7 +351,7 @@ func getComparisonIndex(
301
351
}
302
352
303
353
if ! isEvaluable (left ) && isEvaluable (right ) {
304
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), left )
354
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , left ) ... )
305
355
if idx != nil {
306
356
value , err := right .Eval (sql .NewEmptyContext (), nil )
307
357
if err != nil {
@@ -363,10 +413,10 @@ func comparisonIndexLookup(
363
413
return nil , nil
364
414
}
365
415
366
- func getNegatedIndexes (a * Analyzer , not * expression.Not ) (map [string ]* indexLookup , error ) {
416
+ func getNegatedIndexes (a * Analyzer , not * expression.Not , aliases map [ string ]sql. Expression ) (map [string ]* indexLookup , error ) {
367
417
switch e := not .Child .(type ) {
368
418
case * expression.Not :
369
- return getIndexes (e .Child , a )
419
+ return getIndexes (e .Child , aliases , a )
370
420
case * expression.Equals :
371
421
left , right := e .Left (), e .Right ()
372
422
// if the form is SOMETHING OP {INDEXABLE EXPR}, swap it, so it's {INDEXABLE EXPR} OP SOMETHING
@@ -378,7 +428,7 @@ func getNegatedIndexes(a *Analyzer, not *expression.Not) (map[string]*indexLooku
378
428
return nil , nil
379
429
}
380
430
381
- idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), left )
431
+ idx := a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , left ) ... )
382
432
if idx == nil {
383
433
return nil , nil
384
434
}
@@ -410,37 +460,37 @@ func getNegatedIndexes(a *Analyzer, not *expression.Not) (map[string]*indexLooku
410
460
return result , nil
411
461
case * expression.GreaterThan :
412
462
lte := expression .NewLessThanOrEqual (e .Left (), e .Right ())
413
- return getIndexes (lte , a )
463
+ return getIndexes (lte , aliases , a )
414
464
case * expression.GreaterThanOrEqual :
415
465
lt := expression .NewLessThan (e .Left (), e .Right ())
416
- return getIndexes (lt , a )
466
+ return getIndexes (lt , aliases , a )
417
467
case * expression.LessThan :
418
468
gte := expression .NewGreaterThanOrEqual (e .Left (), e .Right ())
419
- return getIndexes (gte , a )
469
+ return getIndexes (gte , aliases , a )
420
470
case * expression.LessThanOrEqual :
421
471
gt := expression .NewGreaterThan (e .Left (), e .Right ())
422
- return getIndexes (gt , a )
472
+ return getIndexes (gt , aliases , a )
423
473
case * expression.Between :
424
474
or := expression .NewOr (
425
475
expression .NewLessThan (e .Val , e .Lower ),
426
476
expression .NewGreaterThan (e .Val , e .Upper ),
427
477
)
428
478
429
- return getIndexes (or , a )
479
+ return getIndexes (or , aliases , a )
430
480
case * expression.Or :
431
481
and := expression .NewAnd (
432
482
expression .NewNot (e .Left ),
433
483
expression .NewNot (e .Right ),
434
484
)
435
485
436
- return getIndexes (and , a )
486
+ return getIndexes (and , aliases , a )
437
487
case * expression.And :
438
488
or := expression .NewOr (
439
489
expression .NewNot (e .Left ),
440
490
expression .NewNot (e .Right ),
441
491
)
442
492
443
- return getIndexes (or , a )
493
+ return getIndexes (or , aliases , a )
444
494
default :
445
495
return nil , nil
446
496
@@ -481,6 +531,7 @@ func getMultiColumnIndexes(
481
531
exprs []sql.Expression ,
482
532
a * Analyzer ,
483
533
used map [sql.Expression ]struct {},
534
+ aliases map [string ]sql.Expression ,
484
535
) (map [string ]* indexLookup , error ) {
485
536
result := make (map [string ]* indexLookup )
486
537
columnExprs := columnExprsByTable (exprs )
@@ -502,7 +553,7 @@ func getMultiColumnIndexes(
502
553
}
503
554
504
555
if len (selected ) > 0 {
505
- index , lookup , err := getMultiColumnIndexForExpressions (a , selected , exps , used )
556
+ index , lookup , err := getMultiColumnIndexForExpressions (a , selected , exps , used , aliases )
506
557
if err != nil || lookup == nil {
507
558
if index != nil {
508
559
a .Catalog .ReleaseIndex (index )
@@ -534,8 +585,9 @@ func getMultiColumnIndexForExpressions(
534
585
selected []sql.Expression ,
535
586
exprs []columnExpr ,
536
587
used map [sql.Expression ]struct {},
588
+ aliases map [string ]sql.Expression ,
537
589
) (index sql.Index , lookup sql.IndexLookup , err error ) {
538
- index = a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), selected ... )
590
+ index = a .Catalog .IndexByExpression (a .Catalog .CurrentDatabase (), unifyExpressions ( aliases , selected ... ) ... )
539
591
if index != nil {
540
592
var first sql.Expression
541
593
for _ , e := range exprs {
0 commit comments