Made dolt_merge return a particular error type, and check for it during batch processing (in which case don't do any further state cleanup). Also removed extra error decorators that could interere with error type detection.

This commit is contained in:
Zach Musgrave
2021-06-08 18:07:07 -07:00
parent afd3eaac82
commit 07bc5fafdd
3 changed files with 17 additions and 7 deletions
+11 -4
View File
@@ -394,7 +394,14 @@ func execBatch(sqlCtx *sql.Context, readOnly bool, mrEnv env.MultiRepoEnv, roots
err = runBatchMode(sqlCtx, se, batchInput)
if err != nil {
// If we encounter an error, flush what we have so far to disk before exiting
// If we encounter an error, flush what we have so far to disk before exiting, except in the case of merge
// errors, which have already updated the repo state all they're going to (and writing session root on top of
// them would overwrite these changes)
// TODO: this is a mess, merge conflicts need to follow the same code path as everything else
if err == doltdb.ErrUnresolvedConflicts || err == doltdb.ErrMergeActive {
return errhand.BuildDError("Error processing batch").Build()
}
_ = flushBatchedEdits(sqlCtx, se)
_ = writeRoots(sqlCtx, se, mrEnv, roots)
@@ -1100,7 +1107,7 @@ func processNonBatchableQuery(ctx *sql.Context, se *sqlEngine, query string, sql
if rowIter != nil {
err = mergeResultIntoStats(sqlStatement, rowIter, batchEditStats)
if err != nil {
return fmt.Errorf("error executing statement: %v", err.Error())
return err
}
// Some statement types should print results, even in batch mode.
@@ -1130,7 +1137,7 @@ func processNonBatchableQuery(ctx *sql.Context, se *sqlEngine, query string, sql
func processBatchableEditQuery(ctx *sql.Context, se *sqlEngine, query string, sqlStatement sqlparser.Statement) (returnErr error) {
_, rowIter, err := se.query(ctx, query)
if err != nil {
return fmt.Errorf("Error inserting rows: %v", err.Error())
return err
}
if rowIter != nil {
@@ -1142,7 +1149,7 @@ func processBatchableEditQuery(ctx *sql.Context, se *sqlEngine, query string, sq
}()
err = mergeResultIntoStats(sqlStatement, rowIter, batchEditStats)
if err != nil {
return fmt.Errorf("Error inserting rows: %v", err.Error())
return err
}
}
+3
View File
@@ -47,6 +47,9 @@ var ErrUpToDate = errors.New("up to date")
var ErrIsAhead = errors.New("current fast forward from a to b. a is ahead of b already")
var ErrIsBehind = errors.New("cannot reverse from b to a. b is a is behind a already")
var ErrUnresolvedConflicts = errors.New("merge has unresolved conflicts")
var ErrMergeActive = errors.New("merging is not possible because you have not committed an active merge")
type ErrClientOutOfDate struct {
RepoVer FeatureVersion
ClientVer FeatureVersion
@@ -100,11 +100,11 @@ func (d DoltMergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error)
}
if hasConflicts {
return 1, errors.New("error: merge has unresolved conflicts")
return 1, doltdb.ErrUnresolvedConflicts
}
if dbData.Rsr.IsMergeActive() {
return 1, errors.New("error: merging is not possible because you have not committed an active merge")
return 1, doltdb.ErrMergeActive
}
head, hh, headRoot, err := getHead(ctx, sess, dbName)
@@ -333,7 +333,7 @@ func mergeRootToWorking(
hasConflicts := checkForConflicts(mergeStats)
if hasConflicts {
return errors.New("merge has conflicts. use the dolt_conflicts table to resolve")
return doltdb.ErrUnresolvedConflicts
}
_, err = env.UpdateStagedRoot(ctx, dbData.Ddb, dbData.Rsw, workingRoot)