#!/usr/bin/env bats load $BATS_TEST_DIRNAME/helper/common.bash load $BATS_TEST_DIRNAME/helper/query-server-common.bash make_repo() { mkdir "$1" cd "$1" dolt init cd .. } setup() { skiponwindows "tests are flaky on Windows" if [ "$SQL_ENGINE" = "remote-engine" ]; then skip "This test tests remote connections directly, SQL_ENGINE is not needed." fi setup_no_dolt_init make_repo repo1 make_repo repo2 } teardown() { stop_sql_server 1 && sleep 0.5 rm -rf $BATS_TMPDIR/sql-server-test$$ teardown_common } @test "sql-server: innodb_autoinc_lock_mode is set to 2" { # assert that loglevel on command line is not case sensitive cd repo1 PORT=$( definePORT ) # assert that innodb_autoinc_lock_mode is set to 2 cat > config.yml <', '-Am', 'committing as barbie');" run dolt -u user1 sql -q "select committer, email, message from dolt_log limit 1;" [ $status -eq 0 ] [[ $output =~ "| barbie | barbie@plastic.com | committing as barbie |" ]] || false } @test "sql-server: can create savepoint when no database is selected" { skiponwindows "Missing dependencies" mkdir my-db cd my-db dolt init cd .. SAVEPOINT_QUERY=$(cat <<'EOF' START TRANSACTION; SAVEPOINT tx1; EOF ) start_sql_server >> server_log.txt 2>&1 run dolt sql -q "$SAVEPOINT_QUERY" [ $status -eq 0 ] } @test "sql-server: server with no dbs yet should be able to clone" { # make directories outside of the existing init'ed dolt repos to ensure that # we are starting a sql-server with no existing dolt databases inside it tempDir=$(mktemp -d) cd $tempDir mkdir empty_server mkdir remote # create a file remote to clone later cd $BATS_TMPDIR/dolt-repo-$$/repo1 dolt remote add remote01 file:///$tempDir/remote dolt push remote01 main # start the server and ensure there are no databases yet cd $tempDir/empty_server start_sql_server run dolt sql -q "show databases" [ $status -eq 0 ] [[ $output =~ information_schema ]] || false [[ $output =~ mysql ]] || false # verify that dolt_clone works dolt sql -q "create database test01" dolt --use-db 'test01' sql -q "call dolt_clone('file:///$tempDir/remote')" } @test "sql-server: loglevels are case insensitive" { # assert that loglevel on command line is not case sensitive cd repo1 PORT=$( definePORT ) dolt sql-server --loglevel TrAcE --port=$PORT --user dolt --socket "dolt.$PORT.sock" > log.txt 2>&1 & SERVER_PID=$! wait_for_connection $PORT 8500 dolt sql -q "show databases;" stop_sql_server # assert that loglevel in yaml config is not case sensitive cat >config.yml < log.txt 2>&1 & SERVER_PID=$! sleep 5 run dolt --user=dolt --password=wrongpassword sql -q "select 1" [ "$status" -eq 1 ] run grep 'Error authenticating user' log.txt [ "$status" -eq 0 ] [ "${#lines[@]}" -eq 2 ] } @test "sql-server: Database specific system variables should be loaded" { cd repo1 dolt branch dev dolt branch other start_sql_server dolt sql -q "SET PERSIST repo1_default_branch = 'dev'" stop_sql_server start_sql_server run dolt --use-db repo1 sql -q "SELECT @@repo1_default_branch;" [ $status -eq 0 ] [[ $output =~ "@@repo1_default_branch" ]] || false [[ $output =~ "dev" ]] || false } @test "sql-server: user session variables from config" { cd repo1 echo " privilege_file: privs.json user_session_vars: - name: user0 vars: aws_credentials_file: /Users/user0/.aws/config aws_credentials_profile: default - name: user1 vars: aws_credentials_file: /Users/user1/.aws/config aws_credentials_profile: lddev - name: user3 vars: autocommit: 0" > server.yaml dolt --privilege-file=privs.json sql -q "CREATE USER dolt@'127.0.0.1'" dolt --privilege-file=privs.json sql -q "CREATE USER user0@'127.0.0.1' IDENTIFIED BY 'pass0'" dolt --privilege-file=privs.json sql -q "CREATE USER user1@'127.0.0.1' IDENTIFIED BY 'pass1'" dolt --privilege-file=privs.json sql -q "CREATE USER user2@'127.0.0.1' IDENTIFIED BY 'pass2'" dolt --privilege-file=privs.json sql -q "CREATE USER user3@'127.0.0.1' IDENTIFIED BY 'pass3'" start_sql_server_with_config "" server.yaml run dolt --host=127.0.0.1 --port=$PORT --no-tls --user=user0 --password=pass0 sql -q "SELECT @@aws_credentials_file, @@aws_credentials_profile;" [[ "$output" =~ /Users/user0/.aws/config.*default ]] || false run dolt --host=127.0.0.1 --port=$PORT --no-tls --user=user1 --password=pass1 sql -q "SELECT @@aws_credentials_file, @@aws_credentials_profile;" [[ "$output" =~ /Users/user1/.aws/config.*lddev ]] || false run dolt --host=127.0.0.1 --port=$PORT --no-tls --user=user2 --password=pass2 sql -q "SELECT @@aws_credentials_file, @@aws_credentials_profile;" [[ "$output" =~ " " ]] || false run dolt --host=127.0.0.1 --port=$PORT --no-tls --user=user2 --password=pass2 sql -q "SET @@aws_credentials_file='/Users/should_fail';" [[ "$output" =~ "Variable 'aws_credentials_file' is a read only variable" ]] || false run dolt --host=127.0.0.1 --port=$PORT --no-tls --user=user3 --password=pass3 sql -q "SELECT @@autocommit;" [[ "$output" =~ "0" ]] || false } @test "sql-server: read-only mode" { skiponwindows "Missing dependencies" # Create a second branch to test `call dolt_checkout()` # and push to a remote to test `dolt status` cd repo1 dolt sql -q "call dolt_branch('other');" mkdir ../repo1-remote dolt remote add origin file://../repo1-remote dolt push origin main # Start up the server in read-only mode start_sql_server_with_args "--readonly" "--user dolt" # Assert that we can still checkout other branches and run dolt status # while the sql-server is running in read-only mode dolt sql -q "call dolt_checkout('other');" dolt sql -q "call dolt_count_commits('--from', 'HEAD', '--to', 'HEAD');" dolt status } @test "sql-server: inspect sql-server using CLI" { skiponwindows "Missing dependencies" cd repo1 start_sql_server repo1 # No tables at the start run dolt ls [ "$status" -eq 0 ] [[ "$output" =~ "No tables in working set" ]] || false dolt sql -q "CREATE TABLE one_pk ( pk BIGINT NOT NULL, c1 BIGINT, c2 BIGINT, PRIMARY KEY (pk))" run dolt ls [ "$status" -eq 0 ] [[ "$output" =~ "one_pk" ]] || false # Add rows on the command line run dolt --verbose-engine-setup --user=dolt sql -q "insert into one_pk values (1,1,1)" [ "$status" -eq 0 ] [[ "$output" =~ "starting remote mode" ]] || false run dolt sql -q "SELECT * FROM one_pk" [ $status -eq 0 ] [[ $output =~ " 1 " ]] || false # Test import as well (used by doltpy) echo 'pk,c1,c2' > import.csv echo '2,2,2' >> import.csv run dolt table import -u one_pk import.csv [ "$status" -eq 1 ] run dolt sql -q "SELECT * FROM one_pk" [ $status -eq 0 ] ! [[ $output =~ " 2 " ]] || false } @test "sql-server: test reset_hard" { skiponwindows "Missing dependencies" cd repo1 dolt sql <');" run dolt ls [ "$status" -eq 0 ] [[ "$output" =~ "one_pk" ]] || false run dolt --verbose-engine-setup --user=dolt --use-db repo1 sql -q "drop table one_pk" [ "$status" -eq 0 ] [[ "$output" =~ "starting remote mode" ]] || false dolt sql -q "call dolt_add('.')" dolt sql -q "call dolt_commit('-am', 'Dropped table one_pk')" run dolt ls [ "$status" -eq 0 ] ! [[ "$output" =~ "one_pk" ]] || false } @test "sql-server: connect to another branch with connection string" { skiponwindows "Missing dependencies" cd repo1 dolt checkout -b "feature-branch" dolt checkout main start_sql_server repo1 dolt --use-db "repo1/feature-branch" sql -q "CREATE TABLE test ( pk int, c1 int, PRIMARY KEY (pk) )" run dolt sql -q "SHOW Tables" [ $status -eq 0 ] [ "${#lines[@]}" -eq 0 ] run dolt --use-db "repo1/feature-branch" sql -q "SHOW Tables" [ $status -eq 0 ] [[ $output =~ "feature-branch" ]] || false [[ $output =~ "test" ]] || false } @test "sql-server: connect to a commit with connection string" { skiponwindows "Missing dependencies" cd repo1 dolt sql -q "create table test (pk int primary key)" dolt add . dolt commit -a -m "Created new table" dolt sql -q "insert into test values (1), (2), (3)" dolt commit -a -m "Inserted 3 values" dolt sql -q "insert into test values (4), (5), (6)" dolt commit -a -m "Inserted 3 more values" start_sql_server repo1 # get the second-to-last commit hash hash=`dolt log | grep commit | cut -d" " -f2 | tail -n+2 | head -n1` run dolt --use-db "repo1/$hash" sql -q"select count(*) from test" [ $status -eq 0 ] [[ $output =~ " 3 " ]] || false # fails run dolt --use-db "repo1/$hash" sql -q"insert into test values (7)" [ $status -ne 0 ] [[ $output =~ "read-only" ]] || false # dolt checkout can't create new branches on a read only database run dolt --use-db "repo1/$hash" sql -q"call dolt_checkout('-b', 'newBranch');" [ $status -ne 0 ] [[ $output =~ "unable to create new branch in a read-only database" ]] || false # server should still be alive after an error run dolt --use-db "repo1/$hash" sql -q"select count(*) from test" [ $status -eq 0 ] [[ $output =~ " 3 " ]] || false } @test "sql-server: SET GLOBAL default branch as ref" { skiponwindows "Missing dependencies" cd repo1 dolt checkout -b "new" dolt checkout main start_sql_server repo1 run dolt sql -q ' CALL dolt_checkout("new"); CREATE TABLE t (a int primary key, b int); INSERT INTO t VALUES (2,2),(3,3);' run dolt sql -q "SHOW Tables" [ $status -eq 0 ] [ "${#lines[@]}" -eq 0 ] dolt sql -q "set GLOBAL repo1_default_branch = 'refs/heads/new'" run dolt sql -q "select @@GLOBAL.repo1_default_branch;" [ $status -eq 0 ] [[ $output =~ "refs/heads/new" ]] || false dolt sql -q "select active_branch()" run dolt sql -q "select active_branch()" [ $status -eq 0 ] [[ $output =~ "new" ]] || false run dolt sql -q "SHOW Tables" [ $status -eq 0 ] [[ $output =~ " t " ]] || false } @test "sql-server: SET GLOBAL default branch as branch name" { skiponwindows "Missing dependencies" cd repo1 dolt checkout -b "new" dolt checkout main start_sql_server repo1 run dolt sql -q ' call dolt_checkout("new"); CREATE TABLE t (a int primary key, b int); INSERT INTO t VALUES (2,2),(3,3);' run dolt sql -q "SHOW Tables" [ $status -eq 0 ] [ "${#lines[@]}" -eq 0 ] dolt sql -q "set GLOBAL repo1_default_branch = 'new'" run dolt sql -q "select @@GLOBAL.repo1_default_branch;" [ $status -eq 0 ] [[ $output =~ " new " ]] || false run dolt sql -q "select active_branch()" [ $status -eq 0 ] [[ $output =~ " new " ]] || false run dolt sql -q "SHOW Tables" [ $status -eq 0 ] [[ $output =~ " t " ]] || false stop_sql_server 1 } @test "sql-server: disable_client_multi_statements makes create trigger work" { skiponwindows "Missing dependencies" cd repo1 dolt sql -q 'create table test (id int primary key)' PORT=$( definePORT ) cat >config.yml <config.yml < server.yaml start_sql_server_with_config repo1 server.yaml dolt --port $PORT --host 0.0.0.0 --no-tls -u dolt --use-db repo1 sql -q "call dolt_fetch()" } # bats test_tags=no_lambda @test "sql-server: run mysql from shell" { skiponwindows "Has dependencies that are not installed on Windows CI" if [[ `uname` == 'Darwin' ]]; then skip "Unsupported in MacOS CI" fi cd repo1 dolt sql -q "create table r1t_one (id1 int primary key, col1 varchar(20));" dolt sql -q "insert into r1t_one values (1,'aaaa'), (2,'bbbb'), (3,'cccc');" dolt sql -q "create table r1t_two (id2 int primary key, col2 varchar(20));" dolt add . dolt commit -am "create two tables" cd ../repo2 dolt sql -q "create table r2t_one (id1 int primary key, col1 varchar(20));" dolt sql -q "create table r2t_two (id2 int primary key, col2 varchar(20));" dolt sql -q "create table r2t_three (id3 int primary key, col3 varchar(20));" dolt sql -q "insert into r2t_three values (4,'dddd'), (3,'gggg'), (2,'eeee'), (1,'ffff');" dolt add . dolt commit -am "create three tables" cd .. start_sql_server_with_args --user dolt -ltrace --no-auto-commit run expect $BATS_TEST_DIRNAME/sql-server-mysql.expect $PORT repo1 [ "$status" -eq 0 ] } @test "sql-server: sql-server info cleanup" { cd repo1 start_sql_server stop_sql_server start_sql_server stop_sql_server } @test "sql-server: sql-server info database" { cd repo1 start_sql_server [[ -f "$PWD/.dolt/sql-server.info" ]] || false PORT=$( definePORT ) run dolt sql-server -P $PORT --socket "dolt.$PORT.sock" [ "$status" -eq 1 ] } @test "sql-server: sql-server sets permissions on sql-server.info" { cd repo1 ! [[ -f "$PWD/.dolt/sql-server.info" ]] || false start_sql_server [[ -f "$PWD/.dolt/sql-server.info" ]] || false if [[ `uname` == 'Darwin' ]]; then run stat -x "$PWD/.dolt/sql-server.info" [[ "$output" =~ "(0600/-rw-------)" ]] || false else run stat "$PWD/.dolt/sql-server.info" [[ "$output" =~ "(0600/-rw-------)" ]] || false fi } @test "sql-server: multi dir sql-server locks out children" { start_sql_server cd repo2 PORT=$( definePORT ) run dolt sql-server -P $PORT --socket "dolt.$PORT.sock" [ "$status" -eq 1 ] } @test "sql-server: sql-server child locks out parent multi dir" { cd repo2 start_sql_server cd .. PORT=$( definePORT ) run dolt sql-server -P $PORT --socket "dolt.$PORT.sock" [ "$status" -eq 1 ] } @test "sql-server: sql-server lock for new databases" { cd repo1 start_sql_server dolt sql -q "create database newdb" # Verify that we can't start a sql-server from the new database dir cd newdb PORT=$( definePORT ) run dolt sql-server -P $PORT --socket "dolt.$PORT.sock" [ "$status" -eq 1 ] } @test "sql-server: start server without socket flag should set default socket path" { skiponwindows "unix socket is not available on Windows" cd repo2 DEFAULT_DB="repo2" PORT=$( definePORT ) dolt sql-server --port $PORT --user dolt >> log.txt 2>&1 & SERVER_PID=$! wait_for_connection $PORT 8500 cat log.txt run dolt sql -q "select 1 as col1" [ $status -eq 0 ] [[ $output =~ col1 ]] || false [[ $output =~ " 1 " ]] || false run grep '"/tmp/mysql.sock"' log.txt [ "$status" -eq 0 ] [ "${#lines[@]}" -eq 1 ] run dolt --user=dolt sql -q "select 1" [ "$status" -eq 0 ] [[ "$output" =~ "1" ]] || false run dolt sql -q "select 1" [ "$status" -eq 0 ] [[ "$output" =~ "1" ]] || false } @test "sql-server: start server with socket option undefined should set default socket path" { skiponwindows "unix socket is not available on Windows" cd repo2 DEFAULT_DB="repo2" PORT=$( definePORT ) dolt sql-server --port $PORT --user dolt --socket > log.txt 2>&1 & SERVER_PID=$! wait_for_connection $PORT 8500 run dolt sql -q "select 1 as col1" [ $status -eq 0 ] [[ $output =~ col1 ]] || false [[ $output =~ " 1 " ]] || false run grep '"/tmp/mysql.sock"' log.txt [ "$status" -eq 0 ] [ "${#lines[@]}" -eq 1 ] } @test "sql-server: the second server starts without unix socket set up if there is already a file in the socket file path" { skiponwindows "unix socket is not available on Windows" cd repo2 touch mysql.sock run pwd REPO_NAME=$output secondPORT=$( definePORT ) dolt sql-server --port=$secondPORT --socket="$REPO_NAME/mysql.sock" --user dolt > log.txt 2>&1 & SECOND_SERVER_PID=$! run wait_for_connection $secondPORT 8500 [ "$status" -eq 0 ] run grep 'unix socket set up failed: file already in use:' log.txt [ "$status" -eq 0 ] [ "${#lines[@]}" -eq 1 ] # killing the second server should not affect the socket file. kill $SECOND_SERVER_PID [ -f mysql.sock ] } @test "sql-server: start server with yaml config with socket file path defined" { skiponwindows "unix socket is not available on Windows" cd repo2 DEFAULT_DB="repo2" PORT=$( definePORT ) echo " log_level: debug user: name: dolt listener: host: localhost port: $PORT max_connections: 10 socket: dolt.$PORT.sock behavior: autocommit: true dolt_transaction_commit: true" > server.yaml dolt sql-server --config server.yaml > log.txt 2>&1 & SERVER_PID=$! wait_for_connection $PORT 8500 run dolt sql -q "select 1 as col1" [ $status -eq 0 ] [[ $output =~ col1 ]] || false [[ $output =~ " 1 " ]] || false run dolt sql -q "select @@dolt_transaction_commit" [ $status -eq 0 ] [[ $output =~ " 1 " ]] || false run grep "dolt.$PORT.sock" log.txt [ "$status" -eq 0 ] [ "${#lines[@]}" -eq 1 ] } @test "sql-server: sigterm running server and restarting works correctly" { start_sql_server kill -9 $SERVER_PID run ls .dolt [[ "$output" =~ "sql-server.info" ]] || false start_sql_server run dolt sql -q "select 1 as col1" [ $status -eq 0 ] [[ $output =~ col1 ]] || false [[ $output =~ " 1 " ]] || false } @test "sql-server: create a database when no current database is set" { mkdir new_format && cd new_format dolt init PORT=$( definePORT ) dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt --socket "dolt.$PORT.sock" & SERVER_PID=$! # will get killed by teardown_common wait_for_connection $PORT 8500 dolt sql -q "create database mydb1;" stop_sql_server 1 [ -d mydb1 ] cd mydb1 dolt version } @test "sql-server: deleting database directory when a running server is using it does not panic" { skiponwindows "Missing dependencies" mkdir nodb cd nodb start_sql_server >> server_log.txt 2>&1 dolt sql -q "CREATE DATABASE mydb1" dolt sql -q "CREATE DATABASE mydb2" [ -d mydb1 ] [ -d mydb2 ] rm -rf mydb2 run dolt sql -q "SHOW DATABASES" [ $status -eq 0 ] skip "Forcefully deleting a database doesn't cause direct panics, but also doesn't stop the server" run grep "panic" server_log.txt [ "${#lines[@]}" -eq 0 ] run grep "failed to access 'mydb2' database: can no longer find .dolt dir on disk" server_log.txt [ "${#lines[@]}" -eq 1 ] # this tests fails sometimes as the server is stopped from the above error # but stop_sql_server in teardown tries to kill process that is not # running anymore, so start the server again, and it will be stopped in # teardown start_sql_server } @test "sql-server: dropping database that the server is running in should drop only the db itself not its nested dbs" { skiponwindows "Missing dependencies" mkdir mydb cd mydb dolt init start_sql_server >> server_log.txt 2>&1 # 'doltdb' will be nested database inside 'mydb' dolt sql -q "CREATE DATABASE doltdb" run dolt sql -q "SHOW DATABASES" [[ "$output" =~ "mydb" ]] || false [[ "$output" =~ "doltdb" ]] || false dolt sql -q "DROP DATABASE mydb" stop_sql_server 1 [ ! -d .dolt ] run dolt sql -q "SHOW DATABASES" [[ ! "$output" =~ "mydb" ]] || false [[ "$output" =~ "doltdb" ]] || false # nested databases inside dropped database should still exist dolt sql -q "SHOW DATABASES" run dolt sql -q "SHOW DATABASES" [[ "$output" =~ "doltdb" ]] || false [[ ! "$output" =~ "mydb" ]] || false } @test "sql-server: dropping database currently selected and that the server is running in" { skiponwindows "Missing dependencies" mkdir mydb cd mydb dolt init run dolt sql -q "SHOW DATABASES" [[ "$output" =~ "mydb" ]] || false start_sql_server >> server_log.txt 2>&1 dolt sql -q "DROP DATABASE mydb;" run dolt sql -q "SHOW DATABASES" [[ ! "$output" =~ "mydb" ]] || false [ ! -d .dolt ] run dolt sql -q "SHOW DATABASES" [[ ! "$output" =~ "mydb" ]] || false } @test "sql-server: create database, drop it, and then create it again" { skiponwindows "Missing dependencies" mkdir mydbs cd mydbs start_sql_server >> server_log.txt 2>&1 dolt sql -q "CREATE DATABASE mydb1;" [ -d mydb1 ] dolt sql -q "DROP DATABASE mydb1;" [ ! -d mydb1 ] dolt sql -q "CREATE DATABASE mydb1;" [ -d mydb1 ] run dolt sql -q "SHOW DATABASES;" [ $status -eq 0 ] [[ "$output" =~ "mydb1" ]] || false } @test "sql-server: dropping database with '-' in it but replaced with underscore" { skiponwindows "Missing dependencies" export DOLT_DBNAME_REPLACE="true" mkdir my-db cd my-db dolt init cd .. run dolt sql -q "SHOW DATABASES" [[ "$output" =~ "my_db" ]] || false start_sql_server >> server_log.txt 2>&1 dolt sql -q "DROP DATABASE my_db;" run dolt sql -q "SHOW DATABASES" [[ ! "$output" =~ "my_db" ]] || false [ ! -d my-db ] } @test "sql-server: dropping database with '-' in it" { skiponwindows "Missing dependencies" mkdir my-db cd my-db dolt init cd .. run dolt sql -q "SHOW DATABASES" [[ "$output" =~ "my-db" ]] || false start_sql_server >> server_log.txt 2>&1 dolt sql -q "DROP DATABASE \`my-db\`;" run dolt sql -q "SHOW DATABASES" [[ ! "$output" =~ "my-db" ]] || false [ ! -d my-db ] } @test "sql-server: dolt_clone procedure in empty dir" { mkdir rem1 cd repo1 dolt sql -q "CREATE TABLE test (pk INT PRIMARY KEY);" dolt sql -q "INSERT INTO test VALUES (1), (2), (3);" dolt sql -q "CREATE PROCEDURE test() SELECT 42;" dolt add -A dolt commit -m "initial commit" dolt remote add remote1 file://../rem1 dolt push remote1 main cd .. dolt sql -q "call dolt_clone('file://./rem1', 'repo3');" cd repo3 # verify databases run dolt sql -q "show databases;" [ "$status" -eq 0 ] [[ "$output" =~ "repo3" ]] || false run dolt sql -q "select database();" [[ "$output" =~ "repo3" ]] || false # verify data run dolt sql -q "SELECT * FROM test" [ "$status" -eq 0 ] [[ "$output" =~ "1" ]] || false [[ "$output" =~ "2" ]] || false [[ "$output" =~ "3" ]] || false # verify procedure run dolt sql -q "call test()" [ "$status" -eq 0 ] [[ "$output" =~ "42" ]] || false } @test "sql-server: locks made in session should be released on session end" { start_sql_server EXPECTED=$(echo -e "\"GET_LOCK('mylock', 1000)\"\n1\nIS_FREE_LOCK('mylock')\n0") run dolt sql --result-format csv -q "SELECT GET_LOCK('mylock', 1000); SELECT IS_FREE_LOCK('mylock');" [ $status -eq 0 ] [[ "$output" =~ "$EXPECTED" ]] || false EXPECTED=$(echo -e "IS_FREE_LOCK('mylock')\n1") run dolt sql --result-format csv -q "SELECT IS_FREE_LOCK('mylock');" [ $status -eq 0 ] [[ "$output" =~ "$EXPECTED" ]] || false } @test "sql-server: binary literal is printed as hex string for utf8 charset result set" { cd repo1 start_sql_server dolt sql -q "SET character_set_results = utf8; CREATE TABLE mapping(branch_id binary(16) PRIMARY KEY, user_id binary(16) NOT NULL, company_id binary(16) NOT NULL);" run dolt sql -q "EXPLAIN PLAN SELECT m.* FROM mapping m WHERE user_id = uuid_to_bin('1c4c4e33-8ad7-4421-8450-9d5182816ac3');" [ $status -eq 0 ] [[ "$output" =~ "0x1C4C4E338AD7442184509D5182816AC3" ]] || false } @test "sql-server: CALL DOLT_BRANCH -m on session active branch (dolt sql-server)" { cd repo1 dolt branch other start_sql_server run dolt sql -q "call dolt_checkout('other'); call dolt_branch('-m', 'other', 'newOther'); select active_branch();" [ $status -eq 0 ] [[ "$output" =~ "newOther" ]] || false run dolt --user dolt branch [ $status -eq 0 ] [[ "$output" =~ "newOther" ]] || false [[ "$output" =~ "main" ]] || false [[ ! "$output" =~ "other" ]] || false } @test "sql-server: empty server can be connected to using sql with no args" { baseDir=$(mktemp -d) cd $baseDir start_sql_server run dolt sql -q "select current_user" [ $status -eq 0 ] [[ "$output" =~ "__dolt_local_user__@localhost" ]] || false } @test "sql-server: --data-dir respected when creating server lock file" { baseDir=$(mktemp -d) PORT=$( definePORT ) dolt sql-server --data-dir=$baseDir --host 0.0.0.0 --port=$PORT & SERVER_PID=$! SQL_USER='root' wait_for_connection $PORT 8500 run dolt --data-dir=$baseDir sql -q "select current_user" [ $status -eq 0 ] [[ "$output" =~ "__dolt_local_user__@localhost" ]] || false # We create a database here so that the server has exclusive access to this database. # Starting another server attempting to serve it will fail. dolt --data-dir=$baseDir sql -q "create database mydb" cd "$baseDir" run dolt sql-server [ $status -eq 1 ] run dolt sql -q "select current_user" [ $status -eq 0 ] [[ "$output" =~ "__dolt_local_user__@localhost" ]] || false } @test "sql-server: --data-dir used to load persisted system variables" { prevWd=$(pwd) baseDir=$(mktemp -d) # Initialize a Dolt directory and persist a global variable cd $baseDir dolt init dolt sql -q "SET @@PERSIST.log_bin=1;" run cat .dolt/config.json [ $status -eq 0 ] [[ "$output" =~ "\"sqlserver.global.log_bin\":\"1\"" ]] || false # Start a sql-server and make sure the persisted global was loaded cd $prevWd PORT=$( definePORT ) dolt sql-server --data-dir=$baseDir --host 0.0.0.0 --port=$PORT & SERVER_PID=$! SQL_USER='root' wait_for_connection $PORT 7500 run dolt --data-dir=$baseDir sql -q "select @@log_bin" [ $status -eq 0 ] [[ "$output" =~ "1" ]] || false } # Tests that when a Dolt sql-server is running from a directory that hasn't been initialized as a dolt # database, that the CLI gives good error messages. @test "sql-server: dolt CLI commands give good error messages in an uninitialized sql-server dir" { # Start a sql-server from an uninitialized directory PORT=$( definePORT ) dolt sql-server --host 0.0.0.0 --port=$PORT & SERVER_PID=$! SQL_USER='root' wait_for_connection $PORT 7500 # Test various commands to make sure they give a good error message run dolt pull [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt ls [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt rebase [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt stash [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt docs print [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt rebase [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt tag [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt remote [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false run dolt push [ $status -ne 0 ] [[ "$output" =~ "The current directory is not a valid dolt repository." ]] || false # dolt init has a different error message, since the sql-server won't pick up the initialized directory run dolt init [ $status -ne 0 ] [[ "$output" =~ "Detected that a Dolt sql-server is running from this directory." ]] || false [[ "$output" =~ "Stop the sql-server before initializing this directory as a Dolt database." ]] || false } @test "sql-server: fail to start when multiple data dirs found" { skiponwindows "Missing dependencies" mkdir datadir1 mkdir datadir2 # This file is legit, and would work if there was no --data-dir on the cli. cat > config.yml <