@@ -352,7 +352,11 @@ type selectResult struct {
352
352
iter * selectResultIter
353
353
}
354
354
355
- func (r * selectResult ) fetchResp (ctx context.Context , intermediateOutputTypes [][]* types.FieldType ) error {
355
+ func (r * selectResult ) fetchResp (ctx context.Context ) error {
356
+ return r .fetchRespWithIntermediateResults (ctx , nil )
357
+ }
358
+
359
+ func (r * selectResult ) fetchRespWithIntermediateResults (ctx context.Context , intermediateOutputTypes [][]* types.FieldType ) error {
356
360
defer func () {
357
361
if r .stats != nil {
358
362
// Ignore internal sql.
@@ -474,7 +478,7 @@ func (r *selectResult) Next(ctx context.Context, chk *chunk.Chunk) error {
474
478
475
479
chk .Reset ()
476
480
if r .selectResp == nil || r .respChkIdx == len (r .selectResp .Chunks ) {
477
- err := r .fetchResp (ctx , nil )
481
+ err := r .fetchResp (ctx )
478
482
if err != nil {
479
483
return err
480
484
}
@@ -526,7 +530,7 @@ func (r *selectResult) NextRaw(ctx context.Context) (data []byte, err error) {
526
530
func (r * selectResult ) readFromDefault (ctx context.Context , chk * chunk.Chunk ) error {
527
531
for ! chk .IsFull () {
528
532
if r .respChkIdx == len (r .selectResp .Chunks ) {
529
- err := r .fetchResp (ctx , nil )
533
+ err := r .fetchResp (ctx )
530
534
if err != nil || r .selectResp == nil {
531
535
return err
532
536
}
@@ -552,7 +556,7 @@ func (r *selectResult) readFromChunk(ctx context.Context, chk *chunk.Chunk) erro
552
556
553
557
for ! chk .IsFull () {
554
558
if r .respChkIdx == len (r .selectResp .Chunks ) {
555
- err := r .fetchResp (ctx , nil )
559
+ err := r .fetchResp (ctx )
556
560
if err != nil || r .selectResp == nil {
557
561
return err
558
562
}
@@ -909,7 +913,7 @@ func newSelectResultIter(result *selectResult, intermediateOutputTypes [][]*type
909
913
func (iter * selectResultIter ) Next (ctx context.Context ) (SelectResultRow , error ) {
910
914
for {
911
915
if r := iter .result ; r .selectResp == nil {
912
- if err := r .fetchResp (ctx , iter .intermediateOutputTypes ); err != nil {
916
+ if err := r .fetchRespWithIntermediateResults (ctx , iter .intermediateOutputTypes ); err != nil {
913
917
return SelectResultRow {}, err
914
918
}
915
919
@@ -931,6 +935,9 @@ func (iter *selectResultIter) Next(ctx context.Context) (SelectResultRow, error)
931
935
}
932
936
933
937
for len (iter .channels ) > 0 {
938
+ // here we read the channel in reverse order to make sure the "more complete" data should be read first.
939
+ // For example, if a cop-request contains IndexLookUp, we should read the final rows first (with the biggest channel index),
940
+ // and then read the index rows (with smaller channel index) that have not been looked up.
934
941
lastPos := len (iter .channels ) - 1
935
942
channel := iter .channels [lastPos ]
936
943
row , err := channel .Next ()
0 commit comments