From 362defb112dbfeda99f5a814fc092b39ee8bf882 Mon Sep 17 00:00:00 2001 From: Zhou Kunqin <25057648+time-and-fate@users.noreply.github.com> Date: Mon, 9 Jan 2023 21:10:22 +0800 Subject: [PATCH] planner: add nil check when handling empty charset in `setUnionFlen` (#40429) close pingcap/tidb#40285 --- planner/core/integration_test.go | 8 ++++++++ planner/core/logical_plan_builder.go | 4 +++- planner/core/plan_cost_ver2_test.go | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index 459d113d97f2c..0eb7bea667b9a 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -8219,3 +8219,11 @@ func TestAutoIncrementCheckWithCheckConstraint(t *testing.T) { KEY idx_autoinc_id (id) )`) } + +func TestIssue40285(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t(col1 enum('p5', '9a33x') NOT NULL DEFAULT 'p5',col2 tinyblob DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = latin1 COLLATE = latin1_bin;") + tk.MustQuery("(select last_value(col1) over () as r0 from t) union all (select col2 as r0 from t);") +} diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index df903670ab010..21c54056c7cd8 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -1576,7 +1576,9 @@ func (*PlanBuilder) setUnionFlen(resultTp *types.FieldType, cols []expression.Ex childTp := cols[i].GetType() childTpCharLen := 1 if isBinary { - childTpCharLen = charset.CharacterSetInfos[childTp.GetCharset()].Maxlen + if charsetInfo, ok := charset.CharacterSetInfos[childTp.GetCharset()]; ok { + childTpCharLen = charsetInfo.Maxlen + } } resultTp.SetFlen(mathutil.Max(resultTp.GetFlen(), childTpCharLen*childTp.GetFlen())) } diff --git a/planner/core/plan_cost_ver2_test.go b/planner/core/plan_cost_ver2_test.go index 38ee51738d81a..c56f41b22cf59 100644 --- a/planner/core/plan_cost_ver2_test.go +++ b/planner/core/plan_cost_ver2_test.go @@ -163,6 +163,7 @@ func TestCostModelVer2ScanRowSize(t *testing.T) { tk.MustExec(`create table t (pk int, a int, b int, c int, d int, primary key(pk), index ab(a, b), index abc(a, b, c))`) tk.MustExec("insert into t values (1, 1, 1, 1, 1)") tk.MustExec(`set @@tidb_cost_model_version=2`) + tk.MustExec("set global tidb_enable_collect_execution_info=1;") cases := []struct { query string