From 998c5f1b8718c553df9110331a824aef22b5b94b Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Mon, 13 Mar 2023 17:56:59 +0800 Subject: [PATCH 1/3] executor: fix the wrong output when the whole data of partition table falls in one region --- executor/builder.go | 2 +- executor/distsql.go | 19 ++++++++++++------- executor/partition_table_test.go | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/executor/builder.go b/executor/builder.go index ab0ad87efc891..c97a5812cc332 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -4388,7 +4388,7 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte if err != nil { return nil, err } - err = e.open(ctx, kvRanges) + err = e.open(ctx, kv.NewNonParitionedKeyRanges(kvRanges)) return e, err } diff --git a/executor/distsql.go b/executor/distsql.go index 3d7d54bf6824c..ac531a452fb8f 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -270,8 +270,9 @@ func (e *IndexReaderExecutor) Open(ctx context.Context) error { } sc := e.ctx.GetSessionVars().StmtCtx - var kvRanges []kv.KeyRange + var kvRanges *kv.KeyRanges if len(e.partitions) > 0 { + keyRanges := make([][]kv.KeyRange, 0, len(e.partitions)) for _, p := range e.partitions { partRange := e.ranges if pRange, ok := e.partRangeMap[p.GetPhysicalID()]; ok { @@ -281,10 +282,15 @@ func (e *IndexReaderExecutor) Open(ctx context.Context) error { if err != nil { return err } - kvRanges = append(kvRanges, kvRange...) + keyRanges = append(keyRanges, kvRange) + e.kvRanges = append(e.kvRanges, kvRange...) } + kvRanges = kv.NewPartitionedKeyRanges(keyRanges) } else { - kvRanges, err = e.buildKeyRanges(sc, e.ranges, e.physicalTableID) + var keyRanges []kv.KeyRange + keyRanges, err = e.buildKeyRanges(sc, e.ranges, e.physicalTableID) + kvRanges = kv.NewNonParitionedKeyRanges(keyRanges) + e.kvRanges = keyRanges } if err != nil { return err @@ -293,7 +299,7 @@ func (e *IndexReaderExecutor) Open(ctx context.Context) error { return e.open(ctx, kvRanges) } -func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges []kv.KeyRange) error { +func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges *kv.KeyRanges) error { var err error if e.corColInFilter { e.dagPB.Executors, err = constructDistExec(e.ctx, e.plans) @@ -306,7 +312,6 @@ func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges []kv.KeyRange) collExec := true e.dagPB.CollectExecutionSummaries = &collExec } - e.kvRanges = kvRanges // Treat temporary table as dummy table, avoid sending distsql request to TiKV. // In a test case IndexReaderExecutor is mocked and e.table is nil. // Avoid sending distsql request to TIKV. @@ -320,11 +325,11 @@ func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges []kv.KeyRange) e.memTracker = memory.NewTracker(e.id, -1) } e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) - slices.SortFunc(kvRanges, func(i, j kv.KeyRange) bool { + kvRanges.SortByFunc(func(i, j kv.KeyRange) bool { return bytes.Compare(i.StartKey, j.StartKey) < 0 }) var builder distsql.RequestBuilder - builder.SetKeyRanges(kvRanges). + builder.SetWrappedKeyRanges(kvRanges). SetDAGRequest(e.dagPB). SetStartTS(e.startTS). SetDesc(e.desc). diff --git a/executor/partition_table_test.go b/executor/partition_table_test.go index 79e710d7e2e5b..6c661cde3cd61 100644 --- a/executor/partition_table_test.go +++ b/executor/partition_table_test.go @@ -614,7 +614,7 @@ func TestOrderByandLimit(t *testing.T) { x := rand.Intn(1099) y := rand.Intn(2000) + 1 queryRangePartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from trange use index(idx_a) where a > %v order by a limit %v;", x, y) - queryHashPartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from trange use index(idx_a) where a > %v order by a limit %v;", x, y) + queryHashPartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from thash use index(idx_a) where a > %v order by a limit %v;", x, y) queryRegular := fmt.Sprintf("select a from tregular use index(idx_a) where a > %v order by a limit %v;", x, y) require.True(t, tk.HasPlan(queryRangePartition, "IndexReader")) // check if indexReader is used require.True(t, tk.HasPlan(queryHashPartition, "IndexReader")) From 4f48c81365268adcbe5771ec4748e7f2cddf47bd Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Wed, 12 Apr 2023 01:27:52 +0800 Subject: [PATCH 2/3] patch a fix --- executor/builder.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/executor/builder.go b/executor/builder.go index c97a5812cc332..2c40aa69b3952 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -4384,11 +4384,11 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte } tbInfo := e.table.Meta() if tbInfo.GetPartitionInfo() == nil || !builder.ctx.GetSessionVars().StmtCtx.UseDynamicPartitionPrune() { - kvRanges, err := buildKvRangesForIndexJoin(e.ctx, e.physicalTableID, e.index.ID, lookUpContents, indexRanges, keyOff2IdxOff, cwc, memoryTracker, interruptSignal) + e.ranges, err = buildRangesForIndexJoin(e.ctx, lookUpContents, indexRanges, keyOff2IdxOff, cwc) if err != nil { return nil, err } - err = e.open(ctx, kv.NewNonParitionedKeyRanges(kvRanges)) + err = e.Open(ctx) return e, err } From 7177845204ccd8481c8ae0b2e1952f8aa6edfbef Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Wed, 12 Apr 2023 02:06:34 +0800 Subject: [PATCH 3/3] another way to fix --- executor/builder.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/executor/builder.go b/executor/builder.go index 2c40aa69b3952..48d8d9b87cf0c 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -4384,11 +4384,12 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte } tbInfo := e.table.Meta() if tbInfo.GetPartitionInfo() == nil || !builder.ctx.GetSessionVars().StmtCtx.UseDynamicPartitionPrune() { - e.ranges, err = buildRangesForIndexJoin(e.ctx, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + kvRanges, err := buildKvRangesForIndexJoin(e.ctx, e.physicalTableID, e.index.ID, lookUpContents, indexRanges, keyOff2IdxOff, cwc, memoryTracker, interruptSignal) if err != nil { return nil, err } - err = e.Open(ctx) + e.kvRanges = kvRanges + err = e.open(ctx, kv.NewNonParitionedKeyRanges(kvRanges)) return e, err }