code: func (e *TableReaderExecutor) buildResp(ctx context.Context, ranges []*ranger.Range) (distsql.SelectResult, error) {
  	var builder distsql.RequestBuilder
  	kvReq, err := builder.SetTableRanges(getPhysicalTableID(e.table), ranges, e.feedback).
  		SetDAGRequest(e.dagPB).
  		SetDesc(e.desc).
  		SetKeepOrder(e.keepOrder).
  		SetStreaming(e.streaming).
  		SetFromSessionVars(e.ctx.GetSessionVars()).
  		SetMemTracker(e.ctx, tableReaderDistSQLTrackerLabel).
  		Build()
  	if err != nil {
  		return nil, err
  	}
  	result, err := e.SelectResult(ctx, e.ctx, kvReq, e.retTypes(), e.feedback, getPhysicalPlanIDs(e.plans))
  	if err != nil {
  		return nil, err
  	}
  	result.Fetch(ctx)
  	return result, nil
  }
docs: // buildResp first builds request and sends it to tikv using distsql.Select. It uses SelectResut returned by the callee
  // to fetch all results.