mirror of
https://github.com/dolthub/dolt.git
synced 2026-02-11 18:49:14 -06:00
281 lines
10 KiB
Bash
281 lines
10 KiB
Bash
#!/usr/bin/env bats
|
|
load $BATS_TEST_DIRNAME/helper/common.bash
|
|
load $BATS_TEST_DIRNAME/helper/query-server-common.bash
|
|
|
|
make_test_repo_and_start_server() {
|
|
rm -rf ./"$1"
|
|
mkdir "$1"
|
|
cd "$1"
|
|
|
|
# Override the default event scheduler period (30s) and set it to 1s so that we can run
|
|
# tests faster, without having to wait for the default 30s period to elapse several times.
|
|
export DOLT_EVENT_SCHEDULER_PERIOD=1
|
|
start_sql_server
|
|
|
|
dolt -u dolt --port $PORT --host 0.0.0.0 --no-tls --use-db information_schema sql -q "CREATE DATABASE repo1;"
|
|
dolt -u dolt --port $PORT --host 0.0.0.0 --no-tls --use-db repo1 sql -q "CREATE TABLE totals (id int PRIMARY KEY AUTO_INCREMENT, int_col int);"
|
|
dolt -u dolt --port $PORT --host 0.0.0.0 --no-tls --use-db repo1 sql -q "call dolt_commit('-Am', 'creating table');"
|
|
}
|
|
|
|
setup() {
|
|
skiponwindows "tests are flaky on Windows"
|
|
setup_no_dolt_init
|
|
make_test_repo_and_start_server repo1
|
|
}
|
|
|
|
teardown() {
|
|
stop_sql_server 1 && sleep 0.5
|
|
teardown_common
|
|
}
|
|
|
|
@test "events: disabling recurring event should not be dropped" {
|
|
dolt sql -q "CREATE EVENT insert1 ON SCHEDULE EVERY 1 DAY DO INSERT INTO totals (int_col) VALUES (1);"
|
|
run dolt sql -q "ALTER EVENT insert1 DISABLE; SELECT * FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "DISABLED" ]] || false
|
|
}
|
|
|
|
@test "events: disabling current_timestamp one time event after execution" {
|
|
dolt sql -q "CREATE EVENT insert9 ON SCHEDULE AT CURRENT_TIMESTAMP DO INSERT INTO totals (int_col) VALUES (9);"
|
|
# used for debugging
|
|
dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
run dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 |" ]] || false
|
|
|
|
run dolt sql -q "SELECT COUNT(*) FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 0 |" ]] || false
|
|
|
|
dolt sql -q "CREATE EVENT insert8 ON SCHEDULE AT CURRENT_TIMESTAMP ON COMPLETION PRESERVE DO INSERT INTO totals (int_col) VALUES (8);"
|
|
# used for debugging
|
|
dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
run dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 2 |" ]] || false
|
|
|
|
run dolt sql -q "SHOW CREATE EVENT insert8;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "ON COMPLETION PRESERVE DISABLE" ]] || false
|
|
|
|
run dolt sql -q "ALTER EVENT insert8 ON COMPLETION NOT PRESERVE; SELECT COUNT(*) FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 |" ]] || false
|
|
|
|
run dolt sql -q "ALTER EVENT insert8 ENABLE; SELECT COUNT(*) FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 0 |" ]] || false
|
|
}
|
|
|
|
@test "events: disabling future one time event after execution from the scheduler" {
|
|
run dolt sql -q "CREATE EVENT insert9 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 3 SECOND ON COMPLETION PRESERVE DO INSERT INTO totals (int_col) VALUES (9); SHOW CREATE EVENT insert9;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "ON COMPLETION PRESERVE ENABLE" ]] || false
|
|
|
|
sleep 4
|
|
# used for debugging
|
|
dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
|
|
run dolt sql -q "SELECT COUNT(*) >= 1 FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 |" ]] || false
|
|
|
|
run dolt sql -q "SELECT COUNT(*) FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 |" ]] || false
|
|
|
|
run dolt sql -q "SHOW CREATE EVENT insert9;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "ON COMPLETION PRESERVE DISABLE" ]] || false
|
|
}
|
|
|
|
@test "events: recurring event with STARTS and ENDS defined" {
|
|
dolt sql -q "CREATE EVENT insert1 ON SCHEDULE EVERY 2 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 2 SECOND ENDS CURRENT_TIMESTAMP + INTERVAL 5 SECOND DO INSERT INTO totals (int_col) VALUES (1);"
|
|
sleep 10
|
|
|
|
# used for debugging
|
|
dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
|
|
run dolt sql -q "SELECT COUNT(*) >= 2 FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 |" ]] || false
|
|
|
|
# should be dropped
|
|
run dolt sql -q "SELECT COUNT(*) FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 0 |" ]] || false
|
|
}
|
|
|
|
@test "events: recurring event with ENDS defined" {
|
|
dolt sql -q "CREATE EVENT insert1 ON SCHEDULE EVERY 2 SECOND ENDS CURRENT_TIMESTAMP + INTERVAL 3 SECOND ON COMPLETION PRESERVE DO INSERT INTO totals (int_col) VALUES (1); SELECT SLEEP(5);"
|
|
sleep 3
|
|
|
|
# used for debugging
|
|
dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
run dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 2 |" ]] || false
|
|
|
|
# should be disabled
|
|
run dolt sql -q "SELECT * FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "DISABLED" ]] || false
|
|
}
|
|
|
|
@test "events: checking out a branch should disable all events leaving the working set dirty" {
|
|
dolt sql -q "CREATE EVENT insert1 ON SCHEDULE EVERY 2 SECOND ENDS CURRENT_TIMESTAMP + INTERVAL 3 SECOND ON COMPLETION PRESERVE DO INSERT INTO totals (int_col) VALUES (1); SELECT SLEEP(5);"
|
|
dolt sql -q "CALL DOLT_COMMIT('-am','commit event changes to totals table')"
|
|
|
|
dolt sql -q "CALL DOLT_CHECKOUT('-b','newbranch')"
|
|
# should be disabled
|
|
run dolt sql -q "SELECT * FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "DISABLED" ]] || false
|
|
}
|
|
|
|
@test "events: events on default branch still run after switching to non-default branch" {
|
|
dolt sql -q "CREATE EVENT insert1 ON SCHEDULE EVERY 3 SECOND ENDS CURRENT_TIMESTAMP + INTERVAL 3 MINUTE DO INSERT INTO totals (int_col) VALUES (1);"
|
|
dolt sql -q "CALL DOLT_COMMIT('-Am','commit with an event');"
|
|
|
|
dolt sql -q "CALL DOLT_CHECKOUT('-b','newbranch');"
|
|
# should be disabled
|
|
run dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 |" ]] || false
|
|
|
|
# While we are sleeping, the event executor should still be running our event on schedule, on the main branch
|
|
sleep 5
|
|
run dolt sql -q "CALL DOLT_CHECKOUT('main'); SELECT COUNT(*) FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ ! $output =~ "| 1 |" ]] || false
|
|
}
|
|
|
|
# Test that events with multiple statements in nested BEGIN/END blocks work correctly
|
|
@test "events: multiple statements in nested BEGIN END blocks in event body" {
|
|
# Use dolt sql to pipe in a HEREDOC; Note that this will connect to the running sql-server
|
|
cd repo1
|
|
dolt sql << SQL
|
|
delimiter //
|
|
CREATE EVENT event1234
|
|
ON SCHEDULE AT CURRENT_TIMESTAMP
|
|
DO
|
|
BEGIN
|
|
INSERT INTO totals (int_col) VALUES (111);
|
|
BEGIN
|
|
INSERT INTO totals (int_col) VALUES (222);
|
|
INSERT INTO totals (int_col) VALUES (333);
|
|
END;
|
|
END;
|
|
//
|
|
delimiter ;
|
|
SQL
|
|
|
|
# Verify that our event ran correctly and inserted three rows
|
|
run dolt sql -q "SELECT * FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 | 111 |" ]] || false
|
|
[[ $output =~ "| 2 | 222 |" ]] || false
|
|
[[ $output =~ "| 3 | 333 |" ]] || false
|
|
|
|
# Verify that the event did not persist after execution
|
|
run dolt sql -q "SELECT COUNT(*) FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 0 |" ]] || false
|
|
}
|
|
|
|
# Test that events containing procedure calls work correctly
|
|
@test "events: procedure calls in events" {
|
|
# Create a procedure
|
|
cd repo1
|
|
dolt sql << SQL
|
|
DELIMITER //
|
|
CREATE PROCEDURE InsertIntoTotals()
|
|
BEGIN
|
|
INSERT INTO totals (int_col) VALUES (42);
|
|
END //
|
|
DELIMITER ;
|
|
SQL
|
|
|
|
# Use dolt sql to pipe in a HEREDOC; Note that this will connect to the running sql-server
|
|
dolt sql << SQL
|
|
delimiter //
|
|
CREATE EVENT event1234
|
|
ON SCHEDULE AT CURRENT_TIMESTAMP
|
|
DO
|
|
BEGIN
|
|
CALL InsertIntoTotals();
|
|
END;
|
|
//
|
|
delimiter ;
|
|
SQL
|
|
|
|
# Verify that our event ran correctly and inserted one row
|
|
run dolt sql -q "SELECT * FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 | 42 |" ]] || false
|
|
run dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 " ]] || false
|
|
|
|
# Verify that the event did not persist after execution
|
|
run dolt sql -q "SELECT COUNT(*) FROM information_schema.events;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 0 |" ]] || false
|
|
}
|
|
|
|
# Test that out-of-band event definition changes (e.g. merges, reverts, or anything else that doesn't go through
|
|
# CREATE EVENT statements) are reflected correctly.
|
|
@test "events: out-of-band event changes are detected" {
|
|
# Use dolt sql to pipe in a HEREDOC; Note that this will connect to the running sql-server
|
|
dolt sql << SQL
|
|
call dolt_checkout('-b', 'other');
|
|
CREATE EVENT event12345
|
|
ON SCHEDULE EVERY 1 SECOND STARTS CURRENT_TIMESTAMP
|
|
DO INSERT INTO totals (int_col) VALUES (42);
|
|
call dolt_commit('-Am', 'Adding a new recurring event');
|
|
SQL
|
|
|
|
# Verify that our event IS NOT executing (on a non-main branch)
|
|
sleep 1
|
|
run dolt sql -q "SELECT COUNT(*) FROM totals;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 0 " ]] || false
|
|
|
|
# Merge our event from other back to main and enable it
|
|
dolt sql << SQL
|
|
call dolt_checkout('main');
|
|
call dolt_merge('other');
|
|
ALTER EVENT event12345 ENABLE;
|
|
call dolt_commit('-am', 'committing enabled event');
|
|
SQL
|
|
|
|
# Verify that the new event starts executing on main after we merge it over
|
|
sleep 2
|
|
run dolt sql -q "SELECT (SELECT COUNT(*) FROM totals) > 0;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 " ]] || false
|
|
}
|
|
|
|
@test "events: restarting a sql-server correctly schedules existing events" {
|
|
# Create the recurring event and make sure it runs at least once
|
|
dolt sql -q "CREATE EVENT eventTest1 ON SCHEDULE EVERY 1 SECOND STARTS CURRENT_TIMESTAMP DO INSERT INTO totals (int_col) VALUES (111);"
|
|
sleep 1
|
|
run dolt sql -q "SELECT (SELECT COUNT(*) FROM totals) > 0;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 " ]] || false
|
|
|
|
# Stop the sql-server, truncate the totals table, and assert it's empty
|
|
stop_sql_server 1
|
|
dolt sql -q "truncate totals;"
|
|
run dolt sql -q "SELECT (SELECT COUNT(*) FROM totals) > 0;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| false " ]] || false
|
|
|
|
# Restart the server and assert that the event gets scheduled and executed again
|
|
start_sql_server
|
|
sleep 1
|
|
run dolt sql -q "SELECT (SELECT COUNT(*) FROM totals) > 0;"
|
|
[ $status -eq 0 ]
|
|
[[ $output =~ "| 1 " ]] || false
|
|
}
|