code: func (e *NestedLoopApplyExec) Next(ctx context.Context, req *chunk.RecordBatch) (err error) {
  	if e.runtimeStats != nil {
  		start := time.Now()
  		defer func() { e.runtimeStats.Record(time.Since(start), req.NumRows()) }()
  	}
  	req.Reset()
  	for {
  		if e.innerIter == nil || e.innerIter.Current() == e.innerIter.End() {
  			if e.outerRow != nil && !e.hasMatch {
  				e.joiner.onMissMatch(e.hasNull, *e.outerRow, req.Chunk)
  			}
  			e.outerRow, err = e.fetchSelectedOuterRow(ctx, req.Chunk)
  			if e.outerRow == nil || err != nil {
  				return err
  			}
  			e.hasMatch = false
  			e.hasNull = false
  
  			for _, col := range e.outerSchema {
  				*col.Data = e.outerRow.GetDatum(col.Index, col.RetType)
  			}
  			err = e.fetchAllInners(ctx)
  			if err != nil {
  				return err
  			}
  			e.innerIter = chunk.NewIterator4List(e.innerList)
  			e.innerIter.Begin()
  		}
  
  		matched, isNull, err := e.joiner.tryToMatch(*e.outerRow, e.innerIter, req.Chunk)
  		e.hasMatch = e.hasMatch || matched
  		e.hasNull = e.hasNull || isNull
  
  		if err != nil || req.IsFull() {
  			return err
  		}
  	}
  }
docs: // Next implements the Executor interface.