code: func (e *UnionExec) Next(ctx context.Context, req *chunk.RecordBatch) error {
  	if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil {
  		span1 := span.Tracer().StartSpan("union.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.initialized {
  		e.initialize(ctx)
  		e.initialized = true
  	}
  	result, ok := <-e.resultPool
  	if !ok {
  		return nil
  	}
  	if result.err != nil {
  		return errors.Trace(result.err)
  	}
  
  	req.SwapColumns(result.chk)
  	result.src <- result.chk
  	return nil
  }
docs: // Next implements the Executor Next interface.