diff --git a/go/libraries/doltcore/env/actions/errors.go b/go/libraries/doltcore/env/actions/errors.go index fde5fa0e66..ff308376b5 100644 --- a/go/libraries/doltcore/env/actions/errors.go +++ b/go/libraries/doltcore/env/actions/errors.go @@ -25,8 +25,8 @@ type tblErrorType string const ( tblErrInvalid tblErrorType = "invalid" tblErrTypeNotExist tblErrorType = "do not exist" - tblErrTypeInConflict tblErrorType = "in conflict" - tblErrTypeConstViols tblErrorType = "has constraint violations" + tblErrTypeInConflict tblErrorType = "are in conflict" + tblErrTypeConstViols tblErrorType = "have constraint violations" ) type TblError struct { diff --git a/go/libraries/doltcore/sqle/dfunctions/dolt_merge.go b/go/libraries/doltcore/sqle/dfunctions/dolt_merge.go index 497bdf7bf7..240a2ce8c6 100644 --- a/go/libraries/doltcore/sqle/dfunctions/dolt_merge.go +++ b/go/libraries/doltcore/sqle/dfunctions/dolt_merge.go @@ -47,8 +47,13 @@ type DoltMergeFunc struct { const DoltMergeWarningCode int = 1105 // Since this our own custom warning we'll use 1105, the code for an unknown error const ( - hasConflictsOrViolations int = 0 - noConflictsOrViolations int = 1 + noConflictsOrViolations int = 0 + hasConflictsOrViolations int = 1 +) + +const ( + threeWayMerge = 0 + fastForwardMerge = 1 ) func (d DoltMergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { @@ -56,92 +61,96 @@ func (d DoltMergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) if err != nil { return noConflictsOrViolations, err } - return DoDoltMerge(ctx, args) + hasConflicts, _, err := DoDoltMerge(ctx, args) + return hasConflicts, err } -func DoDoltMerge(ctx *sql.Context, args []string) (int, error) { +// DoDoltMerge returns has_conflicts and fast_forward status +func DoDoltMerge(ctx *sql.Context, args []string) (int, int, error) { dbName := ctx.GetCurrentDatabase() if len(dbName) == 0 { - return noConflictsOrViolations, fmt.Errorf("Empty database name.") + return noConflictsOrViolations, threeWayMerge, fmt.Errorf("Empty database name.") } sess := dsess.DSessFromSess(ctx.Session) apr, err := cli.CreateMergeArgParser().Parse(args) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } if apr.ContainsAll(cli.SquashParam, cli.NoFFParam) { - return noConflictsOrViolations, fmt.Errorf("error: Flags '--%s' and '--%s' cannot be used together.\n", cli.SquashParam, cli.NoFFParam) + return noConflictsOrViolations, threeWayMerge, fmt.Errorf("error: Flags '--%s' and '--%s' cannot be used together.\n", cli.SquashParam, cli.NoFFParam) } ws, err := sess.WorkingSet(ctx, dbName) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } roots, ok := sess.GetRoots(ctx, dbName) if !ok { - return noConflictsOrViolations, sql.ErrDatabaseNotFound.New(dbName) + return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName) } if apr.Contains(cli.AbortParam) { if !ws.MergeActive() { - return noConflictsOrViolations, fmt.Errorf("fatal: There is no merge to abort") + return noConflictsOrViolations, threeWayMerge, fmt.Errorf("fatal: There is no merge to abort") } ws, err = abortMerge(ctx, ws, roots) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } err := sess.SetWorkingSet(ctx, dbName, ws) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } err = sess.CommitWorkingSet(ctx, dbName, sess.GetTransaction()) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } - return noConflictsOrViolations, nil + return noConflictsOrViolations, threeWayMerge, nil } branchName := apr.Arg(0) mergeSpec, err := createMergeSpec(ctx, sess, dbName, apr, branchName) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } - ws, conflicts, err := mergeIntoWorkingSet(ctx, sess, roots, ws, dbName, mergeSpec) + ws, conflicts, fastForward, err := mergeIntoWorkingSet(ctx, sess, roots, ws, dbName, mergeSpec) if err != nil { - return conflicts, err + return conflicts, fastForward, err } - return conflicts, nil + return conflicts, fastForward, nil } -// mergeIntoWorkingSet encapsulates server merge logic, switching between fast-forward, no fast-forward, merge commit, -// and merging into working set. Returns a new WorkingSet and whether there were merge conflicts. This currently -// persists merge commits in the database, but expects the caller to update the working set. +// mergeIntoWorkingSet encapsulates server merge logic, switching between +// fast-forward, no fast-forward, merge commit, and merging into working set. +// Returns a new WorkingSet, whether there were merge conflicts, and whether a +// fast-forward was performed. This currently persists merge commits in the +// database, but expects the caller to update the working set. // TODO FF merging commit with constraint violations requires `constraint verify` -func mergeIntoWorkingSet(ctx *sql.Context, sess *dsess.DoltSession, roots doltdb.Roots, ws *doltdb.WorkingSet, dbName string, spec *merge.MergeSpec) (*doltdb.WorkingSet, int, error) { +func mergeIntoWorkingSet(ctx *sql.Context, sess *dsess.DoltSession, roots doltdb.Roots, ws *doltdb.WorkingSet, dbName string, spec *merge.MergeSpec) (*doltdb.WorkingSet, int, int, error) { // todo: allow merges even when an existing merge is uncommitted if ws.MergeActive() { - return ws, noConflictsOrViolations, doltdb.ErrMergeActive + return ws, noConflictsOrViolations, threeWayMerge, doltdb.ErrMergeActive } err := checkForUncommittedChanges(ctx, roots.Working, roots.Head) if err != nil { - return ws, noConflictsOrViolations, err + return ws, noConflictsOrViolations, threeWayMerge, err } dbData, ok := sess.GetDbData(ctx, dbName) if !ok { - return ws, noConflictsOrViolations, fmt.Errorf("failed to get dbData") + return ws, noConflictsOrViolations, threeWayMerge, fmt.Errorf("failed to get dbData") } canFF, err := spec.HeadC.CanFastForwardTo(ctx, spec.MergeC) @@ -150,7 +159,7 @@ func mergeIntoWorkingSet(ctx *sql.Context, sess *dsess.DoltSession, roots doltdb case doltdb.ErrIsAhead, doltdb.ErrUpToDate: ctx.Warn(DoltMergeWarningCode, err.Error()) default: - return ws, noConflictsOrViolations, err + return ws, noConflictsOrViolations, threeWayMerge, err } } @@ -162,25 +171,25 @@ func mergeIntoWorkingSet(ctx *sql.Context, sess *dsess.DoltSession, roots doltdb // error message wsErr := sess.SetWorkingSet(ctx, dbName, ws) if wsErr != nil { - return ws, hasConflictsOrViolations, wsErr + return ws, hasConflictsOrViolations, threeWayMerge, wsErr } ctx.Warn(DoltMergeWarningCode, err.Error()) - return ws, hasConflictsOrViolations, nil + return ws, hasConflictsOrViolations, threeWayMerge, nil } - return ws, noConflictsOrViolations, err + return ws, noConflictsOrViolations, fastForwardMerge, err } ws, err = executeFFMerge(ctx, dbName, spec.Squash, ws, dbData, spec.MergeC) - return ws, noConflictsOrViolations, err + return ws, noConflictsOrViolations, fastForwardMerge, err } dbState, ok, err := sess.LookupDbState(ctx, dbName) if err != nil { - return ws, noConflictsOrViolations, err + return ws, noConflictsOrViolations, threeWayMerge, err } else if !ok { - return ws, noConflictsOrViolations, sql.ErrDatabaseNotFound.New(dbName) + return ws, noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName) } ws, err = executeMerge(ctx, spec.Squash, spec.HeadC, spec.MergeC, ws, dbState.EditOpts()) @@ -189,22 +198,22 @@ func mergeIntoWorkingSet(ctx *sql.Context, sess *dsess.DoltSession, roots doltdb // error message wsErr := sess.SetWorkingSet(ctx, dbName, ws) if wsErr != nil { - return ws, hasConflictsOrViolations, wsErr + return ws, hasConflictsOrViolations, threeWayMerge, wsErr } ctx.Warn(DoltMergeWarningCode, err.Error()) - return ws, hasConflictsOrViolations, nil + return ws, hasConflictsOrViolations, threeWayMerge, nil } else if err != nil { - return ws, noConflictsOrViolations, err + return ws, noConflictsOrViolations, threeWayMerge, err } err = sess.SetWorkingSet(ctx, dbName, ws) if err != nil { - return ws, noConflictsOrViolations, err + return ws, noConflictsOrViolations, threeWayMerge, err } - return ws, noConflictsOrViolations, nil + return ws, noConflictsOrViolations, threeWayMerge, nil } func abortMerge(ctx *sql.Context, workingSet *doltdb.WorkingSet, roots doltdb.Roots) (*doltdb.WorkingSet, error) { diff --git a/go/libraries/doltcore/sqle/dfunctions/dolt_pull.go b/go/libraries/doltcore/sqle/dfunctions/dolt_pull.go index c1c9e30a9e..11be3a55da 100644 --- a/go/libraries/doltcore/sqle/dfunctions/dolt_pull.go +++ b/go/libraries/doltcore/sqle/dfunctions/dolt_pull.go @@ -68,29 +68,31 @@ func (d DoltPullFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return noConflictsOrViolations, err } - return DoDoltPull(ctx, args) + conflicts, _, err := DoDoltPull(ctx, args) + return conflicts, err } -func DoDoltPull(ctx *sql.Context, args []string) (int, error) { +// DoDoltPull returns conflicts, fast_forward statuses +func DoDoltPull(ctx *sql.Context, args []string) (int, int, error) { dbName := ctx.GetCurrentDatabase() if len(dbName) == 0 { - return noConflictsOrViolations, fmt.Errorf("empty database name.") + return noConflictsOrViolations, threeWayMerge, fmt.Errorf("empty database name.") } sess := dsess.DSessFromSess(ctx.Session) dbData, ok := sess.GetDbData(ctx, dbName) if !ok { - return noConflictsOrViolations, sql.ErrDatabaseNotFound.New(dbName) + return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName) } apr, err := cli.CreatePullArgParser().Parse(args) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } if apr.NArg() > 1 { - return noConflictsOrViolations, actions.ErrInvalidPullArgs + return noConflictsOrViolations, threeWayMerge, actions.ErrInvalidPullArgs } var remoteName string @@ -100,20 +102,21 @@ func DoDoltPull(ctx *sql.Context, args []string) (int, error) { pullSpec, err := env.NewPullSpec(ctx, dbData.Rsr, remoteName, apr.Contains(cli.SquashParam), apr.Contains(cli.NoFFParam), apr.Contains(cli.ForceFlag)) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } srcDB, err := pullSpec.Remote.GetRemoteDBWithoutCaching(ctx, dbData.Ddb.ValueReadWriter().Format()) if err != nil { - return noConflictsOrViolations, fmt.Errorf("failed to get remote db; %w", err) + return noConflictsOrViolations, threeWayMerge, fmt.Errorf("failed to get remote db; %w", err) } ws, err := sess.WorkingSet(ctx, dbName) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } var conflicts int + var fastForward int for _, refSpec := range pullSpec.RefSpecs { remoteTrackRef := refSpec.DestRef(pullSpec.Branch) @@ -122,42 +125,42 @@ func DoDoltPull(ctx *sql.Context, args []string) (int, error) { // todo: can we pass nil for either of the channels? srcDBCommit, err := actions.FetchRemoteBranch(ctx, dbData.Rsw.TempTableFilesDir(), pullSpec.Remote, srcDB, dbData.Ddb, pullSpec.Branch, runProgFuncs, stopProgFuncs) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } // TODO: this could be replaced with a canFF check to test for error err = dbData.Ddb.FastForward(ctx, remoteTrackRef, srcDBCommit) if err != nil { - return noConflictsOrViolations, fmt.Errorf("fetch failed; %w", err) + return noConflictsOrViolations, threeWayMerge, fmt.Errorf("fetch failed; %w", err) } roots, ok := sess.GetRoots(ctx, dbName) if !ok { - return noConflictsOrViolations, sql.ErrDatabaseNotFound.New(dbName) + return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName) } mergeSpec, err := createMergeSpec(ctx, sess, dbName, apr, remoteTrackRef.String()) if err != nil { - return noConflictsOrViolations, err + return noConflictsOrViolations, threeWayMerge, err } - ws, conflicts, err = mergeIntoWorkingSet(ctx, sess, roots, ws, dbName, mergeSpec) + ws, conflicts, fastForward, err = mergeIntoWorkingSet(ctx, sess, roots, ws, dbName, mergeSpec) if err != nil && !errors.Is(doltdb.ErrUpToDate, err) { - return conflicts, err + return conflicts, fastForward, err } err = sess.SetWorkingSet(ctx, dbName, ws) if err != nil { - return conflicts, err + return conflicts, fastForward, err } } } err = actions.FetchFollowTags(ctx, dbData.Rsw.TempTableFilesDir(), srcDB, dbData.Ddb, runProgFuncs, stopProgFuncs) if err != nil { - return noConflictsOrViolations, err + return conflicts, fastForward, err } - return noConflictsOrViolations, nil + return conflicts, fastForward, nil } func pullerProgFunc(ctx context.Context, statsCh <-chan pull.Stats) { diff --git a/go/libraries/doltcore/sqle/dfunctions/merge.go b/go/libraries/doltcore/sqle/dfunctions/merge.go index 56ee98819e..b86241a8ba 100644 --- a/go/libraries/doltcore/sqle/dfunctions/merge.go +++ b/go/libraries/doltcore/sqle/dfunctions/merge.go @@ -43,7 +43,8 @@ func (mf *MergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return noConflictsOrViolations, err } - return DoDoltMerge(ctx, args) + hasConflicts, _, err := DoDoltMerge(ctx, args) + return hasConflicts, err } // String implements the Stringer interface. diff --git a/go/libraries/doltcore/sqle/dprocedures/dolt_merge.go b/go/libraries/doltcore/sqle/dprocedures/dolt_merge.go index 833966eb1e..a2538845f7 100644 --- a/go/libraries/doltcore/sqle/dprocedures/dolt_merge.go +++ b/go/libraries/doltcore/sqle/dprocedures/dolt_merge.go @@ -22,9 +22,9 @@ import ( // doltMerge is the stored procedure version of the functions `merge` and `dolt_merge`. func doltMerge(ctx *sql.Context, args ...string) (sql.RowIter, error) { - res, err := dfunctions.DoDoltMerge(ctx, args) + hasConflicts, ff, err := dfunctions.DoDoltMerge(ctx, args) if err != nil { return nil, err } - return rowToIter(int64(res)), nil + return rowToIter(int64(ff), int64(hasConflicts)), nil } diff --git a/go/libraries/doltcore/sqle/dprocedures/dolt_pull.go b/go/libraries/doltcore/sqle/dprocedures/dolt_pull.go index 22ac566640..1c2add522b 100644 --- a/go/libraries/doltcore/sqle/dprocedures/dolt_pull.go +++ b/go/libraries/doltcore/sqle/dprocedures/dolt_pull.go @@ -22,9 +22,9 @@ import ( // doltPull is the stored procedure version of the function `dolt_pull`. func doltPull(ctx *sql.Context, args ...string) (sql.RowIter, error) { - res, err := dfunctions.DoDoltPull(ctx, args) + conflicts, ff, err := dfunctions.DoDoltPull(ctx, args) if err != nil { return nil, err } - return rowToIter(int64(res)), nil + return rowToIter(int64(ff), int64(conflicts)), nil } diff --git a/go/libraries/doltcore/sqle/dprocedures/init.go b/go/libraries/doltcore/sqle/dprocedures/init.go index 43a4403308..c9cb060dfb 100644 --- a/go/libraries/doltcore/sqle/dprocedures/init.go +++ b/go/libraries/doltcore/sqle/dprocedures/init.go @@ -24,8 +24,8 @@ var DoltProcedures = []sql.ExternalStoredProcedureDetails{ {Name: "dolt_clean", Schema: int64Schema("status"), Function: doltClean}, {Name: "dolt_commit", Schema: stringSchema("hash"), Function: doltCommit}, {Name: "dolt_fetch", Schema: int64Schema("success"), Function: doltFetch}, - {Name: "dolt_merge", Schema: int64Schema("no_conflicts"), Function: doltMerge}, - {Name: "dolt_pull", Schema: int64Schema("no_conflicts"), Function: doltPull}, + {Name: "dolt_merge", Schema: int64Schema("fast_forward", "conflicts"), Function: doltMerge}, + {Name: "dolt_pull", Schema: int64Schema("fast_forward", "conflicts"), Function: doltPull}, {Name: "dolt_push", Schema: int64Schema("success"), Function: doltPush}, {Name: "dolt_reset", Schema: int64Schema("status"), Function: doltReset}, {Name: "dolt_revert", Schema: int64Schema("status"), Function: doltRevert}, @@ -37,8 +37,8 @@ var DoltProcedures = []sql.ExternalStoredProcedureDetails{ {Name: "dclean", Schema: int64Schema("status"), Function: doltClean}, {Name: "dcommit", Schema: stringSchema("hash"), Function: doltCommit}, {Name: "dfetch", Schema: int64Schema("success"), Function: doltFetch}, - {Name: "dmerge", Schema: int64Schema("no_conflicts"), Function: doltMerge}, - {Name: "dpull", Schema: int64Schema("no_conflicts"), Function: doltPull}, + {Name: "dmerge", Schema: int64Schema("fast_forward", "conflicts"), Function: doltMerge}, + {Name: "dpull", Schema: int64Schema("fast_forward", "conflicts"), Function: doltPull}, {Name: "dpush", Schema: int64Schema("success"), Function: doltPush}, {Name: "dreset", Schema: int64Schema("status"), Function: doltReset}, {Name: "drevert", Schema: int64Schema("status"), Function: doltRevert}, diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go index 1ca0c25412..0589dcb389 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go @@ -698,7 +698,7 @@ func TestSingleTransactionScript(t *testing.T) { }, { Query: "/* client b */ call dolt_merge('main')", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "/* client b */ select count(*) from dolt_conflicts", diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_queries.go b/go/libraries/doltcore/sqle/enginetest/dolt_queries.go index 1b0be67b56..7ce4525552 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_queries.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_queries.go @@ -534,7 +534,7 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{ var MergeScripts = []queries.ScriptTest{ { - Name: "DOLT_MERGE ff correctly works with autocommit off", + Name: "CALL DOLT_MERGE ff correctly works with autocommit off", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -549,8 +549,8 @@ var MergeScripts = []queries.ScriptTest{ Assertions: []queries.ScriptTestAssertion{ { // FF-Merge - Query: "SELECT DOLT_MERGE('feature-branch')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch')", + Expected: []sql.Row{{1, 0}}, }, { Query: "SELECT * from dolt_status", @@ -567,7 +567,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE no-ff correctly works with autocommit off", + Name: "CALL DOLT_MERGE no-ff correctly works with autocommit off", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -582,8 +582,8 @@ var MergeScripts = []queries.ScriptTest{ Assertions: []queries.ScriptTestAssertion{ { // No-FF-Merge - Query: "SELECT DOLT_MERGE('feature-branch', '-no-ff', '-m', 'this is a no-ff')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch', '-no-ff', '-m', 'this is a no-ff')", + Expected: []sql.Row{{1, 0}}, }, { Query: "SELECT * from dolt_status", @@ -604,7 +604,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE without conflicts correctly works with autocommit off", + Name: "CALL DOLT_MERGE without conflicts correctly works with autocommit off", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -620,8 +620,8 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch', '-m', 'this is a merge')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch', '-m', 'this is a merge')", + Expected: []sql.Row{{0, 0}}, }, { Query: "SELECT COUNT(*) from dolt_status", @@ -642,7 +642,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE with conflicts can be correctly resolved when autocommit is off", + Name: "CALL DOLT_MERGE with conflicts can be correctly resolved when autocommit is off", SetUpScript: []string{ "CREATE TABLE test (pk int primary key, val int)", "INSERT INTO test VALUES (0, 0)", @@ -658,8 +658,8 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch', '-m', 'this is a merge')", - Expected: []sql.Row{{0}}, + Query: "CALL DOLT_MERGE('feature-branch', '-m', 'this is a merge')", + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT * from dolt_status", @@ -696,7 +696,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE ff & squash correctly works with autocommit off", + Name: "CALL DOLT_MERGE ff & squash correctly works with autocommit off", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -710,8 +710,8 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch', '--squash')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch', '--squash')", + Expected: []sql.Row{{1, 0}}, }, { Query: "SELECT count(*) from dolt_status", @@ -728,7 +728,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE ff & squash with a checkout in between", + Name: "CALL DOLT_MERGE ff & squash with a checkout in between", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -742,8 +742,8 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch', '--squash')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch', '--squash')", + Expected: []sql.Row{{1, 0}}, }, { Query: "SELECT DOLT_CHECKOUT('-b', 'other')", @@ -756,7 +756,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE ff", + Name: "CALL DOLT_MERGE ff", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -770,8 +770,8 @@ var MergeScripts = []queries.ScriptTest{ Assertions: []queries.ScriptTestAssertion{ { // FF-Merge - Query: "SELECT DOLT_MERGE('feature-branch')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch')", + Expected: []sql.Row{{1, 0}}, }, { Query: "SELECT * from dolt_status", @@ -788,7 +788,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE no-ff", + Name: "CALL DOLT_MERGE no-ff", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -802,8 +802,8 @@ var MergeScripts = []queries.ScriptTest{ Assertions: []queries.ScriptTestAssertion{ { // No-FF-Merge - Query: "SELECT DOLT_MERGE('feature-branch', '-no-ff', '-m', 'this is a no-ff')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch', '-no-ff', '-m', 'this is a no-ff')", + Expected: []sql.Row{{1, 0}}, }, { Query: "SELECT * from dolt_status", @@ -824,7 +824,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE with no conflicts works", + Name: "CALL DOLT_MERGE with no conflicts works", SetUpScript: []string{ "CREATE TABLE test (pk int primary key)", "INSERT INTO test VALUES (0),(1),(2);", @@ -839,8 +839,8 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch', '-m', 'this is a merge')", - Expected: []sql.Row{{1}}, + Query: "CALL DOLT_MERGE('feature-branch', '-m', 'this is a merge')", + Expected: []sql.Row{{0, 0}}, }, { Query: "SELECT COUNT(*) from dolt_status", @@ -861,7 +861,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE with conflict is queryable and committable with dolt_allow_commit_conflicts on", + Name: "CALL DOLT_MERGE with conflict is queryable and committable with dolt_allow_commit_conflicts on", SetUpScript: []string{ "CREATE TABLE test (pk int primary key, val int)", "INSERT INTO test VALUES (0, 0)", @@ -877,8 +877,8 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch')", - Expected: []sql.Row{{0}}, + Query: "CALL DOLT_MERGE('feature-branch')", + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT count(*) from dolt_conflicts_test", @@ -886,7 +886,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "SELECT DOLT_MERGE('--abort')", - Expected: []sql.Row{{1}}, + Expected: []sql.Row{{0}}, }, { Query: "SELECT * FROM test", @@ -915,7 +915,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE with conflicts can be aborted when autocommit is off", + Name: "CALL DOLT_MERGE with conflicts can be aborted when autocommit is off", SetUpScript: []string{ "CREATE TABLE test (pk int primary key, val int)", "INSERT INTO test VALUES (0, 0)", @@ -931,8 +931,8 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch', '-m', 'this is a merge')", - Expected: []sql.Row{{0}}, + Query: "CALL DOLT_MERGE('feature-branch', '-m', 'this is a merge')", + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT * from dolt_status", @@ -944,7 +944,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "SELECT DOLT_MERGE('--abort')", - Expected: []sql.Row{{1}}, + Expected: []sql.Row{{0}}, }, { Query: "SELECT * from dolt_status", @@ -965,7 +965,7 @@ var MergeScripts = []queries.ScriptTest{ }, }, { - Name: "DOLT_MERGE complains when a merge overrides local changes", + Name: "CALL DOLT_MERGE complains when a merge overrides local changes", SetUpScript: []string{ "CREATE TABLE test (pk int primary key, val int)", "INSERT INTO test VALUES (0, 0)", @@ -980,7 +980,7 @@ var MergeScripts = []queries.ScriptTest{ }, Assertions: []queries.ScriptTestAssertion{ { - Query: "SELECT DOLT_MERGE('feature-branch', '-m', 'this is a merge')", + Query: "CALL DOLT_MERGE('feature-branch', '-m', 'this is a merge')", ExpectedErr: dfunctions.ErrUncommittedChanges, }, }, @@ -1004,7 +1004,7 @@ var MergeScripts = []queries.ScriptTest{ Assertions: []queries.ScriptTestAssertion{ { Query: "call dolt_merge('b1')", - Expected: []sql.Row{{1}}, + Expected: []sql.Row{{0, 0}}, }, { Query: "select count(*) from dolt_conflicts", @@ -1057,7 +1057,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_MERGE('branch1');", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT violation_type, pk, parent_fk from dolt_constraint_violations_child;", @@ -1069,7 +1069,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_COMMIT('-am', 'commit constraint violations');", - ExpectedErrStr: "error: the table(s) child has constraint violations", + ExpectedErrStr: "error: the table(s) child have constraint violations", }, { Query: "CALL DOLT_COMMIT('-afm', 'commit constraint violations');", @@ -1105,7 +1105,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_MERGE('branch2');", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT violation_type, pk, parent_fk from dolt_constraint_violations_child;", @@ -1117,7 +1117,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_COMMIT('-am', 'commit non-conflicting merge');", - ExpectedErrStr: "error: the table(s) child has constraint violations", + ExpectedErrStr: "error: the table(s) child have constraint violations", }, { Query: "CALL DOLT_COMMIT('-afm', 'commit non-conflicting merge');", @@ -1141,7 +1141,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_MERGE('branch3');", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT violation_type, pk, parent_fk from dolt_constraint_violations_child;", @@ -1177,7 +1177,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_MERGE('other');", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT * from parent;", @@ -1250,7 +1250,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_MERGE('other');", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT * from parent;", @@ -1275,7 +1275,7 @@ var MergeScripts = []queries.ScriptTest{ }, { Query: "CALL DOLT_MERGE('other2');", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "SELECT * from parent;", diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_transaction_queries.go b/go/libraries/doltcore/sqle/enginetest/dolt_transaction_queries.go index eb3ace8db5..8bb409106e 100755 --- a/go/libraries/doltcore/sqle/enginetest/dolt_transaction_queries.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_transaction_queries.go @@ -953,7 +953,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{ }, { Query: "/* client b */ call dolt_merge('main')", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "/* client b */ select count(*) from dolt_conflicts", @@ -1043,7 +1043,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{ }, { Query: "/* client b */ call dolt_merge('main')", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "/* client b */ select count(*) from dolt_conflicts", @@ -1131,7 +1131,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{ }, { Query: "/* client b */ call dolt_merge('main')", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{0, 1}}, }, { Query: "/* client b */ select count(*) from dolt_conflicts", @@ -1183,7 +1183,7 @@ var DoltSqlFuncTransactionTests = []queries.TransactionTest{ }, { Query: "/* client a */ SELECT DOLT_MERGE('feature-branch')", - Expected: []sql.Row{{0}}, + Expected: []sql.Row{{1}}, }, { Query: "/* client a */ SELECT count(*) from dolt_conflicts_test", @@ -1215,7 +1215,7 @@ var DoltSqlFuncTransactionTests = []queries.TransactionTest{ }, { Query: "/* client a */ SELECT DOLT_MERGE('--abort')", - Expected: []sql.Row{{1}}, + Expected: []sql.Row{{0}}, }, { Query: "/* client a */ commit", diff --git a/integration-tests/bats/sql-merge.bats b/integration-tests/bats/sql-merge.bats index 907bd66acd..4f9db2492f 100644 --- a/integration-tests/bats/sql-merge.bats +++ b/integration-tests/bats/sql-merge.bats @@ -444,7 +444,7 @@ SQL [[ "$output" =~ "true" ]] || false [[ "$output" =~ "true" ]] || false [[ "${lines[1]}" =~ "DOLT_MERGE('feature-branch')" ]] || false # validate that merge returns 1 not "Updating..." - [[ "${lines[3]}" =~ "1" ]] || false + [[ "${lines[3]}" =~ "0" ]] || false ! [[ "$output" =~ "Updating" ]] || false run dolt sql -q "SELECT * FROM test" -r csv @@ -764,7 +764,7 @@ SQL [[ "${lines[2]}" =~ "table,num_conflicts" ]] || false [[ "${lines[3]}" =~ "one_pk,1" ]] || false [[ "${lines[4]}" =~ "DOLT_MERGE('--abort')" ]] || false - [[ "${lines[5]}" =~ "1" ]] || false + [[ "${lines[5]}" =~ "0" ]] || false # now resolve commits run dolt sql << SQL @@ -1308,7 +1308,7 @@ rollback; SQL [ $status -eq 0 ] [[ "$output" =~ "| DOLT_MERGE('feature-branch') |" ]] || false - [[ "$output" =~ "| 0 |" ]] || false # conflict should return 0 + [[ "$output" =~ "| 1 |" ]] || false # conflict should return 1 [[ "$output" =~ "| Warning | 1105 | merge has unresolved conflicts or constraint violations |" ]] || false [[ "$output" =~ "| COUNT(*) |" ]] || false [[ "$output" =~ "| 1 |" ]] || false diff --git a/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java b/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java index 130571ff96..d6b1923f37 100644 --- a/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java +++ b/integration-tests/mysql-client-tests/java/MySQLConnectorTest.java @@ -52,7 +52,7 @@ public class MySQLConnectorTest { "1", "1", "0", - "1", + "0", "3" }; diff --git a/integration-tests/mysql-client-tests/node/index.js b/integration-tests/mysql-client-tests/node/index.js index 737388ad52..b447030047 100644 --- a/integration-tests/mysql-client-tests/node/index.js +++ b/integration-tests/mysql-client-tests/node/index.js @@ -109,7 +109,7 @@ async function main() { }, [], [ { "dolt_checkout('main')": 0 } ], - [ { "dolt_merge('mybranch')": 1 } ], + [ { "dolt_merge('mybranch')": 0 } ], [ { "COUNT(*)": 3 } ], ]; diff --git a/integration-tests/mysql-client-tests/python/mysql.connector-test.py b/integration-tests/mysql-client-tests/python/mysql.connector-test.py index d8b8167a33..fd7888cfd5 100644 --- a/integration-tests/mysql-client-tests/python/mysql.connector-test.py +++ b/integration-tests/mysql-client-tests/python/mysql.connector-test.py @@ -23,7 +23,7 @@ QUERY_RESPONSE = [ {"insert into test (pk, `value`) values (1,1)": []}, {"select dolt_commit('-a', '-m', 'my commit2')": [('',)]}, {"select dolt_checkout('main')": [(0,)]}, - {"select dolt_merge('mybranch')": [(1,)]}, + {"select dolt_merge('mybranch')": [(0,)]}, {"select COUNT(*) FROM dolt_log": [(3,)]}, ] diff --git a/integration-tests/mysql-client-tests/python/pymysql-test.py b/integration-tests/mysql-client-tests/python/pymysql-test.py index 6649afa7ab..4dc81f8ccf 100644 --- a/integration-tests/mysql-client-tests/python/pymysql-test.py +++ b/integration-tests/mysql-client-tests/python/pymysql-test.py @@ -16,7 +16,7 @@ QUERY_RESPONSE = [ {"insert into test (pk, `value`) values (1,1)": ()}, {"select dolt_commit('-a', '-m', 'my commit2')": (('',),)}, {"select dolt_checkout('main')": ((0,),)}, - {"select dolt_merge('mybranch')": ((1,),)}, + {"select dolt_merge('mybranch')": ((0,),)}, {"select COUNT(*) FROM dolt_log": ((3,),)}, ] diff --git a/integration-tests/mysql-client-tests/python/sqlalchemy-test.py b/integration-tests/mysql-client-tests/python/sqlalchemy-test.py index 1bca1b3033..e3cf4a993d 100644 --- a/integration-tests/mysql-client-tests/python/sqlalchemy-test.py +++ b/integration-tests/mysql-client-tests/python/sqlalchemy-test.py @@ -20,7 +20,7 @@ QUERY_RESPONSE = [ {"insert into test (pk, `value`) values (1,1)": []}, {"select dolt_commit('-a', '-m', 'my commit2')": [('',)]}, {"select dolt_checkout('main')": [(0,)]}, - {"select dolt_merge('mybranch')": [(1,)]}, + {"select dolt_merge('mybranch')": [(0,)]}, {"select COUNT(*) FROM dolt_log": [(3,)]}, ]