diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index 2734cafc0957d..25a5ee7366463 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -390,7 +390,7 @@ Sort_13 2.00 root a:asc └─HashAgg_26 1.00 root group by:a, funcs:firstrow(a), firstrow(a) └─Projection_27 1.00 root 1 └─TableDual_28 1.00 root rows:1 -explain SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a) +explain SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a); id count task operator info HashAgg_15 2.00 root group by:a, funcs:firstrow(join_agg_0) └─Union_16 2.00 root @@ -400,3 +400,26 @@ HashAgg_15 2.00 root group by:a, funcs:firstrow(join_agg_0) └─StreamAgg_26 1.00 root group by:a, funcs:firstrow(a), firstrow(a) └─Projection_31 1.00 root 1 └─TableDual_32 1.00 root rows:1 +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 diff --git a/cmd/explaintest/t/explain_easy.test b/cmd/explaintest/t/explain_easy.test index eb7d36e0a7198..9ef0bc6503efc 100644 --- a/cmd/explaintest/t/explain_easy.test +++ b/cmd/explaintest/t/explain_easy.test @@ -82,4 +82,11 @@ explain select * from ta where a = 1; rollback; explain SELECT 0 AS a FROM dual UNION SELECT 1 AS a FROM dual ORDER BY a; -explain SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a) +explain SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a); + +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; diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index d97afbeb43b44..aa2cc510b67c9 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -340,7 +340,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) } @@ -349,6 +352,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