Skip to content

Commit 204fe88

Browse files
authored
Merge pull request #2817 from dolthub/nicktobey/vector2
Use vector index when the `SELECT` cause has a projection.
2 parents 115c98b + 64a9b68 commit 204fe88

File tree

6 files changed

+188
-9
lines changed

6 files changed

+188
-9
lines changed

enginetest/queries/index_query_plans.go

Lines changed: 112 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

enginetest/queries/vector_index_queries.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ var VectorIndexQueries = []ScriptTest{
5656
},
5757
ExpectedIndexes: []string{"v_idx"},
5858
},
59+
{
60+
// Use the index even when there's a projection involved.
61+
Query: "select `id`+1 from vectors order by VEC_DISTANCE('[0.0,0.0]', v) limit 4",
62+
Expected: []sql.Row{
63+
{3},
64+
{4},
65+
{5},
66+
{2},
67+
},
68+
ExpectedIndexes: []string{"v_idx"},
69+
},
5970
{
6071
// Only queries with a limit can use a vector index.
6172
Query: "select * from vectors order by VEC_DISTANCE('[0.0,0.0]', v)",
@@ -88,6 +99,21 @@ var VectorIndexQueries = []ScriptTest{
8899
},
89100
ExpectedIndexes: []string{},
90101
},
102+
{
103+
// Modify the index after creation.
104+
Query: "insert into vectors values (5, '[1.0,0.0]')",
105+
},
106+
{
107+
Query: "select * from vectors order by VEC_DISTANCE('[0.0,0.0]', v)",
108+
Expected: []sql.Row{
109+
{2, types.MustJSON(`[0.0, 0.0]`)},
110+
{5, types.MustJSON(`[1.0, 0.0]`)},
111+
{3, types.MustJSON(`[-1.0, 1.0]`)},
112+
{4, types.MustJSON(`[0.0, -2.0]`)},
113+
{1, types.MustJSON(`[4.0, 3.0]`)},
114+
},
115+
ExpectedIndexes: []string{},
116+
},
91117
},
92118
},
93119
}

