diff --git a/go/libraries/doltcore/merge/merge_prolly_rows.go b/go/libraries/doltcore/merge/merge_prolly_rows.go index f57a80b9c4..7ef7abe070 100644 --- a/go/libraries/doltcore/merge/merge_prolly_rows.go +++ b/go/libraries/doltcore/merge/merge_prolly_rows.go @@ -403,29 +403,32 @@ func newCheckValidator(ctx *sql.Context, tm *TableMerger, vm *valueMerger, sch s func (cv checkValidator) validateDiff(ctx *sql.Context, diff tree.ThreeWayDiff) (int, error) { conflictCount := 0 + var valueTuple val.Tuple + var valueDesc val.TupleDesc + + switch diff.Op { + case tree.DiffOpLeftDelete, tree.DiffOpRightDelete, tree.DiffOpConvergentDelete: + // no need to validate check constraints for deletes + return 0, nil + case tree.DiffOpDivergentDeleteConflict, tree.DiffOpDivergentModifyConflict: + // Don't bother validating divergent conflicts, just let them get reported as conflicts + return 0, nil + case tree.DiffOpLeftAdd, tree.DiffOpLeftModify: + valueTuple = diff.Left + valueDesc = cv.tableMerger.leftSch.GetValueDescriptor() + case tree.DiffOpRightAdd, tree.DiffOpRightModify: + valueTuple = diff.Right + valueDesc = cv.tableMerger.rightSch.GetValueDescriptor() + case tree.DiffOpConvergentAdd, tree.DiffOpConvergentModify: + // both sides made the same change, just take the left + valueTuple = diff.Left + valueDesc = cv.tableMerger.leftSch.GetValueDescriptor() + case tree.DiffOpDivergentModifyResolved: + valueTuple = diff.Merged + valueDesc = cv.tableMerger.leftSch.GetValueDescriptor() + } + for checkName, checkExpression := range cv.checkExpressions { - var valueTuple val.Tuple - var valueDesc val.TupleDesc - - switch diff.Op { - case tree.DiffOpLeftAdd, tree.DiffOpLeftDelete, tree.DiffOpLeftModify: - valueTuple = diff.Left - valueDesc = cv.tableMerger.leftSch.GetValueDescriptor() - case tree.DiffOpRightAdd, tree.DiffOpRightDelete, tree.DiffOpRightModify: - valueTuple = diff.Right - valueDesc = cv.tableMerger.rightSch.GetValueDescriptor() - case tree.DiffOpConvergentAdd, tree.DiffOpConvergentDelete, tree.DiffOpConvergentModify: - // both sides made the same change, just take the left - valueTuple = diff.Left - valueDesc = cv.tableMerger.leftSch.GetValueDescriptor() - case tree.DiffOpDivergentModifyResolved: - valueTuple = diff.Merged - valueDesc = cv.tableMerger.leftSch.GetValueDescriptor() - case tree.DiffOpDivergentDeleteConflict, tree.DiffOpDivergentModifyConflict: - // Don't bother validating divergent conflicts, just let them get reported as conflicts - return 0, nil - } - // If the row came from the right side of the merge, then remap it (if necessary) to the final schema. // This isn't necessary for left-side changes, because we already migrated the primary index data to // the merged schema, and we skip keyless tables, since their value tuples require different mapping diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go b/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go index 719243ee6f..623306d820 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go @@ -4381,6 +4381,27 @@ var ThreeWayMergeWithSchemaChangeTestScripts = []MergeScriptTest{ }, }, }, + { + Name: "check constraint violation - deleting rows", + AncSetUpScript: []string{ + "set autocommit = 0;", + "CREATE table t (pk int primary key, col1 int, col2 int, col3 int, CHECK (col2 != col3));", + "INSERT into t values (1, 2, 3, -3);", + "alter table t add index idx1 (pk, col2);", + }, + RightSetUpScript: []string{ + "delete from t where pk=1;", + }, + LeftSetUpScript: []string{ + "insert into t values (4, 3, 2, 1);", + }, + Assertions: []queries.ScriptTestAssertion{ + { + Query: "call dolt_merge('right');", + Expected: []sql.Row{{0, 0x0}}, + }, + }, + }, { Name: "check constraint violation - divergent edits", AncSetUpScript: []string{