From fbc38f8b7fdfb176d9e69bcdfc2eec9fe0c2bcdb Mon Sep 17 00:00:00 2001 From: Weizhen Wang Date: Thu, 12 Jan 2023 19:07:52 +0800 Subject: [PATCH] planner: correctly handle expression.ScalarFunction in the buildSemiJoinForSetOperator (#40390) close pingcap/tidb#40279 --- executor/executor_test.go | 15 +++++++++++++++ planner/core/logical_plan_builder.go | 4 +++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/executor/executor_test.go b/executor/executor_test.go index 9e40832db5..535fb55df8 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -1521,6 +1521,21 @@ func TestSetOperation(t *testing.T) { tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(tt).Sort().Check(testkit.Rows(output[i].Res...)) } + + // from https://github.com/pingcap/tidb/issues/40279 + tk.MustExec("CREATE TABLE `issue40279` (`a` char(155) NOT NULL DEFAULT 'on1unvbxp5sko6mbetn3ku26tuiyju7w3wc0olzto9ew7gsrx',`b` mediumint(9) NOT NULL DEFAULT '2525518',PRIMARY KEY (`b`,`a`) /*T![clustered_index] CLUSTERED */);") + tk.MustExec("insert into `issue40279` values ();") + tk.MustQuery("( select `issue40279`.`b` as r0 , from_base64( `issue40279`.`a` ) as r1 from `issue40279` ) " + + "except ( " + + "select `issue40279`.`a` as r0 , elt(2, `issue40279`.`a` , `issue40279`.`a` ) as r1 from `issue40279`);"). + Check(testkit.Rows("2525518 ")) + tk.MustExec("drop table if exists t2") + + tk.MustExec("CREATE TABLE `t2` ( `a` varchar(20) CHARACTER SET gbk COLLATE gbk_chinese_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("insert into t2 values(0xCED2)") + result := tk.MustQuery("(select elt(2,t2.a,t2.a) from t2) except (select 0xCED2 from t2)") + rows := result.Rows() + require.Len(t, rows, 0) } func TestSetOperationOnDiffColType(t *testing.T) { diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 619b95474c..38ba8df4e3 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -1747,7 +1747,9 @@ func (b *PlanBuilder) buildSemiJoinForSetOperator( if err != nil { return nil, err } - if leftCol.RetType.GetType() != rightCol.RetType.GetType() { + _, leftArgIsColumn := eqCond.(*expression.ScalarFunction).GetArgs()[0].(*expression.Column) + _, rightArgIsColumn := eqCond.(*expression.ScalarFunction).GetArgs()[1].(*expression.Column) + if leftCol.RetType.GetType() != rightCol.RetType.GetType() || !leftArgIsColumn || !rightArgIsColumn { joinPlan.OtherConditions = append(joinPlan.OtherConditions, eqCond) } else { joinPlan.EqualConditions = append(joinPlan.EqualConditions, eqCond.(*expression.ScalarFunction))