diff --git a/doc/releasenotes/12_0_1_release_notes.md b/doc/releasenotes/12_0_1_release_notes.md new file mode 100644 index 00000000000..b927539ec4a --- /dev/null +++ b/doc/releasenotes/12_0_1_release_notes.md @@ -0,0 +1,17 @@ +# Release of Vitess v12.0.1 + +## Major Changes + + +## Deprecations + +## Minor Changes + +### vtctl VExec + +The command `vtctl VExec` is restored after being deprecated in `v12.0.0`. + + +------------ +## Changelog + diff --git a/doc/releasenotes/12_0_1_summary.md b/doc/releasenotes/12_0_1_summary.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index f491f5053b9..bba50603ad5 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -766,6 +766,16 @@ var commands = []commandGroup{ }, }, }, + { + "Workflow", []command{ + { + name: "VExec", + method: commandVExec, + params: " --dry-run", + help: "Runs query on all tablets in workflow. Example: VExec merchant.morders \"update _vt.vreplication set Status='Running'\"", + }, + }, + }, { "Workflow", []command{ { @@ -3791,6 +3801,45 @@ func commandHelp(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.Flag return nil } +func commandVExec(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { + deprecationMessage := `VExec command will be deprecated in version v12. For Online DDL control, use "vtctl OnlineDDL" commands or SQL syntax` + log.Warningf(deprecationMessage) + + json := subFlags.Bool("json", false, "Output JSON instead of human-readable table") + dryRun := subFlags.Bool("dry_run", false, "Does a dry run of VExec and only reports the final query and list of tablets on which it will be applied") + if err := subFlags.Parse(args); err != nil { + return err + } + if subFlags.NArg() != 2 { + return fmt.Errorf("usage: VExec --dry-run keyspace.workflow \"\"") + } + keyspace, workflow, err := splitKeyspaceWorkflow(subFlags.Arg(0)) + if err != nil { + return err + } + _, err = wr.TopoServer().GetKeyspace(ctx, keyspace) + if err != nil { + wr.Logger().Errorf("keyspace %s not found", keyspace) + } + query := subFlags.Arg(1) + + qr, err := wr.VExecResult(ctx, workflow, keyspace, query, *dryRun) + if err != nil { + return err + } + if *dryRun { + return nil + } + if qr == nil { + wr.Logger().Printf("no result returned\n") + } + if *json { + return printJSON(wr.Logger(), qr) + } + printQueryResult(loggerWriter{wr.Logger()}, qr) + return nil +} + func commandWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { dryRun := subFlags.Bool("dry_run", false, "Does a dry run of Workflow and only reports the final query and list of tablets on which the operation will be applied") if err := subFlags.Parse(args); err != nil {