diff --git a/pkg/planner/core/physical_plans.go b/pkg/planner/core/physical_plans.go index 490aaba00f386..71af98e6bf011 100644 --- a/pkg/planner/core/physical_plans.go +++ b/pkg/planner/core/physical_plans.go @@ -1063,25 +1063,36 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, oldNumColumns := len(schema.Columns) numExtraColumns := 0 + 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] - 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 { @@ -1096,9 +1107,6 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, } } } - - schema.Columns = append(schema.Columns, extraColumns...) - copyColumn = append(copyColumn, extraColumnModels...) return copyColumn } 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);