code: func (a *Statement) Exec(ctx context.Context) (*flow.Dataset, error) {
  	a.startTime = time.Now()
  
  	b := newExecutorBuilder(ctx, a.InfoSchema)
  
  	exe := b.build(a.Plan)
  	if b.err != nil {
  		return nil, errors.Trace(b.err)
  	}
  
  	if exe == nil {
  		return nil, fmt.Errorf("Failed to build execution plan %v", plan.ToString(a.Plan))
  	}
  
  	return exe.Exec(), nil
  }
docs: // Exec implements the ast.Statement Exec interface.
  // This function builds an Executor from a plan. If the Executor doesn't return result,
  // like the INSERT, UPDATE statements, it executes in this function, if the Executor returns
  // result, execution is done after this function returns, in the returned ast.RecordSet Next method.