Skip to content

Commit a0b355c

Browse files
committed
Merge remote-tracking branch 'origin/trinity'
Change-Id: I9b1596ae6680f765cac4f16e9536412f7a253d67
2 parents 183cc05 + d3d1af4 commit a0b355c

File tree

5 files changed

+70
-3
lines changed

5 files changed

+70
-3
lines changed

planner/build_scan_covering.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ couter:
478478
for tc, _ := range coveringEntries {
479479
if sc != tc {
480480
te := coveringEntries[tc].idxEntry
481-
if be := bestIndexBySargableKeys(se, te, se.nEqCond, te.nEqCond); be != nil {
481+
if be := bestIndexBySargableKeys(se, te, se.nEqCond, te.nEqCond, false); be != nil {
482482
if be == te {
483483
delete(coveringEntries, sc)
484484
continue couter

planner/build_scan_secondary.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,9 @@ func (this *builder) sargableIndexes(indexes []datastore.Index, pred, subset, vp
586586
nvectors++
587587
entry.SetFlags(IE_VECTOR_KEY_SARGABLE, true)
588588
}
589+
if hasRedundantSargKeys(keys, skeys) {
590+
entry.SetFlags(IE_HAS_REDUNDANT_SARG_KEY, true)
591+
}
589592

590593
if n > 0 {
591594
sargables[index] = entry
@@ -804,7 +807,7 @@ func narrowerOrEquivalent(se, te *indexEntry, shortest, corrSubq bool, predFc ma
804807

805808
snk, snc := matchedKeysConditions(se, te, shortest, predFc)
806809

807-
be := bestIndexBySargableKeys(se, te, se.nEqCond, te.nEqCond)
810+
be := bestIndexBySargableKeys(se, te, se.nEqCond, te.nEqCond, shortest)
808811
if be == te { // te is better index
809812
return false
810813
}
@@ -1248,6 +1251,23 @@ func hasArrayIndexKey(keys expression.Expressions) bool {
12481251
return false
12491252
}
12501253

1254+
func hasRedundantSargKeys(keys datastore.IndexKeys, skeys []bool) bool {
1255+
for i := 0; i < len(keys); i++ {
1256+
if i >= len(skeys) || !skeys[i] {
1257+
continue
1258+
}
1259+
for j := i + 1; j < len(keys); j++ {
1260+
if j >= len(skeys) || !skeys[j] {
1261+
continue
1262+
}
1263+
if keys[i].Expr.DependsOn(keys[j].Expr) || keys[j].Expr.DependsOn(keys[i].Expr) {
1264+
return true
1265+
}
1266+
}
1267+
}
1268+
return false
1269+
}
1270+
12511271
func (this *builder) chooseIntersectScan(sargables map[datastore.Index]*indexEntry,
12521272
node *algebra.KeyspaceTerm, vector bool) map[datastore.Index]*indexEntry {
12531273

@@ -1274,7 +1294,31 @@ func (this *builder) chooseIntersectScan(sargables map[datastore.Index]*indexEnt
12741294
this.advisorValidate(), len(this.baseKeyspaces) == 1, vector, this.context)
12751295
}
12761296

1277-
func bestIndexBySargableKeys(se, te *indexEntry, snc, tnc int) *indexEntry {
1297+
func bestIndexBySargableKeys(se, te *indexEntry, snc, tnc int, shortest bool) *indexEntry {
1298+
be := bestIndexBySargKeys(se, te, snc, tnc)
1299+
if !shortest && be != nil {
1300+
s_pushdown := se.PushDownProperty()
1301+
t_pushdown := te.PushDownProperty()
1302+
s_redundantSargKey := se.HasFlag(IE_HAS_REDUNDANT_SARG_KEY)
1303+
t_redundantSargKey := te.HasFlag(IE_HAS_REDUNDANT_SARG_KEY)
1304+
if be == se && s_redundantSargKey {
1305+
if t_pushdown > s_pushdown {
1306+
be = te
1307+
} else if t_pushdown == s_pushdown {
1308+
be = nil
1309+
}
1310+
} else if be == te && t_redundantSargKey {
1311+
if s_pushdown > t_pushdown {
1312+
be = se
1313+
} else if s_pushdown == t_pushdown {
1314+
be = nil
1315+
}
1316+
}
1317+
}
1318+
return be
1319+
}
1320+
1321+
func bestIndexBySargKeys(se, te *indexEntry, snc, tnc int) *indexEntry {
12781322
si := 0
12791323
ti := 0
12801324
for si < len(se.skeys) && ti < len(te.skeys) {

planner/index_entry.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const (
4646
IE_VECTOR_KEY_SKIP_ORDER
4747
IE_NONEQ_COND
4848
IE_VECTOR_RERANK
49+
IE_HAS_REDUNDANT_SARG_KEY
4950
)
5051

5152
type indexEntry struct {

test/gsi/test_cases/indexga/case_indexga_bugs.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,5 +180,25 @@
180180
"c3": 10
181181
}
182182
]
183+
},
184+
{
185+
"testcase": "MB-67549",
186+
"ignore": "index_id",
187+
"explain": {
188+
"disabled": false,
189+
"results": [
190+
{
191+
"present": true
192+
}
193+
],
194+
"statement": "SELECT true AS present FROM $explan AS p WHERE ANY v WITHIN p.plan.`~children` SATISFIES v.`#operator` LIKE 'IndexScan%' AND v.`index_group_aggs` IS NOT MISSING AND v.`index_order` IS NOT MISSING END"
195+
},
196+
"statements": "SELECT abs(c3) AS abs, count(1) AS cnt FROM orders WHERE test_id = 'indexga' AND type = 'bugs' AND abs(c3) > 10 GROUP BY abs(c3) ORDER BY abs",
197+
"results": [
198+
{
199+
"abs": 15,
200+
"cnt": 2
201+
}
202+
]
183203
}
184204
]

test/gsi/test_cases/indexga/indexga_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@ func TestGroupagg(t *testing.T) {
3737
runStmt(qc, "CREATE INDEX ixga201 ON orders(c1, a1, c2, c3) WHERE test_id = 'indexga' AND type = 'bugs'")
3838
runStmt(qc, "CREATE INDEX ixga202 ON orders(c10, DISTINCT a1) WHERE test_id = 'indexga' AND type = 'bugs'")
3939
runStmt(qc, "CREATE INDEX ixga203 ON orders(c3, abs(c3)) WHERE test_id = 'indexga' AND type = 'bugs'")
40+
runStmt(qc, "CREATE INDEX ixga204 ON orders(abs(c3)) WHERE test_id = 'indexga' AND type = 'bugs'")
4041

4142
runMatch("case_indexga_bugs.json", false, true, qc, t)
4243

4344
runStmt(qc, "DROP INDEX orders.ixga201")
4445
runStmt(qc, "DROP INDEX orders.ixga202")
4546
runStmt(qc, "DROP INDEX orders.ixga203")
47+
runStmt(qc, "DROP INDEX orders.ixga204")
4648

4749
// misc bugs with primary index
4850
runStmt(qc, "CREATE PRIMARY INDEX oprimary ON orders")

0 commit comments

Comments
 (0)