Skip to content

Commit 2ba2a9e

Browse files
authored
planner: Manual revert of pingcap#24282 (pingcap#35298)
ref pingcap#22079, closes pingcap#33966, close pingcap#35181
1 parent f8a00f3 commit 2ba2a9e

File tree

4 files changed

+37
-42
lines changed

4 files changed

+37
-42
lines changed

executor/partition_table_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3600,3 +3600,18 @@ func TestPartitionTableExplain(t *testing.T) {
36003600
" └─Selection 1.00 cop[tikv] not(isnull(testpartitiontableexplain.t.b))",
36013601
" └─TableRangeScan 1.00 cop[tikv] table:t range:[1,1], keep order:false"))
36023602
}
3603+
3604+
func TestIssue35181(t *testing.T) {
3605+
store, clean := testkit.CreateMockStore(t)
3606+
defer clean()
3607+
3608+
tk := testkit.NewTestKit(t, store)
3609+
tk.MustExec("create database TestIssue35181")
3610+
tk.MustExec("use TestIssue35181")
3611+
tk.MustExec("CREATE TABLE `t` (`a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL) PARTITION BY RANGE (`a`) (PARTITION `p0` VALUES LESS THAN (2021), PARTITION `p1` VALUES LESS THAN (3000))")
3612+
3613+
tk.MustExec("set @@tidb_partition_prune_mode = 'static'")
3614+
tk.MustExec(`insert into t select * from t where a=3000`)
3615+
tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'")
3616+
tk.MustExec(`insert into t select * from t where a=3000`)
3617+
}

planner/core/partition_prune.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func PartitionPruning(ctx sessionctx.Context, tbl table.PartitionedTable, conds
3333
case model.PartitionTypeHash:
3434
return s.pruneHashPartition(ctx, tbl, partitionNames, conds, columns, names)
3535
case model.PartitionTypeRange:
36-
rangeOr, _, err := s.pruneRangePartition(ctx, pi, tbl, conds, columns, names, nil)
36+
rangeOr, err := s.pruneRangePartition(ctx, pi, tbl, conds, columns, names)
3737
if err != nil {
3838
return nil, err
3939
}

planner/core/rule_partition_processor.go

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -825,26 +825,26 @@ func intersectionRange(start, end, newStart, newEnd int) (int, int) {
825825
}
826826

827827
func (s *partitionProcessor) pruneRangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, tbl table.PartitionedTable, conds []expression.Expression,
828-
columns []*expression.Column, names types.NameSlice, condsToBePruned *[]expression.Expression) (partitionRangeOR, []expression.Expression, error) {
828+
columns []*expression.Column, names types.NameSlice) (partitionRangeOR, error) {
829829
partExpr, err := tbl.(partitionTable).PartitionExpr()
830830
if err != nil {
831-
return nil, nil, err
831+
return nil, err
832832
}
833833

834834
// Partition by range columns.
835835
if len(pi.Columns) > 0 {
836836
result, err := s.pruneRangeColumnsPartition(ctx, conds, pi, partExpr, columns, names)
837-
return result, nil, err
837+
return result, err
838838
}
839839

840840
// Partition by range.
841841
col, fn, mono, err := makePartitionByFnCol(ctx, columns, names, pi.Expr)
842842
if err != nil {
843-
return nil, nil, err
843+
return nil, err
844844
}
845845
result := fullRange(len(pi.Definitions))
846846
if col == nil {
847-
return result, nil, nil
847+
return result, nil
848848
}
849849

850850
// Extract the partition column, if the column is not null, it's possible to prune.
@@ -859,41 +859,14 @@ func (s *partitionProcessor) pruneRangePartition(ctx sessionctx.Context, pi *mod
859859
}
860860
result = partitionRangeForCNFExpr(ctx, conds, &pruner, result)
861861

862-
if condsToBePruned == nil {
863-
return result, nil, nil
864-
}
865-
// remove useless predicates after pruning
866-
newConds := make([]expression.Expression, 0, len(*condsToBePruned))
867-
for _, cond := range *condsToBePruned {
868-
if dataForPrune, ok := pruner.extractDataForPrune(ctx, cond); ok {
869-
switch dataForPrune.op {
870-
case ast.EQ:
871-
unsigned := mysql.HasUnsignedFlag(pruner.col.RetType.GetFlag())
872-
start, _ := pruneUseBinarySearch(pruner.lessThan, dataForPrune, unsigned)
873-
// if the type of partition key is Int
874-
if pk, ok := partExpr.Expr.(*expression.Column); ok && pk.RetType.EvalType() == types.ETInt {
875-
// see if can be removed
876-
// see issue #22079: https://github.com/pingcap/tidb/issues/22079 for details
877-
if start > 0 && pruner.lessThan.data[start-1] == dataForPrune.c && (pruner.lessThan.data[start]-1) == dataForPrune.c {
878-
continue
879-
}
880-
}
881-
}
882-
}
883-
newConds = append(newConds, cond)
884-
}
885-
886-
return result, newConds, nil
862+
return result, nil
887863
}
888864

