From 597805f5656593f0a0c1710df9a8031805911b60 Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Wed, 6 Dec 2023 13:57:08 +0800 Subject: [PATCH 1/2] executor, codec: hash join build wrong hash key for ENUM/SET value (#49031) --- executor/join_test.go | 20 ++++++++++++++++++++ expression/chunk_executor.go | 13 +++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/executor/join_test.go b/executor/join_test.go index 3f71a03a4cd6c..670fc949a3877 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -98,3 +98,23 @@ func TestTiDBNAAJ(t *testing.T) { tk.MustQuery("select ( table1 . a , table1 . b ) NOT IN ( SELECT 3 , 2 UNION SELECT 9, 2 ) AS field2 from t as table1 order by field2;").Check(testkit.Rows( "0", "0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1")) } + +func TestIssue48991(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tbl_3") + tk.MustExec("create table tbl_3 ( col_11 mediumint unsigned not null default 8346281 ,col_12 enum ( 'Alice','Bob','Charlie','David' ) ,col_13 time not null default '07:10:30.00' ,col_14 timestamp ,col_15 varbinary ( 194 ) not null default '-ZpCzjqdl4hsyo' , key idx_5 ( col_14 ,col_11 ,col_12 ) ,primary key ( col_11 ,col_15 ) /*T![clustered_index] clustered */ ) charset utf8mb4 collate utf8mb4_bin partition by range ( col_11 ) ( partition p0 values less than (530262), partition p1 values less than (9415740), partition p2 values less than (11007444), partition p3 values less than (maxvalue) );") + tk.MustExec("insert into tbl_3 values ( 8838143,'David','23:41:27.00','1993-02-23','g0q~Z0b*PpMPKJxYbIE' );") + tk.MustExec("insert into tbl_3 values ( 9082223,'Alice','02:25:16.00','2035-11-08','i' );") + tk.MustExec("insert into tbl_3 values ( 2483729,'Charlie','14:43:13.00','1970-09-10','w6o6WFYyL5' );") + tk.MustExec("insert into tbl_3 values ( 4135401,'Charlie','19:30:34.00','2017-06-07','2FZmy9lanL8' );") + tk.MustExec("insert into tbl_3 values ( 1479390,'Alice','20:40:08.00','1984-06-10','LeoVONgN~iJz&inj' );") + tk.MustExec("insert into tbl_3 values ( 10427825,'Charlie','15:27:35.00','1986-12-25','tWJ' );") + tk.MustExec("insert into tbl_3 values ( 12794792,'Charlie','04:10:08.00','2034-08-08','hvpXVQyuP' );") + tk.MustExec("insert into tbl_3 values ( 4696775,'Charlie','05:07:43.00','1984-07-31','SKOW9I^sM$4xNk' );") + tk.MustExec("insert into tbl_3 values ( 8963236,'Alice','08:18:31.00','2022-04-17','v4DsE' );") + tk.MustExec("insert into tbl_3 values ( 9048951,'Alice','05:19:47.00','2018-09-22','sJ!vs' );") + + res := tk.MustQuery("SELECT `col_14` FROM `test`.`tbl_3` WHERE ((`tbl_3`.`col_15` < 'dV') AND `tbl_3`.`col_12` IN (SELECT `col_12` FROM `test`.`tbl_3` WHERE NOT (ISNULL(`tbl_3`.`col_12`)))) ORDER BY IF(ISNULL(`col_14`),0,1),`col_14`;") + res.Check(testkit.Rows("1984-06-10 00:00:00", "1984-07-31 00:00:00", "2017-06-07 00:00:00")) diff --git a/expression/chunk_executor.go b/expression/chunk_executor.go index 3f3a995a0b131..019592c783891 100644 --- a/expression/chunk_executor.go +++ b/expression/chunk_executor.go @@ -15,6 +15,7 @@ package expression import ( + "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" @@ -179,7 +180,11 @@ func evalOneVec(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, out if result.IsNull(i) { buf.AppendNull() } else { - buf.AppendEnum(types.Enum{Value: 0, Name: result.GetString(i)}) + enum, err := types.ParseEnumName(ft.GetElems(), result.GetString(i), ft.GetCollate()) + if err != nil { + return errors.Errorf("Wrong enum value parsed during evaluation") + } + buf.AppendEnum(enum) } } output.SetCol(colIdx, buf) @@ -191,7 +196,11 @@ func evalOneVec(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, out if result.IsNull(i) { buf.AppendNull() } else { - buf.AppendSet(types.Set{Value: 0, Name: result.GetString(i)}) + set, err := types.ParseSetName(ft.GetElems(), result.GetString(i), ft.GetCollate()) + if err != nil { + return errors.Errorf("Wrong set value parsed during evaluation") + } + buf.AppendSet(set) } } output.SetCol(colIdx, buf) From 49398b48452d80479bd5db929d9fa7e09e707662 Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Wed, 6 Dec 2023 16:22:50 +0800 Subject: [PATCH 2/2] fix merge conflict --- executor/join_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/executor/join_test.go b/executor/join_test.go index 670fc949a3877..e6523d020b769 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -118,3 +118,4 @@ func TestIssue48991(t *testing.T) { res := tk.MustQuery("SELECT `col_14` FROM `test`.`tbl_3` WHERE ((`tbl_3`.`col_15` < 'dV') AND `tbl_3`.`col_12` IN (SELECT `col_12` FROM `test`.`tbl_3` WHERE NOT (ISNULL(`tbl_3`.`col_12`)))) ORDER BY IF(ISNULL(`col_14`),0,1),`col_14`;") res.Check(testkit.Rows("1984-06-10 00:00:00", "1984-07-31 00:00:00", "2017-06-07 00:00:00")) +}