Skip to content

Commit d69d4fe

Browse files
committed
Unwrap wrapped values before computing their hash.
1 parent d41f701 commit d69d4fe

File tree

17 files changed

+84
-30
lines changed

17 files changed

+84
-30
lines changed

enginetest/enginetests.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3046,7 +3046,7 @@ func TestRenameColumn(t *testing.T, harness Harness) {
30463046
TestQueryWithContext(t, ctx, e, harness, "ALTER TABLE mydb.tabletest RENAME COLUMN s TO i1", []sql.Row{{types.NewOkResult(0)}}, nil, nil, nil)
30473047
TestQueryWithContext(t, ctx, e, harness, "SHOW FULL COLUMNS FROM mydb.tabletest", []sql.Row{
30483048
{"i", "int", nil, "NO", "PRI", nil, "", "", ""},
3049-
{"i1", "varchar(20)", "utf8mb4_0900_bin", "NO", "", nil, "", "", ""},
3049+
{"i1", "text", "utf8mb4_0900_bin", "NO", "", nil, "", "", ""},
30503050
}, nil, nil, nil)
30513051
})
30523052
}

enginetest/join_planning_tests.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,32 @@ where u in (select * from rec);`,
945945
},
946946
},
947947
},
948+
{
949+
name: "join varchar and text columns",
950+
setup: []string{
951+
"CREATE table varchartable (pk int primary key, s varchar(20));",
952+
"CREATE table texttable (pk int primary key, t text);",
953+
"insert into varchartable values (1,'first'), (2,'second'), (3,'third');",
954+
"insert into texttable values (1,'first'), (2,'second'), (3,'third');",
955+
},
956+
// write a bunch of left joins and make sure they are converted to anti joins
957+
tests: []JoinPlanTest{
958+
{
959+
q: "select /*+ HASH_JOIN(varchartable,texttable) */ * from varchartable where s in (select t from texttable) order by pk",
960+
types: []plan.JoinType{plan.JoinTypeHash},
961+
exp: []sql.Row{
962+
{1, "first"},
963+
{2, "second"},
964+
{3, "third"},
965+
},
966+
},
967+
{
968+
q: "select /*+ HASH_JOIN(varchartable,texttable) */ * from varchartable where s not in (select t from texttable) order by pk",
969+
types: []plan.JoinType{plan.JoinTypeLeftOuterHashExcludeNulls},
970+
exp: []sql.Row{},
971+
},
972+
},
973+
},
948974
{
949975
name: "join concat tests",
950976
setup: []string{

enginetest/queries/queries.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5665,6 +5665,18 @@ SELECT * FROM cte WHERE d = 2;`,
56655665
{"third row"},
56665666
},
56675667
},
5668+
{
5669+
Query: "select * from mytable intersect select * from tabletest",
5670+
Expected: []sql.Row{{1, "first row"}, {2, "second row"}, {3, "third row"}},
5671+
},
5672+
{
5673+
Query: "select * from mytable union distinct select * from tabletest",
5674+
Expected: []sql.Row{{1, "first row"}, {2, "second row"}, {3, "third row"}},
5675+
},
5676+
{
5677+
Query: "select * from mytable except select * from tabletest",
5678+
Expected: []sql.Row{},
5679+
},
56685680
{
56695681
SkipPrepared: true,
56705682
Query: "",
@@ -6772,6 +6784,10 @@ SELECT * FROM cte WHERE d = 2;`,
67726784
Query: "select replace(s, 'row', '') from mytable order by i",
67736785
Expected: []sql.Row{{"first "}, {"second "}, {"third "}},
67746786
},
6787+
{
6788+
Query: "select replace(s, 'row', '') from tabletest order by i",
6789+
Expected: []sql.Row{{"first "}, {"second "}, {"third "}},
6790+
},
67756791
{
67766792
Query: "select rpad(s, 13, ' ') from mytable order by i",
67776793
Expected: []sql.Row{{"first row "}, {"second row "}, {"third row "}},
@@ -6780,6 +6796,10 @@ SELECT * FROM cte WHERE d = 2;`,
67806796
Query: "select lpad(s, 13, ' ') from mytable order by i",
67816797
Expected: []sql.Row{{" first row"}, {" second row"}, {" third row"}},
67826798
},
6799+
{
6800+
Query: "select lpad(s, 13, ' ') from tabletest order by i",
6801+
Expected: []sql.Row{{" first row"}, {" second row"}, {" third row"}},
6802+
},
67836803
{
67846804
Query: "select sqrt(i) from mytable order by i",
67856805
Expected: []sql.Row{{1.0}, {1.4142135623730951}, {1.7320508075688772}},

enginetest/scriptgen/setup/scripts/tabletest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
exec
22
create table tabletest (
33
i int primary key,
4-
s varchar(20) not null
4+
s text not null
55
)
66
----
77

enginetest/scriptgen/setup/setup_data.sg.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

memory/table.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,7 +1971,7 @@ func (t *Table) DropCheck(ctx *sql.Context, chName string) error {
19711971
return fmt.Errorf("check '%s' was not found on the table", chName)
19721972
}
19731973

1974-
func (t *Table) createIndex(data *TableData, name string, columns []sql.IndexColumn, constraint sql.IndexConstraint, comment string) (sql.Index, error) {
1974+
func (t *Table) createIndex(ctx *sql.Context, data *TableData, name string, columns []sql.IndexColumn, constraint sql.IndexConstraint, comment string) (sql.Index, error) {
19751975
if name == "" {
19761976
for _, column := range columns {
19771977
name += column.Name + "_"
@@ -2005,7 +2005,7 @@ func (t *Table) createIndex(data *TableData, name string, columns []sql.IndexCol
20052005
}
20062006

20072007
if constraint == sql.IndexConstraint_Unique {
2008-
err := data.errIfDuplicateEntryExist(colNames, name)
2008+
err := data.errIfDuplicateEntryExist(ctx, colNames, name)
20092009
if err != nil {
20102010
return nil, err
20112011
}
@@ -2041,7 +2041,7 @@ func (t *Table) CreateIndex(ctx *sql.Context, idx sql.IndexDef) error {
20412041
data.indexes = make(map[string]sql.Index)
20422042
}
20432043

2044-
index, err := t.createIndex(data, idx.Name, idx.Columns, idx.Constraint, idx.Comment)
2044+
index, err := t.createIndex(ctx, data, idx.Name, idx.Columns, idx.Constraint, idx.Comment)
20452045
if err != nil {
20462046
return err
20472047
}
@@ -2107,7 +2107,7 @@ func (t *Table) CreateFulltextIndex(ctx *sql.Context, indexDef sql.IndexDef, key
21072107
data.indexes = make(map[string]sql.Index)
21082108
}
21092109

2110-
index, err := t.createIndex(data, indexDef.Name, indexDef.Columns, indexDef.Constraint, indexDef.Comment)
2110+
index, err := t.createIndex(ctx, data, indexDef.Name, indexDef.Columns, indexDef.Constraint, indexDef.Comment)
21112111
if err != nil {
21122112
return err
21132113
}
@@ -2138,7 +2138,7 @@ func (t *Table) CreateVectorIndex(ctx *sql.Context, idx sql.IndexDef, distanceTy
21382138
data.indexes = make(map[string]sql.Index)
21392139
}
21402140

2141-
index, err := t.createIndex(data, idx.Name, idx.Columns, idx.Constraint, idx.Comment)
2141+
index, err := t.createIndex(ctx, data, idx.Name, idx.Columns, idx.Constraint, idx.Comment)
21422142
if err != nil {
21432143
return err
21442144
}

memory/table_data.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package memory
1616

1717
import (
18+
"context"
1819
"fmt"
1920
"sort"
2021
"strconv"
@@ -274,7 +275,7 @@ func (td *TableData) numRows(ctx *sql.Context) (uint64, error) {
274275
}
275276

276277
// throws an error if any two or more rows share the same |cols| values.
277-
func (td *TableData) errIfDuplicateEntryExist(cols []string, idxName string) error {
278+
func (td *TableData) errIfDuplicateEntryExist(ctx context.Context, cols []string, idxName string) error {
278279
columnMapping, err := td.columnIndexes(cols)
279280

280281
// We currently skip validating duplicates on unique virtual columns.
@@ -296,7 +297,7 @@ func (td *TableData) errIfDuplicateEntryExist(cols []string, idxName string) err
296297
if hasNulls(idxPrefixKey) {
297298
continue
298299
}
299-
h, err := sql.HashOf(idxPrefixKey)
300+
h, err := sql.HashOf(ctx, idxPrefixKey)
300301
if err != nil {
301302
return err
302303
}

sql/cache.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package sql
1616

1717
import (
18+
"context"
1819
"fmt"
1920
"runtime"
2021
"sync"
@@ -25,7 +26,7 @@ import (
2526
)
2627

2728
// HashOf returns a hash of the given value to be used as key in a cache.
28-
func HashOf(v Row) (uint64, error) {
29+
func HashOf(ctx context.Context, v Row) (uint64, error) {
2930
hash := digestPool.Get().(*xxhash.Digest)
3031
hash.Reset()
3132
defer digestPool.Put(hash)
@@ -36,7 +37,10 @@ func HashOf(v Row) (uint64, error) {
3637
return 0, err
3738
}
3839
}
39-
40+
x, err := UnwrapAny(ctx, x)
41+
if err != nil {
42+
return 0, err
43+
}
4044
// TODO: probably much faster to do this with a type switch
4145
// TODO: we don't have the type info necessary to appropriately encode the value of a string with a non-standard
4246
// collation, which means that two strings that differ only in their collations will hash to the same value.

sql/cache_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package sql
1616

1717
import (
18+
"context"
1819
"errors"
1920
"testing"
2021

@@ -179,10 +180,11 @@ func TestRowsCache(t *testing.T) {
179180
}
180181

181182
func BenchmarkHashOf(b *testing.B) {
183+
ctx := context.Background()
182184
row := NewRow(1, "1")
183185
b.ResetTimer()
184186
for i := 0; i < b.N; i++ {
185-
sum, err := HashOf(row)
187+
sum, err := HashOf(ctx, row)
186188
if err != nil {
187189
b.Fatal(err)
188190
}
@@ -193,11 +195,12 @@ func BenchmarkHashOf(b *testing.B) {
193195
}
194196

195197
func BenchmarkParallelHashOf(b *testing.B) {
198+
ctx := context.Background()
196199
row := NewRow(1, "1")
197200
b.ResetTimer()
198201
b.RunParallel(func(pb *testing.PB) {
199202
for pb.Next() {
200-
sum, err := HashOf(row)
203+
sum, err := HashOf(ctx, row)
201204
if err != nil {
202205
b.Fatal(err)
203206
}

sql/iters/rel_iters.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ func (di *distinctIter) Next(ctx *sql.Context) (sql.Row, error) {
571571
return nil, err
572572
}
573573

574-
hash, err := sql.HashOf(row)
574+
hash, err := sql.HashOf(ctx, row)
575575
if err != nil {
576576
return nil, err
577577
}
@@ -647,7 +647,7 @@ func (ii *IntersectIter) Next(ctx *sql.Context) (sql.Row, error) {
647647
return nil, err
648648
}
649649

650-
hash, herr := sql.HashOf(res)
650+
hash, herr := sql.HashOf(ctx, res)
651651
if herr != nil {
652652
return nil, herr
653653
}
@@ -669,7 +669,7 @@ func (ii *IntersectIter) Next(ctx *sql.Context) (sql.Row, error) {
669669
return nil, err
670670
}
671671

672-
hash, herr := sql.HashOf(res)
672+
hash, herr := sql.HashOf(ctx, res)
673673
if herr != nil {
674674
return nil, herr
675675
}
@@ -714,7 +714,7 @@ func (ei *ExceptIter) Next(ctx *sql.Context) (sql.Row, error) {
714714
return nil, err
715715
}
716716

717-
hash, herr := sql.HashOf(res)
717+
hash, herr := sql.HashOf(ctx, res)
718718
if herr != nil {
719719
return nil, herr
720720
}
@@ -736,7 +736,7 @@ func (ei *ExceptIter) Next(ctx *sql.Context) (sql.Row, error) {
736736
return nil, err
737737
}
738738

739-
hash, herr := sql.HashOf(res)
739+
hash, herr := sql.HashOf(ctx, res)
740740
if herr != nil {
741741
return nil, herr
742742
}

0 commit comments

Comments
 (0)