Skip to content

Commit 7f6dddf

Browse files
committed
Bug fix for type conversion in index building
1 parent e806822 commit 7f6dddf

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

sql/analyzer/costed_index_scan.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,23 +1012,23 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder,
10121012
name := f.normString()
10131013
switch f.Op() {
10141014
case sql.IndexScanOpEq:
1015-
bb.Equals(b.ctx, name, f.gf.Type(), f.litValue)
1015+
bb.Equals(b.ctx, name, f.litType, f.litValue)
10161016
case sql.IndexScanOpNotEq:
1017-
bb.NotEquals(b.ctx, name, f.gf.Type(), f.litValue)
1017+
bb.NotEquals(b.ctx, name, f.litType, f.litValue)
10181018
case sql.IndexScanOpInSet:
1019-
bb.Equals(b.ctx, name, f.gf.Type(), f.setValues...)
1019+
bb.Equals(b.ctx, name, f.litType, f.setValues...)
10201020
case sql.IndexScanOpNotInSet:
10211021
for _, v := range f.setValues {
1022-
bb.NotEquals(b.ctx, name, f.gf.Type(), v)
1022+
bb.NotEquals(b.ctx, name, f.litType, v)
10231023
}
10241024
case sql.IndexScanOpGt:
1025-
bb.GreaterThan(b.ctx, name, f.gf.Type(), f.litValue)
1025+
bb.GreaterThan(b.ctx, name, f.litType, f.litValue)
10261026
case sql.IndexScanOpGte:
1027-
bb.GreaterOrEqual(b.ctx, name, f.gf.Type(), f.litValue)
1027+
bb.GreaterOrEqual(b.ctx, name, f.litType, f.litValue)
10281028
case sql.IndexScanOpLt:
1029-
bb.LessThan(b.ctx, name, f.gf.Type(), f.litValue)
1029+
bb.LessThan(b.ctx, name, f.litType, f.litValue)
10301030
case sql.IndexScanOpLte:
1031-
bb.LessOrEqual(b.ctx, name, f.gf.Type(), f.litValue)
1031+
bb.LessOrEqual(b.ctx, name, f.litType, f.litValue)
10321032
case sql.IndexScanOpIsNotNull:
10331033
bb.IsNotNull(b.ctx, name)
10341034
case sql.IndexScanOpIsNull:
@@ -1037,7 +1037,7 @@ func (b *indexScanRangeBuilder) rangeBuildDefaultLeaf(bb *sql.MySQLIndexBuilder,
10371037
if f.litValue == nil {
10381038
bb.IsNull(b.ctx, name)
10391039
} else {
1040-
bb.Equals(b.ctx, name, f.gf.Type(), f.litValue)
1040+
bb.Equals(b.ctx, name, f.litType, f.litValue)
10411041
}
10421042
default:
10431043
panic(fmt.Sprintf("unknown IndexScanOp: %d", f.Op()))
@@ -1070,6 +1070,7 @@ type indexFilter interface {
10701070

10711071
type iScanLeaf struct {
10721072
litValue interface{}
1073+
litType sql.Type
10731074
gf *expression.GetField
10741075
underlying string
10751076
fulltextIndex string
@@ -1439,7 +1440,14 @@ func newLeaf(ctx *sql.Context, id indexScanId, e sql.Expression, underlying stri
14391440
return nil, false
14401441
}
14411442

1442-
return &iScanLeaf{id: id, gf: gf, op: op, litValue: value, underlying: underlying}, true
1443+
return &iScanLeaf{
1444+
id: id,
1445+
gf: gf,
1446+
op: op,
1447+
litValue: value,
1448+
litType: right.Type(),
1449+
underlying: underlying,
1450+
}, true
14431451
}
14441452

14451453
// IndexLeafChildren handles the struct types that may be found on a leaf node while creating indexes.

sql/index_builder.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,8 @@ func (b *MySQLIndexBuilder) Equals(ctx *Context, colExpr string, keyType Type, k
134134
}
135135

136136
var err error
137-
if et, ok := keyType.(ExtendedType); ok {
138-
k, err = et.ConvertToType(ctx, colTyp.(ExtendedType), k)
139-
} else {
140-
k, _, err = colTyp.Convert(ctx, k)
141-
}
137+
k, err = b.convertKey(ctx, colTyp, keyType, k)
138+
142139
if err != nil {
143140
b.isInvalid = true
144141
b.err = err
@@ -228,8 +225,8 @@ func (b *MySQLIndexBuilder) GreaterThan(ctx *Context, colExpr string, keyType Ty
228225
}
229226

230227
func (b *MySQLIndexBuilder) convertKey(ctx *Context, colType Type, keyType Type, key interface{}) (interface{}, error) {
231-
if et, ok := keyType.(ExtendedType); ok {
232-
return et.ConvertToType(ctx, colType.(ExtendedType), key)
228+
if et, ok := colType.(ExtendedType); ok {
229+
return et.ConvertToType(ctx, keyType.(ExtendedType), key)
233230
} else {
234231
key, _, err := colType.Convert(ctx, key)
235232
return key, err

0 commit comments

Comments
 (0)