code: func (e *SelectionExec) Next(ctx context.Context, req *chunk.RecordBatch) error {
  	if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil {
  		span1 := span.Tracer().StartSpan("selection.Next", opentracing.ChildOf(span.Context()))
  		defer span1.Finish()
  	}
  	if e.runtimeStats != nil {
  		start := time.Now()
  		defer func() { e.runtimeStats.Record(time.Since(start), req.NumRows()) }()
  	}
  	req.GrowAndReset(e.maxChunkSize)
  
  	if !e.batched {
  		return e.unBatchedNext(ctx, req.Chunk)
  	}
  
  	for {
  		for ; e.inputRow != e.inputIter.End(); e.inputRow = e.inputIter.Next() {
  			if !e.selected[e.inputRow.Idx()] {
  				continue
  			}
  			if req.IsFull() {
  				return nil
  			}
  			req.AppendRow(e.inputRow)
  		}
  		err := e.children[0].Next(ctx, chunk.NewRecordBatch(e.childResult))
  		if err != nil {
  			return err
  		}
  		// no more data.
  		if e.childResult.NumRows() == 0 {
  			return nil
  		}
  		e.selected, err = expression.VectorizedFilter(e.ctx, e.filters, e.inputIter, e.selected)
  		if err != nil {
  			return err
  		}
  		e.inputRow = e.inputIter.Begin()
  	}
  }
docs: // Next implements the Executor Next interface.