From 0eb177304af7f03f2be3b89399e20e3b275cf69e Mon Sep 17 00:00:00 2001 From: Hangjie Mo Date: Fri, 19 Jul 2024 11:45:08 +0800 Subject: [PATCH] planner: forbid generate `PointGet` plan with partition table + `_tidb_rowid` (#54592) close pingcap/tidb#54583 --- pkg/planner/core/find_best_task.go | 5 + pkg/planner/core/point_get_plan.go | 17 +- .../planner/core/integration_partition.result | 291 ++++++++---------- .../t/planner/core/integration_partition.test | 16 + 4 files changed, 163 insertions(+), 166 deletions(-) diff --git a/pkg/planner/core/find_best_task.go b/pkg/planner/core/find_best_task.go index b3fc8a283d845..6e163e5318d41 100644 --- a/pkg/planner/core/find_best_task.go +++ b/pkg/planner/core/find_best_task.go @@ -1451,6 +1451,7 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter if canConvertPointGet && ds.table.Meta().GetPartitionInfo() != nil { // partition table with dynamic prune not support batchPointGet // Due to sorting? + // Please make sure handle `where _tidb_rowid in (xx, xx)` correctly when delete this if statements. if canConvertPointGet && len(path.Ranges) > 1 && ds.SCtx().GetSessionVars().StmtCtx.UseDynamicPartitionPrune() { canConvertPointGet = false } @@ -1468,6 +1469,10 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter canConvertPointGet = false } } + // Partition table can't use `_tidb_rowid` to generate PointGet Plan unless one partition is explicitly specified. + if canConvertPointGet && path.IsIntHandlePath && !ds.table.Meta().PKIsHandle && len(ds.PartitionNames) != 1 { + canConvertPointGet = false + } if canConvertPointGet { // If the schema contains ExtraPidColID, do not convert to point get. // Because the point get executor can not handle the extra partition ID column now. diff --git a/pkg/planner/core/point_get_plan.go b/pkg/planner/core/point_get_plan.go index 78e784c97f6ab..0a378b3fd559e 100644 --- a/pkg/planner/core/point_get_plan.go +++ b/pkg/planner/core/point_get_plan.go @@ -335,6 +335,17 @@ func (p *PointGetPlan) PrunePartitions(sctx sessionctx.Context) bool { // reading for the Global Index / table id return false } + // _tidb_rowid + specify a partition + if p.IndexInfo == nil && !p.TblInfo.HasClusteredIndex() && len(p.PartitionNames) == 1 { + for i, def := range pi.Definitions { + if def.Name.L == p.PartitionNames[0].L { + idx := i + p.PartitionIdx = &idx + break + } + } + return false + } // If tryPointGetPlan did generate the plan, // then PartitionIdx is not set and needs to be set here! // There are two ways to get here from static mode partition pruning: @@ -1696,7 +1707,11 @@ func getNameValuePairs(ctx PlanContext, tbl *model.TableInfo, tblName model.CISt return nil, false } col := model.FindColumnInfo(tbl.Cols(), colName.Name.Name.L) - if col == nil { // Handling the case when the column is _tidb_rowid. + if col == nil { + // Partition table can't use `_tidb_rowid` to generate PointGet Plan. + if tbl.GetPartitionInfo() != nil && colName.Name.Name.L == model.ExtraHandleName.L { + return nil, false + } return append(nvPairs, nameValuePair{colName: colName.Name.Name.L, colFieldType: types.NewFieldType(mysql.TypeLonglong), value: d, con: con}), false } diff --git a/tests/integrationtest/r/planner/core/integration_partition.result b/tests/integrationtest/r/planner/core/integration_partition.result index b31926697baf6..6a6780c5aaef2 100644 --- a/tests/integrationtest/r/planner/core/integration_partition.result +++ b/tests/integrationtest/r/planner/core/integration_partition.result @@ -649,6 +649,7 @@ c1 c2 c3 c4 4 4 4 4 drop table t2; drop database issue_27532; +set autocommit = DEFAULT; use planner__core__integration_partition; set @@tidb_partition_prune_mode = 'dynamic'; select @@tidb_partition_prune_mode; @@ -736,39 +737,29 @@ a b c 10 2022-01-01 00:00:00 Wowe explain format = 'brief' select * from t where a = 10 and b = "2022-01-01" and c = "Wow"; id estRows task access object operator info -Projection 0.00 root rangecolumnsmulti.t.a, rangecolumnsmulti.t.b, rangecolumnsmulti.t.c -└─UnionScan 0.00 root eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), eq(rangecolumnsmulti.t.c, "Wow") - └─TableReader 0.00 root partition:p3 data:Selection - └─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), eq(rangecolumnsmulti.t.c, "Wow") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.00 root partition:p3 data:Selection +└─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), eq(rangecolumnsmulti.t.c, "Wow") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a = 10 and b = "2022-01-01" and c <= "Wow"; id estRows task access object operator info -Projection 0.00 root rangecolumnsmulti.t.a, rangecolumnsmulti.t.b, rangecolumnsmulti.t.c -└─UnionScan 0.00 root eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), le(rangecolumnsmulti.t.c, "Wow") - └─TableReader 0.00 root partition:p2,p3 data:Selection - └─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), le(rangecolumnsmulti.t.c, "Wow") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.00 root partition:p2,p3 data:Selection +└─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), le(rangecolumnsmulti.t.c, "Wow") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a = 10 and b = "2022-01-01" and c < "Wow"; id estRows task access object operator info -Projection 0.00 root rangecolumnsmulti.t.a, rangecolumnsmulti.t.b, rangecolumnsmulti.t.c -└─UnionScan 0.00 root eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") - └─TableReader 0.00 root partition:p2 data:Selection - └─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.00 root partition:p2 data:Selection +└─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a = 10 and b = "2022-01-01" and c > "Wow"; id estRows task access object operator info -Projection 0.00 root rangecolumnsmulti.t.a, rangecolumnsmulti.t.b, rangecolumnsmulti.t.c -└─UnionScan 0.00 root eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), gt(rangecolumnsmulti.t.c, "Wow") - └─TableReader 0.00 root partition:p3 data:Selection - └─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), gt(rangecolumnsmulti.t.c, "Wow") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.00 root partition:p3 data:Selection +└─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), gt(rangecolumnsmulti.t.c, "Wow") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a = 10 and b = "2022-01-01" and c >= "Wow"; id estRows task access object operator info -Projection 0.00 root rangecolumnsmulti.t.a, rangecolumnsmulti.t.b, rangecolumnsmulti.t.c -└─UnionScan 0.00 root eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), ge(rangecolumnsmulti.t.c, "Wow") - └─TableReader 0.00 root partition:p3 data:Selection - └─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), ge(rangecolumnsmulti.t.c, "Wow") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.00 root partition:p3 data:Selection +└─Selection 0.00 cop[tikv] eq(rangecolumnsmulti.t.a, 10), eq(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), ge(rangecolumnsmulti.t.c, "Wow") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a <= 10 and b <= '2022-01-01' and c < "Wow"; a b c -2147483648 0000-00-00 00:00:00 @@ -785,11 +776,9 @@ a b c 5 0000-00-00 00:00:00 Hi explain format = 'brief' select * from t where a <= 10 and b <= '2022-01-01' and c < "Wow"; id estRows task access object operator info -Projection 367.05 root rangecolumnsmulti.t.a, rangecolumnsmulti.t.b, rangecolumnsmulti.t.c -└─UnionScan 367.05 root le(rangecolumnsmulti.t.a, 10), le(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") - └─TableReader 367.05 root partition:p1,p2,p3 data:Selection - └─Selection 367.05 cop[tikv] le(rangecolumnsmulti.t.a, 10), le(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 367.05 root partition:p1,p2,p3 data:Selection +└─Selection 367.05 cop[tikv] le(rangecolumnsmulti.t.a, 10), le(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a <= 11 and b <= '2022-01-01' and c < "Wow"; a b c -2147483648 0000-00-00 00:00:00 @@ -797,22 +786,18 @@ a b c 5 0000-00-00 00:00:00 Hi explain format = 'brief' select * from t where a <= 10 and b <= '2022-01-01' and c < "Wow"; id estRows task access object operator info -Projection 367.05 root rangecolumnsmulti.t.a, rangecolumnsmulti.t.b, rangecolumnsmulti.t.c -└─UnionScan 367.05 root le(rangecolumnsmulti.t.a, 10), le(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") - └─TableReader 367.05 root partition:p1,p2,p3 data:Selection - └─Selection 367.05 cop[tikv] le(rangecolumnsmulti.t.a, 10), le(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 367.05 root partition:p1,p2,p3 data:Selection +└─Selection 367.05 cop[tikv] le(rangecolumnsmulti.t.a, 10), le(rangecolumnsmulti.t.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.t.c, "Wow") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo create table tref (a int, b datetime, c varchar(255), key (a,b,c)); set @@sql_mode = ''; insert into tref select * from t; set @@sql_mode = DEFAULT; explain format = 'brief' select * from tref where a <= 10 and b <= '2022-01-01' and c < "Wow"; id estRows task access object operator info -Projection 367.05 root rangecolumnsmulti.tref.a, rangecolumnsmulti.tref.b, rangecolumnsmulti.tref.c -└─UnionScan 367.05 root le(rangecolumnsmulti.tref.a, 10), le(rangecolumnsmulti.tref.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.tref.c, "Wow") - └─IndexReader 367.05 root index:Selection - └─Selection 367.05 cop[tikv] le(rangecolumnsmulti.tref.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.tref.c, "Wow") - └─IndexRangeScan 3323.33 cop[tikv] table:tref, index:a(a, b, c) range:[-inf,10], keep order:false, stats:pseudo +IndexReader 367.05 root index:Selection +└─Selection 367.05 cop[tikv] le(rangecolumnsmulti.tref.b, 2022-01-01 00:00:00.000000), lt(rangecolumnsmulti.tref.c, "Wow") + └─IndexRangeScan 3323.33 cop[tikv] table:tref, index:a(a, b, c) range:[-inf,10], keep order:false, stats:pseudo explain format = 'brief' select * from t where a <= 10 and b <= '2022-01-01' and c <= "Wow"; id estRows task access object operator info TableReader 367.05 root partition:p1,p2,p3 data:Selection @@ -893,21 +878,17 @@ a b c 1 NULL Wow explain format = 'brief' select a,b,c from t where a = 1 AND c = "Wow"; id estRows task access object operator info -Projection 0.01 root rcolumnsmulti.t.a, rcolumnsmulti.t.b, rcolumnsmulti.t.c -└─UnionScan 0.01 root eq(rcolumnsmulti.t.a, 1), eq(rcolumnsmulti.t.c, "Wow") - └─IndexReader 0.01 root partition:p8 index:Selection - └─Selection 0.01 cop[tikv] eq(rcolumnsmulti.t.c, "Wow") - └─IndexRangeScan 10.00 cop[tikv] table:t, index:a(a, b, c) range:[1,1], keep order:false, stats:pseudo +IndexReader 0.50 root partition:p8 index:Selection +└─Selection 0.50 cop[tikv] eq(rcolumnsmulti.t.c, "Wow") + └─IndexRangeScan 1.00 cop[tikv] table:t, index:a(a, b, c) range:[1,1], keep order:false select a,b,c from t where a = 0 AND c = "Wow"; a b c 0 2020-01-01 00:00:00 Wow explain format = 'brief' select a,b,c from t where a = 0 AND c = "Wow"; id estRows task access object operator info -Projection 0.01 root rcolumnsmulti.t.a, rcolumnsmulti.t.b, rcolumnsmulti.t.c -└─UnionScan 0.01 root eq(rcolumnsmulti.t.a, 0), eq(rcolumnsmulti.t.c, "Wow") - └─IndexReader 0.01 root partition:p3,p4,p5,p6,p7 index:Selection - └─Selection 0.01 cop[tikv] eq(rcolumnsmulti.t.c, "Wow") - └─IndexRangeScan 10.00 cop[tikv] table:t, index:a(a, b, c) range:[0,0], keep order:false, stats:pseudo +IndexReader 0.50 root partition:p3,p4,p5,p6,p7 index:Selection +└─Selection 0.50 cop[tikv] eq(rcolumnsmulti.t.c, "Wow") + └─IndexRangeScan 1.00 cop[tikv] table:t, index:a(a, b, c) range:[0,0], keep order:false create database rce; use rce; create table tref (a int unsigned, b int, c int); @@ -1012,46 +993,34 @@ a b c 17 17 17 explain format = 'brief' select * from t where c = 3; id estRows task access object operator info -Projection 10.00 root rce.t.a, rce.t.b, rce.t.c -└─UnionScan 10.00 root eq(rce.t.c, 3) - └─TableReader 10.00 root partition:all data:Selection - └─Selection 10.00 cop[tikv] eq(rce.t.c, 3) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10.00 root partition:all data:Selection +└─Selection 10.00 cop[tikv] eq(rce.t.c, 3) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where b > 3 and c = 3; id estRows task access object operator info -Projection 3.33 root rce.t.a, rce.t.b, rce.t.c -└─UnionScan 3.33 root eq(rce.t.c, 3), gt(rce.t.b, 3) - └─TableReader 3.33 root partition:all data:Selection - └─Selection 3.33 cop[tikv] eq(rce.t.c, 3), gt(rce.t.b, 3) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 3.33 root partition:all data:Selection +└─Selection 3.33 cop[tikv] eq(rce.t.c, 3), gt(rce.t.b, 3) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a = 5 and c = 3; id estRows task access object operator info -Projection 0.01 root rce.t.a, rce.t.b, rce.t.c -└─UnionScan 0.01 root eq(rce.t.a, 5), eq(rce.t.c, 3) - └─TableReader 0.01 root partition:p9 data:Selection - └─Selection 0.01 cop[tikv] eq(rce.t.a, 5), eq(rce.t.c, 3) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.01 root partition:p9 data:Selection +└─Selection 0.01 cop[tikv] eq(rce.t.a, 5), eq(rce.t.c, 3) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a = 4 and c = 3; id estRows task access object operator info -Projection 0.01 root rce.t.a, rce.t.b, rce.t.c -└─UnionScan 0.01 root eq(rce.t.a, 4), eq(rce.t.c, 3) - └─TableReader 0.01 root partition:p1,p2,p3,p4,p5,p6,p7,p8 data:Selection - └─Selection 0.01 cop[tikv] eq(rce.t.a, 4), eq(rce.t.c, 3) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.01 root partition:p1,p2,p3,p4,p5,p6,p7,p8 data:Selection +└─Selection 0.01 cop[tikv] eq(rce.t.a, 4), eq(rce.t.c, 3) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a in (4,14) and c = 3; id estRows task access object operator info -Projection 0.02 root rce.t.a, rce.t.b, rce.t.c -└─UnionScan 0.02 root eq(rce.t.c, 3), in(rce.t.a, 4, 14) - └─TableReader 0.02 root partition:p1,p2,p3,p4,p5,p6,p7,p8,p11,p12 data:Selection - └─Selection 0.02 cop[tikv] eq(rce.t.c, 3), in(rce.t.a, 4, 14) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.02 root partition:p1,p2,p3,p4,p5,p6,p7,p8,p11,p12 data:Selection +└─Selection 0.02 cop[tikv] eq(rce.t.c, 3), in(rce.t.a, 4, 14) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a in (4,14) and b in (null,10); id estRows task access object operator info -Projection 0.02 root rce.t.a, rce.t.b, rce.t.c -└─UnionScan 0.02 root in(rce.t.a, 4, 14), in(rce.t.b, NULL, 10) - └─TableReader 0.02 root partition:p5,p12 data:Selection - └─Selection 0.02 cop[tikv] in(rce.t.a, 4, 14), in(rce.t.b, NULL, 10) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.02 root partition:p5,p12 data:Selection +└─Selection 0.02 cop[tikv] in(rce.t.a, 4, 14), in(rce.t.b, NULL, 10) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo select * from tref where a in (4,14) and b in (null,10); a b c 14 10 4 @@ -1062,11 +1031,9 @@ a b c 4 10 3 explain format = 'brief' select * from t where a in (4,14) and (b in (11,10) OR b is null); id estRows task access object operator info -Projection 0.06 root rce.t.a, rce.t.b, rce.t.c -└─UnionScan 0.06 root in(rce.t.a, 4, 14), or(in(rce.t.b, 11, 10), isnull(rce.t.b)) - └─TableReader 0.06 root partition:p1,p5,p6,p11,p12 data:Selection - └─Selection 0.06 cop[tikv] in(rce.t.a, 4, 14), or(in(rce.t.b, 11, 10), isnull(rce.t.b)) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.06 root partition:p1,p5,p6,p11,p12 data:Selection +└─Selection 0.06 cop[tikv] in(rce.t.a, 4, 14), or(in(rce.t.b, 11, 10), isnull(rce.t.b)) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo select * from tref where a in (4,14) and (b in (11,10) OR b is null); a b c 14 NULL NULL @@ -1130,18 +1097,14 @@ h l explain format = 'brief' select * from t where a > 'C' and a < 'q'; id estRows task access object operator info -Projection 250.00 root cwc.t.a -└─UnionScan 250.00 root gt(cwc.t.a, "C"), lt(cwc.t.a, "q") - └─TableReader 250.00 root partition:p1,p2,p3,p4 data:Selection - └─Selection 250.00 cop[tikv] gt(cwc.t.a, "C"), lt(cwc.t.a, "q") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 250.00 root partition:p1,p2,p3,p4 data:Selection +└─Selection 250.00 cop[tikv] gt(cwc.t.a, "C"), lt(cwc.t.a, "q") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where a > 'c' and a < 'Q'; id estRows task access object operator info -Projection 250.00 root cwc.t.a -└─UnionScan 250.00 root gt(cwc.t.a, "c"), lt(cwc.t.a, "Q") - └─TableReader 250.00 root partition:p1,p2,p3,p4 data:Selection - └─Selection 250.00 cop[tikv] gt(cwc.t.a, "c"), lt(cwc.t.a, "Q") - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 250.00 root partition:p1,p2,p3,p4 data:Selection +└─Selection 250.00 cop[tikv] gt(cwc.t.a, "c"), lt(cwc.t.a, "Q") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop database if exists rcd; create database rcd; use rcd; @@ -1191,95 +1154,69 @@ a 2020-01-01 explain select * from t where a < '1943-02-12'; id estRows task access object operator info -Projection_5 3323.33 root rcd.t.a -└─UnionScan_6 3323.33 root lt(rcd.t.a, 1943-02-12 00:00:00.000000) - └─TableReader_9 3323.33 root partition:p0 data:Selection_8 - └─Selection_8 3323.33 cop[tikv] lt(rcd.t.a, 1943-02-12 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3323.33 root partition:p0 data:Selection_6 +└─Selection_6 3323.33 cop[tikv] lt(rcd.t.a, 1943-02-12 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a >= '19690213'; id estRows task access object operator info -Projection_5 3333.33 root rcd.t.a -└─UnionScan_6 3333.33 root ge(rcd.t.a, 1969-02-13 00:00:00.000000) - └─TableReader_9 3333.33 root partition:all data:Selection_8 - └─Selection_8 3333.33 cop[tikv] ge(rcd.t.a, 1969-02-13 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3333.33 root partition:all data:Selection_6 +└─Selection_6 3333.33 cop[tikv] ge(rcd.t.a, 1969-02-13 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a > '2003-03-13'; id estRows task access object operator info -Projection_5 3333.33 root rcd.t.a -└─UnionScan_6 3333.33 root gt(rcd.t.a, 2003-03-13 00:00:00.000000) - └─TableReader_9 3333.33 root partition:p2,p3,p4,p5,p6 data:Selection_8 - └─Selection_8 3333.33 cop[tikv] gt(rcd.t.a, 2003-03-13 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3333.33 root partition:p2,p3,p4,p5,p6 data:Selection_6 +└─Selection_6 3333.33 cop[tikv] gt(rcd.t.a, 2003-03-13 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a < '2006-02-03'; id estRows task access object operator info -Projection_5 3323.33 root rcd.t.a -└─UnionScan_6 3323.33 root lt(rcd.t.a, 2006-02-03 00:00:00.000000) - └─TableReader_9 3323.33 root partition:p0,p1,p2 data:Selection_8 - └─Selection_8 3323.33 cop[tikv] lt(rcd.t.a, 2006-02-03 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3323.33 root partition:p0,p1,p2 data:Selection_6 +└─Selection_6 3323.33 cop[tikv] lt(rcd.t.a, 2006-02-03 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a = '20070707'; id estRows task access object operator info -Projection_5 10.00 root rcd.t.a -└─UnionScan_6 10.00 root eq(rcd.t.a, 2007-07-07 00:00:00.000000) - └─TableReader_9 10.00 root partition:p2 data:Selection_8 - └─Selection_8 10.00 cop[tikv] eq(rcd.t.a, 2007-07-07 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 10.00 root partition:p2 data:Selection_6 +└─Selection_6 10.00 cop[tikv] eq(rcd.t.a, 2007-07-07 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a > '1949-10-10'; id estRows task access object operator info -Projection_5 3333.33 root rcd.t.a -└─UnionScan_6 3333.33 root gt(rcd.t.a, 1949-10-10 00:00:00.000000) - └─TableReader_9 3333.33 root partition:all data:Selection_8 - └─Selection_8 3333.33 cop[tikv] gt(rcd.t.a, 1949-10-10 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3333.33 root partition:all data:Selection_6 +└─Selection_6 3333.33 cop[tikv] gt(rcd.t.a, 1949-10-10 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a > '2016-02-01' AND a < '20000103'; id estRows task access object operator info -Projection_5 0.00 root rcd.t.a -└─UnionScan_6 0.00 root gt(rcd.t.a, 2016-02-01 00:00:00.000000), lt(rcd.t.a, 2000-01-03 00:00:00.000000) - └─TableReader_9 0.00 root partition:dual data:Selection_8 - └─Selection_8 0.00 cop[tikv] gt(rcd.t.a, 2016-02-01 00:00:00.000000), lt(rcd.t.a, 2000-01-03 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 0.00 root partition:dual data:Selection_6 +└─Selection_6 0.00 cop[tikv] gt(rcd.t.a, 2016-02-01 00:00:00.000000), lt(rcd.t.a, 2000-01-03 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a < '19691112' or a >= '2019-09-18'; id estRows task access object operator info -Projection_5 6656.67 root rcd.t.a -└─UnionScan_6 6656.67 root or(lt(rcd.t.a, 1969-11-12 00:00:00.000000), ge(rcd.t.a, 2019-09-18 00:00:00.000000)) - └─TableReader_9 6656.67 root partition:p0,p5,p6 data:Selection_8 - └─Selection_8 6656.67 cop[tikv] or(lt(rcd.t.a, 1969-11-12 00:00:00.000000), ge(rcd.t.a, 2019-09-18 00:00:00.000000)) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 6656.67 root partition:p0,p5,p6 data:Selection_6 +└─Selection_6 6656.67 cop[tikv] or(lt(rcd.t.a, 1969-11-12 00:00:00.000000), ge(rcd.t.a, 2019-09-18 00:00:00.000000)) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a is null; id estRows task access object operator info -Projection_5 10.00 root rcd.t.a -└─UnionScan_6 10.00 root isnull(rcd.t.a) - └─TableReader_9 10.00 root partition:p0 data:Selection_8 - └─Selection_8 10.00 cop[tikv] isnull(rcd.t.a) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 10.00 root partition:p0 data:Selection_6 +└─Selection_6 10.00 cop[tikv] isnull(rcd.t.a) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where '2003-02-27' >= a; id estRows task access object operator info -Projection_5 3323.33 root rcd.t.a -└─UnionScan_6 3323.33 root ge(2003-02-27 00:00:00.000000, rcd.t.a) - └─TableReader_9 3323.33 root partition:p0,p1,p2 data:Selection_8 - └─Selection_8 3323.33 cop[tikv] ge(2003-02-27 00:00:00.000000, rcd.t.a) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3323.33 root partition:p0,p1,p2 data:Selection_6 +└─Selection_6 3323.33 cop[tikv] ge(2003-02-27 00:00:00.000000, rcd.t.a) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where '20141024' < a; id estRows task access object operator info -Projection_5 3333.33 root rcd.t.a -└─UnionScan_6 3333.33 root lt(2014-10-24 00:00:00.000000, rcd.t.a) - └─TableReader_9 3333.33 root partition:p4,p5,p6 data:Selection_8 - └─Selection_8 3333.33 cop[tikv] lt(2014-10-24 00:00:00.000000, rcd.t.a) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3333.33 root partition:p4,p5,p6 data:Selection_6 +└─Selection_6 3333.33 cop[tikv] lt(2014-10-24 00:00:00.000000, rcd.t.a) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where '2003-03-30' > a; id estRows task access object operator info -Projection_5 3323.33 root rcd.t.a -└─UnionScan_6 3323.33 root gt(2003-03-30 00:00:00.000000, rcd.t.a) - └─TableReader_9 3323.33 root partition:p0,p1,p2 data:Selection_8 - └─Selection_8 3323.33 cop[tikv] gt(2003-03-30 00:00:00.000000, rcd.t.a) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 3323.33 root partition:p0,p1,p2 data:Selection_6 +└─Selection_6 3323.33 cop[tikv] gt(2003-03-30 00:00:00.000000, rcd.t.a) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain select * from t where a between '2003-03-30' AND '2014-01-01'; id estRows task access object operator info -Projection_5 250.00 root rcd.t.a -└─UnionScan_6 250.00 root ge(rcd.t.a, 2003-03-30 00:00:00.000000), le(rcd.t.a, 2014-01-01 00:00:00.000000) - └─TableReader_9 250.00 root partition:p2,p3,p4 data:Selection_8 - └─Selection_8 250.00 cop[tikv] ge(rcd.t.a, 2003-03-30 00:00:00.000000), le(rcd.t.a, 2014-01-01 00:00:00.000000) - └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader_7 250.00 root partition:p2,p3,p4 data:Selection_6 +└─Selection_6 250.00 cop[tikv] ge(rcd.t.a, 2003-03-30 00:00:00.000000), le(rcd.t.a, 2014-01-01 00:00:00.000000) + └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop database if exists rcd; create database rcd; use rcd; @@ -1288,11 +1225,9 @@ insert into t1 values ('a', NULL, 'd'); analyze table t1; explain format=brief select * from t1 where a = 'a' AND c = 'd'; id estRows task access object operator info -Projection 0.01 root rcd.t1.a, rcd.t1.b, rcd.t1.c -└─UnionScan 0.01 root eq(rcd.t1.a, "a"), eq(rcd.t1.c, "d") - └─TableReader 0.01 root partition:p0,p1 data:Selection - └─Selection 0.01 cop[tikv] eq(rcd.t1.a, "a"), eq(rcd.t1.c, "d") - └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 0.01 root partition:p0,p1 data:Selection +└─Selection 0.01 cop[tikv] eq(rcd.t1.a, "a"), eq(rcd.t1.c, "d") + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo select * from t1 where a = 'a' AND c = 'd'; a b c a NULL d @@ -1358,3 +1293,29 @@ insert into tlist values (1); Error 1142 (42000): INSERT command denied to user 'priv_test'@'%' for table 'tlist' use planner__core__integration_partition; set tidb_enable_list_partition = DEFAULT; +drop table if exists t; +create table t(id int) PARTITION BY HASH(id) partitions 5; +insert into t values(0),(0); +analyze table t; +explain select *,_tidb_rowid from t where _tidb_rowid=1; +id estRows task access object operator info +TableReader_6 10000.00 root partition:all data:TableRangeScan_5 +└─TableRangeScan_5 10000.00 cop[tikv] table:t range:[1,1], keep order:false, stats:pseudo +select *,_tidb_rowid from t where _tidb_rowid=1; +id _tidb_rowid +0 1 +explain select *,_tidb_rowid from t partition(p0) where _tidb_rowid=1; +id estRows task access object operator info +Point_Get_5 1.00 root table:t, partition:p0 handle:1 +select *,_tidb_rowid from t partition(p0) where _tidb_rowid=1; +id _tidb_rowid +0 1 +explain select *,_tidb_rowid from t partition(p1) where _tidb_rowid=1; +id estRows task access object operator info +Point_Get_5 1.00 root table:t, partition:p1 handle:1 +select *,_tidb_rowid from t partition(p1) where _tidb_rowid=1; +id _tidb_rowid +explain select *,_tidb_rowid from t partition(p0,p1) where _tidb_rowid=1; +id estRows task access object operator info +TableReader_6 10000.00 root partition:p0,p1 data:TableRangeScan_5 +└─TableRangeScan_5 10000.00 cop[tikv] table:t range:[1,1], keep order:false, stats:pseudo diff --git a/tests/integrationtest/t/planner/core/integration_partition.test b/tests/integrationtest/t/planner/core/integration_partition.test index 2429748af0a21..86561c463eada 100644 --- a/tests/integrationtest/t/planner/core/integration_partition.test +++ b/tests/integrationtest/t/planner/core/integration_partition.test @@ -541,6 +541,7 @@ select * from t2; select * from t2; drop table t2; drop database issue_27532; +set autocommit = DEFAULT; # TestIssue37508 @@ -869,3 +870,18 @@ disconnect conn1; use planner__core__integration_partition; set tidb_enable_list_partition = DEFAULT; + +# TestForbidPartitionTableGeneratePointGetPlanWithTidbRowid +drop table if exists t; +create table t(id int) PARTITION BY HASH(id) partitions 5; +insert into t values(0),(0); +analyze table t; +explain select *,_tidb_rowid from t where _tidb_rowid=1; +select *,_tidb_rowid from t where _tidb_rowid=1; +explain select *,_tidb_rowid from t partition(p0) where _tidb_rowid=1; +select *,_tidb_rowid from t partition(p0) where _tidb_rowid=1; +explain select *,_tidb_rowid from t partition(p1) where _tidb_rowid=1; +select *,_tidb_rowid from t partition(p1) where _tidb_rowid=1; +explain select *,_tidb_rowid from t partition(p0,p1) where _tidb_rowid=1; + +