From a0cddea48f55c01cea4106ce876bc5fe53dfe9a6 Mon Sep 17 00:00:00 2001 From: dash12653 <35824102+dash12653@users.noreply.github.com> Date: Sat, 4 Jan 2025 11:57:05 -0500 Subject: [PATCH 1/4] modify some code --- .../r/planner/core/issuetest/planner_issue.result | 10 ++++++++++ .../t/planner/core/issuetest/planner_issue.test | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/tests/integrationtest/r/planner/core/issuetest/planner_issue.result b/tests/integrationtest/r/planner/core/issuetest/planner_issue.result index d1e8d6bc1830c..166db9334cf51 100644 --- a/tests/integrationtest/r/planner/core/issuetest/planner_issue.result +++ b/tests/integrationtest/r/planner/core/issuetest/planner_issue.result @@ -765,3 +765,13 @@ KEY `idx_65` (`col_36`(5)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; with cte_192 ( col_1101,col_1102,col_1103,col_1104 ) AS ( select /*+ use_index_merge( tl6e913fb9 ) */ replace( tl6e913fb9.col_36 , tl6e913fb9.col_36 , tl6e913fb9.col_36 ) as r0 , space( 0 ) as r1 , min( distinct tl6e913fb9.col_36 ) as r2 , count( distinct tl6e913fb9.col_36 ) as r3 from tl6e913fb9 where tl6e913fb9.col_36 between 'n92ok$B%W#UU%O' and '()c=KVQ=T%-vzGJ' and tl6e913fb9.col_36 in ( 'T+kf' ,'Lvluod2H' ,'3#Omx@pC^fFkeH' ,'=b$z' ) group by tl6e913fb9.col_36 having tl6e913fb9.col_36 = 'xjV@' or IsNull( tl6e913fb9.col_36 ) ) ( select 1,col_1101,col_1102,col_1103,col_1104 from cte_192 where not( IsNull( cte_192.col_1102 ) ) order by 1,2,3,4,5 limit 72850972 ); 1 col_1101 col_1102 col_1103 col_1104 +drop table if exists t; +create table t (id int unique key, c int); +insert into t values (1, 10); +insert into t values (2, 20); +insert into t values (3, 30); +select _tidb_rowid from t where id in (1, 2, 3); +_tidb_rowid +1 +2 +3 diff --git a/tests/integrationtest/t/planner/core/issuetest/planner_issue.test b/tests/integrationtest/t/planner/core/issuetest/planner_issue.test index ae4b848059204..99259bf18d56f 100644 --- a/tests/integrationtest/t/planner/core/issuetest/planner_issue.test +++ b/tests/integrationtest/t/planner/core/issuetest/planner_issue.test @@ -534,3 +534,11 @@ CREATE TABLE `tl6e913fb9` ( KEY `idx_65` (`col_36`(5)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; with cte_192 ( col_1101,col_1102,col_1103,col_1104 ) AS ( select /*+ use_index_merge( tl6e913fb9 ) */ replace( tl6e913fb9.col_36 , tl6e913fb9.col_36 , tl6e913fb9.col_36 ) as r0 , space( 0 ) as r1 , min( distinct tl6e913fb9.col_36 ) as r2 , count( distinct tl6e913fb9.col_36 ) as r3 from tl6e913fb9 where tl6e913fb9.col_36 between 'n92ok$B%W#UU%O' and '()c=KVQ=T%-vzGJ' and tl6e913fb9.col_36 in ( 'T+kf' ,'Lvluod2H' ,'3#Omx@pC^fFkeH' ,'=b$z' ) group by tl6e913fb9.col_36 having tl6e913fb9.col_36 = 'xjV@' or IsNull( tl6e913fb9.col_36 ) ) ( select 1,col_1101,col_1102,col_1103,col_1104 from cte_192 where not( IsNull( cte_192.col_1102 ) ) order by 1,2,3,4,5 limit 72850972 ); + +# TestIssue58581 +drop table if exists t; +create table t (id int unique key, c int); +insert into t values (1, 10); +insert into t values (2, 20); +insert into t values (3, 30); +select _tidb_rowid from t where id in (1, 2, 3); From 45ad56fddef99a7ec082d930442c29d37abbe355 Mon Sep 17 00:00:00 2001 From: dash12653 <35824102+dash12653@users.noreply.github.com> Date: Sat, 4 Jan 2025 11:58:12 -0500 Subject: [PATCH 2/4] modify some code --- pkg/planner/core/physical_plans.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pkg/planner/core/physical_plans.go b/pkg/planner/core/physical_plans.go index 490aaba00f386..f89e9e55a1a20 100644 --- a/pkg/planner/core/physical_plans.go +++ b/pkg/planner/core/physical_plans.go @@ -1063,15 +1063,17 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, oldNumColumns := len(schema.Columns) numExtraColumns := 0 - for i := oldNumColumns - 1; i >= 0; i-- { - cid := schema.Columns[i].ID - // Move extra columns to the end. - // ExtraRowChecksumID is ignored here since it's treated as an ordinary column. - // https://github.com/pingcap/tidb/blob/3c407312a986327bc4876920e70fdd6841b8365f/pkg/util/rowcodec/decoder.go#L206-L222 - if cid != model.ExtraHandleID && cid != model.ExtraPhysTblID { - break + if oldNumColumns > 1 { + for i := oldNumColumns - 1; i >= 0; i-- { + cid := schema.Columns[i].ID + // Move extra columns to the end. + // ExtraRowChecksumID is ignored here since it's treated as an ordinary column. + // https://github.com/pingcap/tidb/blob/3c407312a986327bc4876920e70fdd6841b8365f/pkg/util/rowcodec/decoder.go#L206-L222 + if cid != model.ExtraHandleID && cid != model.ExtraPhysTblID { + break + } + numExtraColumns++ } - numExtraColumns++ } extraColumns := make([]*expression.Column, numExtraColumns) From b015dd53e67b1e406110e9c77f26e1ff4e6baca0 Mon Sep 17 00:00:00 2001 From: dash12653 <35824102+dash12653@users.noreply.github.com> Date: Sun, 5 Jan 2025 14:43:47 -0500 Subject: [PATCH 3/4] modify some code --- pkg/planner/core/physical_plans.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/pkg/planner/core/physical_plans.go b/pkg/planner/core/physical_plans.go index f89e9e55a1a20..8b3320e25238a 100644 --- a/pkg/planner/core/physical_plans.go +++ b/pkg/planner/core/physical_plans.go @@ -1063,19 +1063,21 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, oldNumColumns := len(schema.Columns) numExtraColumns := 0 - if oldNumColumns > 1 { - for i := oldNumColumns - 1; i >= 0; i-- { - cid := schema.Columns[i].ID - // Move extra columns to the end. - // ExtraRowChecksumID is ignored here since it's treated as an ordinary column. - // https://github.com/pingcap/tidb/blob/3c407312a986327bc4876920e70fdd6841b8365f/pkg/util/rowcodec/decoder.go#L206-L222 - if cid != model.ExtraHandleID && cid != model.ExtraPhysTblID { - break - } - numExtraColumns++ + ordinaryColumnExists := false + for i := oldNumColumns - 1; i >= 0; i-- { + cid := schema.Columns[i].ID + // Move extra columns to the end. + // ExtraRowChecksumID is ignored here since it's treated as an ordinary column. + // https://github.com/pingcap/tidb/blob/3c407312a986327bc4876920e70fdd6841b8365f/pkg/util/rowcodec/decoder.go#L206-L222 + if cid != model.ExtraHandleID && cid != model.ExtraPhysTblID { + ordinaryColumnExists = true + break } + numExtraColumns++ + } + if !ordinaryColumnExists { + numExtraColumns = 0 } - extraColumns := make([]*expression.Column, numExtraColumns) copy(extraColumns, schema.Columns[oldNumColumns-numExtraColumns:]) schema.Columns = schema.Columns[:oldNumColumns-numExtraColumns] From f620465ac55279d2ed056cae6627506d7bee0dfa Mon Sep 17 00:00:00 2001 From: dash12653 <35824102+dash12653@users.noreply.github.com> Date: Mon, 13 Jan 2025 21:28:51 -0500 Subject: [PATCH 4/4] make the code more readable --- pkg/planner/core/physical_plans.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/pkg/planner/core/physical_plans.go b/pkg/planner/core/physical_plans.go index 8b3320e25238a..71af98e6bf011 100644 --- a/pkg/planner/core/physical_plans.go +++ b/pkg/planner/core/physical_plans.go @@ -1075,17 +1075,24 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, } numExtraColumns++ } - if !ordinaryColumnExists { - numExtraColumns = 0 - } - extraColumns := make([]*expression.Column, numExtraColumns) - copy(extraColumns, schema.Columns[oldNumColumns-numExtraColumns:]) - schema.Columns = schema.Columns[:oldNumColumns-numExtraColumns] + if ordinaryColumnExists && numExtraColumns > 0 { + extraColumns := make([]*expression.Column, numExtraColumns) + copy(extraColumns, schema.Columns[oldNumColumns-numExtraColumns:]) + schema.Columns = schema.Columns[:oldNumColumns-numExtraColumns] - extraColumnModels := make([]*model.ColumnInfo, numExtraColumns) - copy(extraColumnModels, copyColumn[len(copyColumn)-numExtraColumns:]) - copyColumn = copyColumn[:len(copyColumn)-numExtraColumns] + extraColumnModels := make([]*model.ColumnInfo, numExtraColumns) + copy(extraColumnModels, copyColumn[len(copyColumn)-numExtraColumns:]) + copyColumn = copyColumn[:len(copyColumn)-numExtraColumns] + copyColumn = expandVirtualColumn(schema, copyColumn, colsInfo) + schema.Columns = append(schema.Columns, extraColumns...) + copyColumn = append(copyColumn, extraColumnModels...) + return copyColumn + } + return expandVirtualColumn(schema, copyColumn, colsInfo) +} + +func expandVirtualColumn(schema *expression.Schema, copyColumn []*model.ColumnInfo, colsInfo []*model.ColumnInfo) []*model.ColumnInfo { schemaColumns := schema.Columns for _, col := range schemaColumns { if col.VirtualExpr == nil { @@ -1100,9 +1107,6 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, } } } - - schema.Columns = append(schema.Columns, extraColumns...) - copyColumn = append(copyColumn, extraColumnModels...) return copyColumn }