code: func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) *TableReaderExecutor {
  	ret, err := buildNoRangeTableReader(b, v)
  	if err != nil {
  		b.err = err
  		return nil
  	}
  
  	ts := v.TablePlans[0].(*plannercore.PhysicalTableScan)
  	ret.ranges = ts.Ranges
  	sctx := b.ctx.GetSessionVars().StmtCtx
  	sctx.TableIDs = append(sctx.TableIDs, ts.Table.ID)
  	return ret
  }
docs: // buildTableReader builds a table reader executor. It first build a no range table reader,
  // and then update it ranges from table scan plan.