code: func CompileExecutePreparedStmt(ctx sessionctx.Context, ID uint32, args ...interface{}) (sqlexec.Statement, error) {
  	execStmt := &ast.ExecuteStmt{ExecID: ID}
  	if err := ResetContextOfStmt(ctx, execStmt); err != nil {
  		return nil, err
  	}
  	execStmt.UsingVars = make([]ast.ExprNode, len(args))
  	for i, val := range args {
  		execStmt.UsingVars[i] = ast.NewValueExpr(val)
  	}
  	is := GetInfoSchema(ctx)
  	execPlan, err := planner.Optimize(ctx, execStmt, is)
  	if err != nil {
  		return nil, err
  	}
  
  	stmt := &ExecStmt{
  		InfoSchema: is,
  		Plan:       execPlan,
  		StmtNode:   execStmt,
  		Ctx:        ctx,
  	}
  	if prepared, ok := ctx.GetSessionVars().PreparedStmts[ID]; ok {
  		stmt.Text = prepared.Stmt.Text()
  		ctx.GetSessionVars().StmtCtx.OriginalSQL = stmt.Text
  	}
  	return stmt, nil
  }
docs: // CompileExecutePreparedStmt compiles a session Execute command to a stmt.Statement.