Skip to content

Commit 5425a89

Browse files
authored
[memo] merge joins must use globally sorted indexes (#2803)
* [memo] merge joins must use globally sorted indexes * explicitly label default unordered * second merge join side idx order check
1 parent 999a371 commit 5425a89

File tree

4 files changed

+27
-10
lines changed

4 files changed

+27
-10
lines changed

sql/analyzer/indexed_joins.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,9 +1070,18 @@ func addMergeJoins(ctx *sql.Context, m *memo.Memo) error {
10701070
// Check to see if any rIndexes match that set of filters
10711071
// Remove the last matched filter
10721072
for _, lIndex := range lIndexes {
1073+
if lIndex.Order() == sql.IndexOrderNone {
1074+
// lookups can be unordered, merge indexes need to
1075+
// be globally ordered
1076+
continue
1077+
}
1078+
10731079
matchedEqFilters := matchedFiltersForLeftIndex(lIndex, join.Left.RelProps.FuncDeps().Constants(), eqFilters)
10741080
for len(matchedEqFilters) > 0 {
10751081
for _, rIndex := range rIndexes {
1082+
if rIndex.Order() == sql.IndexOrderNone {
1083+
continue
1084+
}
10761085
if rightIndexMatchesFilters(rIndex, join.Left.RelProps.FuncDeps().Constants(), matchedEqFilters) {
10771086
jb := join.Copy()
10781087
if d, ok := jb.Left.First.(*memo.Distinct); ok && lIndex.SqlIdx().IsUnique() {

sql/memo/memo.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -743,14 +743,15 @@ type SourceRel interface {
743743

744744
type Index struct {
745745
// ordered list of index columns
746-
order []sql.ColumnId
746+
cols []sql.ColumnId
747747
// unordered column set
748-
set sql.ColSet
749-
idx sql.Index
748+
set sql.ColSet
749+
idx sql.Index
750+
order sql.IndexOrder
750751
}
751752

752753
func (i *Index) Cols() []sql.ColumnId {
753-
return i.order
754+
return i.cols
754755
}
755756

756757
func (i *Index) ColSet() sql.ColSet {
@@ -761,6 +762,10 @@ func (i *Index) SqlIdx() sql.Index {
761762
return i.idx
762763
}
763764

765+
func (i *Index) Order() sql.IndexOrder {
766+
return i.order
767+
}
768+
764769
type sourceBase struct {
765770
*relBase
766771
indexes []*Index

sql/memo/rel_props.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,10 @@ func (p *relProps) populateFds() {
226226
// strict if primary key or all nonNull and unique
227227
columns := idxExprsColumns(idx)
228228
strict := true
229-
normIdx := &Index{idx: idx, order: make([]sql.ColumnId, len(columns))}
229+
normIdx := &Index{idx: idx, cols: make([]sql.ColumnId, len(columns)), order: sql.IndexOrderNone}
230+
if oidx, ok := idx.(sql.OrderedIndex); ok {
231+
normIdx.order = oidx.Order()
232+
}
230233
for i, c := range columns {
231234
ord := sch.IndexOfColName(strings.ToLower(c))
232235
idOffset := firstCol + sql.ColumnId(ord)
@@ -236,7 +239,7 @@ func (p *relProps) populateFds() {
236239
p.grp.m.HandleErr(err)
237240
}
238241
normIdx.set.Add(colId)
239-
normIdx.order[i] = colId
242+
normIdx.cols[i] = colId
240243
if !notNull.Contains(colId) {
241244
strict = false
242245
}

sql/memo/rel_props_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func TestPopulateFDs(t *testing.T) {
3939
notNull: sql.NewColSet(1, 2, 3),
4040
indexes: []*Index{
4141
{
42-
order: []sql.ColumnId{2, 1},
43-
set: sql.NewColSet(1, 2),
42+
cols: []sql.ColumnId{2, 1},
43+
set: sql.NewColSet(1, 2),
4444
},
4545
},
4646
key: sql.NewColSet(1, 2),
@@ -62,8 +62,8 @@ func TestPopulateFDs(t *testing.T) {
6262
notNull: sql.NewColSet(1, 2, 3),
6363
indexes: []*Index{
6464
{
65-
order: []sql.ColumnId{1, 2, 3},
66-
set: sql.NewColSet(1, 2, 3),
65+
cols: []sql.ColumnId{1, 2, 3},
66+
set: sql.NewColSet(1, 2, 3),
6767
},
6868
},
6969
key: sql.NewColSet(1, 2, 3),

0 commit comments

Comments
 (0)