diff --git a/bats/index-on-writes.bats b/bats/index-on-writes.bats index fb5685d9dc..8a4cae7bdd 100644 --- a/bats/index-on-writes.bats +++ b/bats/index-on-writes.bats @@ -141,7 +141,7 @@ test_mutation() { } @test "delete all one_pk, <>, pk" { - test_mutation "delete from one_pk where pk1 <> 1024" "one_pk" "$one_pk_header" + test_mutation "delete from one_pk where pk1 <> 1024" "one_pk" "$one_pk_header" "yes" } @test "delete all two_pk, >, pk" { @@ -221,7 +221,7 @@ test_mutation() { } @test "delete all one_pk, <>, pk + non-pk" { - test_mutation "delete from one_pk where pk1 <> 1024 and c1 <> 1024" "one_pk" "$one_pk_header" + test_mutation "delete from one_pk where pk1 <> 1024 and c1 <> 1024" "one_pk" "$one_pk_header" "yes" } @test "delete all two_pk, >, pk + non-pk" { @@ -269,7 +269,7 @@ test_mutation() { } @test "update all one_pk, <>, pk" { - test_mutation "update one_pk set c2 = 256 where pk1 <> 1024" "one_pk" "$one_pk_all_updated" + test_mutation "update one_pk set c2 = 256 where pk1 <> 1024" "one_pk" "$one_pk_all_updated" "yes" } @test "update all two_pk, >, pk" { @@ -349,7 +349,7 @@ test_mutation() { } @test "update all one_pk, <>, pk + non-pk" { - test_mutation "update one_pk set c2 = 256 where pk1 <> 1024 and c1 <> 1024" "one_pk" "$one_pk_all_updated" + test_mutation "update one_pk set c2 = 256 where pk1 <> 1024 and c1 <> 1024" "one_pk" "$one_pk_all_updated" "yes" } @test "update all two_pk, >, pk + non-pk" { diff --git a/go/go.sum b/go/go.sum index cba0615192..7973177118 100644 --- a/go/go.sum +++ b/go/go.sum @@ -134,18 +134,6 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dolthub/fslock v0.0.2 h1:8vUh47iKovgrtXNrXVIzsIoWLlspoXg+3nslhUzgKSw= github.com/dolthub/fslock v0.0.2/go.mod h1:0i7bsNkK+XHwFL3dIsSWeXSV7sykVzzVr6+jq8oeEo0= -github.com/dolthub/go-mysql-server v0.6.1-0.20201106005010-6faca804df09 h1:g5O/JQc4N5qQAxENlra7W2VbjdHqiltkvZoddiW+jfM= -github.com/dolthub/go-mysql-server v0.6.1-0.20201106005010-6faca804df09/go.mod h1:69ws/iwxL664UM+Rrdh69f0Bnix3pUHkHCS8uPc/cSI= -github.com/dolthub/go-mysql-server v0.6.1-0.20201110022037-011cc27c6296 h1:VmD/IO7FAg3g8q8BoZ2MQIljyApRpkpv3TB3Tp6k47Y= -github.com/dolthub/go-mysql-server v0.6.1-0.20201110022037-011cc27c6296/go.mod h1:mt/X2Nhcup61HdX72jdBwVKkWSA+2qrJYdq4fLvqkB0= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111024628-117786c2389a h1:F/3HM5q1FN3x8MaF4blQ7LeU2MwXyrxLADfkH7kVFiA= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111024628-117786c2389a/go.mod h1:mt/X2Nhcup61HdX72jdBwVKkWSA+2qrJYdq4fLvqkB0= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111071229-4fc31132e166 h1:EB9BGLZJDn2yCt4FXUlA2C6M3002bTQ7rLMg4c8c55g= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111071229-4fc31132e166/go.mod h1:mt/X2Nhcup61HdX72jdBwVKkWSA+2qrJYdq4fLvqkB0= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111173919-d00e2941f3f6 h1:kYZiRovVt4rrdKugw53d7WqHwLls5HOXnXpjrTlfRUw= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111173919-d00e2941f3f6/go.mod h1:mt/X2Nhcup61HdX72jdBwVKkWSA+2qrJYdq4fLvqkB0= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111174437-8e114c906f31 h1:TP6HcGdMUCVd0KEGH8k1HxJ3Qx8mRZVR7kyrXNEsC+I= -github.com/dolthub/go-mysql-server v0.6.1-0.20201111174437-8e114c906f31/go.mod h1:mt/X2Nhcup61HdX72jdBwVKkWSA+2qrJYdq4fLvqkB0= github.com/dolthub/go-mysql-server v0.6.1-0.20201111233201-058dc85fd7d7 h1:ZtnTk8uvzBZG54seiHFVo94gFo2akmxuuOYQn5Wpyc0= github.com/dolthub/go-mysql-server v0.6.1-0.20201111233201-058dc85fd7d7/go.mod h1:K/xTlom+iL7IdXdA7OOgZRzm4D8ivqE68OqOlKH9ahg= github.com/dolthub/ishell v0.0.0-20201107004254-1592c0036c8d h1:i0u1Ze9wZF/zLgyOB/aLkG01gDDNQ48PR0/a80mxEyQ= @@ -154,8 +142,6 @@ github.com/dolthub/mmap-go v1.0.4-0.20201107010347-f9f2a9588a66 h1:WRPDbpJWEnPxP github.com/dolthub/mmap-go v1.0.4-0.20201107010347-f9f2a9588a66/go.mod h1:N5ZIbMGuDUpTpOFQ7HcsN6WSIpTGQjHP+Mz27AfmAgk= github.com/dolthub/sqllogictest/go v0.0.0-20201105013724-5123fc66e12c h1:ZIo6IOXU3/rJK4lp83QRq1zGhQrjQQtlmE2b7H1Vv/k= github.com/dolthub/sqllogictest/go v0.0.0-20201105013724-5123fc66e12c/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= -github.com/dolthub/vitess v0.0.0-20201105231317-8886950f2053 h1:d1IcMtRAas14KQWTLG3vh6hWhYTwZYvdtp1bUwVfdIU= -github.com/dolthub/vitess v0.0.0-20201105231317-8886950f2053/go.mod h1:hUE8oSk2H5JZnvtlLBhJPYC8WZCA5AoSntdLTcBvdBM= github.com/dolthub/vitess v0.0.0-20201111232835-de121b254639 h1:zCse34nACeJiO+JUPwp4tbGY0ci4V1iPO3CrdYwKS3A= github.com/dolthub/vitess v0.0.0-20201111232835-de121b254639/go.mod h1:hUE8oSk2H5JZnvtlLBhJPYC8WZCA5AoSntdLTcBvdBM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= diff --git a/go/libraries/doltcore/sqle/dolt_index.go b/go/libraries/doltcore/sqle/dolt_index.go index 3f65f9111a..991f2409a3 100644 --- a/go/libraries/doltcore/sqle/dolt_index.go +++ b/go/libraries/doltcore/sqle/dolt_index.go @@ -29,6 +29,7 @@ type DoltIndex interface { sql.Index sql.AscendIndex sql.DescendIndex + sql.NegateIndex Schema() schema.Schema IndexSchema() schema.Schema TableData() types.Map @@ -177,6 +178,26 @@ func (di *doltIndex) Get(keys ...interface{}) (sql.IndexLookup, error) { }, nil } +// Not implements sql.NegateIndex +func (di *doltIndex) Not(keys ...interface{}) (sql.IndexLookup, error) { + tpl, err := di.keysToTuple(keys) + if err != nil { + return nil, err + } + r1 := lookup.LessThanRange(tpl) + r2, err := lookup.GreaterThanRange(tpl) + if err != nil { + return nil, err + } + return &doltIndexLookup{ + idx: di, + ranges: []lookup.Range{ + r1, + r2, + }, + }, nil +} + // Has implements sql.Index func (*doltIndex) Has(partition sql.Partition, key ...interface{}) (bool, error) { return false, errors.New("unimplemented") diff --git a/go/libraries/doltcore/sqle/mergeable_indexes_setup_test.go b/go/libraries/doltcore/sqle/mergeable_indexes_setup_test.go index 918ea529e0..c558a2b662 100644 --- a/go/libraries/doltcore/sqle/mergeable_indexes_setup_test.go +++ b/go/libraries/doltcore/sqle/mergeable_indexes_setup_test.go @@ -183,6 +183,14 @@ func (di *testMergeableDoltIndex) Get(keys ...interface{}) (sql.IndexLookup, err finalRanges: di.finalRanges, }, err } +func (di *testMergeableDoltIndex) Not(keys ...interface{}) (sql.IndexLookup, error) { + indexLookup, err := di.doltIndex.Not(keys...) + return &testMergeableIndexLookup{ + doltIndexLookup: indexLookup.(*doltIndexLookup), + t: di.t, + finalRanges: di.finalRanges, + }, err +} func (di *testMergeableDoltIndex) AscendGreaterOrEqual(keys ...interface{}) (sql.IndexLookup, error) { indexLookup, err := di.doltIndex.AscendGreaterOrEqual(keys...) return &testMergeableIndexLookup{ diff --git a/go/libraries/doltcore/sqle/mergeable_indexes_test.go b/go/libraries/doltcore/sqle/mergeable_indexes_test.go index 68e7ad00e7..3475b217f2 100644 --- a/go/libraries/doltcore/sqle/mergeable_indexes_test.go +++ b/go/libraries/doltcore/sqle/mergeable_indexes_test.go @@ -83,6 +83,59 @@ func TestMergeableIndexes(t *testing.T) { }, []int64{}, }, + { + "v1 = 11 OR v1 != 11", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 = 11 OR v1 != 15", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(15)), + lookup.MustGreaterThanRange(idxv1.tuple(15)), + }, + []int64{0, 1, 2, 3, 4, 6, 7, 8, 9}, + }, + { + "v1 = 11 AND v1 != 15", + []lookup.Range{ + lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)), + }, + []int64{1}, + }, + { + "v1 = 11 OR v1 = 15 OR v1 != 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(19)), + lookup.MustGreaterThanRange(idxv1.tuple(19)), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8}, + }, + { + "v1 = 11 OR v1 = 15 AND v1 != 19", + []lookup.Range{ + lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)), + lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)), + }, + []int64{1, 5}, + }, + { + "v1 = 11 AND v1 = 15 OR v1 != 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(19)), + lookup.MustGreaterThanRange(idxv1.tuple(19)), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8}, + }, + { + "v1 = 11 AND v1 = 15 AND v1 != 19", + []lookup.Range{ + lookup.EmptyRange(), + }, + []int64{}, + }, { "v1 = 11 OR v1 > 15", []lookup.Range{ @@ -259,6 +312,286 @@ func TestMergeableIndexes(t *testing.T) { }, []int64{}, }, + { + "v1 != 11", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustGreaterThanRange(idxv1.tuple(11)), + }, + []int64{0, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 <> 11", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustGreaterThanRange(idxv1.tuple(11)), + }, + []int64{0, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 <> 11 OR v1 <> 15", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustGreaterThanRange(idxv1.tuple(15)), + }, + []int64{0, 2, 3, 4, 6, 7, 8, 9}, + }, + { + "v1 <> 11 AND v1 <> 15", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustGreaterThanRange(idxv1.tuple(15)), + }, + []int64{0, 2, 3, 4, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 OR v1 != 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 <> 11 OR v1 <> 15 OR v1 <> 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 AND v1 != 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 <> 11 OR v1 <> 15 AND v1 <> 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 AND v1 != 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)), + lookup.MustGreaterThanRange(idxv1.tuple(19)), + }, + []int64{0, 2, 3, 4, 6, 7, 8}, + }, + { + "v1 <> 11 AND v1 <> 15 AND v1 <> 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)), + lookup.MustGreaterThanRange(idxv1.tuple(19)), + }, + []int64{0, 2, 3, 4, 6, 7, 8}, + }, + { + "v1 != 11 OR v1 > 15", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustGreaterThanRange(idxv1.tuple(11)), + }, + []int64{0, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 > 15", + []lookup.Range{ + lookup.MustGreaterThanRange(idxv1.tuple(15)), + }, + []int64{6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 OR v1 > 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 AND v1 > 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustGreaterThanRange(idxv1.tuple(11)), + }, + []int64{0, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 OR v1 > 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustGreaterThanRange(idxv1.tuple(15)), + }, + []int64{0, 2, 3, 4, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 AND v1 > 19", + []lookup.Range{ + lookup.MustGreaterThanRange(idxv1.tuple(19)), + }, + []int64{}, + }, + { + "v1 != 11 OR v1 >= 15", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustGreaterThanRange(idxv1.tuple(11)), + }, + []int64{0, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 >= 15", + []lookup.Range{ + lookup.GreaterOrEqualRange(idxv1.tuple(15)), + }, + []int64{5, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 OR v1 >= 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 AND v1 >= 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustGreaterThanRange(idxv1.tuple(11)), + }, + []int64{0, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 OR v1 >= 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustGreaterThanRange(idxv1.tuple(15)), + }, + []int64{0, 2, 3, 4, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 AND v1 >= 19", + []lookup.Range{ + lookup.GreaterOrEqualRange(idxv1.tuple(19)), + }, + []int64{9}, + }, + { + "v1 != 11 OR v1 < 15", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 < 15", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + }, + []int64{0, 2, 3, 4}, + }, + { + "v1 != 11 OR v1 != 15 OR v1 < 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 AND v1 < 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 OR v1 < 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 AND v1 < 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)), + }, + []int64{0, 2, 3, 4, 6, 7, 8}, + }, + { + "v1 != 11 OR v1 <= 15", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 <= 15", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustCustomRange(idxv1.tuple(11), idxv1.tuple(15), + lookup.Open, lookup.Closed), + }, + []int64{0, 2, 3, 4, 5}, + }, + { + "v1 != 11 OR v1 != 15 OR v1 <= 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 OR v1 != 15 AND v1 <= 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 OR v1 <= 19", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 != 11 AND v1 != 15 AND v1 <= 19", + []lookup.Range{ + lookup.LessThanRange(idxv1.tuple(11)), + lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)), + lookup.MustCustomRange(idxv1.tuple(15), idxv1.tuple(19), + lookup.Open, lookup.Closed), + }, + []int64{0, 2, 3, 4, 6, 7, 8, 9}, + }, { "v1 > 11", []lookup.Range{ @@ -803,6 +1136,23 @@ func TestMergeableIndexes(t *testing.T) { }, []int64{1, 2, 3, 4, 5}, }, + { + "v1 BETWEEN 11 AND 15 OR v1 != 13", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 BETWEEN 11 AND 15 AND v1 != 13", + []lookup.Range{ + lookup.MustCustomRange(idxv1.tuple(11), idxv1.tuple(13), + lookup.Closed, lookup.Open), + lookup.MustCustomRange(idxv1.tuple(13), idxv1.tuple(15), + lookup.Open, lookup.Closed), + }, + []int64{1, 2, 4, 5}, + }, { "v1 BETWEEN 11 AND 15 AND v1 <= 19", []lookup.Range{ @@ -841,6 +1191,21 @@ func TestMergeableIndexes(t *testing.T) { }, []int64{2, 3}, }, + { + "v1 IN (11, 12, 13) OR v1 != 12", + []lookup.Range{ + lookup.AllRange(), + }, + []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + "v1 IN (11, 12, 13) AND v1 != 12", + []lookup.Range{ + lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)), + lookup.MustClosedRange(idxv1.tuple(13), idxv1.tuple(13)), + }, + []int64{1, 3}, + }, { "v1 IN (11, 12, 13) OR v1 >= 13 AND v1 < 15", []lookup.Range{