code: func (e *IndexLookUpExecutor) Close() error {
  	if !e.workerStarted || e.finished == nil {
  		return nil
  	}
  
  	close(e.finished)
  	// Drain the resultCh and discard the result, in case that Next() doesn't fully
  	// consume the data, background worker still writing to resultCh and block forever.
  	for range e.resultCh {
  	}
  	e.idxWorkerWg.Wait()
  	e.tblWorkerWg.Wait()
  	e.finished = nil
  	e.workerStarted = false
  	e.memTracker.Detach()
  	e.memTracker = nil
  	if e.runtimeStats != nil {
  		copStats := e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.GetRootStats(e.idxPlans[0].ExplainID().String())
  		copStats.SetRowNum(e.feedback.Actual())
  	}
  	return nil
  }
docs: // Close implements Exec Close interface.