diff --git a/cmd/explaintest/r/collation_misc_disabled.result b/cmd/explaintest/r/collation_misc_disabled.result index a66f63ead2db9..a3e273c1a9b4e 100644 --- a/cmd/explaintest/r/collation_misc_disabled.result +++ b/cmd/explaintest/r/collation_misc_disabled.result @@ -120,4 +120,16 @@ binary binary 63 Yes Yes 1 ascii_bin ascii 65 Yes Yes 1 utf8_bin utf8 83 Yes Yes 1 gbk_bin gbk 87 Yes Yes 1 -use test; +drop table if exists t1; +drop table if exists t2; +create table t1(code varchar(32)) CHARSET=utf8 COLLATE=utf8_general_ci; +create table t2(code varchar(32)) CHARSET=utf8 COLLATE=utf8_bin; +desc format=brief select * from t1 join t2 on t1.code=t2.code and t1.code in ('1') and t2.code in ('1'); +id estRows task access object operator info +HashJoin 12.50 root inner join, equal:[eq(cd_test_latin1.t1.code, cd_test_latin1.t2.code)] +├─TableReader(Build) 10.00 root data:Selection +│ └─Selection 10.00 cop[tikv] eq(cd_test_latin1.t2.code, "1"), not(isnull(cd_test_latin1.t2.code)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 10.00 root data:Selection + └─Selection 10.00 cop[tikv] eq(cd_test_latin1.t1.code, "1"), not(isnull(cd_test_latin1.t1.code)) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/collation_misc_enabled.result b/cmd/explaintest/r/collation_misc_enabled.result index a088ddb0b2c9d..38e9a8cc1d8c5 100644 --- a/cmd/explaintest/r/collation_misc_enabled.result +++ b/cmd/explaintest/r/collation_misc_enabled.result @@ -133,4 +133,17 @@ utf8_unicode_ci utf8 192 Yes 1 utf8mb4_bin utf8mb4 46 Yes Yes 1 utf8mb4_general_ci utf8mb4 45 Yes 1 utf8mb4_unicode_ci utf8mb4 224 Yes 1 -use test; +drop table if exists t1; +drop table if exists t2; +create table t1(code varchar(32)) CHARSET=utf8 COLLATE=utf8_general_ci; +create table t2(code varchar(32)) CHARSET=utf8 COLLATE=utf8_bin; +desc format=brief select * from t1 join t2 on t1.code=t2.code and t1.code in ('1') and t2.code in ('1'); +id estRows task access object operator info +Projection 80000.00 root cd_test_utf8.t1.code, cd_test_utf8.t2.code +└─HashJoin 80000.00 root CARTESIAN inner join + ├─TableReader(Build) 10.00 root data:Selection + │ └─Selection 10.00 cop[tikv] eq(cd_test_utf8.t2.code, "1") + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 8000.00 root data:Selection + └─Selection 8000.00 cop[tikv] eq(cd_test_utf8.t1.code, "1") + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo diff --git a/cmd/explaintest/t/collation_misc.test b/cmd/explaintest/t/collation_misc.test index 433cd2f7a9051..d789823c806e4 100644 --- a/cmd/explaintest/t/collation_misc.test +++ b/cmd/explaintest/t/collation_misc.test @@ -86,4 +86,9 @@ select * from information_schema.COLLATION_CHARACTER_SET_APPLICABILITY where COL show charset; show collation; -use test; +# issue 52772 +drop table if exists t1; +drop table if exists t2; +create table t1(code varchar(32)) CHARSET=utf8 COLLATE=utf8_general_ci; +create table t2(code varchar(32)) CHARSET=utf8 COLLATE=utf8_bin; +desc format=brief select * from t1 join t2 on t1.code=t2.code and t1.code in ('1') and t2.code in ('1'); diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 7ad98964b7daf..fc77ad403261d 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -1651,6 +1651,13 @@ func (er *expressionRewriter) castCollationForIn(colLen int, elemCnt int, stkLen if colLen != 1 { return } + if !collate.NewCollationEnabled() { + // See https://github.com/pingcap/tidb/issues/52772 + // This function will apply CoercibilityExplicit to the casted expression, but some checks(during ColumnSubstituteImpl) is missed when the new + // collation is disabled, then lead to panic. + // To work around this issue, we can skip the function, it should be good since the collation is disabled. + return + } for i := stkLen - elemCnt; i < stkLen; i++ { // todo: consider refining the code and reusing expression.BuildCollationFunction here if er.ctxStack[i].GetType().EvalType() == types.ETString {