code: func (e *SetExecutor) Next(ctx context.Context, req *chunk.RecordBatch) error {
  	req.Reset()
  	if e.done {
  		return nil
  	}
  	e.done = true
  	sessionVars := e.ctx.GetSessionVars()
  	for _, v := range e.vars {
  		// Variable is case insensitive, we use lower case.
  		if v.Name == ast.SetNames {
  			// This is set charset stmt.
  			dt, err := v.Expr.(*expression.Constant).Eval(chunk.Row{})
  			if err != nil {
  				return err
  			}
  			cs := dt.GetString()
  			var co string
  			if v.ExtendValue != nil {
  				co = v.ExtendValue.Value.GetString()
  			}
  			err = e.setCharset(cs, co)
  			if err != nil {
  				return err
  			}
  			continue
  		}
  		name := strings.ToLower(v.Name)
  		if !v.IsSystem {
  			// Set user variable.
  			value, err := v.Expr.Eval(chunk.Row{})
  			if err != nil {
  				return err
  			}
  
  			if value.IsNull() {
  				delete(sessionVars.Users, name)
  			} else {
  				svalue, err1 := value.ToString()
  				if err1 != nil {
  					return err1
  				}
  				sessionVars.Users[name] = fmt.Sprintf("%v", svalue)
  			}
  			continue
  		}
  
  		syns := e.getSynonyms(name)
  		// Set system variable
  		for _, n := range syns {
  			err := e.setSysVariable(n, v)
  			if err != nil {
  				return err
  			}
  		}
  	}
  	return nil
  }
docs: // Next implements the Executor Next interface.