Fixing a bug with deleting rows

This commit is contained in:
Jason Fulghum
2023-05-22 16:28:26 -07:00
parent 9ee6f46274
commit 760add4899
2 changed files with 46 additions and 22 deletions

View File

@@ -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

View File

@@ -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{