#!/usr/bin/env bats load $BATS_TEST_DIRNAME/helper/common.bash setup() { setup_common dolt sql < | modify1 | CREATE PROCEDURE modify1() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 2 |" ]] || false [[ "$output" =~ "| | | AS RESULTING |" ]] || false [[ "$output" =~ "| | | FROM DUAL; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "| < | modify2 | CREATE PROCEDURE modify2() SELECT 42 |" ]] || false [[ "$output" =~ "| > | modify2 | CREATE PROCEDURE modify2() SELECT 43 |" ]] || false [[ "$output" =~ "| - | remove | CREATE PROCEDURE remove() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 8; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "+---+---------+--------------------------------------+" ]] || false # Look at the line-by-line diff run dolt diff original --diff-mode=line [ "$status" -eq 0 ] # Verify that standard diffs are still working [[ "$output" =~ "| | PK |" ]] || false [[ "$output" =~ "+---+----+" ]] || false [[ "$output" =~ "| - | 2 |" ]] || false [[ "$output" =~ "| + | 4 |" ]] || false # Check the overall stored procedure diff (excluding dates since they're variable) [[ "$output" =~ "+---+---------+---------------------------------------+" ]] || false [[ "$output" =~ "| | name | create_stmt |" ]] || false [[ "$output" =~ "+---+---------+---------------------------------------+" ]] || false [[ "$output" =~ "| + | adding | CREATE PROCEDURE adding() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 9; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "| * | modify1 | CREATE PROCEDURE modify1() BEGIN |" ]] || false [[ "$output" =~ "| | | -DECLARE a INT DEFAULT 1; |" ]] || false [[ "$output" =~ "| | | -SELECT a |" ]] || false [[ "$output" =~ "| | | - AS RESULT; |" ]] || false [[ "$output" =~ "| | | +SELECT 2 |" ]] || false [[ "$output" =~ "| | | + AS RESULTING |" ]] || false [[ "$output" =~ "| | | + FROM DUAL; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "| * | modify2 | -CREATE PROCEDURE modify2() SELECT 42 |" ]] || false [[ "$output" =~ "| | | +CREATE PROCEDURE modify2() SELECT 43 |" ]] || false [[ "$output" =~ "| - | remove | CREATE PROCEDURE remove() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 8; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "+---+---------+---------------------------------------+" ]] || false # Look at the in-place diff run dolt diff original --diff-mode=in-place [ "$status" -eq 0 ] # Verify that standard diffs are still working [[ "$output" =~ "| | PK |" ]] || false [[ "$output" =~ "+---+----+" ]] || false [[ "$output" =~ "| - | 2 |" ]] || false [[ "$output" =~ "| + | 4 |" ]] || false # Check the overall stored procedure diff (excluding dates since they're variable) [[ "$output" =~ "+---+---------+---------------------------------------+" ]] || false [[ "$output" =~ "| | name | create_stmt |" ]] || false [[ "$output" =~ "+---+---------+---------------------------------------+" ]] || false [[ "$output" =~ "| + | adding | CREATE PROCEDURE adding() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 9; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "| * | modify1 | CREATE PROCEDURE modify1() BEGIN |" ]] || false [[ "$output" =~ "| | | DECLARE a INT DEFAULT 1; |" ]] || false [[ "$output" =~ "| | | SELECT a2 |" ]] || false [[ "$output" =~ "| | | AS RESULTING |" ]] || false [[ "$output" =~ "| | | FROM DUAL; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "| * | modify2 | CREATE PROCEDURE modify2() SELECT 423 |" ]] || false [[ "$output" =~ "| - | remove | CREATE PROCEDURE remove() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 8; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "+---+---------+---------------------------------------+" ]] || false # Look at the context diff run dolt diff original --diff-mode=context [ "$status" -eq 0 ] # Verify that standard diffs are still working [[ "$output" =~ "| | PK |" ]] || false [[ "$output" =~ "+---+----+" ]] || false [[ "$output" =~ "| - | 2 |" ]] || false [[ "$output" =~ "| + | 4 |" ]] || false # Check the overall stored procedure diff (excluding dates since they're variable) [[ "$output" =~ "+---+---------+--------------------------------------+" ]] || false [[ "$output" =~ "| | name | create_stmt |" ]] || false [[ "$output" =~ "+---+---------+--------------------------------------+" ]] || false [[ "$output" =~ "| + | adding | CREATE PROCEDURE adding() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 9; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "| * | modify1 | CREATE PROCEDURE modify1() BEGIN |" ]] || false [[ "$output" =~ "| | | -DECLARE a INT DEFAULT 1; |" ]] || false [[ "$output" =~ "| | | -SELECT a |" ]] || false [[ "$output" =~ "| | | - AS RESULT; |" ]] || false [[ "$output" =~ "| | | +SELECT 2 |" ]] || false [[ "$output" =~ "| | | + AS RESULTING |" ]] || false [[ "$output" =~ "| | | + FROM DUAL; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "| < | modify2 | CREATE PROCEDURE modify2() SELECT 42 |" ]] || false [[ "$output" =~ "| > | modify2 | CREATE PROCEDURE modify2() SELECT 43 |" ]] || false [[ "$output" =~ "| - | remove | CREATE PROCEDURE remove() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 8; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "+---+---------+--------------------------------------+" ]] || false # Ensure that the context diff is the default run dolt diff original [ "$status" -eq 0 ] [[ "$output" =~ "| * | modify1 | CREATE PROCEDURE modify1() BEGIN |" ]] || false [[ "$output" =~ "| | | -SELECT a |" ]] || false [[ "$output" =~ "| | | +SELECT 2 |" ]] || false [[ "$output" =~ "| < | modify2 | CREATE PROCEDURE modify2() SELECT 42 |" ]] || false [[ "$output" =~ "| > | modify2 | CREATE PROCEDURE modify2() SELECT 43 |" ]] || false } @test "diff: reverse diff" { # We're not using the test table, so we might as well delete it dolt sql < | modify2 | CREATE PROCEDURE modify2() SELECT 42 |" ]] || false [[ "$output" =~ "| + | remove | CREATE PROCEDURE remove() BEGIN |" ]] || false [[ "$output" =~ "| | | SELECT 8; |" ]] || false [[ "$output" =~ "| | | END |" ]] || false [[ "$output" =~ "+---+---------+--------------------------------------+" ]] || false } @test "diff: clean working set" { dolt add . dolt commit -m table dolt sql -q 'insert into test values (0,0,0,0,0,0)' dolt add . dolt commit -m row run dolt diff [ "$status" -eq 0 ] [ "$output" = "" ] run dolt diff head [ "$status" -eq 0 ] [ "$output" = "" ] dolt diff head^ run dolt diff head^ [ "$status" -eq 0 ] [[ "$output" =~ "+ | 0" ]] || false run dolt diff head^ head [ "$status" -eq 0 ] [[ "$output" =~ "+ | 0" ]] || false run dolt diff head head^ [ "$status" -eq 0 ] [[ "$output" =~ "- | 0" ]] || false # Two dot run dolt diff head.. [ "$status" -eq 0 ] [ "$output" = "" ] run dolt diff head^.. [ "$status" -eq 0 ] [[ "$output" =~ "+ | 0" ]] || false run dolt diff head^..head [ "$status" -eq 0 ] [[ "$output" =~ "+ | 0" ]] || false run dolt diff head..head^ [ "$status" -eq 0 ] [[ "$output" =~ "- | 0" ]] || false run dolt diff ..head^ [ "$status" -eq 0 ] [[ "$output" =~ "- | 0" ]] || false } @test "diff: dirty working set" { dolt add . dolt commit -m table dolt sql -q 'insert into test values (0,0,0,0,0,0)' run dolt diff [ "$status" -eq 0 ] [[ "$output" =~ "+ | 0" ]] || false run dolt diff head [ "$status" -eq 0 ] [[ "$output" =~ "+ | 0" ]] || false dolt add . run dolt diff [ "$status" -eq 0 ] [ "$output" = "" ] run dolt diff head [ "$status" -eq 0 ] [[ "$output" =~ "+ | 0" ]] || false } @test "diff: two and three dot diff" { dolt checkout main dolt sql -q 'insert into test values (0,0,0,0,0,0)' dolt add . dolt commit -m table dolt checkout -b branch1 dolt sql -q 'insert into test values (1,1,1,1,1,1)' dolt add . dolt commit -m row dolt checkout main dolt sql -q 'insert into test values (2,2,2,2,2,2)' dolt add . dolt commit -m newrow # Two dot shows all changes between branches run dolt diff branch1 [ "$status" -eq 0 ] [[ "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff branch1.. [ "$status" -eq 0 ] [[ "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff branch1..main [ "$status" -eq 0 ] [[ "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff branch1 main [ "$status" -eq 0 ] [[ "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff ..branch1 [ "$status" -eq 0 ] [[ "$output" =~ "+ | 1" ]] || false [[ "$output" =~ "- | 2" ]] || false run dolt diff main..branch1 [ "$status" -eq 0 ] [[ "$output" =~ "+ | 1" ]] || false [[ "$output" =~ "- | 2" ]] || false run dolt diff main branch1 [ "$status" -eq 0 ] [[ "$output" =~ "+ | 1" ]] || false [[ "$output" =~ "- | 2" ]] || false # Three dot shows changes between common ancestor and branch run dolt diff branch1... [ "$status" -eq 0 ] [[ ! "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff $(dolt merge-base branch1 HEAD) [ "$status" -eq 0 ] [[ ! "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff --merge-base branch1 [ "$status" -eq 0 ] [[ ! "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff branch1...main [ "$status" -eq 0 ] [[ ! "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff --merge-base branch1 main [ "$status" -eq 0 ] [[ ! "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff main...branch1 [ "$status" -eq 0 ] [[ "$output" =~ "+ | 1" ]] || false [[ ! "$output" =~ "- | 2" ]] || false run dolt diff --merge-base main branch1 [ "$status" -eq 0 ] [[ "$output" =~ "+ | 1" ]] || false [[ ! "$output" =~ "- | 2" ]] || false run dolt diff --merge-base main branch1 test [ "$status" -eq 0 ] [[ "$output" =~ "+ | 1" ]] || false [[ ! "$output" =~ "- | 2" ]] || false run dolt diff $(dolt merge-base branch1 main) main [ "$status" -eq 0 ] [[ ! "$output" =~ "- | 1" ]] || false [[ "$output" =~ "+ | 2" ]] || false run dolt diff $(dolt merge-base main branch1) branch1 [ "$status" -eq 0 ] [[ "$output" =~ "+ | 1" ]] || false [[ ! "$output" =~ "- | 2" ]] || false } @test "diff: data and schema changes" { dolt sql < | 4 | 100 | NULL | NULL | | + | 7 | 8 | NULL | 9 | +---+----+-----+------+------+ EOF ) [ "$status" -eq 0 ] [[ "$output" =~ "$EXPECTED" ]] || false run dolt diff --data --schema [ "$status" -eq 0 ] [[ "$output" =~ "$EXPECTED" ]] || false run dolt diff --schema EXPECTED=$(cat <<'EOF' CREATE TABLE `test` ( `pk` int NOT NULL, `c1` int, - `c2` int, + `c3` varchar(10), PRIMARY KEY (`pk`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin; EOF ) [[ "$output" =~ "$EXPECTED" ]] || false # Count the line numbers to make sure there are no data changes output [ "${#lines[@]}" -eq 10 ] run dolt diff --data EXPECTED=$(cat <<'EOF' +---+----+-----+------+------+ | | pk | c1 | c2 | c3 | +---+----+-----+------+------+ | - | 1 | 2 | 3 | NULL | | < | 4 | 5 | 6 | NULL | | > | 4 | 100 | NULL | NULL | | + | 7 | 8 | NULL | 9 | +---+----+-----+------+------+ EOF ) [[ "$output" =~ "$EXPECTED" ]] || false # Count the line numbers to make sure there are no schema changes output [ "${#lines[@]}" -eq 11 ] } @test "diff: data diff only" { dolt add . dolt commit -am "First commit" dolt sql -q "insert into test (pk) values (10);" dolt diff run dolt diff [ "$status" -eq 0 ] [[ ! "$output" =~ "CREATE TABLE" ]] || false [[ "$output" =~ "| | pk | c1 | c2 | c3 | c4 | c5 |" ]] || false [[ "$output" =~ "| + | 10 | NULL | NULL | NULL | NULL | NULL |" ]] || false } @test "diff: schema changes only" { dolt add . dolt commit -am "First commit" dolt sql < 0" --limit 1 EXPECTED_TABLE2=$(cat <<'EOF' +---+----+ | | pk | +---+----+ | + | 1 | +---+----+ EOF ) [[ "$output" =~ "$EXPECTED_TABLE2" ]] || false run dolt diff --limit 0 [[ "$output" =~ "diff --dolt a/test b/test" ]] || false [[ "$output" =~ "--- a/test @" ]] || false [[ "$output" =~ "+++ b/test @" ]] || false [[ "$output" =~ "diff --dolt a/test2 b/test2" ]] || false [[ "$output" =~ "--- a/test2 @" ]] || false [[ "$output" =~ "+++ b/test2 @" ]] || false run dolt diff --limit [ "$status" -ne 0 ] } @test "diff: allowed across primary key renames" { dolt sql < | NULL | 100 | 1 | +---+------+------+------+ EOF ) [[ "$output" =~ "$EXPECTED_TABLE" ]] EXPECTED_TABLE=$(cat <<'EOF' +---+------+------+------+------+------+ | | pk1a | pk1b | col1 | pk2a | pk2b | +---+------+------+------+------+------+ | < | 1 | 1 | 1 | NULL | NULL | | > | NULL | NULL | 100 | 1 | 1 | +---+------+------+------+------+------+ EOF ) [[ "$output" =~ "$EXPECTED_TABLE" ]] } # This test was added to prevent short tuples from causing an empty diff. @test "diff: add a column, then set and unset its value. Should not show a diff" { dolt sql -q "CREATE table t (pk int primary key);" dolt sql -q "Insert into t values (1), (2), (3);" dolt sql -q "alter table t add column col1 int;" dolt add . dolt commit -am "setup" # Turn a short tuple into a nominal one dolt sql -q "UPDATE t set col1 = 1 where pk = 1;" dolt sql -q "UPDATE t set col1 = null where pk = 1;" run dolt diff [ $status -eq 0 ] [[ ! "$output" =~ "| 1" ]] || false run dolt diff --stat [ $status -eq 0 ] [[ ! "$output" =~ "1 Row Modified" ]] || false } @test "diff: dolt_schema table changes are special" { dolt sql <= 18; DROP TRIGGER avg_age; CREATE TRIGGER avg_age AFTER INSERT ON people FOR EACH ROW update average_age set average = (SELECT AVG(age) FROM people); SQL dolt add . dolt commit -m "commit 2" run dolt diff HEAD~1 HEAD [ $status -eq 0 ] [[ "$output" =~ "CREATE TRIGGER avg_age AFTER INSERT ON people" ]] || false [[ "$output" =~ "- for each row" ]] || false [[ "$output" =~ "+ FOR EACH ROW" ]] || false [[ "$output" =~ " update average_age set average = (SELECT AVG(age) FROM people);" ]] || false [[ "$output" =~ "+CREATE VIEW adults AS SELECT name FROM people WHERE age >= 18;" ]] || false dolt sql <= 18; DROP TRIGGER avg_age; SQL dolt add . dolt commit -m "commit 3" run dolt diff HEAD~1 HEAD [ $status -eq 0 ] [[ "$output" =~ "-CREATE TRIGGER avg_age AFTER INSERT ON people" ]] || false [[ "$output" =~ "- FOR EACH ROW" ]] || false [[ "$output" =~ "- update average_age set average = (SELECT AVG(age) FROM people);" ]] || false [[ "$output" =~ "-CREATE VIEW adults AS SELECT name FROM people WHERE age >= 18;" ]] || false [[ "$output" =~ "+CREATE VIEW adults AS SELECT nickname FROM people WHERE age >= 18;" ]] || false } @test "diff: get diff on dolt_schemas table with different result output formats" { dolt add . dolt commit -am "commit 1" dolt sql <