Skip to content

Commit

Permalink
expression: don't cast collation for in expression is the new collati…
Browse files Browse the repository at this point in the history
…on is disabled (#52812) (#52864)

close #52772
  • Loading branch information
ti-chi-bot authored Apr 24, 2024
1 parent 5e7a36d commit caa60c0
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 3 deletions.
14 changes: 13 additions & 1 deletion cmd/explaintest/r/collation_misc_disabled.result
Original file line number Diff line number Diff line change
Expand Up @@ -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
15 changes: 14 additions & 1 deletion cmd/explaintest/r/collation_misc_enabled.result
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 6 additions & 1 deletion cmd/explaintest/t/collation_misc.test
Original file line number Diff line number Diff line change
Expand Up @@ -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');
7 changes: 7 additions & 0 deletions planner/core/expression_rewriter.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit caa60c0

Please sign in to comment.