mirror of
https://github.com/dolthub/dolt.git
synced 2026-03-09 01:56:30 -05:00
Fixing a bug with deleting rows
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user