diff --git a/go/libraries/doltcore/merge/merge_prolly_rows.go b/go/libraries/doltcore/merge/merge_prolly_rows.go index b8004c5eea..038053bcf1 100644 --- a/go/libraries/doltcore/merge/merge_prolly_rows.go +++ b/go/libraries/doltcore/merge/merge_prolly_rows.go @@ -422,14 +422,12 @@ func (cv checkValidator) validateDiff(ctx *sql.Context, diff tree.ThreeWayDiff) valueTuple = diff.Merged valueDesc = cv.tableMerger.leftSch.GetValueDescriptor() case tree.DiffOpDivergentDeleteConflict, tree.DiffOpDivergentModifyConflict: - // TODO: Add a test case to trigger this... would this even get this far? - return 0, fmt.Errorf("check constraint validation not supported for divergent conflicts") + // Don't bother validating divergent conflicts, just let them get reported as conflicts + return 0, nil } - // TODO: Do we need to honor column defaults here? Seems like it? - // TEST: A new column with a column default is added, and the column default value causes a check violation - // (check must be just added on one side of the merge to trigger this) newTuple := valueTuple + // TODO: Why are our tests working without this?! if false { // TODO: If we're using diff.Merged, then that means we don't need to do any remapping, right? // TODO: This right mapping needs to be different, right? for each diff op type? @@ -448,9 +446,8 @@ func (cv checkValidator) validateDiff(ctx *sql.Context, diff tree.ThreeWayDiff) } if result == nil || result == true { - // If a check constraint returns NULL (aka UNKNOWN) or TRUE, then the check constraint is fulfilled + // If a check constraint returns NULL or TRUE, then the check constraint is fulfilled // https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html - // TODO: Add a test case for CHECK(NULL = NULL) –something that will always return NULL continue } else if result == false { conflictCount++ diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go b/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go index 111fc40fbd..072ab48524 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_queries_merge.go @@ -4381,11 +4381,73 @@ var ThreeWayMergeWithSchemaChangeTestScripts = []MergeScriptTest{ }, }, }, + { + Name: "check constraint violation - divergent edits", + AncSetUpScript: []string{ + "set autocommit = 0;", + "CREATE table t (pk int primary key, col1 varchar(100) default ('hello'));", + "INSERT into t values (1, 'hi');", + "alter table t add index idx1 (col1);", + }, + RightSetUpScript: []string{ + "alter table t add constraint CHECK (col1 != concat('he', 'llo'))", + "update t set col1 = 'bye' where pk=1;", + }, + LeftSetUpScript: []string{ + "update t set col1 = 'adios' where pk=1;", + }, + Assertions: []queries.ScriptTestAssertion{ + { + Query: "call dolt_merge('right');", + Expected: []sql.Row{{0, 0x1}}, + }, + }, + }, + { + Name: "check constraint violation - check is always NULL", + AncSetUpScript: []string{ + "CREATE table t (pk int primary key, col1 varchar(100) default ('hello'));", + "INSERT into t values (1, 'hi');", + "alter table t add index idx1 (col1);", + }, + RightSetUpScript: []string{ + "alter table t add constraint CHECK (NULL = NULL)", + }, + LeftSetUpScript: []string{ + "insert into t values (2, DEFAULT);", + }, + Assertions: []queries.ScriptTestAssertion{ + { + Query: "call dolt_merge('right');", + Expected: []sql.Row{{0, 0x0}}, + }, + }, + }, + { + Name: "check constraint violation - check is always false", + AncSetUpScript: []string{ + "SET @@dolt_force_transaction_commit=1;", + "CREATE table t (pk int primary key, col1 varchar(100) default ('hello'));", + "alter table t add index idx1 (col1);", + }, + RightSetUpScript: []string{ + "alter table t add constraint CHECK (1 = 2)", + }, + LeftSetUpScript: []string{ + "insert into t values (1, DEFAULT);", + }, + Assertions: []queries.ScriptTestAssertion{ + { + Query: "call dolt_merge('right');", + Expected: []sql.Row{{0, 0x1}}, + }, + }, + }, { Name: "check constraint violation - left side violates new check constraint", AncSetUpScript: []string{ "set autocommit = 0;", - "CREATE table t (pk int primary key, col1 varchar(100));", + "CREATE table t (pk int primary key, col1 varchar(100) default ('hello'));", "INSERT into t values (1, 'hi');", "alter table t add index idx1 (col1);", }, @@ -4393,7 +4455,7 @@ var ThreeWayMergeWithSchemaChangeTestScripts = []MergeScriptTest{ "alter table t add constraint CHECK (col1 != concat('he', 'llo'))", }, LeftSetUpScript: []string{ - "insert into t values (2, 'hello');", + "insert into t values (2, DEFAULT);", }, Assertions: []queries.ScriptTestAssertion{ {