Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions enginetest/queries/script_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -4197,6 +4197,34 @@ CREATE TABLE tab3 (
},
},
},
{
Name: "Complex Filter Index Scan",
SetUpScript: []string{
`CREATE TABLE tab2 (
pk int NOT NULL,
col0 int,
col1 float,
col2 text,
col3 int,
col4 float,
col5 text,
PRIMARY KEY (pk),
UNIQUE KEY idx_tab2_0 (col3,col4),
UNIQUE KEY idx_tab2_1 (col1,col4),
UNIQUE KEY idx_tab2_2 (col3,col0,col4),
UNIQUE KEY idx_tab2_3 (col1,col3)
);`,
`insert into tab2 values ( 63, 587, 465.59 , 'aggxb', 303 , 763.91, 'tgpqr');`,
},
Assertions: []ScriptTestAssertion{
{
Query: "SELECT pk FROM tab2 WHERE col4 IS NULL OR col0 > 560 AND (col3 < 848) OR (col3 > 883) OR (((col4 >= 539.78 AND col3 <= 953))) OR ((col3 IN (258)) OR (col3 IN (583,234,372)) AND col4 >= 488.43)",
Expected: []sql.Row{
{63},
},
},
},
},
}

var SpatialScriptTests = []ScriptTest{
Expand Down
117 changes: 116 additions & 1 deletion sql/range_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"fmt"
"testing"

"github.com/shopspring/decimal"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

Expand Down Expand Up @@ -188,7 +189,6 @@ func TestRangeOverlapTwoColumns(t *testing.T) {
require.NoError(t, err)
rangeBool := evalRanges(t, discreteRanges, row)
assert.Equal(t, referenceBool, rangeBool, fmt.Sprintf("%v: DiscreteRanges: %s", row, discreteRanges.DebugString()))

}
discreteRanges, err = sql.SortRanges(discreteRanges...)
require.NoError(t, err)
Expand Down Expand Up @@ -405,6 +405,121 @@ func TestRangeOverlapNulls(t *testing.T) {
}
}

func TestComplexRange(t *testing.T) {
tests := []struct {
skip bool
ranges sql.RangeCollection
}{
{
// derived from sqllogictest/index/in/100/slt_good_1.test:12655
ranges: sql.RangeCollection{
r(
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveNull{}, Typ: types.Float32},
),
r(
sql.RangeColumnExpr{LowerBound: sql.AboveNull{}, UpperBound: sql.Below{Key: int16(848)}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Above{Key: int16(560)}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Float32},
),
r(
sql.RangeColumnExpr{LowerBound: sql.AboveNull{}, UpperBound: sql.Above{Key: 953}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: decimal.New(53978, -2)}, UpperBound: sql.AboveAll{}, Typ: types.Float32},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: int16(234)}, UpperBound: sql.Above{Key: int16(234)}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: decimal.New(48843, -2)}, UpperBound: sql.AboveAll{}, Typ: types.Float32},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: int16(258)}, UpperBound: sql.Above{Key: int16(258)}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Float32},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: int16(372)}, UpperBound: sql.Above{Key: int16(372)}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: decimal.New(48843, -2)}, UpperBound: sql.AboveAll{}, Typ: types.Float32},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: int16(583)}, UpperBound: sql.Above{Key: int16(583)}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: decimal.New(48843, -2)}, UpperBound: sql.AboveAll{}, Typ: types.Float32},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Above{Key: int16(883)}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.BelowNull{}, UpperBound: sql.AboveAll{}, Typ: types.Float32},
),
},
},
{
skip: true, // returns different ranges, which are non-overlapping, but not sure if they're still correct
ranges: sql.RangeCollection{
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 0}, Typ: types.Int16},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Above{Key: 0}, UpperBound: sql.Below{Key: 5}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Above{Key: 3}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 1}, UpperBound: sql.Above{Key: 1}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 2}, UpperBound: sql.Above{Key: 2}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 1}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
),
r(
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 4}, UpperBound: sql.Above{Key: 4}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 0}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
sql.RangeColumnExpr{LowerBound: sql.Below{Key: 1}, UpperBound: sql.Above{Key: 6}, Typ: types.Int16},
),
},
},
}

for _, test := range tests {
t.Run(fmt.Sprintf("Range: %s", test.ranges.DebugString()), func(t *testing.T) {
if test.skip {
t.Skip()
}
discreteRanges, err := sql.RemoveOverlappingRanges(test.ranges...)
require.NoError(t, err)
verificationRanges, err := removeOverlappingRangesVerification(test.ranges...)
require.NoError(t, err)
discreteRanges, err = sql.SortRanges(discreteRanges...)
require.NoError(t, err)
verificationRanges, err = sql.SortRanges(verificationRanges...)
require.NoError(t, err)
ok, err := discreteRanges.Equals(verificationRanges)
require.NoError(t, err)
// TODO: need a way to either verify that the ranges cover the area, or that they're the same
for i := 0; i < len(discreteRanges)-1; i++ {
for j := i + 1; j < len(discreteRanges); j++ {
r1 := discreteRanges[i]
r2 := discreteRanges[j]
hasOverlap, err := r1.Overlaps(r2)
if hasOverlap {
t.Logf("Overlap: %s\n%s", r1.String(), r2.String())
}
assert.NoError(t, err)
assert.False(t, hasOverlap)
}
}
assert.True(t, ok)
})
}
}

func setup() (x, y, z sql.Expression, values2, values3, valuesNull [][]interface{}) {
values2 = make([][]interface{}, 0, 100)
values3 = make([][]interface{}, 0, 1000)
Expand Down
4 changes: 4 additions & 0 deletions sql/range_tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,10 @@ func (tree *RangeColumnExprTree) insert(rang Range, colExprIdx int) error {
insertedNode = node.Right
loop = false
} else {
node.MaxUpperbound, err = GetRangeCutMax(colExpr.Typ, node.MaxUpperbound, colExpr.UpperBound)
if err != nil {
return err
}
node = node.Right
}
} else /* cmp == 0 */ {
Expand Down