889865
func (s *partitionProcessor) processRangePartition(ds *DataSource, pi *model.PartitionInfo, opt *logicalOptimizeOp) (LogicalPlan, error) {
890-
used, prunedConds, err := s.pruneRangePartition(ds.ctx, pi, ds.table.(table.PartitionedTable), ds.allConds, ds.TblCols, ds.names, &ds.pushedDownConds)
866+
used, err := s.pruneRangePartition(ds.ctx, pi, ds.table.(table.PartitionedTable), ds.allConds, ds.TblCols, ds.names)
891867
if err != nil {
892868
return nil, err
893869
}
894-
if prunedConds != nil {
895-
ds.pushedDownConds = prunedConds
896-
}
897870
return s.makeUnionAllChildren(ds, pi, used, opt)
898871
}
899872

@@ -1280,11 +1253,13 @@ func relaxOP(op string) string {
12801253
return op
12811254
}
12821255

1256+
// pruneUseBinarySearch returns the start and end of which partitions will match.
1257+
// If no match (i.e. value > last partition) the start partition will be the number of partition, not the first partition!
12831258
func pruneUseBinarySearch(lessThan lessThanDataInt, data dataForPrune, unsigned bool) (start int, end int) {
12841259
length := lessThan.length()
12851260
switch data.op {
12861261
case ast.EQ:
1287-
// col = 66, lessThan = [4 7 11 14 17] => [5, 6)
1262+
// col = 66, lessThan = [4 7 11 14 17] => [5, 5)
12881263
// col = 14, lessThan = [4 7 11 14 17] => [4, 5)
12891264
// col = 10, lessThan = [4 7 11 14 17] => [2, 3)
12901265
// col = 3, lessThan = [4 7 11 14 17] => [0, 1)
@@ -1590,6 +1565,8 @@ func (p *rangeColumnsPruner) partitionRangeForExpr(sctx sessionctx.Context, expr
15901565
return start, end, true
15911566
}
15921567

1568+
// pruneUseBinarySearch returns the start and end of which partitions will match.
1569+
// If no match (i.e. value > last partition) the start partition will be the number of partition, not the first partition!
15931570
func (p *rangeColumnsPruner) pruneUseBinarySearch(sctx sessionctx.Context, op string, data *expression.Constant) (start int, end int) {
15941571
var err error
15951572
var isNull bool

planner/core/testdata/partition_pruner_out.json

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2843,15 +2843,17 @@
28432843
{
28442844
"SQL": "explain format = 'brief' select * from t where a = 1",
28452845
"Result": [
2846-
"TableReader 10000.00 root data:TableFullScan",
2847-
"└─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo"
2846+
"TableReader 10.00 root data:Selection",
2847+
"└─Selection 10.00 cop[tikv] eq(test_partition.t.a, 1)",
2848+
" └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo"
28482849
]
28492850
},
28502851
{
28512852
"SQL": "explain format = 'brief' select * from t where a = 2",
28522853
"Result": [
2853-
"TableReader 10000.00 root data:TableFullScan",
2854-
"└─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo"
2854+
"TableReader 10.00 root data:Selection",
2855+
"└─Selection 10.00 cop[tikv] eq(test_partition.t.a, 2)",
2856+
" └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo"
28552857
]
28562858
},
28572859
{
@@ -2899,8 +2901,9 @@
28992901
{
29002902
"SQL": "explain format = 'brief' select * from t where a in (2)",
29012903
"Result": [
2902-
"TableReader 10000.00 root data:TableFullScan",
2903-
"└─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo"
2904+
"TableReader 10.00 root data:Selection",
2905+
"└─Selection 10.00 cop[tikv] eq(test_partition.t.a, 2)",
2906+
" └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo"
29042907
]
29052908
}
29062909
]

0 commit comments

Comments
 (0)