Skip to content

Commit a03f2a4

Browse files
author
James Cor
committed
bug fixes and more tests
1 parent 3797cf3 commit a03f2a4

3 files changed

Lines changed: 191 additions & 17 deletions

File tree

enginetest/queries/indexed_expressions_queries.go

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,4 +1149,180 @@ var IndexedExpressionsScriptTests = []ScriptTest{
11491149
},
11501150
},
11511151
},
1152+
{
1153+
Name: "composite indexes are used during tuple expression filters",
1154+
SetUpScript: []string{
1155+
"create table t (i int, j int, k int, primary key(i, j, k));",
1156+
"insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8), (9, 9, 9), (10, 10, 10);",
1157+
},
1158+
Assertions: []ScriptTestAssertion{
1159+
{
1160+
Query: "select * from t where (i, j, k) = (3, 3, 3);",
1161+
Expected: []sql.Row{
1162+
{3, 3, 3},
1163+
},
1164+
ExpectedIndexes: []string{"primary"},
1165+
},
1166+
{
1167+
Query: "select * from t where (i, j, k) = (3, 3, 3) or (i, j, k) = (10, 10, 10);",
1168+
Expected: []sql.Row{
1169+
{3, 3, 3},
1170+
{10, 10, 10},
1171+
},
1172+
ExpectedIndexes: []string{"primary"},
1173+
},
1174+
{
1175+
Query: "select * from t where (k, j, i) = (3, 3, 3);",
1176+
Expected: []sql.Row{
1177+
{3, 3, 3},
1178+
},
1179+
ExpectedIndexes: []string{"primary"},
1180+
},
1181+
{
1182+
Query: "select * from t where (i, j, k) > (2, 3, 4);",
1183+
Expected: []sql.Row{
1184+
{3, 3, 3},
1185+
{4, 4, 4},
1186+
{5, 5, 5},
1187+
{6, 6, 6},
1188+
{7, 7, 7},
1189+
{8, 8, 8},
1190+
{9, 9, 9},
1191+
{10, 10, 10},
1192+
},
1193+
ExpectedIndexes: []string{"primary"},
1194+
},
1195+
{
1196+
Query: "select * from t where (i, j, k) >= (2, 3, 4);",
1197+
Expected: []sql.Row{
1198+
{3, 3, 3},
1199+
{4, 4, 4},
1200+
{5, 5, 5},
1201+
{6, 6, 6},
1202+
{7, 7, 7},
1203+
{8, 8, 8},
1204+
{9, 9, 9},
1205+
{10, 10, 10},
1206+
},
1207+
ExpectedIndexes: []string{"primary"},
1208+
},
1209+
{
1210+
Query: "select * from t where (i, j, k) < (2, 3, 4);",
1211+
Expected: []sql.Row{
1212+
{1, 1, 1},
1213+
{2, 2, 2},
1214+
},
1215+
ExpectedIndexes: []string{"primary"},
1216+
},
1217+
{
1218+
Query: "select * from t where (i, j, k) <= (2, 3, 4);",
1219+
Expected: []sql.Row{
1220+
{1, 1, 1},
1221+
{2, 2, 2},
1222+
},
1223+
ExpectedIndexes: []string{"primary"},
1224+
},
1225+
{
1226+
Query: "select * from t where (i, j, k) > (5, 5, 5);",
1227+
Expected: []sql.Row{
1228+
{6, 6, 6},
1229+
{7, 7, 7},
1230+
{8, 8, 8},
1231+
{9, 9, 9},
1232+
{10, 10, 10},
1233+
},
1234+
ExpectedIndexes: []string{"primary"},
1235+
},
1236+
{
1237+
Query: "select * from t where (i, j, k) >= (5, 5, 5);",
1238+
Expected: []sql.Row{
1239+
{5, 5, 5},
1240+
{6, 6, 6},
1241+
{7, 7, 7},
1242+
{8, 8, 8},
1243+
{9, 9, 9},
1244+
{10, 10, 10},
1245+
},
1246+
ExpectedIndexes: []string{"primary"},
1247+
},
1248+
{
1249+
Query: "select * from t where (i, j, k) < (5, 5, 5);",
1250+
Expected: []sql.Row{
1251+
{1, 1, 1},
1252+
{2, 2, 2},
1253+
{3, 3, 3},
1254+
{4, 4, 4},
1255+
},
1256+
ExpectedIndexes: []string{"primary"},
1257+
},
1258+
{
1259+
Query: "select * from t where (i, j, k) <= (5, 5, 5);",
1260+
Expected: []sql.Row{
1261+
{1, 1, 1},
1262+
{2, 2, 2},
1263+
{3, 3, 3},
1264+
{4, 4, 4},
1265+
{5, 5, 5},
1266+
},
1267+
ExpectedIndexes: []string{"primary"},
1268+
},
1269+
{
1270+
Query: "select * from t where (k, j, i) > (2, 3, 4);",
1271+
Expected: []sql.Row{
1272+
{3, 3, 3},
1273+
{4, 4, 4},
1274+
{5, 5, 5},
1275+
{6, 6, 6},
1276+
{7, 7, 7},
1277+
{8, 8, 8},
1278+
{9, 9, 9},
1279+
{10, 10, 10},
1280+
},
1281+
ExpectedIndexes: []string{"primary"},
1282+
},
1283+
{
1284+
Query: "select * from t where (i, j, k) > (3, 3, 3) and (i, j, k) < (7, 7, 7);",
1285+
Expected: []sql.Row{
1286+
{4, 4, 4},
1287+
{5, 5, 5},
1288+
{6, 6, 6},
1289+
},
1290+
ExpectedIndexes: []string{"primary"},
1291+
},
1292+
{
1293+
Query: "select * from t where (i, j, k) >= (3, 3, 3) and (i, j, k) < (7, 7, 7);",
1294+
Expected: []sql.Row{
1295+
{3, 3, 3},
1296+
{4, 4, 4},
1297+
{5, 5, 5},
1298+
{6, 6, 6},
1299+
},
1300+
ExpectedIndexes: []string{"primary"},
1301+
},
1302+
{
1303+
Query: "select * from t where (i, j, k) < (3, 3, 3) or (i, j, k) > (7, 7, 7);",
1304+
Expected: []sql.Row{
1305+
{1, 1, 1},
1306+
{2, 2, 2},
1307+
{8, 8, 8},
1308+
{9, 9, 9},
1309+
{10, 10, 10},
1310+
},
1311+
ExpectedIndexes: []string{"primary"},
1312+
},
1313+
{
1314+
Query: "select * from t where (i, j, k) <= (3, 3, 3) or (i, j, k) >= (7, 7, 7);",
1315+
Expected: []sql.Row{
1316+
{1, 1, 1},
1317+
{2, 2, 2},
1318+
{3, 3, 3},
1319+
{7, 7, 7},
1320+
{8, 8, 8},
1321+
{9, 9, 9},
1322+
{10, 10, 10},
1323+
},
1324+
ExpectedIndexes: []string{"primary"},
1325+
},
1326+
},
1327+
},
11521328
}

