diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index fa8a4e99b924d..dbde6d506a2ff 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -422,3 +422,26 @@ Projection_3 10000.00 root plus(1, ifnull(test.t.a, 0)) └─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; drop table if exists t; +create table t(a int); +explain select * from t where _tidb_rowid = 0; +id count task operator info +Projection_4 8000.00 root test.t.a +└─TableReader_6 10000.00 root data:TableScan_5 + └─TableScan_5 10000.00 cop table:t, range:[0,0], keep order:false, stats:pseudo +explain select * from t where _tidb_rowid > 0; +id count task operator info +Projection_4 8000.00 root test.t.a +└─TableReader_6 10000.00 root data:TableScan_5 + └─TableScan_5 10000.00 cop table:t, range:(0,+inf], keep order:false, stats:pseudo +explain select a, _tidb_rowid from t where a > 0; +id count task operator info +TableReader_7 3333.33 root data:Selection_6 +└─Selection_6 3333.33 cop gt(test.t.a, 0) + └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t where _tidb_rowid > 0 and a > 0; +id count task operator info +Projection_4 2666.67 root test.t.a +└─TableReader_7 2666.67 root data:Selection_6 + └─Selection_6 2666.67 cop gt(test.t.a, 0) + └─TableScan_5 3333.33 cop table:t, range:(0,+inf], keep order:false, stats:pseudo +drop table if exists t; diff --git a/cmd/explaintest/t/explain_easy.test b/cmd/explaintest/t/explain_easy.test index 3800abd33ec67..f8ca1c8bb1dc8 100644 --- a/cmd/explaintest/t/explain_easy.test +++ b/cmd/explaintest/t/explain_easy.test @@ -93,3 +93,10 @@ explain select ifnull(nb, 0), ifnull(nb, 0) from t; explain select 1+ifnull(nb, 0) from t; explain select 1+ifnull(a, 0) from t; drop table if exists t; +drop table if exists t; +create table t(a int); +explain select * from t where _tidb_rowid = 0; +explain select * from t where _tidb_rowid > 0; +explain select a, _tidb_rowid from t where a > 0; +explain select * from t where _tidb_rowid > 0 and a > 0; +drop table if exists t; diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index b50fd67f768ff..b5fae30185ae6 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -333,7 +333,10 @@ func (ds *DataSource) deriveTablePathStats(path *accessPath) (bool, error) { path.countAfterAccess = float64(ds.statisticTable.Count) path.tableFilters = ds.pushedDownConds var pkCol *expression.Column - if ds.tableInfo.PKIsHandle { + columnLen := len(ds.schema.Columns) + if columnLen > 0 && ds.schema.Columns[columnLen-1].ID == model.ExtraHandleID { + pkCol = ds.schema.Columns[columnLen-1] + } else if ds.tableInfo.PKIsHandle { if pkColInfo := ds.tableInfo.GetPkColInfo(); pkColInfo != nil { pkCol = expression.ColInfo2Col(ds.schema.Columns, pkColInfo) } @@ -342,6 +345,7 @@ func (ds *DataSource) deriveTablePathStats(path *accessPath) (bool, error) { path.ranges = ranger.FullIntRange(false) return false, nil } + path.ranges = ranger.FullIntRange(mysql.HasUnsignedFlag(pkCol.RetType.Flag)) if len(ds.pushedDownConds) == 0 { return false, nil