enginetest/scriptgen/setup/scripts/comp_index_tables

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,28 @@ create table pref_index_t3 (v1 varchar(10), v2 varchar(10), unique index (v1(3),
9595

9696
exec
9797
create table pref_index_t4 (i int primary key, v1 varchar(10), v2 varchar(10), unique index (v1(3),v2(5)));
98+
----
99+
100+
exec
101+
CREATE TABLE comp_vector_index_t0 (pk BIGINT PRIMARY KEY, v1 BIGINT, v2 JSON);
102+
----
103+
104+
exec
105+
INSERT INTO comp_vector_index_t0 VALUES (0,0,"[3,16]"),(1,2,"[65,9]"),(2,3,"[38,37]"),(3,3,"[99,99]"),(4,5,"[17,42]"),(5,6,"[6,76]"),(6,6,"[81,33]"),
106+
(7,7,"[33,51]"),(8,7,"[37,42]"),(9,8,"[9,21]"),(10,8,"[37,90]"),(11,9,"[39,20]"),(12,9,"[71,82]"),(13,10,"[16,21]"),(14,10,"[32,46]"),(15,10,"[47,36]"),
107+
(16,12,"[44,84]"),(17,12,"[66,40]"),(18,13,"[47,30]"),(19,13,"[56,41]"),(20,14,"[38,24]"),(21,14,"[91,1]"),(22,15,"[2,69]"),(23,16,"[40,36]"),
108+
(24,20,"[29,93]"),(25,21,"[9,89]"),(26,21,"[42,76]"),(27,23,"[13,53]"),(28,23,"[28,68]"),(29,23,"[28,90]"),(30,23,"[30,44]"),(31,24,"[20,8]"),
109+
(32,25,"[49,88]"),(33,26,"[15,28]"),(34,27,"[35,12]"),(35,28,"[39,84]"),(36,29,"[7,38]"),(37,29,"[21,74]"),(38,29,"[27,48]"),(39,29,"[77,46]"),
110+
(40,31,"[47,21]"),(41,31,"[47,91]"),(42,32,"[40,76]"),(43,33,"[70,50]"),(44,34,"[27,58]"),(45,35,"[32,36]"),(46,36,"[4,36]"),(47,36,"[84,75]"),
111+
(48,37,"[27,32]"),(49,38,"[88,68]"),(50,41,"[17,68]"),(51,41,"[77,26]"),(52,42,"[80,85]"),(53,45,"[1,57]"),(54,46,"[58,8]"),(55,49,"[26,11]"),
112+
(56,50,"[49,20]"),(57,50,"[86,6]"),(58,54,"[13,78]"),(59,54,"[57,83]"),(60,55,"[45,46]"),(61,55,"[81,80]"),(62,56,"[0,97]"),(63,56,"[8,78]"),
113+
(64,56,"[58,4]"),(65,56,"[66,33]"),(66,57,"[7,52]"),(67,59,"[77,53]"),(68,60,"[8,70]"),(69,61,"[11,25]"),(70,63,"[85,23]"),(71,65,"[17,9]"),
114+
(72,66,"[46,46]"),(73,66,"[73,4]"),(74,67,"[55,27]"),(75,70,"[8,54]"),(76,70,"[58,33]"),(77,71,"[39,15]"),(78,72,"[65,64]"),(79,74,"[78,26]"),
115+
(80,75,"[91,35]"),(81,76,"[40,52]"),(82,76,"[44,87]"),(83,81,"[32,4]"),(84,82,"[11,6]"),(85,82,"[46,32]"),(86,84,"[40,8]"),(87,84,"[93,37]"),
116+
(88,85,"[53,50]"),(89,86,"[63,79]"),(90,87,"[22,34]"),(91,87,"[57,62]"),(92,88,"[88,42]"),(93,90,"[30,67]"),(94,91,"[15,15]"),(95,93,"[7,26]"),
117+
(96,94,"[92,38]"),(97,95,"[89,66]"),(98,97,"[63,19]"),(99,98,"[31,21]"),(100,98,"[42,22]")
118+
----
119+
120+
exec
121+
create VECTOR INDEX v_idx on comp_vector_index_t0 (v2)
98122
----

enginetest/scriptgen/setup/setup_data.sg.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sql/analyzer/replace_order_by_distance.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@ import (
1010

1111
// replaceIdxSort applies an IndexAccess when there is an `OrderBy` over a prefix of any columns with Indexes
1212
func replaceIdxOrderByDistance(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope, sel RuleSelector, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) {
13-
return replaceIdxOrderByDistanceHelper(ctx, scope, n, nil)
13+
return replaceIdxOrderByDistanceHelper(ctx, scope, n, nil, nil)
1414
}
1515

16-
func replaceIdxOrderByDistanceHelper(ctx *sql.Context, scope *plan.Scope, node sql.Node, sortNode *plan.TopN) (sql.Node, transform.TreeIdentity, error) {
16+
func replaceIdxOrderByDistanceHelper(ctx *sql.Context, scope *plan.Scope, node sql.Node, sortNode plan.Sortable, limit sql.Expression) (sql.Node, transform.TreeIdentity, error) {
1717
switch n := node.(type) {
1818
case *plan.TopN:
1919
sortNode = n // lowest parent sort node
20+
limit = n.Limit
21+
case plan.Sortable:
22+
sortNode = n
23+
case *plan.Limit:
24+
limit = n.Limit
2025
case *plan.ResolvedTable:
21-
if sortNode == nil {
26+
if sortNode == nil || limit == nil {
2227
return n, transform.SameTree, nil
2328
}
2429

@@ -44,7 +49,7 @@ func replaceIdxOrderByDistanceHelper(ctx *sql.Context, scope *plan.Scope, node s
4449

4550
// Column references have not been assigned their final indexes yet, so do that for the ORDER BY expression now.
4651
// We can safely do this because an expression that references other tables won't pass `isSortFieldsValidPrefix` below.
47-
sortNode = offsetAssignIndexes(sortNode).(*plan.TopN)
52+
sortNode = offsetAssignIndexes(sortNode).(plan.Sortable)
4853

4954
sfExprs := normalizeExpressions(tableAliases, sortNode.GetSortFields().ToExpressions()...)
5055
sfAliases := aliasedExpressionsInNode(sortNode)
@@ -100,8 +105,6 @@ func replaceIdxOrderByDistanceHelper(ctx *sql.Context, scope *plan.Scope, node s
100105
return n, transform.SameTree, nil
101106
}
102107

103-
limit := sortNode.Limit
104-
105108
lookup := sql.IndexLookup{
106109
Index: idx,
107110
Ranges: sql.MySQLRangeCollection{},
@@ -125,7 +128,7 @@ func replaceIdxOrderByDistanceHelper(ctx *sql.Context, scope *plan.Scope, node s
125128
same := transform.SameTree
126129
switch c := child.(type) {
127130
case *plan.Project, *plan.TableAlias, *plan.ResolvedTable, *plan.Filter, *plan.Limit, *plan.TopN, *plan.Offset, *plan.Sort, *plan.IndexedTableAccess:
128-
newChildren[i], same, err = replaceIdxOrderByDistanceHelper(ctx, scope, child, sortNode)
131+
newChildren[i], same, err = replaceIdxOrderByDistanceHelper(ctx, scope, child, sortNode, limit)
129132
default:
130133
newChildren[i] = c
131134
}

sql/analyzer/vector_index_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func TestVectorIndex(t *testing.T) {
114114

115115
for _, testCase := range vectorIndexTestCases(t, db, vectorIndexTable) {
116116
t.Run(testCase.name, func(t *testing.T) {
117-
res, same, err := replaceIdxOrderByDistanceHelper(nil, nil, testCase.inputPlan, nil)
117+
res, same, err := replaceIdxOrderByDistanceHelper(nil, nil, testCase.inputPlan, nil, nil)
118118
require.NoError(t, err)
119119
require.Equal(t, testCase.usesVectorIndex, !bool(same))
120120
res = offsetAssignIndexes(res)
@@ -218,7 +218,6 @@ func (i vectorIndexTable) SkipIndexCosting() bool {
218218
}
219219

220220
func (i vectorIndexTable) IndexWithPrefix(ctx *sql.Context, expressions []string) (sql.Index, error) {
221-
//TODO implement me
222221
panic("implement me")
223222
}
224223

0 commit comments

Comments
 (0)