sql/analyzer/costed_index_scan.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1713,7 +1713,7 @@ func (c *indexCoster) transformForIndexCosting(ctx *sql.Context, expr sql.Expres
17131713
switch e := e.(type) {
17141714
case *expression.InTuple, *expression.HashInTuple:
17151715
newExpr, ok = c.transformInTupleForIndexCosting(leftTuple, rightTuple)
1716-
case *expression.Equals: // TODO: *expression.NullSafeEquals?
1716+
case *expression.Equals:
17171717
newExpr, ok = c.transformInTupleForIndexCosting(leftTuple, expression.NewTuple(rightTuple))
17181718
case *expression.LessThan:
17191719
newExpr, ok = c.transformLessThanTupleForIndexCosting(leftTuple, rightTuple)
@@ -1735,8 +1735,11 @@ func (c *indexCoster) transformForIndexCosting(ctx *sql.Context, expr sql.Expres
17351735
}
17361736

17371737
func (c *indexCoster) transformInTupleForIndexCosting(leftTuple, rightTuples expression.Tuple) (sql.Expression, bool) {
1738-
orExprs := make([]sql.Expression, len(rightTuples))
17391738
n := len(leftTuple)
1739+
if len(rightTuples) == 0 && n > 0 {
1740+
return expression.NewLiteral(false, types.Boolean), true
1741+
}
1742+
orExprs := make([]sql.Expression, len(rightTuples))
17401743
for i, elem := range rightTuples {
17411744
rightTuple, isTup := elem.(expression.Tuple)
17421745
if !isTup || n != len(rightTuple) {
@@ -1750,11 +1753,6 @@ func (c *indexCoster) transformInTupleForIndexCosting(leftTuple, rightTuples exp
17501753
orExprs[i] = expression.JoinAnd(andExprs...)
17511754
}
17521755

1753-
// TODO: If JoinOr returned a false literal on an empty input, this would not be necessary, but that seems to
1754-
// break some tests.
1755-
if len(orExprs) == 0 {
1756-
return expression.NewLiteral(false, types.Boolean), true
1757-
}
17581756
return expression.JoinOr(orExprs...), true
17591757
}
17601758

@@ -1827,12 +1825,12 @@ func (c *indexCoster) transformGreaterThanEqualTupleForIndexCosting(leftTuple, r
18271825
}
18281826
andExprs[n-1] = expression.NewGreaterThanOrEqual(leftTuple[n-1], rightTuple[n-1])
18291827
orExprs[0] = expression.JoinAnd(andExprs...)
1830-
for i := 0; i < n; i++ {
1828+
for i := 1; i < n; i++ {
18311829
andExprs = make([]sql.Expression, n-i)
18321830
for j := 0; j < n-i-1; j++ {
18331831
andExprs[j] = expression.NewEquals(leftTuple[j], rightTuple[j])
18341832
}
1835-
andExprs[n-i-1] = expression.NewLessThan(leftTuple[n-i-1], rightTuple[n-i-1])
1833+
andExprs[n-i-1] = expression.NewGreaterThan(leftTuple[n-i-1], rightTuple[n-i-1])
18361834
orExprs[i] = expression.JoinAnd(andExprs...)
18371835
}
18381836
return expression.JoinOr(orExprs...), true

sql/analyzer/costed_index_scan_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ Or
347347
},
348348
{
349349
name: "tuple greater than decomposes to ORs of ANDs",
350-
in: expression.NewLessThan(
350+
in: expression.NewGreaterThan(
351351
expression.Tuple{
352352
gf(0, "xyz", "x"),
353353
gf(1, "xyz", "y"),
@@ -363,15 +363,15 @@ Or
363363
(3: and
364364
(5: xy.x = 5)
365365
(6: xy.y = 6)
366-
(7: xy.z < 7))
366+
(7: xy.z > 7))
367367
(8: and
368368
(9: xy.x = 5)
369-
(10: xy.y < 6))
370-
(11: xy.x < 5))`,
369+
(10: xy.y > 6))
370+
(11: xy.x > 5))`,
371371
},
372372
{
373373
name: "tuple greater than equals decomposes to ORs of ANDs",
374-
in: expression.NewLessThanOrEqual(
374+
in: expression.NewGreaterThanOrEqual(
375375
expression.Tuple{
376376
gf(0, "xyz", "x"),
377377
gf(1, "xyz", "y"),
@@ -387,11 +387,11 @@ Or
387387
(3: and
388388
(5: xy.x = 5)
389389
(6: xy.y = 6)
390-
(7: xy.z <= 7))
390+
(7: xy.z >= 7))
391391
(8: and
392392
(9: xy.x = 5)
393-
(10: xy.y < 6))
394-
(11: xy.x < 5))`,
393+
(10: xy.y > 6))
394+
(11: xy.x > 5))`,
395395
},
396396
}
397397

0 commit comments

Comments
 (0)