#!/usr/bin/env bats load $BATS_TEST_DIRNAME/helper/common.bash setup() { setup_common dolt sql < export.csv run wc -l export.csv [ "$status" -eq 0 ] [[ "$output" =~ "2 export.csv" ]] || false } @test "export-tables: dolt table SQL export" { dolt sql -q "insert into test_int values (0, 1, 2, 3, 4, 5)" run dolt table export test_int export.sql [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false [ -f export.sql ] diff --strip-trailing-cr $BATS_TEST_DIRNAME/helper/1pk5col-ints.sql export.sql # string columns dolt sql -q "create table strings (a varchar(10) primary key, b char(10))" dolt sql -q "insert into strings values ('abc', '123'), ('def', '456')" dolt add . dolt commit -am "Checkpoint" dolt table export strings -f export.sql dolt sql < export.sql run dolt status [[ "$output" =~ "working tree clean" ]] || false # enum columns dolt sql -q "create table enums (a varchar(10) primary key, b enum('one','two','three'))" dolt sql -q "insert into enums values ('abc', 'one'), ('def', 'two')" dolt add . dolt commit -am "Checkpoint" dolt table export enums -f export.sql dolt sql < export.sql run dolt status [[ "$output" =~ "working tree clean" ]] || false # set columns dolt sql < one_mod.sql dolt sql < one_mod.sql dolt sql < two.sql dolt table export one one_new.sql dolt table export two two_new.sql run diff one.sql one_new.sql [ "$status" -eq 0 ] [[ "$output" -eq "" ]] || false run diff two.sql two_new.sql [ "$status" -eq 0 ] [[ "$output" -eq "" ]] || false } @test "export-tables: export a table with a string with commas to csv" { run dolt sql -q "insert into test_string values ('tim', 'is', 'super', 'duper', 'rad', 'a,b,c,d,e')" [ "$status" -eq 0 ] run dolt table export test_string export.csv [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false grep -E \"a,b,c,d,e\" export.csv } @test "export-tables: export a table with a string with double quotes to csv" { run dolt sql -q 'insert into test_string (pk,c1,c5) values ("this", "is", "a ""quotation""");' [ "$status" -eq 0 ] run dolt table export test_string export.csv [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false grep '"a ""quotation"""' export.csv } @test "export-tables: export a table with a string with new lines to csv" { run dolt sql -q 'insert into test_string (pk,c1,c5) values ("this", "is", "a new \n line");' [ "$status" -eq 0 ] run dolt table export test_string export.csv [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false # output will be slit over two lines grep 'this,is,,,,"a new ' export.csv grep ' line"' export.csv } @test "export-tables: table with column with not null constraint can be exported and reimported" { dolt sql -q "CREATE TABLE person_info(name VARCHAR(255) NOT NULL,location VARCHAR(255) NOT NULL,age BIGINT NOT NULL,PRIMARY KEY (name));" dolt add . dolt commit -m 'add person_info table' dolt sql -q "INSERT INTO person_info (name, location, age) VALUES ('kevern smith', 'los angeles', 21);" dolt sql -q "INSERT INTO person_info (name, location, age) VALUES ('barbara smith', 'los angeles', 24);" # insert empty value in not null column dolt sql -q "INSERT INTO person_info (name, location, age) VALUES ('gary busy', '', 900);" dolt sql -q "INSERT INTO person_info (name, location, age) VALUES ('the tampa bay buccs', 'florida', 123);" dolt sql -q "INSERT INTO person_info (name, location, age) VALUES ('michael fakeperson', 'fake city', 39);" # create csvs dolt sql -r csv -q 'select * from person_info' > sql-csv.csv dolt table export person_info export-csv.csv dolt checkout person_info run dolt table import -u person_info sql-csv.csv [ "$status" -eq 0 ] run dolt table import -u person_info export-csv.csv [ "$status" -eq 0 ] } @test "export-tables: export a table with a json string to csv" { dolt sql -q "create table t2 (id int primary key, j JSON)" dolt sql -q "insert into t2 values (0, '[\"hi\"]')" run dolt table export t2 export.csv [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false # output will be split over two lines grep 'id,j' export.csv grep '"\[""hi""\]"' export.csv } @test "export-tables: uint schema parsing for writer_test.go backwards compatibility" { dolt sql -q "create table t2 (name text, age int unsigned, title text)" dolt sql -q "insert into t2 values ('Bill Billerson', 32, 'Senior Dufus')" run dolt table export t2 export.csv [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false # output will be split over two lines grep 'name,age,title' export.csv grep 'Bill Billerson,32,Senior Dufus' export.csv } @test "export-tables: exporting a table with datetimes can be reimported" { dolt sql -q "create table timetable(pk int primary key, time datetime)" dolt sql -q "insert into timetable values (1, '2021-06-02 15:37:24');" run dolt table export -f timetable export.csv [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false # reimport the data dolt table rm timetable run dolt table import -c --pk=pk timetable export.csv [ "$status" -eq 0 ] run dolt sql -q "SELECT * FROM timetable" -r csv [[ "$output" =~ "1,2021-06-02 15:37:24" ]] || false } @test "export-tables: parquet file export check with parquet cli" { skiponwindows "Missing dependencies" dolt sql -q "CREATE TABLE test_table (pk int primary key, col1 text, col2 int);" dolt sql -q "INSERT INTO test_table VALUES (1, 'row1', 22), (2, 'row2', 33), (3, 'row3', 22);" run dolt table export -f test_table result.parquet [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false [ -f result.parquet ] run parquet cat result.parquet [ "$status" -eq 0 ] row1='{"pk": 1, "col1": "row1", "col2": 22}' row2='{"pk": 2, "col1": "row2", "col2": 33}' row3='{"pk": 3, "col1": "row3", "col2": 22}' [ "${lines[0]}" = "$row1" ] [ "${lines[1]}" = "$row2" ] [ "${lines[2]}" = "$row3" ] } @test "export-tables: parquet file export compare pandas and pyarrow reads" { dolt sql -q "CREATE TABLE test_table (pk int primary key, col1 text, col2 int);" dolt sql -q "INSERT INTO test_table VALUES (1, 'row1', 22), (2, 'row2', 33), (3, 'row3', 22);" run dolt table export -f test_table result.parquet [ "$status" -eq 0 ] [[ "$output" =~ "Successfully exported data." ]] || false [ -f result.parquet ] echo "import pandas as pd df = pd.read_parquet('result.parquet') print(df) " > pandas.py run python3 pandas.py > pandas.txt [ -f pandas.txt ] echo "import pyarrow.parquet as pq table = pq.read_table('result.parquet') print(table.to_pandas()) " > arrow.py run python3 arrow.py > pyarrow.txt [ -f pyarrow.txt ] run diff pandas.txt pyarrow.txt [ "$status" -eq 0 ] [[ "$output" = "" ]] || false } @test "export-tables: table export datetime, bool, enum types to parquet" { skiponwindows "Missing dependencies" dolt sql < pandas_test.py run python3 pandas_test.py panda_result=$output echo "import pyarrow.parquet as pq table = pq.read_table('dt.parquet') print(table.to_pandas()) " > arrow_test.py run python3 arrow_test.py [ "$output" = "$panda_result" ] echo "import pandas as pd df = pd.read_parquet('dt.parquet') print(pd.to_timedelta(df.at[0, 'v2'])) " > timespan_test.py run python3 timespan_test.py [[ "$output" =~ "-1 days +12:48:49" ]] || false } @test "export-tables: table export more types to parquet" { skiponwindows "Missing dependencies" dolt sql <