#!/usr/bin/env bats load $BATS_TEST_DIRNAME/helper/common.bash setup() { setup_common dolt sql <=5" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "11" ]] || false run dolt sql -q "select pk from one_pk where c3-c2-c1>=5" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "11" ]] || false run dolt sql -q "select pk from one_pk where c2+c1<=5" [ $status -eq 0 ] [ "${#lines[@]}" -eq 6 ] [[ "$output" =~ "0" ]] || false [[ "$output" =~ "11" ]] || false } @test "sql order by and limit" { run dolt sql -q "select * from one_pk order by pk limit 1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ " 0 " ]] || false [[ ! "$output" =~ " 10 " ]] || false run dolt sql -q "select * from one_pk order by pk limit 0,1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ " 0 " ]] || false [[ ! "$output" =~ " 10 " ]] || false run dolt sql -q "select * from one_pk order by pk limit 1,1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ " 10 " ]] || false [[ ! "$output" =~ " 0 " ]] || false run dolt sql -q "select * from one_pk order by pk limit 1,0" [ $status -eq 0 ] [ "${#lines[@]}" -eq 4 ] [[ ! "$output" =~ " 0 " ]] || false run dolt sql -q "select * from one_pk order by pk desc limit 1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "30" ]] || false [[ ! "$output" =~ "10" ]] || false run dolt sql -q "select * from two_pk order by pk1, pk2 desc limit 1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "10" ]] || false run dolt sql -q "select pk,c2 from one_pk order by c1 limit 1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "0" ]] || false [[ ! "$output" =~ "10" ]] || false run dolt sql -q "select * from one_pk,two_pk order by pk1,pk2,pk limit 1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "0" ]] || false [[ ! "$output" =~ "10" ]] || false dolt sql -q "select * from one_pk join two_pk order by pk1,pk2,pk limit 1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "0" ]] || false [[ ! "$output" =~ "10" ]] || false run dolt sql -q "select * from one_pk order by limit 1" [ $status -eq 1 ] run dolt sql -q "select * from one_pk order by bad limit 1" [ $status -eq 1 ] [[ "$output" =~ "column \"bad\" could not be found" ]] || false run dolt sql -q "select * from one_pk order pk by limit" [ $status -eq 1 ] } @test "sql limit less than zero" { run dolt sql -q "select * from one_pk order by pk limit -1" [ $status -eq 1 ] [[ "$output" =~ "unsupported syntax: LIMIT must be >= 0" ]] || false run dolt sql -q "select * from one_pk order by pk limit -2" [ $status -eq 1 ] [[ "$output" =~ "unsupported syntax: LIMIT must be >= 0" ]] || false run dolt sql -q "select * from one_pk order by pk limit -1,1" [ $status -eq 1 ] [[ "$output" =~ "unsupported syntax: OFFSET must be >= 0" ]] || false } @test "addition on both left and right sides of comparison operator" { dolt sql -q "insert into one_pk (pk,c1,c2,c3,c4,c5) values (11,5,5,10,15,20)" run dolt sql -q "select pk from one_pk where c2+c1<=5+5" [ $status -eq 0 ] [ "${#lines[@]}" -eq 6 ] [[ "$output" =~ 0 ]] || false [[ "$output" =~ 11 ]] || false } @test "select with in list" { run dolt sql -q "select pk from one_pk where c1 in (10,20)" [ $status -eq 0 ] [ "${#lines[@]}" -eq 6 ] [[ "$output" =~ "1" ]] || false [[ "$output" =~ "2" ]] || false run dolt sql -q "select pk from one_pk where c1 in (11,21)" [ $status -eq 0 ] [ "${#lines[@]}" -eq 4 ] run dolt sql -q "select pk from one_pk where c1 not in (10,20)" [ $status -eq 0 ] [ "${#lines[@]}" -eq 6 ] [[ "$output" =~ "0" ]] || false [[ "$output" =~ "3" ]] || false run dolt sql -q "select pk from one_pk where c1 not in (10,20) and c1 in (30)" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "3" ]] || false } @test "sql parser does not support empty list" { run dolt sql -q "select pk from one_pk where c1 not in ()" [ $status -eq 1 ] [[ "$output" =~ "Error parsing SQL" ]] || false } @test "sql addition in join statement" { run dolt sql -q "select * from one_pk join two_pk on pk1-pk>0 and pk2<1" [ $status -eq 0 ] [ "${#lines[@]}" -eq 5 ] [[ "$output" =~ "20" ]] || false } @test "leave off table name in select" { dolt sql -q "insert into one_pk (pk,c1,c2) values (11,0,0)" run dolt sql -q "select pk where c3 is null" [ $status -eq 1 ] [[ "$output" =~ "column \"c3\" could not be found in any table in scope" ]] || false } @test "sql show tables" { run dolt sql -q "show tables" [ $status -eq 0 ] echo ${#lines[@]} [ "${#lines[@]}" -eq 7 ] [[ "$output" =~ "one_pk" ]] || false [[ "$output" =~ "two_pk" ]] || false [[ "$output" =~ "has_datetimes" ]] || false } @test "show tables AS OF" { dolt add .; dolt commit -m 'commit tables' dolt sql < DATE_SUB('2020-02-18 00:00:00', INTERVAL 2 DAY)" [ $status -eq 0 ] [[ "$output" =~ "17 " ]] || false run dolt sql -q "select * from has_datetimes where date_created > DATE_ADD('2020-02-14 00:00:00', INTERVAL 2 DAY)" [ $status -eq 0 ] [[ "$output" =~ "17 " ]] || false } @test "sql update a datetime column" { dolt sql -q "insert into has_datetimes (pk) values (1)" run dolt sql -q "update has_datetimes set date_created='2020-02-11 00:00:00' where pk=1" [ $status -eq 0 ] [[ ! "$output" =~ "Expected GetField expression" ]] || false } @test "sql group by statements" { dolt sql -q "insert into one_pk (pk,c1,c2,c3,c4,c5) values (4,0,0,0,0,0),(5,0,0,0,0,0)" run dolt sql -q "select max(pk) from one_pk group by c1" [ $status -eq 0 ] [[ "$output" =~ " 5 " ]] || false [[ ! "$output" =~ " 4 " ]] || false run dolt sql -q "select max(pk), min(c2) from one_pk group by c1" [ $status -eq 0 ] [[ "$output" =~ " 5 " ]] || false [[ "$output" =~ " 0 " ]] || false [[ ! "$output" =~ " 4 " ]] || false run dolt sql -q "select max(pk),c2 from one_pk group by c1" [ $status -eq 1 ] [[ "$output" =~ "doesn't appear in the grouping columns" ]] || false skip "group by behavior is inconsistent" run dolt sql -q "select max(pk),c2 from one_pk group by c1 limit 1" [ $status -eq 1 ] [[ "$output" =~ "doesn't appear in the grouping columns" ]] || false run dolt sql -q "select max(pk) as broke_group_by, c2 from one_pk group by c1" [ $status -eq 1 ] [[ "$output" =~ "doesn't appear in the grouping columns" ]] || false } @test "sql substr() and cast() functions" { run dolt sql -q "select substr(cast(date_created as char), 1, 4) from has_datetimes" [ $status -eq 0 ] [[ "$output" =~ " 2020 " ]] || false [[ ! "$output" =~ "17" ]] || false } @test "sql divide by zero does not panic" { run dolt sql -q "select 1/0 from dual" [ $status -eq 0 ] echo $output [[ "$output" =~ "NULL" ]] || false [[ ! "$output" =~ "panic: " ]] || false run dolt sql -q "select 1.0/0.0 from dual" [ $status -eq 0 ] [[ "$output" =~ "NULL" ]] || false [[ ! "$output" =~ "panic: " ]] || false run dolt sql -q "select 1 div 0 from dual" [ $status -eq 0 ] [[ "$output" =~ "NULL" ]] || false [[ ! "$output" =~ "panic: " ]] || false } @test "sql delete all rows in table" { run dolt sql <