code: func (r *streamResult) readDataFromResponse(ctx context.Context, resp kv.Response, result *tipb.Chunk) (bool, error) {
  	resultSubset, err := resp.Next(ctx)
  	if err != nil {
  		return false, err
  	}
  	if resultSubset == nil {
  		return true, nil
  	}
  
  	var stream tipb.StreamResponse
  	err = stream.Unmarshal(resultSubset.GetData())
  	if err != nil {
  		return false, errors.Trace(err)
  	}
  	if stream.Error != nil {
  		return false, errors.Errorf("stream response error: [%d]%s\n", stream.Error.Code, stream.Error.Msg)
  	}
  	for _, warning := range stream.Warnings {
  		r.ctx.GetSessionVars().StmtCtx.AppendWarning(terror.ClassTiKV.New(terror.ErrCode(warning.Code), warning.Msg))
  	}
  
  	err = result.Unmarshal(stream.Data)
  	if err != nil {
  		return false, errors.Trace(err)
  	}
  	r.feedback.Update(resultSubset.GetStartKey(), stream.OutputCounts)
  	r.partialCount++
  	return false, nil
  }
docs: // readDataFromResponse read the data to result. Returns true means the resp is finished.