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) (#53054)

close #52772
  • Loading branch information
ti-chi-bot authored May 21, 2024
1 parent 0eae42c commit 6cd207e
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 0 deletions.
7 changes: 7 additions & 0 deletions pkg/planner/core/expression_rewriter.go
Original file line number Diff line number Diff line change
Expand Up @@ -1743,6 +1743,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
13 changes: 13 additions & 0 deletions tests/integrationtest/r/collation_misc_disabled.result
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,16 @@ insert into t values ("1", "a ", "a");
select /*+USE_INDEX(t, idx)*/ * from t;
id a b
1 a a
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_utf8mb4_0900_bin.t1.code, cd_test_utf8mb4_0900_bin.t2.code)]
├─TableReader(Build) 10.00 root data:Selection
│ └─Selection 10.00 cop[tikv] eq(cd_test_utf8mb4_0900_bin.t2.code, "1"), not(isnull(cd_test_utf8mb4_0900_bin.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_utf8mb4_0900_bin.t1.code, "1"), not(isnull(cd_test_utf8mb4_0900_bin.t1.code))
└─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo
14 changes: 14 additions & 0 deletions tests/integrationtest/r/collation_misc_enabled.result
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,17 @@ insert into t values ("1", "a ", "a");
select /*+USE_INDEX(t, idx)*/ * from t;
id a b
1 a a
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_utf8mb4_0900_bin.t1.code, cd_test_utf8mb4_0900_bin.t2.code
└─HashJoin 80000.00 root CARTESIAN inner join
├─TableReader(Build) 10.00 root data:Selection
│ └─Selection 10.00 cop[tikv] eq(cd_test_utf8mb4_0900_bin.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_utf8mb4_0900_bin.t1.code, "1")
└─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo
7 changes: 7 additions & 0 deletions tests/integrationtest/t/collation_misc.test
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,10 @@ use cd_test_utf8mb4_0900_bin;
create table t (id varchar(255) primary key clustered, a varchar(255) collate utf8mb4_0900_bin, b varchar(255) collate utf8mb4_bin, key idx(a, b));
insert into t values ("1", "a ", "a");
select /*+USE_INDEX(t, idx)*/ * from t;

# 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');

0 comments on commit 6cd207e

Please sign in to comment.