code: func (e *HashJoinExec) Close() error {
  	close(e.closeCh)
  	e.finished.Store(true)
  	if e.prepared {
  		if e.innerFinished != nil {
  			for range e.innerFinished {
  			}
  		}
  		if e.joinResultCh != nil {
  			for range e.joinResultCh {
  			}
  		}
  		if e.outerChkResourceCh != nil {
  			close(e.outerChkResourceCh)
  			for range e.outerChkResourceCh {
  			}
  		}
  		for i := range e.outerResultChs {
  			for range e.outerResultChs[i] {
  			}
  		}
  		for i := range e.joinChkResourceCh {
  			close(e.joinChkResourceCh[i])
  			for range e.joinChkResourceCh[i] {
  			}
  		}
  		e.outerChkResourceCh = nil
  		e.joinChkResourceCh = nil
  	}
  	e.memTracker.Detach()
  	e.memTracker = nil
  
  	err := e.baseExecutor.Close()
  	return err
  }
docs: // Close implements the Executor Close interface.