From 39979b8f5b26a20ee1f8fb362fd72157e34f4ca3 Mon Sep 17 00:00:00 2001 From: Daylon Wilkins Date: Mon, 21 Sep 2020 02:41:12 -0700 Subject: [PATCH] Moved most commands to use SQL, added CREATE TABLE LIKE, and removed tags from comments. --- bats/1pk5col-ints.bats | 24 +- bats/back-compat.bats | 20 +- bats/column_tags.bats | 318 ++--------- .../test_files/bats/compatibility.bats | 51 +- bats/compatibility/test_files/setup_repo.sh | 14 +- bats/cp-and-mv.bats | 39 +- bats/default-values.bats | 4 +- bats/docs.bats | 7 +- bats/export-tables.bats | 24 +- bats/helper/1pk5col-ints.sql | 14 +- bats/import-create-tables.bats | 28 +- bats/index.bats | 126 ++--- bats/schema-changes.bats | 26 +- bats/schema-export.bats | 33 +- bats/schema-import.bats | 40 +- bats/sql-create-tables.bats | 96 ++-- bats/sql-diff.bats | 3 + bats/sql.bats | 36 +- bats/types.bats | 122 ++--- go/cmd/dolt/commands/diff.go | 30 +- go/cmd/dolt/commands/schcmds/export.go | 56 +- go/cmd/dolt/commands/schcmds/import.go | 2 +- go/cmd/dolt/commands/schcmds/schema.go | 1 + go/cmd/dolt/commands/schcmds/show.go | 23 +- go/cmd/dolt/commands/schcmds/tags.go | 110 ++++ go/cmd/dolt/commands/sql.go | 22 +- go/cmd/dolt/commands/tblcmds/cp.go | 187 +------ go/cmd/dolt/commands/tblcmds/mv.go | 57 +- go/cmd/dolt/commands/tblcmds/rm.go | 38 +- go/go.mod | 2 +- go/go.sum | 62 +++ .../doltcore/doltdb/foreign_key_test.go | 138 +++-- go/libraries/doltcore/doltdb/table.go | 24 + .../doltcore/envtestutils/rebase_tag_test.go | 54 +- .../envtestutils/super_schema_test.go | 53 +- .../doltcore/envtestutils/unique_tags_test.go | 193 ------- .../doltcore/merge/merge_schema_test.go | 149 +++--- go/libraries/doltcore/rowconv/joiner.go | 2 +- .../doltcore/rowconv/row_converter_test.go | 4 +- .../doltcore/schema/alterschema/addcolumn.go | 14 +- .../schema/alterschema/addcolumn_test.go | 2 +- go/libraries/doltcore/schema/col_coll_test.go | 30 +- go/libraries/doltcore/schema/column.go | 9 +- .../schema/encoding/schema_marshaling.go | 5 +- .../schema/encoding/schema_marshaling_test.go | 7 +- go/libraries/doltcore/schema/schema_test.go | 14 +- .../doltcore/schema/super_schema_test.go | 4 +- go/libraries/doltcore/sql/sqltestutil/data.go | 2 +- go/libraries/doltcore/sqle/common_test.go | 14 +- go/libraries/doltcore/sqle/database.go | 22 +- go/libraries/doltcore/sqle/dolt_index.go | 10 +- go/libraries/doltcore/sqle/schema/schema.go | 70 +-- go/libraries/doltcore/sqle/schema_table.go | 8 +- .../doltcore/sqle/schema_util_test.go | 4 +- .../doltcore/sqle/show_create_table.go | 59 ++ go/libraries/doltcore/sqle/sqlddl_test.go | 503 ++++++++---------- .../doltcore/sqle/sqlfmt/row_fmt_test.go | 22 +- .../doltcore/sqle/sqlfmt/schema_fmt.go | 24 +- .../doltcore/sqle/sqlfmt/schema_fmt_test.go | 10 +- go/libraries/doltcore/sqle/tables.go | 115 ++-- .../doltcore/sqle/user_space_database.go | 62 +++ .../table/untyped/sqlexport/sqlwriter.go | 17 +- .../table/untyped/sqlexport/sqlwriter_test.go | 25 +- 63 files changed, 1456 insertions(+), 1828 deletions(-) create mode 100644 go/cmd/dolt/commands/schcmds/tags.go delete mode 100644 go/libraries/doltcore/envtestutils/unique_tags_test.go create mode 100644 go/libraries/doltcore/sqle/show_create_table.go create mode 100644 go/libraries/doltcore/sqle/user_space_database.go diff --git a/bats/1pk5col-ints.bats b/bats/1pk5col-ints.bats index 1742b3ca12..5e08db4f68 100755 --- a/bats/1pk5col-ints.bats +++ b/bats/1pk5col-ints.bats @@ -591,23 +591,23 @@ DELIM [ "$status" -eq 0 ] [[ "$output" =~ "test @ working" ]] || false [[ "$output" =~ "CREATE TABLE \`test\`" ]] || false - [[ "$output" =~ "\`pk\` BIGINT NOT NULL COMMENT 'tag:0'" ]] || false - [[ "$output" =~ "\`c1\` BIGINT COMMENT 'tag:1'" ]] || false - [[ "$output" =~ "\`c2\` BIGINT COMMENT 'tag:2'" ]] || false - [[ "$output" =~ "\`c3\` BIGINT COMMENT 'tag:3'" ]] || false - [[ "$output" =~ "\`c4\` BIGINT COMMENT 'tag:4'" ]] || false - [[ "$output" =~ "\`c5\` BIGINT COMMENT 'tag:5'" ]] || false + [[ "$output" =~ "\`pk\` bigint NOT NULL" ]] || false + [[ "$output" =~ "\`c1\` bigint" ]] || false + [[ "$output" =~ "\`c2\` bigint" ]] || false + [[ "$output" =~ "\`c3\` bigint" ]] || false + [[ "$output" =~ "\`c4\` bigint" ]] || false + [[ "$output" =~ "\`c5\` bigint" ]] || false [[ "$output" =~ "PRIMARY KEY (\`pk\`)" ]] || false run dolt schema show test [ "$status" -eq 0 ] [[ "$output" =~ "test @ working" ]] || false [[ "$output" =~ "CREATE TABLE \`test\`" ]] || false - [[ "$output" =~ "\`pk\` BIGINT NOT NULL COMMENT 'tag:0'" ]] || false - [[ "$output" =~ "\`c1\` BIGINT COMMENT 'tag:1'" ]] || false - [[ "$output" =~ "\`c2\` BIGINT COMMENT 'tag:2'" ]] || false - [[ "$output" =~ "\`c3\` BIGINT COMMENT 'tag:3'" ]] || false - [[ "$output" =~ "\`c4\` BIGINT COMMENT 'tag:4'" ]] || false - [[ "$output" =~ "\`c5\` BIGINT COMMENT 'tag:5'" ]] || false + [[ "$output" =~ "\`pk\` bigint NOT NULL" ]] || false + [[ "$output" =~ "\`c1\` bigint" ]] || false + [[ "$output" =~ "\`c2\` bigint" ]] || false + [[ "$output" =~ "\`c3\` bigint" ]] || false + [[ "$output" =~ "\`c4\` bigint" ]] || false + [[ "$output" =~ "\`c5\` bigint" ]] || false [[ "$output" =~ "PRIMARY KEY (\`pk\`)" ]] || false } diff --git a/bats/back-compat.bats b/bats/back-compat.bats index 581c8f66be..51d7236ff8 100644 --- a/bats/back-compat.bats +++ b/bats/back-compat.bats @@ -24,9 +24,9 @@ teardown() { [[ "$output" =~ "newcolumn" ]] || false run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`pk\` BIGINT NOT NULL COMMENT " ]] || false - [[ "$output" =~ "\`a\` LONGTEXT COMMENT " ]] || false - [[ "$output" =~ "\`b\` DATETIME COMMENT " ]] || false + [[ "$output" =~ "\`pk\` bigint NOT NULL" ]] || false + [[ "$output" =~ "\`a\` longtext" ]] || false + [[ "$output" =~ "\`b\` datetime" ]] || false run dolt sql -q "select * from abc order by pk asc" [ "$status" -eq "0" ] [[ "${lines[3]}" =~ " 1 " ]] || false @@ -35,9 +35,9 @@ teardown() { dolt checkout conflict run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`pk\` BIGINT NOT NULL COMMENT " ]] || false - [[ "$output" =~ "\`a\` LONGTEXT COMMENT " ]] || false - [[ "$output" =~ "\`b\` DATETIME COMMENT " ]] || false + [[ "$output" =~ "\`pk\` bigint NOT NULL" ]] || false + [[ "$output" =~ "\`a\` longtext" ]] || false + [[ "$output" =~ "\`b\` datetime" ]] || false run dolt sql -q "select * from abc order by pk asc" [ "$status" -eq "0" ] [[ "${lines[3]}" =~ " 1 " ]] || false @@ -49,10 +49,10 @@ teardown() { dolt checkout newcolumn run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`pk\` BIGINT NOT NULL COMMENT " ]] || false - [[ "$output" =~ "\`a\` LONGTEXT COMMENT " ]] || false - [[ "$output" =~ "\`b\` DATETIME COMMENT " ]] || false - [[ "$output" =~ "\`c\` BIGINT UNSIGNED COMMENT " ]] || false + [[ "$output" =~ "\`pk\` bigint NOT NULL" ]] || false + [[ "$output" =~ "\`a\` longtext" ]] || false + [[ "$output" =~ "\`b\` datetime" ]] || false + [[ "$output" =~ "\`c\` bigint unsigned" ]] || false run dolt sql -q "select * from abc order by pk asc" [ "$status" -eq "0" ] [[ "${lines[3]}" =~ " 1 " ]] || false diff --git a/bats/column_tags.bats b/bats/column_tags.bats index 07b13d7544..effb8f91d0 100644 --- a/bats/column_tags.bats +++ b/bats/column_tags.bats @@ -9,228 +9,45 @@ teardown() { teardown_common } -@test "Manually specifying tag numbers" { - dolt sql < README.md echo "a license" > LICENSE.md dolt add . dolt commit -m "First commit of docs" - run dolt schema export dolt_docs export.schema - [ "$status" -eq 0 ] run dolt schema import -c --pks=pk dolt_docs `batshelper 1pk5col-ints.csv` [ "$status" -eq 1 ] [[ "$output" =~ "reserved" ]] || false run dolt schema show dolt_docs - [ "$status" -eq 0 ] + [ "$status" -eq 1 ] + [[ "$output" =~ "not found" ]] || false run dolt schema show [ "$status" -eq 0 ] [[ "$output" =~ "No tables in working set" ]] || false diff --git a/bats/export-tables.bats b/bats/export-tables.bats index 6dab1a6e23..f035854500 100644 --- a/bats/export-tables.bats +++ b/bats/export-tables.bats @@ -5,21 +5,21 @@ setup() { setup_common dolt sql < query + echo "----------------------" + cat query + echo "----------------------" dolt checkout firstbranch dolt sql < query dolt add test diff --git a/bats/sql.bats b/bats/sql.bats index 7147f20709..760a527b48 100755 --- a/bats/sql.bats +++ b/bats/sql.bats @@ -497,12 +497,12 @@ SQL dolt sql -q "alter table one_pk modify column c5 bigint" run dolt schema show one_pk [ $status -eq 0 ] - [[ "$output" =~ '`pk` BIGINT NOT NULL COMMENT' ]] || false - [[ "$output" =~ '`c1` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c2` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c3` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c4` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c5` BIGINT COMMENT' ]] || false + [[ "$output" =~ '`pk` bigint NOT NULL' ]] || false + [[ "$output" =~ '`c1` bigint' ]] || false + [[ "$output" =~ '`c2` bigint' ]] || false + [[ "$output" =~ '`c3` bigint' ]] || false + [[ "$output" =~ '`c4` bigint' ]] || false + [[ "$output" =~ '`c5` bigint' ]] || false [[ "$output" =~ 'PRIMARY KEY (`pk`)' ]] || false } @@ -511,27 +511,15 @@ SQL dolt sql -q "alter table one_pk change column c5 c5 bigint" run dolt schema show one_pk [ $status -eq 0 ] - [[ "$output" =~ '`pk` BIGINT NOT NULL COMMENT' ]] || false - [[ "$output" =~ '`c1` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c2` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c3` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c4` BIGINT COMMENT' ]] || false - [[ "$output" =~ '`c5` BIGINT COMMENT' ]] || false + [[ "$output" =~ '`pk` bigint NOT NULL' ]] || false + [[ "$output" =~ '`c1` bigint' ]] || false + [[ "$output" =~ '`c2` bigint' ]] || false + [[ "$output" =~ '`c3` bigint' ]] || false + [[ "$output" =~ '`c4` bigint' ]] || false + [[ "$output" =~ '`c5` bigint' ]] || false [[ "$output" =~ 'PRIMARY KEY (`pk`)' ]] || false } -@test "sql alter table modify column with tag change" { - run dolt sql -q "alter table one_pk modify column c5 bigint comment 'tag:9999'" - [ $status -eq 1 ] - [[ "$output" =~ "cannot change the tag of an existing column" ]] || false -} - -@test "sql alter table change column with tag change" { - run dolt sql -q "alter table one_pk change column c5 c5 bigint comment 'tag:9999'" - [ $status -eq 1 ] - [[ "$output" =~ "cannot change the tag of an existing column" ]] || false -} - @test "sql drop table" { dolt sql -q "drop table one_pk" run dolt ls diff --git a/bats/types.bats b/bats/types.bats index 285aaa9142..04d770d521 100644 --- a/bats/types.bats +++ b/bats/types.bats @@ -42,7 +42,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` BIGINT" ]] || false + [[ "$output" =~ "\`v\` bigint" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 4611686018427387903);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -67,7 +67,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` BIGINT UNSIGNED" ]] || false + [[ "$output" =~ "\`v\` bigint unsigned" ]] || false cat < uint64-max.csv pk,v 0, 18446744073709551615 @@ -100,7 +100,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` BINARY(10)" ]] || false + [[ "$output" =~ "\`v\` binary(10)" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -123,7 +123,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` BIT(10)" ]] || false + [[ "$output" =~ "\`v\` bit(10)" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 511);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -149,7 +149,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` BLOB" ]] || false + [[ "$output" =~ "\`v\` blob" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -170,7 +170,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TINYINT" ]] || false + [[ "$output" =~ "\`v\` tinyint" ]] || false } @test "types: BOOLEAN" { @@ -183,7 +183,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TINYINT" ]] || false + [[ "$output" =~ "\`v\` tinyint" ]] || false dolt sql -q "INSERT INTO test VALUES (1, true);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -204,7 +204,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` CHAR(10)" ]] || false + [[ "$output" =~ "\`v\` char(10)" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -227,7 +227,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` CHAR(10)" ]] || false + [[ "$output" =~ "\`v\` char(10)" ]] || false } @test "types: CHARACTER VARYING(10)" { @@ -240,7 +240,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` VARCHAR(10)" ]] || false + [[ "$output" =~ "\`v\` varchar(10)" ]] || false } @test "types: DATE" { @@ -253,7 +253,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DATE" ]] || false + [[ "$output" =~ "\`v\` date" ]] || false dolt sql -q "INSERT INTO test VALUES (1, '2020-02-10 11:12:13.456789');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -282,7 +282,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DATETIME" ]] || false + [[ "$output" =~ "\`v\` datetime" ]] || false dolt sql -q "INSERT INTO test VALUES (1, '2020-02-10 11:12:13.456789');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -311,7 +311,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(10,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(10,0)" ]] || false } @test "types: DEC(9)" { @@ -324,7 +324,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,0)" ]] || false } @test "types: DEC(9,5)" { @@ -337,7 +337,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,5)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,5)" ]] || false } @test "types: DECIMAL" { @@ -350,7 +350,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(10,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(10,0)" ]] || false } @test "types: DECIMAL(9)" { @@ -363,7 +363,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,0)" ]] || false } @test "types: DECIMAL(9,5)" { @@ -376,7 +376,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,5)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,5)" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 1234.56789);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -399,7 +399,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DOUBLE" ]] || false + [[ "$output" =~ "\`v\` double" ]] || false dolt sql -q "INSERT INTO test VALUES (0, 1.25);" run dolt sql -r csv -q "SELECT * FROM test WHERE pk=0" [ "$status" -eq "0" ] @@ -433,7 +433,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DOUBLE" ]] || false + [[ "$output" =~ "\`v\` double" ]] || false } @test "types: ENUM('a','b','c')" { @@ -446,7 +446,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` ENUM('a','b','c')" ]] || false + [[ "$output" =~ "\`v\` enum('a','b','c')" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'a');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -471,7 +471,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(10,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(10,0)" ]] || false } @test "types: FIXED(9)" { @@ -484,7 +484,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,0)" ]] || false } @test "types: FIXED(9,5)" { @@ -497,7 +497,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,5)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,5)" ]] || false } @test "types: FLOAT" { @@ -510,7 +510,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` FLOAT" ]] || false + [[ "$output" =~ "\`v\` float" ]] || false dolt sql -q "INSERT INTO test VALUES (0, 1.25);" run dolt sql -r csv -q "SELECT * FROM test WHERE pk=0" [ "$status" -eq "0" ] @@ -553,7 +553,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` INT" ]] || false + [[ "$output" =~ "\`v\` int" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 1073741823);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -578,7 +578,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` INT UNSIGNED" ]] || false + [[ "$output" =~ "\`v\` int unsigned" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 2147483647);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -603,7 +603,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` INT" ]] || false + [[ "$output" =~ "\`v\` int" ]] || false } @test "types: INTEGER UNSIGNED" { @@ -616,7 +616,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` INT UNSIGNED" ]] || false + [[ "$output" =~ "\`v\` int unsigned" ]] || false } @test "types: LONG" { @@ -629,7 +629,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` MEDIUMTEXT" ]] || false + [[ "$output" =~ "\`v\` mediumtext" ]] || false } @test "types: LONG VARCHAR" { @@ -642,7 +642,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` MEDIUMTEXT" ]] || false + [[ "$output" =~ "\`v\` mediumtext" ]] || false } @test "types: LONGBLOB" { @@ -656,7 +656,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` LONGBLOB" ]] || false + [[ "$output" =~ "\`v\` longblob" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -677,7 +677,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` LONGTEXT" ]] || false + [[ "$output" =~ "\`v\` longtext" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -699,7 +699,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` MEDIUMBLOB" ]] || false + [[ "$output" =~ "\`v\` mediumblob" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -720,7 +720,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` MEDIUMINT" ]] || false + [[ "$output" =~ "\`v\` mediumint" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 4194303);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -745,7 +745,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` MEDIUMINT UNSIGNED" ]] || false + [[ "$output" =~ "\`v\` mediumint unsigned" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 8388607);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -770,7 +770,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` MEDIUMTEXT" ]] || false + [[ "$output" =~ "\`v\` mediumtext" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -791,7 +791,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` CHAR(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci" ]] || false + [[ "$output" =~ "\`v\` char(10) character set utf8mb3 collate utf8mb3_general_ci" ]] || false } @test "types: NATIONAL CHARACTER(10)" { @@ -804,7 +804,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` CHAR(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci" ]] || false + [[ "$output" =~ "\`v\` char(10) character set utf8mb3 collate utf8mb3_general_ci" ]] || false } @test "types: NATIONAL CHARACTER VARYING(10)" { @@ -817,7 +817,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` VARCHAR(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci" ]] || false + [[ "$output" =~ "\`v\` varchar(10) character set utf8mb3 collate utf8mb3_general_ci" ]] || false } @test "types: NATIONAL VARCHAR(10)" { @@ -830,7 +830,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` VARCHAR(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci" ]] || false + [[ "$output" =~ "\`v\` varchar(10) character set utf8mb3 collate utf8mb3_general_ci" ]] || false } @test "types: NCHAR(10)" { @@ -843,7 +843,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` CHAR(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci" ]] || false + [[ "$output" =~ "\`v\` char(10) character set utf8mb3 collate utf8mb3_general_ci" ]] || false } @test "types: NVARCHAR(10)" { @@ -856,7 +856,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` VARCHAR(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci" ]] || false + [[ "$output" =~ "\`v\` varchar(10) character set utf8mb3 collate utf8mb3_general_ci" ]] || false } @test "types: NUMERIC" { @@ -869,7 +869,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(10,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(10,0)" ]] || false } @test "types: NUMERIC(9)" { @@ -882,7 +882,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,0)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,0)" ]] || false } @test "types: NUMERIC(9,5)" { @@ -895,7 +895,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DECIMAL(9,5)" ]] || false + [[ "$output" =~ "\`v\` decimal(9,5)" ]] || false } @test "types: REAL" { @@ -908,7 +908,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` DOUBLE" ]] || false + [[ "$output" =~ "\`v\` double" ]] || false } @test "types: SET('a','b','c')" { @@ -921,7 +921,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` SET('a','b','c')" ]] || false + [[ "$output" =~ "\`v\` set('a','b','c')" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'b,a');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -947,7 +947,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` SMALLINT" ]] || false + [[ "$output" =~ "\`v\` smallint" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 16383);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -972,7 +972,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` SMALLINT UNSIGNED" ]] || false + [[ "$output" =~ "\`v\` smallint unsigned" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 32767);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -997,7 +997,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TEXT" ]] || false + [[ "$output" =~ "\`v\` text" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1018,7 +1018,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TIME" ]] || false + [[ "$output" =~ "\`v\` time" ]] || false dolt sql -q "INSERT INTO test VALUES (1, '11:22:33.444444');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1047,7 +1047,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TIMESTAMP" ]] || false + [[ "$output" =~ "\`v\` timestamp" ]] || false dolt sql -q "INSERT INTO test VALUES (1, '2020-02-10 11:12:13.456789');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1077,7 +1077,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TINYBLOB" ]] || false + [[ "$output" =~ "\`v\` tinyblob" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1098,7 +1098,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TINYINT" ]] || false + [[ "$output" =~ "\`v\` tinyint" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 63);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1123,7 +1123,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TINYINT UNSIGNED" ]] || false + [[ "$output" =~ "\`v\` tinyint unsigned" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 127);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1148,7 +1148,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` TINYTEXT" ]] || false + [[ "$output" =~ "\`v\` tinytext" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1170,7 +1170,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` VARBINARY(10)" ]] || false + [[ "$output" =~ "\`v\` varbinary(10)" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1193,7 +1193,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` VARCHAR(10)" ]] || false + [[ "$output" =~ "\`v\` varchar(10)" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1216,7 +1216,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` VARCHAR(10) CHARACTER SET utf32 COLLATE utf32_general_ci" ]] || false + [[ "$output" =~ "\`v\` varchar(10) character set utf32 collate utf32_general_ci" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 'abcdefg');" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] @@ -1239,7 +1239,7 @@ CREATE TABLE test ( SQL run dolt schema show [ "$status" -eq "0" ] - [[ "$output" =~ "\`v\` YEAR" ]] || false + [[ "$output" =~ "\`v\` year" ]] || false dolt sql -q "INSERT INTO test VALUES (1, 1901);" run dolt sql -q "SELECT * FROM test" [ "$status" -eq "0" ] diff --git a/go/cmd/dolt/commands/diff.go b/go/cmd/dolt/commands/diff.go index c7ffef793a..0287c005c1 100644 --- a/go/cmd/dolt/commands/diff.go +++ b/go/cmd/dolt/commands/diff.go @@ -138,10 +138,10 @@ func (cmd DiffCmd) createArgParser() *argparser.ArgParser { ap.SupportsFlag(DataFlag, "d", "Show only the data changes, do not show the schema changes (Both shown by default).") ap.SupportsFlag(SchemaFlag, "s", "Show only the schema changes, do not show the data changes (Both shown by default).") ap.SupportsFlag(SummaryFlag, "", "Show summary of data changes") - ap.SupportsString(formatFlag, "r", "result output format", "How to format diff output. Valid values are tabular & sql. Defaults to tabular. ") + ap.SupportsString(FormatFlag, "r", "result output format", "How to format diff output. Valid values are tabular & sql. Defaults to tabular. ") ap.SupportsString(whereParam, "", "column", "filters columns based on values in the diff. See {{.EmphasisLeft}}dolt diff --help{{.EmphasisRight}} for details.") ap.SupportsInt(limitParam, "", "record_count", "limits to the first N diffs.") - ap.SupportsString(queryFlag, "q", "query", "diffs the results of a query at two commits") + ap.SupportsString(QueryFlag, "q", "query", "diffs the results of a query at two commits") return ap } @@ -180,22 +180,22 @@ func (cmd DiffCmd) Exec(ctx context.Context, commandStr string, args []string, d func parseDiffArgs(ctx context.Context, dEnv *env.DoltEnv, apr *argparser.ArgParseResults) (from, to *doltdb.RootValue, dArgs *diffArgs, err error) { dArgs = &diffArgs{} - if q, ok := apr.GetValue(queryFlag); ok { + if q, ok := apr.GetValue(QueryFlag); ok { _, okWhere := apr.GetValue(whereParam) _, okLimit := apr.GetInt(limitParam) switch { case okWhere: - return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", queryFlag, whereParam) + return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", QueryFlag, whereParam) case okLimit: - return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", queryFlag, limitParam) + return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", QueryFlag, limitParam) case apr.Contains(DataFlag): - return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", queryFlag, DataFlag) + return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", QueryFlag, DataFlag) case apr.Contains(SchemaFlag): - return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", queryFlag, SchemaFlag) + return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", QueryFlag, SchemaFlag) case apr.Contains(SummaryFlag): - return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", queryFlag, SummaryFlag) + return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", QueryFlag, SummaryFlag) case apr.Contains(SQLFlag): - return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", queryFlag, SQLFlag) + return nil, nil, nil, fmt.Errorf("arg %s cannot be combined with arg %s", QueryFlag, SQLFlag) } dArgs.query = q } @@ -207,9 +207,9 @@ func parseDiffArgs(ctx context.Context, dEnv *env.DoltEnv, apr *argparser.ArgPar dArgs.diffParts = SchemaOnlyDiff } - f, _ := apr.GetValue(formatFlag) + f, _ := apr.GetValue(FormatFlag) switch strings.ToLower(f) { - case "tablular": + case "tabular": dArgs.diffOutput = TabularDiffOutput case "sql": dArgs.diffOutput = SQLDiffOutput @@ -455,12 +455,12 @@ func tabularSchemaDiff(ctx context.Context, td diff.TableDelta, fromSchemas, toS dff := colDiffs[tag] switch dff.DiffType { case diff.SchDiffNone: - cli.Println(sqlfmt.FmtColWithTag(4, 0, 0, *dff.New)) + cli.Println(sqlfmt.FmtCol(4, 0, 0, *dff.New)) case diff.SchDiffAdded: - cli.Println(color.GreenString("+ " + sqlfmt.FmtColWithTag(2, 0, 0, *dff.New))) + cli.Println(color.GreenString("+ " + sqlfmt.FmtCol(2, 0, 0, *dff.New))) case diff.SchDiffRemoved: // removed from sch2 - cli.Println(color.RedString("- " + sqlfmt.FmtColWithTag(2, 0, 0, *dff.Old))) + cli.Println(color.RedString("- " + sqlfmt.FmtCol(2, 0, 0, *dff.Old))) case diff.SchDiffModified: // changed in sch2 n0, t0 := dff.Old.Name, dff.Old.TypeInfo.ToSqlType().String() @@ -538,7 +538,7 @@ func sqlSchemaDiff(ctx context.Context, td diff.TableDelta, toSchemas map[string if td.IsDrop() { cli.Println(sqlfmt.DropTableStmt(td.FromName)) } else if td.IsAdd() { - cli.Println(sqlfmt.CreateTableStmtWithTags(td.ToName, toSch, td.ToFks, nil)) + cli.Println(sqlfmt.CreateTableStmt(td.ToName, toSch, td.ToFks, nil)) } else { if td.FromName != td.ToName { cli.Println(sqlfmt.RenameTableStmt(td.FromName, td.ToName)) diff --git a/go/cmd/dolt/commands/schcmds/export.go b/go/cmd/dolt/commands/schcmds/export.go index dfd6dfd18b..3be9017476 100644 --- a/go/cmd/dolt/commands/schcmds/export.go +++ b/go/cmd/dolt/commands/schcmds/export.go @@ -20,13 +20,14 @@ import ( "io" "os" + dsqle "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle" + "github.com/liquidata-inc/dolt/go/cmd/dolt/cli" "github.com/liquidata-inc/dolt/go/cmd/dolt/commands" "github.com/liquidata-inc/dolt/go/cmd/dolt/errhand" eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1" "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle/sqlfmt" "github.com/liquidata-inc/dolt/go/libraries/utils/argparser" "github.com/liquidata-inc/dolt/go/libraries/utils/filesys" ) @@ -39,10 +40,6 @@ var schExportDocs = cli.CommandDocumentationContent{ }, } -const ( - withTagsFlag = "with-tags" -) - type ExportCmd struct{} // Name is returns the name of the Dolt cli command. This is what is used on the command line to invoke the command @@ -52,7 +49,7 @@ func (cmd ExportCmd) Name() string { // Description returns a description of the command func (cmd ExportCmd) Description() string { - return "Exports a table's schema." + return "Exports a table's schema in SQL form." } // CreateMarkdown creates a markdown file containing the helptext for the command at the given path @@ -64,8 +61,7 @@ func (cmd ExportCmd) CreateMarkdown(fs filesys.Filesys, path, commandStr string) func (cmd ExportCmd) createArgParser() *argparser.ArgParser { ap := argparser.NewArgParser() ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"table", "table whose schema is being exported."}) - ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"commit", "commit at which point the schema will be displayed."}) - ap.SupportsFlag(withTagsFlag, "", "Include column tags in exported schema") + ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"file", "the file that the schema will be written to."}) return ap } @@ -122,6 +118,9 @@ func exportSchemas(ctx context.Context, apr *argparser.ArgParseResults, root *do var tablesToExport []string var err error if tblName != "" { + if doltdb.HasDoltPrefix(tblName) { + return errhand.BuildDError("%s not found", tblName).Build() + } tablesToExport = []string{tblName} } else { tablesToExport, err = doltdb.GetNonSystemTableNames(ctx, root) @@ -131,7 +130,7 @@ func exportSchemas(ctx context.Context, apr *argparser.ArgParseResults, root *do } for _, tn := range tablesToExport { - verr := exportTblSchema(ctx, tn, root, wr, apr.Contains(withTagsFlag)) + verr := exportTblSchema(ctx, tn, root, wr) if verr != nil { return verr } @@ -140,42 +139,11 @@ func exportSchemas(ctx context.Context, apr *argparser.ArgParseResults, root *do return nil } -func exportTblSchema(ctx context.Context, tblName string, root *doltdb.RootValue, wr io.Writer, withTags bool) errhand.VerboseError { - if has, err := root.HasTable(ctx, tblName); err != nil { - return errhand.BuildDError("unable to read from database").AddCause(err).Build() - } else if !has { - return errhand.BuildDError("table %s not found", tblName).Build() - } - - tbl, _, err := root.GetTable(ctx, tblName) - +func exportTblSchema(ctx context.Context, tblName string, root *doltdb.RootValue, wr io.Writer) errhand.VerboseError { + sqlCtx, engine, _ := dsqle.PrepareCreateTableStmt(ctx, root) + stmt, err := dsqle.GetCreateTableStmt(sqlCtx, engine, tblName) if err != nil { - return errhand.BuildDError("unable to get table").AddCause(err).Build() - } - - sch, err := tbl.GetSchema(ctx) - - if err != nil { - return errhand.BuildDError("error: failed to get schema for table %s", tblName).AddCause(err).Build() - } - - fkc, err := root.GetForeignKeyCollection(ctx) - - if err != nil { - return errhand.BuildDError("error: failed to read foreign key struct").AddCause(err).Build() - } - - declaresFk, _ := fkc.KeysForTable(tblName) - parentSchs, err := root.GetAllSchemas(ctx) - if err != nil { - return errhand.BuildDError("could not read schemas").AddCause(err).Build() - } - - var stmt string - if withTags { - stmt = sqlfmt.CreateTableStmtWithTags(tblName, sch, declaresFk, parentSchs) - } else { - stmt = sqlfmt.CreateTableStmt(tblName, sch, declaresFk, parentSchs) + return errhand.VerboseErrorFromError(err) } _, err = fmt.Fprintln(wr, stmt) diff --git a/go/cmd/dolt/commands/schcmds/import.go b/go/cmd/dolt/commands/schcmds/import.go index d313a28c3d..021178c7dc 100644 --- a/go/cmd/dolt/commands/schcmds/import.go +++ b/go/cmd/dolt/commands/schcmds/import.go @@ -286,7 +286,7 @@ func importSchema(ctx context.Context, dEnv *env.DoltEnv, apr *argparser.ArgPars tblName := impArgs.tableName // inferred schemas have no foreign keys - cli.Println(sqlfmt.CreateTableStmtWithTags(tblName, sch, nil, nil)) + cli.Println(sqlfmt.CreateTableStmt(tblName, sch, nil, nil)) if !apr.Contains(dryRunFlag) { tbl, tblExists, err := root.GetTable(ctx, tblName) diff --git a/go/cmd/dolt/commands/schcmds/schema.go b/go/cmd/dolt/commands/schcmds/schema.go index d4ae5a4228..f19791139d 100644 --- a/go/cmd/dolt/commands/schcmds/schema.go +++ b/go/cmd/dolt/commands/schcmds/schema.go @@ -24,6 +24,7 @@ var Commands = cli.NewSubCommandHandler("schema", "Commands for showing and impo ExportCmd{}, ImportCmd{}, ShowCmd{}, + TagsCmd{}, }) // ValidateTableNameForCreate validates the given table name for creation as a user table, returning an error if the diff --git a/go/cmd/dolt/commands/schcmds/show.go b/go/cmd/dolt/commands/schcmds/show.go index 100f819651..93353b183e 100644 --- a/go/cmd/dolt/commands/schcmds/show.go +++ b/go/cmd/dolt/commands/schcmds/show.go @@ -25,14 +25,14 @@ import ( eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1" "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle/sqlfmt" + dsqle "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle" "github.com/liquidata-inc/dolt/go/libraries/utils/argparser" "github.com/liquidata-inc/dolt/go/libraries/utils/filesys" ) var tblSchemaDocs = cli.CommandDocumentationContent{ ShortDesc: "Shows the schema of one or more tables.", - LongDesc: `{{.EmphasisLeft}}dolt table schema{{.EmphasisRight}} displays the schema of tables at a given commit. If no commit is provided the working set will be used. + + LongDesc: `{{.EmphasisLeft}}dolt schema show{{.EmphasisRight}} displays the schema of tables at a given commit. If no commit is provided the working set will be used. A list of tables can optionally be provided. If it is omitted all table schemas will be shown.`, Synopsis: []string{ @@ -133,15 +133,7 @@ func printSchemas(ctx context.Context, apr *argparser.ArgParseResults, dEnv *env } } - fkc, err := root.GetForeignKeyCollection(ctx) - if err != nil { - return errhand.BuildDError("error: failed to read foreign key struct").AddCause(err).Build() - } - - allSchemas, err := root.GetAllSchemas(ctx) - if err != nil { - return errhand.BuildDError("unable to get schema").AddCause(err).Build() - } + sqlCtx, engine, _ := dsqle.PrepareCreateTableStmt(ctx, root) var notFound []string for _, tblName := range tables { @@ -153,11 +145,12 @@ func printSchemas(ctx context.Context, apr *argparser.ArgParseResults, dEnv *env if !ok { notFound = append(notFound, tblName) } else { - fks, _ := fkc.KeysForTable(tblName) - sch := allSchemas[tblName] - cli.Println(bold.Sprint(tblName), "@", cmStr) - cli.Println(sqlfmt.CreateTableStmtWithTags(tblName, sch, fks, allSchemas)) + stmt, err := dsqle.GetCreateTableStmt(sqlCtx, engine, tblName) + if err != nil { + return errhand.VerboseErrorFromError(err) + } + cli.Println(stmt) cli.Println() } } diff --git a/go/cmd/dolt/commands/schcmds/tags.go b/go/cmd/dolt/commands/schcmds/tags.go new file mode 100644 index 0000000000..bade3d7e92 --- /dev/null +++ b/go/cmd/dolt/commands/schcmds/tags.go @@ -0,0 +1,110 @@ +// Copyright 2020 Liquidata, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package schcmds + +import ( + "context" + "fmt" + "strings" + + "github.com/liquidata-inc/dolt/go/cmd/dolt/cli" + "github.com/liquidata-inc/dolt/go/cmd/dolt/commands" + "github.com/liquidata-inc/dolt/go/cmd/dolt/errhand" + "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" + "github.com/liquidata-inc/dolt/go/libraries/utils/argparser" + "github.com/liquidata-inc/dolt/go/libraries/utils/filesys" +) + +//SELECT table_name AS 'table', column_name AS 'column', SUBSTR(extra, 5) AS tag FROM information_schema.columns WHERE table_name = 'XXX'; + +var tblTagsDocs = cli.CommandDocumentationContent{ + ShortDesc: "Shows the column tags of one or more tables.", + LongDesc: `{{.EmphasisLeft}}dolt schema tags{{.EmphasisRight}} displays the column tags of tables on the working set. + +A list of tables can optionally be provided. If it is omitted then all tables will be shown. If a given table does not exist, then it is ignored.`, + Synopsis: []string{ + "[-r {{.LessThan}}result format{{.GreaterThan}}] [{{.LessThan}}table{{.GreaterThan}}...]", + }, +} + +type TagsCmd struct{} + +var _ cli.Command = TagsCmd{} + +func (cmd TagsCmd) Name() string { + return "tags" +} + +func (cmd TagsCmd) Description() string { + return "Shows the column tags of one or more tables." +} + +func (cmd TagsCmd) CreateMarkdown(fs filesys.Filesys, path, commandStr string) error { + ap := cmd.createArgParser() + return commands.CreateMarkdown(fs, path, cli.GetCommandDocumentation(commandStr, tblTagsDocs, ap)) +} + +func (cmd TagsCmd) createArgParser() *argparser.ArgParser { + ap := argparser.NewArgParser() + ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"table", "table(s) whose tags will be displayed."}) + ap.SupportsString(commands.FormatFlag, "r", "result output format", "How to format result output. Valid values are tabular, csv, json. Defaults to tabular.") + return ap +} + +func (cmd TagsCmd) Exec(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv) int { + ap := cmd.createArgParser() + help, usage := cli.HelpAndUsagePrinters(cli.GetCommandDocumentation(commandStr, tblTagsDocs, ap)) + apr := cli.ParseArgs(ap, args, help) + + tables := apr.Args() + if len(tables) == 0 { + root, verr := commands.GetWorkingWithVErr(dEnv) + if verr != nil { + return commands.HandleVErrAndExitCode(verr, usage) + } + var err error + tables, err = root.GetTableNames(ctx) + + if err != nil { + return commands.HandleVErrAndExitCode(errhand.BuildDError("unable to get table names.").AddCause(err).Build(), usage) + } + + tables = commands.RemoveDocsTbl(tables) + if len(tables) == 0 { + cli.Println("No tables in working set") + return 0 + } + } + for i := 0; i < len(tables); i++ { + tables[i] = fmt.Sprintf("'%s'", tables[i]) + } + + //TODO: implement REGEXP_SUBSTR in go-mysql-server and use it here instead of SUBSTR, as this will eventually break + queryStr := fmt.Sprintf("SELECT table_name AS 'table', column_name AS 'column', "+ + "SUBSTR(extra, 5) AS tag FROM information_schema.columns WHERE table_name IN (%s)", strings.Join(tables, ",")) + + if formatStr, ok := apr.GetValue(commands.FormatFlag); ok { + return commands.SqlCmd{}.Exec(ctx, "", []string{ + fmt.Sprintf(`--%s=%s`, commands.FormatFlag, formatStr), + fmt.Sprintf(`--%s`, commands.QueryFlag), + queryStr + ";", + }, dEnv) + } else { + return commands.SqlCmd{}.Exec(ctx, "", []string{ + fmt.Sprintf(`--%s`, commands.QueryFlag), + queryStr + ";", + }, dEnv) + } +} diff --git a/go/cmd/dolt/commands/sql.go b/go/cmd/dolt/commands/sql.go index 9247638c58..723431a324 100644 --- a/go/cmd/dolt/commands/sql.go +++ b/go/cmd/dolt/commands/sql.go @@ -84,13 +84,13 @@ By default this command uses the dolt data repository in the current working dir } const ( - queryFlag = "query" - formatFlag = "result-format" + QueryFlag = "query" + FormatFlag = "result-format" saveFlag = "save" executeFlag = "execute" listSavedFlag = "list-saved" messageFlag = "message" - batchFlag = "batch" + BatchFlag = "batch" multiDBDirFlag = "multi-db-dir" welcomeMsg = `# Welcome to the DoltSQL shell. # Statements must be terminated with ';'. @@ -120,13 +120,13 @@ func (cmd SqlCmd) CreateMarkdown(fs filesys.Filesys, path, commandStr string) er func (cmd SqlCmd) createArgParser() *argparser.ArgParser { ap := argparser.NewArgParser() ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"commit", "Commit to run read only queries against."}) - ap.SupportsString(queryFlag, "q", "SQL query to run", "Runs a single query and exits") - ap.SupportsString(formatFlag, "r", "result output format", "How to format result output. Valid values are tabular, csv, json. Defaults to tabular. ") + ap.SupportsString(QueryFlag, "q", "SQL query to run", "Runs a single query and exits") + ap.SupportsString(FormatFlag, "r", "result output format", "How to format result output. Valid values are tabular, csv, json. Defaults to tabular. ") ap.SupportsString(saveFlag, "s", "saved query name", "Used with --query, save the query to the query catalog with the name provided. Saved queries can be examined in the dolt_query_catalog system table.") ap.SupportsString(executeFlag, "x", "saved query name", "Executes a saved query with the given name") ap.SupportsFlag(listSavedFlag, "l", "Lists all saved queries") ap.SupportsString(messageFlag, "m", "saved query description", "Used with --query and --save, saves the query with the descriptive message given. See also --name") - ap.SupportsFlag(batchFlag, "b", "batch mode, to run more than one query with --query, separated by ';'. Piping input to sql with no arguments also uses batch mode") + ap.SupportsFlag(BatchFlag, "b", "batch mode, to run more than one query with --query, separated by ';'. Piping input to sql with no arguments also uses batch mode") ap.SupportsString(multiDBDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within ") return ap } @@ -159,7 +159,7 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE var verr errhand.VerboseError format := formatTabular - if formatSr, ok := apr.GetValue(formatFlag); ok { + if formatSr, ok := apr.GetValue(FormatFlag); ok { format, verr = getFormat(formatSr) if verr != nil { return HandleVErrAndExitCode(errhand.VerboseErrorFromError(verr), usage) @@ -254,8 +254,8 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE return HandleVErrAndExitCode(err.(errhand.VerboseError), usage) } - if query, queryOK := apr.GetValue(queryFlag); queryOK { - batchMode := apr.Contains(batchFlag) + if query, queryOK := apr.GetValue(QueryFlag); queryOK { + batchMode := apr.Contains(BatchFlag) if batchMode { batchInput := strings.NewReader(query) @@ -503,10 +503,10 @@ func getFormat(format string) (resultFormat, errhand.VerboseError) { } func validateSqlArgs(apr *argparser.ArgParseResults) error { - _, query := apr.GetValue(queryFlag) + _, query := apr.GetValue(QueryFlag) _, save := apr.GetValue(saveFlag) _, msg := apr.GetValue(messageFlag) - _, batch := apr.GetValue(batchFlag) + _, batch := apr.GetValue(BatchFlag) _, list := apr.GetValue(listSavedFlag) _, execute := apr.GetValue(executeFlag) _, multiDB := apr.GetValue(multiDBDirFlag) diff --git a/go/cmd/dolt/commands/tblcmds/cp.go b/go/cmd/dolt/commands/tblcmds/cp.go index 7c8e9ff2e5..09d6958983 100644 --- a/go/cmd/dolt/commands/tblcmds/cp.go +++ b/go/cmd/dolt/commands/tblcmds/cp.go @@ -16,21 +16,13 @@ package tblcmds import ( "context" - - "github.com/fatih/color" + "fmt" + "io/ioutil" "github.com/liquidata-inc/dolt/go/cmd/dolt/cli" "github.com/liquidata-inc/dolt/go/cmd/dolt/commands" - "github.com/liquidata-inc/dolt/go/cmd/dolt/commands/schcmds" - "github.com/liquidata-inc/dolt/go/cmd/dolt/errhand" eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/mvdata" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/rowconv" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/table" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/table/typed/noms" "github.com/liquidata-inc/dolt/go/libraries/utils/argparser" "github.com/liquidata-inc/dolt/go/libraries/utils/filesys" ) @@ -44,38 +36,10 @@ If a table exists at the target location this command will fail unless the {{.Em All changes will be applied to the working tables and will need to be staged using {{.EmphasisLeft}}dolt add{{.EmphasisRight}} and committed using {{.EmphasisLeft}}dolt commit{{.EmphasisRight}}. `, Synopsis: []string{ - "[-f] [{{.LessThan}}commit{{.GreaterThan}}] {{.LessThan}}oldtable{{.GreaterThan}} {{.LessThan}}newtable{{.GreaterThan}}", + "[-f] {{.LessThan}}oldtable{{.GreaterThan}} {{.LessThan}}newtable{{.GreaterThan}}", }, } -type copyOptions struct { - oldTblName string - newTblName string - contOnErr bool - force bool - Src mvdata.DataLocation - Dest mvdata.DataLocation -} - -func (co copyOptions) checkOverwrite(ctx context.Context, root *doltdb.RootValue, fs filesys.ReadableFS) (bool, error) { - if co.force { - return false, nil - } - return co.Dest.Exists(ctx, root, fs) -} - -func (co copyOptions) WritesToTable() bool { - return true -} - -func (co copyOptions) SrcName() string { - return co.oldTblName -} - -func (co copyOptions) DestName() string { - return co.newTblName -} - type CpCmd struct{} // Name is returns the name of the Dolt cli command. This is what is used on the command line to invoke the command @@ -96,7 +60,6 @@ func (cmd CpCmd) CreateMarkdown(fs filesys.Filesys, path, commandStr string) err func (cmd CpCmd) createArgParser() *argparser.ArgParser { ap := argparser.NewArgParser() - ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"commit", "The state at which point the table will be copied."}) ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"oldtable", "The table being copied."}) ap.ArgListHelp = append(ap.ArgListHelp, [2]string{"newtable", "The destination where the table is being copied to."}) ap.SupportsFlag(forceParam, "f", "If data already exists in the destination, the force flag will allow the target to be overwritten.") @@ -114,140 +77,24 @@ func (cmd CpCmd) Exec(ctx context.Context, commandStr string, args []string, dEn help, usage := cli.HelpAndUsagePrinters(cli.GetCommandDocumentation(commandStr, tblCpDocs, ap)) apr := cli.ParseArgs(ap, args, help) - if apr.NArg() < 2 || apr.NArg() > 3 { + if apr.NArg() != 2 { usage() return 1 } - force := apr.Contains(forceParam) - working, verr := commands.GetWorkingWithVErr(dEnv) - if verr != nil { - return commands.HandleVErrAndExitCode(verr, usage) + oldTbl, newTbl := apr.Arg(0), apr.Arg(1) + + queryStr := "" + if force := apr.Contains(forceParam); force { + queryStr = fmt.Sprintf("DROP TABLE IF EXISTS `%s`;", newTbl) } + queryStr = fmt.Sprintf("%sCREATE TABLE `%s` LIKE `%s`;", queryStr, newTbl, oldTbl) + queryStr = fmt.Sprintf("%sINSERT INTO `%s` SELECT * FROM `%s`;", queryStr, newTbl, oldTbl) - root := working - - var oldTbl, newTbl string - if apr.NArg() == 3 { - var cm *doltdb.Commit - cm, verr = commands.ResolveCommitWithVErr(dEnv, apr.Arg(0)) - if verr != nil { - return commands.HandleVErrAndExitCode(verr, usage) - } - var err error - root, err = cm.GetRootValue() - - if err != nil { - verr = errhand.BuildDError("error: failed to get root value").AddCause(err).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - - oldTbl, newTbl = apr.Arg(1), apr.Arg(2) - } else { - oldTbl, newTbl = apr.Arg(0), apr.Arg(1) - } - - if err := schcmds.ValidateTableNameForCreate(newTbl); err != nil { - return commands.HandleVErrAndExitCode(err, usage) - } - - _, ok, err := root.GetTable(ctx, oldTbl) - - if err != nil { - verr = errhand.BuildDError("error: failed to get table").AddCause(err).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - if !ok { - verr = errhand.BuildDError("Table '%s' not found in root", oldTbl).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - - has, err := working.HasTable(ctx, newTbl) - - if err != nil { - verr = errhand.BuildDError("error: failed to get tables").AddCause(err).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } else if !force && has { - verr = errhand.BuildDError("Data already exists in '%s'. Use -f to overwrite.", newTbl).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - - cpOpts := copyOptions{ - oldTblName: oldTbl, - newTblName: newTbl, - contOnErr: true, - force: force, - Src: mvdata.TableDataLocation{Name: oldTbl}, - Dest: mvdata.TableDataLocation{Name: newTbl}, - } - - mover, verr := newTableCopyDataMover(ctx, root, dEnv.FS, cpOpts, nil) - - if verr != nil { - return commands.HandleVErrAndExitCode(verr, usage) - } - - skipped, verr := mvdata.MoveData(ctx, dEnv, mover, cpOpts) - - if skipped > 0 { - cli.PrintErrln(color.YellowString("Lines skipped: %d", skipped)) - } - if verr != nil { - return commands.HandleVErrAndExitCode(verr, usage) - } - - return commands.HandleVErrAndExitCode(verr, usage) -} - -func newTableCopyDataMover(ctx context.Context, root *doltdb.RootValue, fs filesys.Filesys, co copyOptions, statsCB noms.StatsCB) (*mvdata.DataMover, errhand.VerboseError) { - var rd table.TableReadCloser - var err error - - ow, err := co.checkOverwrite(ctx, root, fs) - if err != nil { - return nil, errhand.VerboseErrorFromError(err) - } - if ow { - return nil, errhand.BuildDError("%s already exists. Use -f to overwrite.", co.DestName()).Build() - } - - rd, srcIsSorted, err := co.Src.NewReader(ctx, root, fs, nil) - - if err != nil { - return nil, errhand.BuildDError("Error creating reader for %s.", co.newTblName).AddCause(err).Build() - } - - defer func() { - if rd != nil { - rd.Close(ctx) - } - }() - - oldTblSch := rd.GetSchema() - cc, err := root.GenerateTagsForNewColColl(ctx, co.newTblName, oldTblSch.GetAllCols()) - - if err != nil { - return nil, errhand.BuildDError("Error create schema for new table %s", co.newTblName).AddCause(err).Build() - } - - newTblSch := schema.SchemaFromCols(cc) - newTblSch.Indexes().Merge(oldTblSch.Indexes().AllIndexes()...) - - transforms, err := mvdata.NameMapTransform(oldTblSch, newTblSch, make(rowconv.NameMapper)) - - if err != nil { - return nil, errhand.BuildDError("Error determining the mapping from input fields to output fields.").AddDetails( - "When attempting to move data from %s to %s, determine the mapping from input fields to output fields.", co.SrcName(), co.DestName()).AddCause(err).Build() - } - - wr, err := co.Dest.NewCreatingWriter(ctx, co, root, fs, srcIsSorted, newTblSch, statsCB) - - if err != nil { - return nil, errhand.BuildDError("Could not create table writer for %s", co.newTblName).AddCause(err).Build() - } - - imp := &mvdata.DataMover{Rd: rd, Transforms: transforms, Wr: wr, ContOnErr: co.contOnErr} - rd = nil - - return imp, nil + cli.CliOut = ioutil.Discard // display nothing on success + return commands.SqlCmd{}.Exec(ctx, "", []string{ + fmt.Sprintf("--%s", commands.BatchFlag), + fmt.Sprintf(`--%s`, commands.QueryFlag), + queryStr, + }, dEnv) } diff --git a/go/cmd/dolt/commands/tblcmds/mv.go b/go/cmd/dolt/commands/tblcmds/mv.go index f30bc56b4d..0014827725 100644 --- a/go/cmd/dolt/commands/tblcmds/mv.go +++ b/go/cmd/dolt/commands/tblcmds/mv.go @@ -16,14 +16,11 @@ package tblcmds import ( "context" - - "github.com/liquidata-inc/dolt/go/cmd/dolt/commands/schcmds" + "fmt" "github.com/liquidata-inc/dolt/go/cmd/dolt/cli" "github.com/liquidata-inc/dolt/go/cmd/dolt/commands" - "github.com/liquidata-inc/dolt/go/cmd/dolt/errhand" eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" "github.com/liquidata-inc/dolt/go/libraries/utils/argparser" "github.com/liquidata-inc/dolt/go/libraries/utils/filesys" @@ -87,51 +84,17 @@ func (cmd MvCmd) Exec(ctx context.Context, commandStr string, args []string, dEn return 1 } - force := apr.Contains(forceParam) - - working, verr := commands.GetWorkingWithVErr(dEnv) - if verr != nil { - return commands.HandleVErrAndExitCode(verr, usage) - } - oldName := apr.Arg(0) newName := apr.Arg(1) - - if doltdb.HasDoltPrefix(oldName) { - return commands.HandleVErrAndExitCode( - errhand.BuildDError("error renaming table %s", oldName).AddCause(doltdb.ErrSystemTableCannotBeModified).Build(), usage) + queryStr := "" + if force := apr.Contains(forceParam); force { + queryStr = fmt.Sprintf("DROP TABLE IF EXISTS `%s`;", newName) } + queryStr = fmt.Sprintf("%sRENAME TABLE `%s` TO `%s`;", queryStr, oldName, newName) - if verr = schcmds.ValidateTableNameForCreate(newName); verr != nil { - return commands.HandleVErrAndExitCode(verr, usage) - } - - _, ok, err := working.GetTable(ctx, oldName) - - if err != nil { - verr = errhand.BuildDError("error: failed to read tables from working set").Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - if !ok { - verr = errhand.BuildDError("Table '%s' not found.", oldName).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - - has, err := working.HasTable(ctx, newName) - - if err != nil { - verr = errhand.BuildDError("error: failed to read tables from working set").AddCause(err).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } else if !force && has { - verr = errhand.BuildDError("Data already exists in '%s'. Use -f to overwrite.", newName).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - - working, err = working.RenameTable(ctx, oldName, newName) - if err != nil { - verr = errhand.BuildDError("Unable to remove '%s'", oldName).Build() - return commands.HandleVErrAndExitCode(verr, usage) - } - - return commands.HandleVErrAndExitCode(commands.UpdateWorkingWithVErr(dEnv, working), usage) + return commands.SqlCmd{}.Exec(ctx, "", []string{ + fmt.Sprintf("--%s", commands.BatchFlag), + fmt.Sprintf(`--%s`, commands.QueryFlag), + queryStr, + }, dEnv) } diff --git a/go/cmd/dolt/commands/tblcmds/rm.go b/go/cmd/dolt/commands/tblcmds/rm.go index 86e9f74918..c6bc50e1c5 100644 --- a/go/cmd/dolt/commands/tblcmds/rm.go +++ b/go/cmd/dolt/commands/tblcmds/rm.go @@ -16,6 +16,8 @@ package tblcmds import ( "context" + "fmt" + "io/ioutil" eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1" "github.com/liquidata-inc/dolt/go/libraries/utils/filesys" @@ -83,33 +85,15 @@ func (cmd RmCmd) Exec(ctx context.Context, commandStr string, args []string, dEn } } - working, verr := commands.GetWorkingWithVErr(dEnv) - if verr != nil { - return exitWithVerr(verr) + queryStr := "" + for _, tableName := range apr.Args() { + queryStr = fmt.Sprintf("%sDROP TABLE `%s`;", queryStr, tableName) } - if verr := commands.ValidateTablesWithVErr(apr.Args(), working); verr != nil { - return exitWithVerr(verr) - } - - if verr := removeTables(ctx, dEnv, apr.Args(), working); verr != nil { - return exitWithVerr(verr) - } - - return 0 -} - -func exitWithVerr(verr errhand.VerboseError) int { - cli.PrintErrln(verr.Verbose()) - return 1 -} - -func removeTables(ctx context.Context, dEnv *env.DoltEnv, tables []string, working *doltdb.RootValue) errhand.VerboseError { - working, err := working.RemoveTables(ctx, tables...) - - if err != nil { - return errhand.BuildDError("Unable to remove table(s)").AddCause(err).Build() - } - - return commands.UpdateWorkingWithVErr(dEnv, working) + cli.CliOut = ioutil.Discard // display nothing on success + return commands.SqlCmd{}.Exec(ctx, "", []string{ + fmt.Sprintf("--%s", commands.BatchFlag), + fmt.Sprintf(`--%s`, commands.QueryFlag), + queryStr, + }, dEnv) } diff --git a/go/go.mod b/go/go.mod index 4f8bed6217..50bba1f488 100644 --- a/go/go.mod +++ b/go/go.mod @@ -46,7 +46,7 @@ require ( github.com/kch42/buzhash v0.0.0-20160816060738-9bdec3dec7c6 github.com/lestrrat-go/strftime v1.0.3 // indirect github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi v0.0.0-20200730200742-c031ec8cba06 - github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200911214625-e81d5c813cb5 + github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200921093816-a2f606c0d13d github.com/liquidata-inc/ishell v0.0.0-20190514193646-693241f1f2a0 github.com/liquidata-inc/mmap-go v1.0.3 github.com/liquidata-inc/sqllogictest/go v0.0.0-20200320151923-b11801f10e15 diff --git a/go/go.sum b/go/go.sum index 3803378c54..b9fe89cb70 100644 --- a/go/go.sum +++ b/go/go.sum @@ -43,6 +43,7 @@ github.com/CAFxX/gcnotifier v0.0.0-20190112062741-224a280d589d/go.mod h1:Rn2zM2M github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1MRDJM= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.4.0+incompatible h1:LZ0OTmlvhCBT0VYUvhGu8Lrc7WqNCj6Zw9HnMi0V6mA= github.com/DataDog/datadog-go v3.4.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -77,6 +78,7 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-metrics v0.3.2 h1:EyUnxyP2yaGpLgMiuyyz8sHnByqeTJUfGs72pdH0i4A= github.com/armon/go-metrics v0.3.2/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -87,6 +89,7 @@ github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:o github.com/attic-labs/kingpin v2.2.7-0.20180312050558-442efcfac769+incompatible h1:wd5mq8xSfwCYd1JpQ309s+3tTlP/gifcG2awOA3x5Vk= github.com/attic-labs/kingpin v2.2.7-0.20180312050558-442efcfac769+incompatible/go.mod h1:Cp18FeDCvsK+cD2QAGkqerGjrgSXLiJWnjHeY2mneBc= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v0.0.0-20180223184012-ebef4262e06a/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.32.6 h1:HoswAabUWgnrUF7X/9dr4WRgrr8DyscxXvTDm7Qw/5c= github.com/aws/aws-sdk-go v1.32.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= @@ -118,17 +121,21 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292/go.mod h1:qRiX68mZX1lGBkTWyp3CLcenw9I94W2dLeRvMzcn9N4= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/blake2 v0.0.0-20150924215134-8d10d0420cbf h1:5ZeQB3mThuz5C2MSER6T5GdtXTF9CMMk42F9BOyRsEQ= github.com/codahale/blake2 v0.0.0-20150924215134-8d10d0420cbf/go.mod h1:BO2rLUAZMrpgh6GBVKi0Gjdqw2MgCtJrtmUdDeZRKjY= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v0.0.0-20170626015032-703663d1f6ed/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -156,6 +163,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -166,10 +174,12 @@ github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:r github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.12.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= @@ -250,6 +260,7 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -281,6 +292,7 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.3.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= @@ -290,13 +302,17 @@ github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20160912153041-2d1e4548da23/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v0.0.0-20161128002007-199c40a060d1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul v1.4.0/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= @@ -308,9 +324,11 @@ github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTME github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90/go.mod h1:o4zcYY1e0GEZI6eSEr+43QDYmuGglw1qSO6qdHUHCgg= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= @@ -331,8 +349,10 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.6 h1:ouPxvwKYaNZe+eTcHxYP0EblPduVLvIPycul+vv8his= github.com/hashicorp/memberlist v0.1.6/go.mod h1:5VDNHjqFMgEcclnwmkCnC99IPwxBmIsxwY8qn+Nl0H4= +github.com/hashicorp/serf v0.0.0-20161207011743-d3a67ab21bc8/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= @@ -344,6 +364,7 @@ github.com/jedib0t/go-pretty v4.3.1-0.20191104025401-85fe5d6a7c4d+incompatible h github.com/jedib0t/go-pretty v4.3.1-0.20191104025401-85fe5d6a7c4d+incompatible/go.mod h1:XemHduiw8R651AF9Pt4FwCTKeG3oo7hrHJAoznj9nag= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= @@ -360,6 +381,7 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= @@ -373,7 +395,11 @@ github.com/kch42/buzhash v0.0.0-20160816060738-9bdec3dec7c6/go.mod h1:UtDV9qK925 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v0.0.0-20180801095237-b50017755d44/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v1.2.0/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.2.0/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= @@ -384,6 +410,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/krishicks/yaml-patch v0.0.10/go.mod h1:Sm5TchwZS6sm7RJoyg87tzxm2ZcKzdRE4Q7TjNhPrME= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.1 h1:o7qz5pmLzPDLyGW4lG6JvTKPUfTFXwe+vOamIYWtnVU= @@ -397,12 +424,19 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200911214625-e81d5c813cb5 h1:iqHHM9uv2NjAoSVc5KQTcFzsV4wb0uwbCIL6ULVM13c= github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200911214625-e81d5c813cb5/go.mod h1:T6gBgEkMsA2WUGPD/J25wuVyX+4Gd2k9mPBta9YDoxY= +github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200916145502-4eafaab16140 h1:ka5fhv0hSfdxEMLyfqZIYYOe04h6p13hoVRKz2BZo/Q= +github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200916145502-4eafaab16140/go.mod h1:T6gBgEkMsA2WUGPD/J25wuVyX+4Gd2k9mPBta9YDoxY= +github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200918120654-0049c3926457 h1:SNt2+HGqlGxQ26CjS8XlUOHk75IIdonNCXVNGFHwFjY= +github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200918120654-0049c3926457/go.mod h1:T6gBgEkMsA2WUGPD/J25wuVyX+4Gd2k9mPBta9YDoxY= +github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200921093816-a2f606c0d13d h1:NX1ZR4S8Ee3Qud8XYYxcbNF/F9Kmr28VTikawaJB+9s= +github.com/liquidata-inc/go-mysql-server v0.6.1-0.20200921093816-a2f606c0d13d/go.mod h1:T6gBgEkMsA2WUGPD/J25wuVyX+4Gd2k9mPBta9YDoxY= github.com/liquidata-inc/ishell v0.0.0-20190514193646-693241f1f2a0 h1:phMgajKClMUiIr+hF2LGt8KRuUa2Vd2GI1sNgHgSXoU= github.com/liquidata-inc/ishell v0.0.0-20190514193646-693241f1f2a0/go.mod h1:YC1rI9k5gx8D02ljlbxDfZe80s/iq8bGvaaQsvR+qxs= github.com/liquidata-inc/mmap-go v1.0.3 h1:2LndAeAtup9rpvUmu4wZSYCsjCQ0Zpc+NqE+6+PnT7g= github.com/liquidata-inc/mmap-go v1.0.3/go.mod h1:w0doE7jfkuDEZyxb/zD3VWnRaQBYx1uDTS816kH8HoY= github.com/liquidata-inc/sqllogictest/go v0.0.0-20200320151923-b11801f10e15 h1:H3RwcYfzkdW4kFh7znTUopcX3XZqnFXm6pcmxSy0mNo= github.com/liquidata-inc/sqllogictest/go v0.0.0-20200320151923-b11801f10e15/go.mod h1:kKRVtyuomkqz15YFRpS0OT8kpsU8y/F3jyiZtvALdKU= +github.com/liquidata-inc/vitess v0.0.0-20200828190113-f278600fb87c/go.mod h1:E8nYT1vcL2NROtFwUN02CiA6cz276CFuB0Q1Zja5CAo= github.com/liquidata-inc/vitess v0.0.0-20200911213404-87f76781a7c7 h1:CGiw+RfbIXsE+BPA8d7WpyvOVJUyw1OzDNxxTMa8qtI= github.com/liquidata-inc/vitess v0.0.0-20200911213404-87f76781a7c7/go.mod h1:8PM478sNETVVNWL2tVW+Uy4LIH31/x/tphLIRPh/hF4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -422,6 +456,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.1/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -435,6 +470,7 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1/go.mod h1:vuvdOZLJuf5HmJAJrKV64MmozrSsk+or0PB5dzdfspg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -466,13 +502,17 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20160115111002-cca8bbc07984/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 h1:Yl0tPBa8QPjGmesFh1D0rDy+q1Twx6FyU7VWHi8wZbI= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852/go.mod h1:eqOVx5Vwu4gd2mmMZvVZsgIqNSaW3xxRThUJ0k/TPk4= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -487,6 +527,7 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v0.0.0-20160824210600-b984ec7fa9ff/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= @@ -509,9 +550,11 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1 h1:FFSuS004yOQEtDdTq+TAOLP5xUq63KqAFYyOi8zA+Y8= @@ -524,16 +567,21 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= @@ -553,6 +601,7 @@ github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFo github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanity-io/litter v1.2.0 h1:DGJO0bxH/+C2EukzOSBmAlxmkhVMGqzvcx/rvySYw9M= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= +github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= @@ -576,6 +625,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= @@ -612,6 +663,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tchap/go-patricia v0.0.0-20160729071656-dd168db6051b/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE= github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM= github.com/tebeka/strftime v0.1.4 h1:e0FKSyxthD1Xk4cIixFPoyfD33u2SbjNngOaaC3ePoU= @@ -630,7 +682,9 @@ github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6 github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= @@ -639,6 +693,7 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/z-division/go-zookeeper v0.0.0-20190128072838-6d7457066b9b/go.mod h1:JNALoWa+nCXR8SmgLluHcBNVJgyejzpKPZk9pX2yXXE= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -672,6 +727,7 @@ go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190128193316-c7b33c32a30b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -679,6 +735,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -776,6 +833,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -790,6 +848,7 @@ golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190926180325-855e68c8590b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -968,6 +1027,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -977,6 +1037,8 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/ini.v1 v1.41.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ldap.v2 v2.5.0/go.mod h1:oI0cpe/D7HRtBQl8aTg+ZmzFUAvu4lsv3eLXMLGFxWk= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= diff --git a/go/libraries/doltcore/doltdb/foreign_key_test.go b/go/libraries/doltcore/doltdb/foreign_key_test.go index ee8584a6d5..2f61ac1362 100644 --- a/go/libraries/doltcore/doltdb/foreign_key_test.go +++ b/go/libraries/doltcore/doltdb/foreign_key_test.go @@ -48,18 +48,16 @@ type testCommand struct { var setupCommon = []testCommand{ {commands.SqlCmd{}, []string{"-q", "create table parent (" + - "id int comment 'tag:0'," + - "v1 int comment 'tag:1'," + - "v2 int comment 'tag:2'," + - //"index v1_idx (v1)," + - //"index v1_idx (v2)," + + "id int," + + "v1 int," + + "v2 int," + + "index v1_idx (v1)," + + "index v2_idx (v2)," + "primary key(id));"}}, - {commands.SqlCmd{}, []string{"-q", "alter table parent add index v1_idx (v1);"}}, - {commands.SqlCmd{}, []string{"-q", "alter table parent add index v2_idx (v2);"}}, {commands.SqlCmd{}, []string{"-q", "create table child (" + - "id int comment 'tag:10', " + - "v1 int comment 'tag:11'," + - "v2 int comment 'tag:12'," + + "id int, " + + "v1 int," + + "v2 int," + "primary key(id));"}}, } @@ -119,10 +117,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "child_fk", TableName: "child", TableIndex: "v1_idx", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, }, }, @@ -139,10 +137,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "multi_col", TableName: "child", TableIndex: "v1v2_idx", - TableColumns: []uint64{11, 12}, + TableColumns: []uint64{1215, 8734}, ReferencedTableName: "parent", ReferencedTableIndex: "v1v2_idx", - ReferencedTableColumns: []uint64{1, 2}, + ReferencedTableColumns: []uint64{6269, 7947}, }, }, }, @@ -161,19 +159,19 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk1", TableName: "child", TableIndex: "v1_idx", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, { Name: "fk2", TableName: "child", TableIndex: "v2_idx", - TableColumns: []uint64{12}, + TableColumns: []uint64{8734}, ReferencedTableName: "parent", ReferencedTableIndex: "v2_idx", - ReferencedTableColumns: []uint64{2}, + ReferencedTableColumns: []uint64{7947}, }, }, }, @@ -181,8 +179,8 @@ var foreignKeyTests = []foreignKeyTest{ name: "create table with foreign key", setup: []testCommand{ {commands.SqlCmd{}, []string{"-q", `create table new_table ( - id int comment 'tag:20', - v1 int comment 'tag:21', + id int, + v1 int, constraint new_fk foreign key (v1) references parent(v1), primary key(id));`}}, }, @@ -192,10 +190,10 @@ var foreignKeyTests = []foreignKeyTest{ TableName: "new_table", // unnamed indexes take the column name TableIndex: "v1", - TableColumns: []uint64{21}, + TableColumns: []uint64{7597}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, }, }, @@ -214,20 +212,20 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk1", TableName: "child", TableIndex: "v1_idx", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, OnUpdate: doltdb.ForeignKeyReferenceOption_Cascade, }, { Name: "fk2", TableName: "child", TableIndex: "v2_idx", - TableColumns: []uint64{12}, + TableColumns: []uint64{8734}, ReferencedTableName: "parent", ReferencedTableIndex: "v2_idx", - ReferencedTableColumns: []uint64{2}, + ReferencedTableColumns: []uint64{7947}, OnDelete: doltdb.ForeignKeyReferenceOption_SetNull, }, }, @@ -244,10 +242,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "child_fk", TableName: "child", TableIndex: "v1_idx", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, OnUpdate: doltdb.ForeignKeyReferenceOption_Cascade, OnDelete: doltdb.ForeignKeyReferenceOption_Cascade, }, @@ -256,19 +254,19 @@ var foreignKeyTests = []foreignKeyTest{ { name: "create foreign keys with all update and delete rules", setup: []testCommand{ - {commands.SqlCmd{}, []string{"-q", "alter table parent add column v3 int comment 'tag:3';"}}, - {commands.SqlCmd{}, []string{"-q", "alter table parent add column v4 int comment 'tag:4';"}}, - {commands.SqlCmd{}, []string{"-q", "alter table parent add column v5 int comment 'tag:5';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table parent add column v3 int;"}}, + {commands.SqlCmd{}, []string{"-q", "alter table parent add column v4 int;"}}, + {commands.SqlCmd{}, []string{"-q", "alter table parent add column v5 int;"}}, {commands.SqlCmd{}, []string{"-q", "alter table parent add index v3_idx (v3);"}}, {commands.SqlCmd{}, []string{"-q", "alter table parent add index v4_idx (v4);"}}, {commands.SqlCmd{}, []string{"-q", "alter table parent add index v5_idx (v5);"}}, {commands.SqlCmd{}, []string{"-q", `create table sibling ( - id int comment 'tag:20', - v1 int comment 'tag:21', - v2 int comment 'tag:22', - v3 int comment 'tag:23', - v4 int comment 'tag:24', - v5 int comment 'tag:25', + id int, + v1 int, + v2 int, + v3 int, + v4 int, + v5 int, constraint fk1 foreign key (v1) references parent(v1), constraint fk2 foreign key (v2) references parent(v2) on delete restrict on update restrict, constraint fk3 foreign key (v3) references parent(v3) on delete cascade on update cascade, @@ -281,19 +279,19 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk1", TableName: "sibling", TableIndex: "v1", - TableColumns: []uint64{21}, + TableColumns: []uint64{16080}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, { Name: "fk2", TableName: "sibling", TableIndex: "v2", - TableColumns: []uint64{22}, + TableColumns: []uint64{7576}, ReferencedTableName: "parent", ReferencedTableIndex: "v2_idx", - ReferencedTableColumns: []uint64{2}, + ReferencedTableColumns: []uint64{7947}, OnUpdate: doltdb.ForeignKeyReferenceOption_Restrict, OnDelete: doltdb.ForeignKeyReferenceOption_Restrict, }, @@ -301,10 +299,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk3", TableName: "sibling", TableIndex: "v3", - TableColumns: []uint64{23}, + TableColumns: []uint64{16245}, ReferencedTableName: "parent", ReferencedTableIndex: "v3_idx", - ReferencedTableColumns: []uint64{3}, + ReferencedTableColumns: []uint64{5237}, OnUpdate: doltdb.ForeignKeyReferenceOption_Cascade, OnDelete: doltdb.ForeignKeyReferenceOption_Cascade, }, @@ -312,10 +310,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk4", TableName: "sibling", TableIndex: "v4", - TableColumns: []uint64{24}, + TableColumns: []uint64{9036}, ReferencedTableName: "parent", ReferencedTableIndex: "v4_idx", - ReferencedTableColumns: []uint64{4}, + ReferencedTableColumns: []uint64{14774}, OnUpdate: doltdb.ForeignKeyReferenceOption_SetNull, OnDelete: doltdb.ForeignKeyReferenceOption_SetNull, }, @@ -323,10 +321,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk5", TableName: "sibling", TableIndex: "v5", - TableColumns: []uint64{25}, + TableColumns: []uint64{11586}, ReferencedTableName: "parent", ReferencedTableIndex: "v5_idx", - ReferencedTableColumns: []uint64{5}, + ReferencedTableColumns: []uint64{8125}, OnUpdate: doltdb.ForeignKeyReferenceOption_NoAction, OnDelete: doltdb.ForeignKeyReferenceOption_NoAction, }, @@ -343,10 +341,10 @@ var foreignKeyTests = []foreignKeyTest{ TableName: "child", // unnamed indexes take the column name TableIndex: "v1", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, }, }, @@ -358,13 +356,13 @@ var foreignKeyTests = []foreignKeyTest{ }, fks: []doltdb.ForeignKey{ { - Name: "ajk4bsgi", + Name: "19eof0mu", TableName: "child", TableIndex: "v1_idx", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, }, }, @@ -372,21 +370,21 @@ var foreignKeyTests = []foreignKeyTest{ name: "create table with unnamed foreign key", setup: []testCommand{ {commands.SqlCmd{}, []string{"-q", `create table new_table ( - id int comment 'tag:20', - v1 int comment 'tag:21', + id int, + v1 int, foreign key (v1) references parent(v1), primary key(id));`}}, }, fks: []doltdb.ForeignKey{ { - Name: "7l96tsms", + Name: "mv9a59oo", TableName: "new_table", // unnamed indexes take the column name TableIndex: "v1", - TableColumns: []uint64{21}, + TableColumns: []uint64{7597}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, }, }, @@ -401,13 +399,13 @@ var foreignKeyTests = []foreignKeyTest{ }, fks: []doltdb.ForeignKey{ { - Name: "ltbb4q51", + Name: "n4qun7ju", TableName: "child", TableIndex: "v1v2_idx", - TableColumns: []uint64{11, 12}, + TableColumns: []uint64{1215, 8734}, ReferencedTableName: "parent", ReferencedTableIndex: "v1v2_idx", - ReferencedTableColumns: []uint64{1, 2}, + ReferencedTableColumns: []uint64{6269, 7947}, }, }, }, @@ -423,22 +421,22 @@ var foreignKeyTests = []foreignKeyTest{ }, fks: []doltdb.ForeignKey{ { - Name: "ajk4bsgi", + Name: "19eof0mu", TableName: "child", TableIndex: "v1_idx", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, { - Name: "jui84jda", + Name: "p79c8qtq", TableName: "child", TableIndex: "v2_idx", - TableColumns: []uint64{12}, + TableColumns: []uint64{8734}, ReferencedTableName: "parent", ReferencedTableIndex: "v2_idx", - ReferencedTableColumns: []uint64{2}, + ReferencedTableColumns: []uint64{7947}, }, }, }, @@ -461,10 +459,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk1", TableName: "child", TableIndex: "v1_idx", - TableColumns: []uint64{11}, + TableColumns: []uint64{1215}, ReferencedTableName: "parent", ReferencedTableIndex: "v1_idx", - ReferencedTableColumns: []uint64{1}, + ReferencedTableColumns: []uint64{6269}, }, }, }, @@ -490,10 +488,10 @@ var foreignKeyTests = []foreignKeyTest{ Name: "fk1", TableName: "child", TableIndex: "v1v2", - TableColumns: []uint64{11, 12}, + TableColumns: []uint64{1215, 8734}, ReferencedTableName: "parent", ReferencedTableIndex: "v1v2", - ReferencedTableColumns: []uint64{1, 2}, + ReferencedTableColumns: []uint64{6269, 7947}, }, }, }, diff --git a/go/libraries/doltcore/doltdb/table.go b/go/libraries/doltcore/doltdb/table.go index ed2f6ebcc9..d073f2e1fb 100644 --- a/go/libraries/doltcore/doltdb/table.go +++ b/go/libraries/doltcore/doltdb/table.go @@ -697,6 +697,30 @@ func (t *Table) DeleteIndexRowData(ctx context.Context, indexName string) (*Tabl return t.SetIndexData(ctx, indexesMap) } +// RenameIndexRowData changes the name for the index data. Does not verify that the new name is unoccupied. If the old +// name does not exist, then this returns the called table without error. +func (t *Table) RenameIndexRowData(ctx context.Context, oldIndexName, newIndexName string) (*Table, error) { + indexesMap, err := t.GetIndexData(ctx) + if err != nil { + return nil, err + } + + oldKey := types.String(oldIndexName) + newKey := types.String(newIndexName) + if indexRowData, ok, err := indexesMap.MaybeGet(ctx, oldKey); err != nil { + return nil, err + } else if ok { + indexesMap, err = indexesMap.Edit().Set(newKey, indexRowData).Remove(oldKey).Map(ctx) + if err != nil { + return nil, err + } + } else { + return t, nil + } + + return t.SetIndexData(ctx, indexesMap) +} + func rebuildIndexRowData(ctx context.Context, vrw types.ValueReadWriter, sch schema.Schema, tblRowData types.Map, index schema.Index) (types.Map, error) { emptyIndexMap, err := types.NewMap(ctx, vrw) if err != nil { diff --git a/go/libraries/doltcore/envtestutils/rebase_tag_test.go b/go/libraries/doltcore/envtestutils/rebase_tag_test.go index 14d25f994a..ae3ab30e12 100644 --- a/go/libraries/doltcore/envtestutils/rebase_tag_test.go +++ b/go/libraries/doltcore/envtestutils/rebase_tag_test.go @@ -18,11 +18,11 @@ import ( "context" "fmt" "io" - "strconv" "testing" "github.com/liquidata-inc/go-mysql-server/sql" "github.com/liquidata-inc/vitess/go/sqltypes" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" @@ -44,8 +44,8 @@ const ( _ AgeTag ) -const DripTag = 13 -const DripTagRebased = 19 +const DripTag = 2360 +const DripTagRebased = 2361 type RebaseTagTest struct { // The name of this test. Names should be unique and descriptive. @@ -65,13 +65,13 @@ type RebaseTagTest struct { ExpectedErrStr string } -var createPeopleTable = fmt.Sprintf(` +var createPeopleTable = ` create table people ( - id int comment 'tag:%d', - name varchar(20) not null comment 'tag:%d', - age int comment 'tag:%d', + id int, + name varchar(20) not null, + age int, primary key (id) - );`, IdTag, NameTag, AgeTag) + );` func columnCollection(cols ...schema.Column) *schema.ColCollection { pcc, err := schema.NewColCollection(cols...) @@ -90,7 +90,7 @@ func newRow(vals row.TaggedValues, cc *schema.ColCollection) row.Row { } func newColTypeInfo(name string, tag uint64, typeInfo typeinfo.TypeInfo, partOfPK bool, constraints ...schema.ColConstraint) schema.Column { - c, err := schema.NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, "", constraints...) + c, err := schema.NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, "", "", constraints...) if err != nil { panic("could not create column") } @@ -141,7 +141,7 @@ var RebaseTagTests = []RebaseTagTest{ Name: "rebase entire history", Commands: []tc.Command{ tc.Query{Query: createPeopleTable}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (10, "Patty Bouvier", 40, 8.5), (11, "Selma Bouvier", 40, 8.5);`}, @@ -161,7 +161,7 @@ var RebaseTagTests = []RebaseTagTest{ Commands: []tc.Command{ tc.Query{Query: createPeopleTable}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.CommitAll{Message: "made changes"}, }, OldTag: DripTag, @@ -176,7 +176,7 @@ var RebaseTagTests = []RebaseTagTest{ tc.Query{Query: createPeopleTable}, tc.Query{Query: `insert into people (id, name, age) values (9, "Jacqueline Bouvier", 80);`}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (11, "Selma Bouvier", 40, 8.5);`}, tc.CommitAll{Message: "made changes"}, }, @@ -195,7 +195,7 @@ var RebaseTagTests = []RebaseTagTest{ tc.Query{Query: createPeopleTable}, tc.Query{Query: `insert into people (id, name, age) values (9, "Jacqueline Bouvier", 80);`}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `update people set drip=9.9 where id=9;`}, tc.CommitAll{Message: "made changes"}, }, @@ -213,7 +213,7 @@ var RebaseTagTests = []RebaseTagTest{ tc.Query{Query: createPeopleTable}, tc.Query{Query: `insert into people (id, name, age) values (9, "Jacqueline Bouvier", 80);`}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (11, "Selma Bouvier", 40, 8.5);`}, tc.CommitAll{Message: "made changes"}, tc.Query{Query: `update people set drip=9.9 where id=11;`}, @@ -234,7 +234,7 @@ var RebaseTagTests = []RebaseTagTest{ tc.Query{Query: createPeopleTable}, tc.Query{Query: `insert into people (id, name, age) values (9, "Jacqueline Bouvier", 80);`}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (11, "Selma Bouvier", 40, 8.5);`}, tc.CommitAll{Message: "made changes"}, tc.Query{Query: `update people set drip=9.9 where id=11;`}, @@ -258,7 +258,7 @@ var RebaseTagTests = []RebaseTagTest{ (7, "Maggie Simpson", 1), (8, "Milhouse Van Houten", 8);`}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.CommitAll{Message: "made changes"}, tc.Query{Query: `update people set age=2 where id=7;`}, tc.Query{Query: `delete from people where id=8;`}, @@ -281,7 +281,7 @@ var RebaseTagTests = []RebaseTagTest{ tc.Query{Query: createPeopleTable}, tc.CommitAll{Message: "made changes"}, tc.Branch{BranchName: "newBranch"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (11, "Selma Bouvier", 40, 8.5);`}, tc.CommitAll{Message: "made changes"}, tc.Checkout{BranchName: "newBranch"}, @@ -311,7 +311,7 @@ var RebaseTagTests = []RebaseTagTest{ (9, "Jacqueline Bouvier", 80);`}, tc.CommitAll{Message: "made changes"}, tc.Branch{BranchName: "newBranch"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `delete from people where id=6;`}, tc.Query{Query: `update people set drip=99.9 where id=7;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (11, "Selma Bouvier", 40, 8.5);`}, @@ -343,7 +343,7 @@ var RebaseTagTests = []RebaseTagTest{ tc.CommitAll{Message: "made changes"}, tc.Branch{BranchName: "newBranch"}, tc.Checkout{BranchName: "newBranch"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (11, "Selma Bouvier", 40, 8.5);`}, tc.CommitAll{Message: "made changes"}, tc.Checkout{BranchName: "master"}, @@ -366,7 +366,7 @@ var RebaseTagTests = []RebaseTagTest{ Commands: []tc.Command{ tc.Query{Query: createPeopleTable}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.Query{Query: `insert into people (id, name, age, drip) values (9, "Jacqueline Bouvier", 80, 8.5);`}, tc.CommitAll{Message: "made changes"}, tc.Branch{BranchName: "newBranch"}, @@ -395,7 +395,7 @@ var RebaseTagTests = []RebaseTagTest{ tc.Query{Query: createPeopleTable}, tc.Query{Query: `insert into people (id, name, age) values (7, "Maggie Simpson", 1);`}, tc.CommitAll{Message: "made changes"}, - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.CommitAll{Message: "made changes"}, tc.Query{Query: `insert into people (id, name, age) values (9, "Jacqueline Bouvier", 80);`}, tc.CommitAll{Message: "made changes"}, @@ -462,7 +462,7 @@ func testRebaseTagHistory(t *testing.T) { (7, "Maggie Simpson", 1);`}, tc.CommitAll{Message: "made changes"}, // common ancestor of (newMaster, oldMaster) and (newMaster, other) - tc.Query{Query: `alter table people add drip double comment 'tag:` + strconv.Itoa(DripTag) + `';`}, + tc.Query{Query: `alter table people add drip double;`}, tc.CommitAll{Message: "made changes"}, // common ancestor of (oldMaster, other) tc.Branch{BranchName: "other"}, @@ -528,9 +528,13 @@ func checkSchema(t *testing.T, r *doltdb.RootValue, tableName string, expectedSc require.NoError(t, err) sch, err := tbl.GetSchema(context.Background()) require.NoError(t, err) - eq, err := schema.SchemasAreEqual(sch, expectedSch) - require.NoError(t, err) - require.True(t, eq) + require.Equal(t, expectedSch.GetAllCols().Size(), sch.GetAllCols().Size()) + cols := sch.GetAllCols().GetColumns() + for i, expectedCol := range expectedSch.GetAllCols().GetColumns() { + col := cols[i] + col.Tag = expectedCol.Tag + assert.Equal(t, expectedCol, col) + } } func checkRows(t *testing.T, dEnv *env.DoltEnv, root *doltdb.RootValue, tableName string, sch schema.Schema, selectQuery string, expectedRows []row.Row) { diff --git a/go/libraries/doltcore/envtestutils/super_schema_test.go b/go/libraries/doltcore/envtestutils/super_schema_test.go index 97efc7f6e7..9ec3ae91dd 100644 --- a/go/libraries/doltcore/envtestutils/super_schema_test.go +++ b/go/libraries/doltcore/envtestutils/super_schema_test.go @@ -29,11 +29,10 @@ import ( ) const ( - pkTag = iota - c0Tag - c1Tag - c11Tag - c12Tag + pkTag = 16191 + c0Tag = 8734 + c1Tag = 15903 + c11Tag = 15001 ) type SuperSchemaTest struct { @@ -53,7 +52,7 @@ type SuperSchemaTest struct { ExpectedErrStr string } -var testableDef = fmt.Sprintf("create table testable (pk int not null primary key comment 'tag:%d');", pkTag) +var testableDef = fmt.Sprintf("create table testable (pk int not null primary key);") var SuperSchemaTests = []SuperSchemaTest{ { @@ -91,7 +90,7 @@ var SuperSchemaTests = []SuperSchemaTest{ Commands: []tc.Command{ tc.Query{Query: testableDef}, tc.CommitAll{Message: "created table testable"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, }, ExpectedBranch: "master", ExpectedSchema: schema.SchemaFromCols(columnCollection( @@ -108,7 +107,7 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int")}, tc.CommitAll{Message: "created table testable"}, tc.Query{Query: "alter table testable drop column c0"}, tc.CommitAll{Message: "dropped column c0"}, @@ -127,7 +126,7 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.CommitAll{Message: "created table testable"}, tc.Query{Query: "alter table testable drop column c0"}, }, @@ -145,7 +144,7 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.Query{Query: "alter table testable drop column c0"}, }, ExpectedBranch: "master", @@ -162,9 +161,9 @@ var SuperSchemaTests = []SuperSchemaTest{ Commands: []tc.Command{ tc.Query{Query: testableDef}, tc.CommitAll{Message: "created table testable"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.StageAll{}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int comment 'tag:%d';", c1Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int;")}, tc.CommitStaged{Message: "adding staged column c0"}, tc.ResetHard{}, }, @@ -183,14 +182,14 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.CommitAll{Message: "created table testable"}, tc.Branch{BranchName: "other"}, tc.Checkout{BranchName: "other"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int comment 'tag:%d';", c11Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int;")}, tc.CommitAll{Message: "added column c11 on branch other"}, tc.Checkout{BranchName: "master"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int comment 'tag:%d';", c1Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int;")}, }, ExpectedBranch: "master", ExpectedSchema: schema.SchemaFromCols(columnCollection( @@ -209,14 +208,14 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.CommitAll{Message: "created table testable"}, tc.Branch{BranchName: "other"}, tc.Checkout{BranchName: "other"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int comment 'tag:%d';", c11Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int;")}, tc.CommitAll{Message: "added column c11 on branch other"}, tc.Checkout{BranchName: "master"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int comment 'tag:%d';", c1Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int;")}, tc.CommitAll{Message: "added column c1 on branch master"}, tc.Checkout{BranchName: "other"}, }, @@ -238,14 +237,14 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.CommitAll{Message: "created table testable"}, tc.Branch{BranchName: "other"}, tc.Checkout{BranchName: "other"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int comment 'tag:%d';", c11Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int;")}, tc.CommitAll{Message: "added column c11 on branch other"}, tc.Checkout{BranchName: "master"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int comment 'tag:%d';", c1Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int;")}, tc.CommitAll{Message: "added column c1 on branch master"}, tc.Merge{BranchName: "other"}, }, @@ -268,17 +267,17 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.CommitAll{Message: "created table testable"}, tc.Branch{BranchName: "other"}, tc.Checkout{BranchName: "other"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int comment 'tag:%d';", c11Tag)}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c12 int comment 'tag:%d';", c12Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c11 int;")}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c12 int;")}, tc.CommitAll{Message: "added columns c11 and c12 on branch other"}, tc.Query{Query: "alter table testable drop column c12;"}, tc.CommitAll{Message: "dropped column c12 on branch other"}, tc.Checkout{BranchName: "master"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int comment 'tag:%d';", c1Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int;")}, tc.CommitAll{Message: "added column c1 on branch master"}, tc.Merge{BranchName: "other"}, tc.CommitAll{Message: "Merged other into master"}, @@ -303,10 +302,10 @@ var SuperSchemaTests = []SuperSchemaTest{ TableName: "testable", Commands: []tc.Command{ tc.Query{Query: testableDef}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int comment 'tag:%d';", c0Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c0 int;")}, tc.Query{Query: "create table foo (pk int not null primary key);"}, tc.CommitAll{Message: "created tables testable and foo"}, - tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int comment 'tag:%d';", c1Tag)}, + tc.Query{Query: fmt.Sprintf("alter table testable add column c1 int;")}, tc.Query{Query: "create table qux (pk int not null primary key);"}, tc.Query{Query: "drop table foo;"}, tc.CommitAll{Message: "added column c1 on branch master, created table qux, dropped table foo"}, diff --git a/go/libraries/doltcore/envtestutils/unique_tags_test.go b/go/libraries/doltcore/envtestutils/unique_tags_test.go deleted file mode 100644 index d942e6572b..0000000000 --- a/go/libraries/doltcore/envtestutils/unique_tags_test.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2020 Liquidata, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package envtestutils - -import ( - "context" - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/liquidata-inc/dolt/go/libraries/doltcore/dtestutils" - tc "github.com/liquidata-inc/dolt/go/libraries/doltcore/dtestutils/testcommands" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema/typeinfo" -) - -type UniqueTagsTest struct { - // The name of this test. Names should be unique and descriptive. - Name string - // The modifying queries to run - Commands []tc.Command - // Name of the table to be verified - TableName string - // The schema of the result of the query, nil if an error is expected - ExpectedSchema schema.Schema - // Expected branch - ExpectedBranch string - // An expected error string - ExpectedErrStr string -} - -var UniqueTagsTests = []UniqueTagsTest{ - { - Name: "can create table with tags specified", - Commands: []tc.Command{ - tc.Query{Query: `create table test (pk int not null primary key comment 'tag:42');`}, - }, - TableName: "test", - ExpectedSchema: schema.SchemaFromCols(columnCollection( - newColTypeInfo("pk", 42, typeinfo.Int32Type, true, schema.NotNullConstraint{}), - )), - ExpectedBranch: "master", - }, - { - Name: "cannot create duplicate tags within a table", - Commands: []tc.Command{ - tc.Query{Query: `create table test ( - pk int not null primary key comment 'tag:42', - c0 int comment 'tag:42');`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "two different columns with the same tag", - }, - { - Name: "cannot create duplicate tags across tables", - Commands: []tc.Command{ - tc.Query{Query: `create table test (pk int not null primary key comment 'tag:42');`}, - tc.Query{Query: `create table test2 (pk int not null primary key comment 'tag:42');`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "Cannot create column pk, the tag 42 was already used in table test", - }, - { - Name: "cannot add a duplicate tag within a table", - Commands: []tc.Command{ - tc.Query{Query: `create table test (pk int not null primary key comment 'tag:42');`}, - tc.Query{Query: `alter table test add column c0 int comment 'tag:42';`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "Cannot create column c0, the tag 42 was already used in table test", - }, - { - Name: "cannot add a duplicate tag across tables", - Commands: []tc.Command{ - tc.Query{Query: `create table test (pk int not null primary key comment 'tag:0');`}, - tc.Query{Query: `create table other (pk int not null primary key comment 'tag:42');`}, - tc.Query{Query: `alter table test add column c0 int comment 'tag:42';`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "Cannot create column c0, the tag 42 was already used in table other", - }, - { - Name: "cannot add a tag that has previously existed in the same table's history", - Commands: []tc.Command{ - tc.Query{Query: `create table test ( - pk int not null primary key comment 'tag:0', - c0 int comment 'tag:42');`}, - tc.CommitAll{Message: "created table test"}, - tc.Query{Query: `alter table test drop column c0;`}, - tc.CommitAll{Message: "dropped c0"}, - tc.Query{Query: `alter table test add column c1 int comment 'tag:42';`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "two different columns with the same tag", - }, - { - Name: "cannot add a tag that has previously existed in a different table's history", - Commands: []tc.Command{ - tc.Query{Query: `create table test (pk int not null primary key comment 'tag:0');`}, - tc.Query{Query: `create table other ( - pk int not null primary key comment 'tag:1', - c0 int comment 'tag:42');`}, - tc.CommitAll{Message: "created tables test and other"}, - tc.Query{Query: `alter table other drop column c0;`}, - tc.CommitAll{Message: "dropped c0 from other"}, - tc.Query{Query: `alter table test add column c1 int comment 'tag:42';`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "two different columns with the same tag", - }, - { - Name: "cannot add a tag that has previously existed in a merged branch's history", - Commands: []tc.Command{ - tc.Query{Query: `create table test (pk int not null primary key comment 'tag:0');`}, - tc.CommitAll{Message: "created table test"}, - tc.Branch{BranchName: "other"}, - tc.Checkout{BranchName: "other"}, - tc.Query{Query: `alter table test add column c0 int comment 'tag:42';`}, - tc.CommitAll{Message: "added column c0 to test on branch other"}, - tc.Query{Query: `alter table test drop column c0;`}, - tc.CommitAll{Message: "dropped c0 from test on other"}, - tc.Checkout{BranchName: "master"}, - tc.Merge{BranchName: "other"}, - tc.Query{Query: `alter table test add column c1 int comment 'tag:42';`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "two different columns with the same tag", - }, - { - Name: "cannot add a tag that has previously existed in a deleted table", - Commands: []tc.Command{ - tc.Query{Query: `create table quiz (pk int not null primary key comment 'tag:42');`}, - tc.Query{Query: `create table test (pk int not null primary key comment 'tag:10');`}, - tc.CommitAll{Message: "created tables test and quiz"}, - tc.Query{Query: `drop table quiz;`}, - tc.CommitAll{Message: "added column c0 to test on branch other"}, - tc.Query{Query: `alter table test add column c1 int comment 'tag:42';`}, - }, - ExpectedBranch: "master", - ExpectedErrStr: "two different columns with the same tag", - }, -} - -func TestUniqueTags(t *testing.T) { - for _, test := range UniqueTagsTests { - t.Run(test.Name, func(t *testing.T) { - testUniqueTags(t, test) - }) - } -} - -func testUniqueTags(t *testing.T, test UniqueTagsTest) { - dEnv := dtestutils.CreateTestEnv() - - var ee error - for idx, cmd := range test.Commands { - require.NoError(t, ee) - fmt.Println(fmt.Sprintf("%d: %s: %s", idx, cmd.CommandString(), cmd)) - ee = cmd.Exec(t, dEnv) - } - - if test.ExpectedErrStr != "" { - require.Error(t, ee, test.ExpectedErrStr) - } else { - spec := dEnv.RepoState.CWBHeadRef() - require.Equal(t, "refs/heads/"+test.ExpectedBranch, spec.String()) - - r, err := dEnv.WorkingRoot(context.Background()) - require.NoError(t, err) - - tbl, ok, err := r.GetTable(context.Background(), test.TableName) - require.NoError(t, err) - require.True(t, ok) - - sch, err := tbl.GetSchema(context.Background()) - require.NoError(t, err) - assert.Equal(t, test.ExpectedSchema, sch) - } -} diff --git a/go/libraries/doltcore/merge/merge_schema_test.go b/go/libraries/doltcore/merge/merge_schema_test.go index 5daedb8067..b20d1e497c 100644 --- a/go/libraries/doltcore/merge/merge_schema_test.go +++ b/go/libraries/doltcore/merge/merge_schema_test.go @@ -75,10 +75,10 @@ type mergeForeignKeyTest struct { var setupCommon = []testCommand{ {commands.SqlCmd{}, []string{"-q", "create table test (" + - "pk int not null primary key comment 'tag:0'," + - "c1 int not null comment 'tag:1'," + - "c2 int comment 'tag:2'," + - "c3 int comment 'tag:3');"}}, + "pk int not null primary key," + + "c1 int not null," + + "c2 int," + + "c3 int);"}}, {commands.SqlCmd{}, []string{"-q", "create index c1_idx on test(c1)"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "setup common"}}, @@ -91,34 +91,34 @@ var mergeSchemaTests = []mergeSchemaTest{ setup: []testCommand{}, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c2", uint64(2), typeinfo.Int32Type, false), - newColTypeInfo("c3", uint64(3), typeinfo.Int32Type, false)), - schema.NewIndex("c1_idx", []uint64{1}, []uint64{1, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c2", uint64(8539), typeinfo.Int32Type, false), + newColTypeInfo("c3", uint64(4696), typeinfo.Int32Type, false)), + schema.NewIndex("c1_idx", []uint64{8201}, []uint64{8201, 3228}, nil, schema.IndexProperties{}), ), }, { name: "add cols, drop cols, merge", setup: []testCommand{ {commands.SqlCmd{}, []string{"-q", "alter table test drop column c2;"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column c8 int comment 'tag:8';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c8 int;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch master"}}, {commands.CheckoutCmd{}, []string{"other"}}, {commands.SqlCmd{}, []string{"-q", "alter table test drop column c3;"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column c9 int comment 'tag:9';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c9 int;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch other"}}, {commands.CheckoutCmd{}, []string{"master"}}, }, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c8", uint64(8), typeinfo.Int32Type, false), - newColTypeInfo("c9", uint64(9), typeinfo.Int32Type, false)), - schema.NewIndex("c1_idx", []uint64{1}, []uint64{1, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c8", uint64(12393), typeinfo.Int32Type, false), + newColTypeInfo("c9", uint64(4508), typeinfo.Int32Type, false)), + schema.NewIndex("c1_idx", []uint64{8201}, []uint64{8201, 3228}, nil, schema.IndexProperties{}), ), }, { @@ -135,11 +135,11 @@ var mergeSchemaTests = []mergeSchemaTest{ }, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false), - newColTypeInfo("c2", uint64(2), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c3", uint64(3), typeinfo.Int32Type, false)), - schema.NewIndex("c1_idx", []uint64{1}, []uint64{1, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false), + newColTypeInfo("c2", uint64(8539), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c3", uint64(4696), typeinfo.Int32Type, false)), + schema.NewIndex("c1_idx", []uint64{8201}, []uint64{8201, 3228}, nil, schema.IndexProperties{}), ), }, { @@ -156,11 +156,11 @@ var mergeSchemaTests = []mergeSchemaTest{ }, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c2", uint64(2), typeinfo.Int32Type, false), - newColTypeInfo("c3", uint64(3), typeinfo.Int32Type, false)), - schema.NewIndex("c3_idx", []uint64{3}, []uint64{3, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c2", uint64(8539), typeinfo.Int32Type, false), + newColTypeInfo("c3", uint64(4696), typeinfo.Int32Type, false)), + schema.NewIndex("c3_idx", []uint64{4696}, []uint64{4696, 3228}, nil, schema.IndexProperties{}), ), }, { @@ -177,11 +177,11 @@ var mergeSchemaTests = []mergeSchemaTest{ }, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c22", uint64(2), typeinfo.Int32Type, false), - newColTypeInfo("c33", uint64(3), typeinfo.Int32Type, false)), - schema.NewIndex("c1_idx", []uint64{1}, []uint64{1, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c22", uint64(8539), typeinfo.Int32Type, false), + newColTypeInfo("c33", uint64(4696), typeinfo.Int32Type, false)), + schema.NewIndex("c1_idx", []uint64{8201}, []uint64{8201, 3228}, nil, schema.IndexProperties{}), ), }, { @@ -194,33 +194,33 @@ var mergeSchemaTests = []mergeSchemaTest{ }, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c2", uint64(2), typeinfo.Int32Type, false), - newColTypeInfo("c3", uint64(3), typeinfo.Int32Type, false)), - schema.NewIndex("c1_index", []uint64{1}, []uint64{1, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c2", uint64(8539), typeinfo.Int32Type, false), + newColTypeInfo("c3", uint64(4696), typeinfo.Int32Type, false)), + schema.NewIndex("c1_index", []uint64{8201}, []uint64{8201, 3228}, nil, schema.IndexProperties{}), ), }, { name: "add same column on both branches, merge", setup: []testCommand{ - {commands.SqlCmd{}, []string{"-q", "alter table test add column c4 int comment 'tag:4';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c4 int;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch master"}}, {commands.CheckoutCmd{}, []string{"other"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column c4 int comment 'tag:4'"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c4 int;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch other"}}, {commands.CheckoutCmd{}, []string{"master"}}, }, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c2", uint64(2), typeinfo.Int32Type, false), - newColTypeInfo("c3", uint64(3), typeinfo.Int32Type, false), - newColTypeInfo("c4", uint64(4), typeinfo.Int32Type, false)), - schema.NewIndex("c1_idx", []uint64{1}, []uint64{1, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c2", uint64(8539), typeinfo.Int32Type, false), + newColTypeInfo("c3", uint64(4696), typeinfo.Int32Type, false), + newColTypeInfo("c4", uint64(1716), typeinfo.Int32Type, false)), + schema.NewIndex("c1_idx", []uint64{8201}, []uint64{8201, 3228}, nil, schema.IndexProperties{}), ), }, { @@ -237,12 +237,12 @@ var mergeSchemaTests = []mergeSchemaTest{ }, sch: schemaFromColsAndIdxs( colCollection( - newColTypeInfo("pk", uint64(0), typeinfo.Int32Type, true, schema.NotNullConstraint{}), - newColTypeInfo("c1", uint64(1), typeinfo.Int32Type, false, schema.NotNullConstraint{}), - newColTypeInfo("c2", uint64(2), typeinfo.Int32Type, false), - newColTypeInfo("c3", uint64(3), typeinfo.Int32Type, false)), - schema.NewIndex("c1_idx", []uint64{1}, []uint64{1, 0}, nil, schema.IndexProperties{}), - schema.NewIndex("c3_idx", []uint64{3}, []uint64{3, 0}, nil, schema.IndexProperties{}), + newColTypeInfo("pk", uint64(3228), typeinfo.Int32Type, true, schema.NotNullConstraint{}), + newColTypeInfo("c1", uint64(8201), typeinfo.Int32Type, false, schema.NotNullConstraint{}), + newColTypeInfo("c2", uint64(8539), typeinfo.Int32Type, false), + newColTypeInfo("c3", uint64(4696), typeinfo.Int32Type, false)), + schema.NewIndex("c1_idx", []uint64{8201}, []uint64{8201, 3228}, nil, schema.IndexProperties{}), + schema.NewIndex("c3_idx", []uint64{4696}, []uint64{4696, 3228}, nil, schema.IndexProperties{}), ), }, } @@ -258,12 +258,12 @@ var mergeSchemaConflictTests = []mergeSchemaConflictTest{ name: "column name collisions", setup: []testCommand{ {commands.SqlCmd{}, []string{"-q", "alter table test rename column c3 to c4;"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column C6 int comment 'tag:13';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column C6 int;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch master"}}, {commands.CheckoutCmd{}, []string{"other"}}, {commands.SqlCmd{}, []string{"-q", "alter table test rename column c2 to c4;"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column c6 int comment 'tag:19';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c6 int;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch other"}}, {commands.CheckoutCmd{}, []string{"master"}}, @@ -301,8 +301,8 @@ var mergeSchemaConflictTests = []mergeSchemaConflictTest{ IdxConflicts: []merge.IdxConflict{ { Kind: merge.NameCollision, - Ours: schema.NewIndex("both", []uint64{1, 2}, []uint64{1, 2, 0}, nil, schema.IndexProperties{}), - Theirs: schema.NewIndex("both", []uint64{2, 3}, []uint64{2, 3, 0}, nil, schema.IndexProperties{}), + Ours: schema.NewIndex("both", []uint64{8201, 8539}, []uint64{8201, 8539, 3228}, nil, schema.IndexProperties{}), + Theirs: schema.NewIndex("both", []uint64{8539, 4696}, []uint64{8539, 4696, 3228}, nil, schema.IndexProperties{}), }, }, }, @@ -310,13 +310,14 @@ var mergeSchemaConflictTests = []mergeSchemaConflictTest{ { name: "column definition collision", setup: []testCommand{ - {commands.SqlCmd{}, []string{"-q", "alter table test add column c40 int comment 'tag:4';"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column c6 bigint comment 'tag:6';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c40 int;"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c6 bigint;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch master"}}, {commands.CheckoutCmd{}, []string{"other"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column c44 int comment 'tag:4';"}}, - {commands.SqlCmd{}, []string{"-q", "alter table test add column c6 tinyint comment 'tag:6';"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c40 int;"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test rename column c40 to c44;"}}, + {commands.SqlCmd{}, []string{"-q", "alter table test add column c6 tinyint;"}}, {commands.AddCmd{}, []string{"."}}, {commands.CommitCmd{}, []string{"-m", "modified branch other"}}, {commands.CheckoutCmd{}, []string{"master"}}, @@ -326,13 +327,13 @@ var mergeSchemaConflictTests = []mergeSchemaConflictTest{ ColConflicts: []merge.ColConflict{ { Kind: merge.TagCollision, - Ours: newColTypeInfo("c40", uint64(4), typeinfo.Int32Type, false), - Theirs: newColTypeInfo("c44", uint64(4), typeinfo.Int32Type, false), + Ours: newColTypeInfo("c40", uint64(679), typeinfo.Int32Type, false), + Theirs: newColTypeInfo("c44", uint64(679), typeinfo.Int32Type, false), }, { Kind: merge.TagCollision, - Ours: newColTypeInfo("c6", uint64(6), typeinfo.Int64Type, false), - Theirs: newColTypeInfo("c6", uint64(6), typeinfo.Int8Type, false), + Ours: newColTypeInfo("c6", uint64(10774), typeinfo.Int64Type, false), + Theirs: newColTypeInfo("c6", uint64(10774), typeinfo.Int8Type, false), }, }, }, @@ -354,8 +355,8 @@ var mergeSchemaConflictTests = []mergeSchemaConflictTest{ IdxConflicts: []merge.IdxConflict{ { Kind: merge.TagCollision, - Ours: schema.NewIndex("c3_idx", []uint64{3}, []uint64{3, 0}, nil, schema.IndexProperties{}), - Theirs: schema.NewIndex("c3_index", []uint64{3}, []uint64{3, 0}, nil, schema.IndexProperties{}), + Ours: schema.NewIndex("c3_idx", []uint64{4696}, []uint64{4696, 3228}, nil, schema.IndexProperties{}), + Theirs: schema.NewIndex("c3_index", []uint64{4696}, []uint64{4696, 3228}, nil, schema.IndexProperties{}), }, }, }, @@ -364,15 +365,15 @@ var mergeSchemaConflictTests = []mergeSchemaConflictTest{ var setupForeignKeyTests = []testCommand{ {commands.SqlCmd{}, []string{"-q", "create table test (" + - "pk int not null primary key comment 'tag:0'," + - "t1 int not null comment 'tag:1'," + - "t2 int comment 'tag:2'," + - "t3 int comment 'tag:3');"}}, + "pk int not null primary key," + + "t1 int not null," + + "t2 int," + + "t3 int);"}}, {commands.SqlCmd{}, []string{"-q", "alter table test add index t1_idx (t1);"}}, {commands.SqlCmd{}, []string{"-q", "create table quiz (" + - "pk int not null primary key comment 'tag:10'," + - "q1 int not null comment 'tag:11'," + - "q2 int not null comment 'tag:12'," + + "pk int not null primary key," + + "q1 int not null," + + "q2 int not null," + "index q2_idx (q2)," + "constraint q1_fk foreign key (q1) references test(t1));"}}, {commands.AddCmd{}, []string{"."}}, @@ -388,10 +389,10 @@ var mergeForeignKeyTests = []mergeForeignKeyTest{ Name: "q1_fk", TableName: "quiz", TableIndex: "q1", - TableColumns: []uint64{11}, + TableColumns: []uint64{13001}, ReferencedTableName: "test", ReferencedTableIndex: "t1_idx", - ReferencedTableColumns: []uint64{1}}), + ReferencedTableColumns: []uint64{12111}}), expFKConflict: []merge.FKConflict{}, }, //{ @@ -435,7 +436,7 @@ func schemaFromColsAndIdxs(allCols *schema.ColCollection, indexes ...schema.Inde } func newColTypeInfo(name string, tag uint64, typeInfo typeinfo.TypeInfo, partOfPK bool, constraints ...schema.ColConstraint) schema.Column { - c, err := schema.NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, "", constraints...) + c, err := schema.NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, "", "", constraints...) if err != nil { panic("could not create column") } diff --git a/go/libraries/doltcore/rowconv/joiner.go b/go/libraries/doltcore/rowconv/joiner.go index 389db059fe..5731fad95d 100644 --- a/go/libraries/doltcore/rowconv/joiner.go +++ b/go/libraries/doltcore/rowconv/joiner.go @@ -73,7 +73,7 @@ func NewJoiner(namedSchemas []NamedSchema, namers map[string]ColNamingFunc) (*Jo allCols.IterInSortedOrder(func(srcTag uint64, col schema.Column) (stop bool) { newColName := namer(col.Name) var newCol schema.Column - newCol, err = schema.NewColumnWithTypeInfo(newColName, destTag, col.TypeInfo, false, col.Default) + newCol, err = schema.NewColumnWithTypeInfo(newColName, destTag, col.TypeInfo, false, col.Default, col.Comment) if err != nil { return true } diff --git a/go/libraries/doltcore/rowconv/row_converter_test.go b/go/libraries/doltcore/rowconv/row_converter_test.go index 87184ab635..d45e73ceaf 100644 --- a/go/libraries/doltcore/rowconv/row_converter_test.go +++ b/go/libraries/doltcore/rowconv/row_converter_test.go @@ -103,9 +103,9 @@ func TestUnneccessaryConversion(t *testing.T) { } func TestSpecialBoolHandling(t *testing.T) { - col1, err := schema.NewColumnWithTypeInfo("pk", 0, typeinfo.Int64Type, true, "") + col1, err := schema.NewColumnWithTypeInfo("pk", 0, typeinfo.Int64Type, true, "", "") require.NoError(t, err) - col2, err := schema.NewColumnWithTypeInfo("v", 1, typeinfo.PseudoBoolType, false, "") + col2, err := schema.NewColumnWithTypeInfo("v", 1, typeinfo.PseudoBoolType, false, "", "") require.NoError(t, err) colColl, _ := schema.NewColCollection(col1, col2) sch := schema.SchemaFromCols(colColl) diff --git a/go/libraries/doltcore/schema/alterschema/addcolumn.go b/go/libraries/doltcore/schema/alterschema/addcolumn.go index 7d5f3715da..5616390821 100644 --- a/go/libraries/doltcore/schema/alterschema/addcolumn.go +++ b/go/libraries/doltcore/schema/alterschema/addcolumn.go @@ -44,7 +44,7 @@ type ColumnOrder struct { // table, since we must write a value for each row. If the column is not nullable, a default value must be provided. // // Returns an error if the column added conflicts with the existing schema in tag or name. -func AddColumnToTable(ctx context.Context, root *doltdb.RootValue, tbl *doltdb.Table, tblName string, tag uint64, newColName string, typeInfo typeinfo.TypeInfo, nullable Nullable, defaultVal string, order *ColumnOrder) (*doltdb.Table, error) { +func AddColumnToTable(ctx context.Context, root *doltdb.RootValue, tbl *doltdb.Table, tblName string, tag uint64, newColName string, typeInfo typeinfo.TypeInfo, nullable Nullable, defaultVal, comment string, order *ColumnOrder) (*doltdb.Table, error) { sch, err := tbl.GetSchema(ctx) if err != nil { return nil, err @@ -54,7 +54,7 @@ func AddColumnToTable(ctx context.Context, root *doltdb.RootValue, tbl *doltdb.T return nil, err } - newSchema, err := addColumnToSchema(sch, tag, newColName, typeInfo, nullable, order, defaultVal) + newSchema, err := addColumnToSchema(sch, tag, newColName, typeInfo, nullable, order, defaultVal, comment) if err != nil { return nil, err } @@ -131,8 +131,8 @@ func updateTableWithNewSchema(ctx context.Context, tblName string, tbl *doltdb.T } // addColumnToSchema creates a new schema with a column as specified by the params. -func addColumnToSchema(sch schema.Schema, tag uint64, newColName string, typeInfo typeinfo.TypeInfo, nullable Nullable, order *ColumnOrder, defaultVal string) (schema.Schema, error) { - newCol, err := createColumn(nullable, newColName, tag, typeInfo, defaultVal) +func addColumnToSchema(sch schema.Schema, tag uint64, newColName string, typeInfo typeinfo.TypeInfo, nullable Nullable, order *ColumnOrder, defaultVal, comment string) (schema.Schema, error) { + newCol, err := createColumn(nullable, newColName, tag, typeInfo, defaultVal, comment) if err != nil { return nil, err } @@ -162,11 +162,11 @@ func addColumnToSchema(sch schema.Schema, tag uint64, newColName string, typeInf return newSch, nil } -func createColumn(nullable Nullable, newColName string, tag uint64, typeInfo typeinfo.TypeInfo, defaultVal string) (schema.Column, error) { +func createColumn(nullable Nullable, newColName string, tag uint64, typeInfo typeinfo.TypeInfo, defaultVal, comment string) (schema.Column, error) { if nullable { - return schema.NewColumnWithTypeInfo(newColName, tag, typeInfo, false, defaultVal) + return schema.NewColumnWithTypeInfo(newColName, tag, typeInfo, false, defaultVal, comment) } else { - return schema.NewColumnWithTypeInfo(newColName, tag, typeInfo, false, defaultVal, schema.NotNullConstraint{}) + return schema.NewColumnWithTypeInfo(newColName, tag, typeInfo, false, defaultVal, comment, schema.NotNullConstraint{}) } } diff --git a/go/libraries/doltcore/schema/alterschema/addcolumn_test.go b/go/libraries/doltcore/schema/alterschema/addcolumn_test.go index c4583aab70..d5b269a2ef 100644 --- a/go/libraries/doltcore/schema/alterschema/addcolumn_test.go +++ b/go/libraries/doltcore/schema/alterschema/addcolumn_test.go @@ -263,7 +263,7 @@ func TestAddColumnToTable(t *testing.T) { tbl, _, err := root.GetTable(ctx, tableName) assert.NoError(t, err) - updatedTable, err := AddColumnToTable(ctx, root, tbl, tableName, tt.tag, tt.newColName, typeinfo.FromKind(tt.colKind), tt.nullable, tt.defaultVal, tt.order) + updatedTable, err := AddColumnToTable(ctx, root, tbl, tableName, tt.tag, tt.newColName, typeinfo.FromKind(tt.colKind), tt.nullable, tt.defaultVal, "", tt.order) if len(tt.expectedErr) > 0 { require.Error(t, err) assert.Contains(t, err.Error(), tt.expectedErr) diff --git a/go/libraries/doltcore/schema/col_coll_test.go b/go/libraries/doltcore/schema/col_coll_test.go index 6599641342..d820bbb1d0 100644 --- a/go/libraries/doltcore/schema/col_coll_test.go +++ b/go/libraries/doltcore/schema/col_coll_test.go @@ -26,10 +26,10 @@ import ( "github.com/liquidata-inc/dolt/go/store/types" ) -var firstNameCol = Column{"first", 0, types.StringKind, false, typeinfo.StringDefaultType, "", nil} -var lastNameCol = Column{"last", 1, types.StringKind, false, typeinfo.StringDefaultType, "", nil} -var firstNameCapsCol = Column{"FiRsT", 2, types.StringKind, false, typeinfo.StringDefaultType, "", nil} -var lastNameCapsCol = Column{"LAST", 3, types.StringKind, false, typeinfo.StringDefaultType, "", nil} +var firstNameCol = Column{"first", 0, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil} +var lastNameCol = Column{"last", 1, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil} +var firstNameCapsCol = Column{"FiRsT", 2, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil} +var lastNameCapsCol = Column{"LAST", 3, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil} func TestGetByNameAndTag(t *testing.T) { cols := []Column{firstNameCol, lastNameCol, firstNameCapsCol, lastNameCapsCol} @@ -111,7 +111,7 @@ func TestNewColCollectionErrorHandling(t *testing.T) { }{ { name: "tag collision", - cols: []Column{firstNameCol, lastNameCol, {"collision", 0, types.StringKind, false, typeinfo.StringDefaultType, "", nil}}, + cols: []Column{firstNameCol, lastNameCol, {"collision", 0, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}}, expectedErr: ErrColTagCollision, }, } @@ -127,18 +127,18 @@ func TestNewColCollectionErrorHandling(t *testing.T) { func TestAppendAndItrInSortOrder(t *testing.T) { cols := []Column{ - {"0", 0, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"2", 2, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"4", 4, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"3", 3, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"1", 1, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, + {"0", 0, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"2", 2, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"4", 4, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"3", 3, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"1", 1, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, } cols2 := []Column{ - {"7", 7, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"9", 9, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"5", 5, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"8", 8, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {"6", 6, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, + {"7", 7, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"9", 9, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"5", 5, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"8", 8, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {"6", 6, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, } colColl, _ := NewColCollection(cols...) diff --git a/go/libraries/doltcore/schema/column.go b/go/libraries/doltcore/schema/column.go index 1c6001d1aa..071ce8a40d 100644 --- a/go/libraries/doltcore/schema/column.go +++ b/go/libraries/doltcore/schema/column.go @@ -43,6 +43,7 @@ var ( false, typeinfo.UnknownType, "", + "", nil, } ) @@ -74,6 +75,9 @@ type Column struct { // Default is the default value of this column. This is the string representation of a sql.Expression. Default string + // Comment is the comment for this column. + Comment string + // Constraints are rules that can be checked on each column to say if the columns value is valid Constraints []ColConstraint } @@ -81,7 +85,7 @@ type Column struct { // NewColumn creates a Column instance with the default type info for the NomsKind func NewColumn(name string, tag uint64, kind types.NomsKind, partOfPK bool, constraints ...ColConstraint) Column { typeInfo := typeinfo.FromKind(kind) - col, err := NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, "", constraints...) + col, err := NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, "", "", constraints...) if err != nil { panic(err) } @@ -89,7 +93,7 @@ func NewColumn(name string, tag uint64, kind types.NomsKind, partOfPK bool, cons } // NewColumnWithTypeInfo creates a Column instance with the given type info. -func NewColumnWithTypeInfo(name string, tag uint64, typeInfo typeinfo.TypeInfo, partOfPK bool, defaultVal string, constraints ...ColConstraint) (Column, error) { +func NewColumnWithTypeInfo(name string, tag uint64, typeInfo typeinfo.TypeInfo, partOfPK bool, defaultVal, comment string, constraints ...ColConstraint) (Column, error) { for _, c := range constraints { if c == nil { return Column{}, errors.New("nil passed as a constraint") @@ -107,6 +111,7 @@ func NewColumnWithTypeInfo(name string, tag uint64, typeInfo typeinfo.TypeInfo, partOfPK, typeInfo, defaultVal, + comment, constraints, }, nil } diff --git a/go/libraries/doltcore/schema/encoding/schema_marshaling.go b/go/libraries/doltcore/schema/encoding/schema_marshaling.go index c0dbb64b17..2b3b81a524 100644 --- a/go/libraries/doltcore/schema/encoding/schema_marshaling.go +++ b/go/libraries/doltcore/schema/encoding/schema_marshaling.go @@ -46,6 +46,8 @@ type encodedColumn struct { Default string `noms:"default,omitempty" json:"default,omitempty"` + Comment string `noms:"comment,omitempty" json:"comment,omitempty"` + Constraints []encodedConstraint `noms:"col_constraints" json:"col_constraints"` // NB: all new fields must have the 'omitempty' annotation. See comment above @@ -84,6 +86,7 @@ func encodeColumn(col schema.Column) encodedColumn { col.IsPartOfPK, encodeTypeInfo(col.TypeInfo), col.Default, + col.Comment, encodeAllColConstraints(col.Constraints), } } @@ -102,7 +105,7 @@ func (nfd encodedColumn) decodeColumn() (schema.Column, error) { return schema.Column{}, errors.New("cannot decode column due to unknown schema format") } colConstraints := decodeAllColConstraint(nfd.Constraints) - return schema.NewColumnWithTypeInfo(nfd.Name, nfd.Tag, typeInfo, nfd.IsPartOfPK, nfd.Default, colConstraints...) + return schema.NewColumnWithTypeInfo(nfd.Name, nfd.Tag, typeInfo, nfd.IsPartOfPK, nfd.Default, nfd.Comment, colConstraints...) } type encodedConstraint struct { diff --git a/go/libraries/doltcore/schema/encoding/schema_marshaling_test.go b/go/libraries/doltcore/schema/encoding/schema_marshaling_test.go index 4bd2307a8f..36fec378b4 100644 --- a/go/libraries/doltcore/schema/encoding/schema_marshaling_test.go +++ b/go/libraries/doltcore/schema/encoding/schema_marshaling_test.go @@ -42,6 +42,7 @@ func createTestSchema() schema.Schema { } for i := range columns { columns[i].Default = `""` + columns[i].Comment = "hello world" } colColl, _ := schema.NewColCollection(columns...) @@ -148,7 +149,7 @@ func TestTypeInfoMarshalling(t *testing.T) { t.Run(sqlType.String(), func(t *testing.T) { ti, err := typeinfo.FromSqlType(sqlType) require.NoError(t, err) - col, err := schema.NewColumnWithTypeInfo("pk", 1, ti, true, "") + col, err := schema.NewColumnWithTypeInfo("pk", 1, ti, true, "", "") require.NoError(t, err) colColl, err := schema.NewColCollection(col) require.NoError(t, err) @@ -209,6 +210,8 @@ type testEncodedColumn struct { Default string `noms:"default" json:"default"` + Comment string `noms:"comment" json:"comment"` + Constraints []encodedConstraint `noms:"col_constraints" json:"col_constraints"` } @@ -239,7 +242,7 @@ func (tec testEncodedColumn) decodeColumn() (schema.Column, error) { return schema.Column{}, errors.New("cannot decode column due to unknown schema format") } colConstraints := decodeAllColConstraint(tec.Constraints) - return schema.NewColumnWithTypeInfo(tec.Name, tec.Tag, typeInfo, tec.IsPartOfPK, tec.Default, colConstraints...) + return schema.NewColumnWithTypeInfo(tec.Name, tec.Tag, typeInfo, tec.IsPartOfPK, tec.Default, tec.Comment, colConstraints...) } func (tsd testSchemaData) decodeSchema() (schema.Schema, error) { diff --git a/go/libraries/doltcore/schema/schema_test.go b/go/libraries/doltcore/schema/schema_test.go index 1d5ae31a7f..e0639d1a9c 100644 --- a/go/libraries/doltcore/schema/schema_test.go +++ b/go/libraries/doltcore/schema/schema_test.go @@ -47,14 +47,14 @@ var ageVal = types.Uint(53) var titleVal = types.NullValue var pkCols = []Column{ - {lnColName, lnColTag, types.StringKind, true, typeinfo.StringDefaultType, "", nil}, - {fnColName, fnColTag, types.StringKind, true, typeinfo.StringDefaultType, "", nil}, + {lnColName, lnColTag, types.StringKind, true, typeinfo.StringDefaultType, "", "", nil}, + {fnColName, fnColTag, types.StringKind, true, typeinfo.StringDefaultType, "", "", nil}, } var nonPkCols = []Column{ - {addrColName, addrColTag, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {ageColName, ageColTag, types.UintKind, false, typeinfo.FromKind(types.UintKind), "", nil}, - {titleColName, titleColTag, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, - {reservedColName, reservedColTag, types.StringKind, false, typeinfo.StringDefaultType, "", nil}, + {addrColName, addrColTag, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {ageColName, ageColTag, types.UintKind, false, typeinfo.FromKind(types.UintKind), "", "", nil}, + {titleColName, titleColTag, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, + {reservedColName, reservedColTag, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}, } var allCols = append(append([]Column(nil), pkCols...), nonPkCols...) @@ -98,7 +98,7 @@ func TestValidateForInsert(t *testing.T) { }) t.Run("Name collision", func(t *testing.T) { - cols := append(allCols, Column{titleColName, 100, types.StringKind, false, typeinfo.StringDefaultType, "", nil}) + cols := append(allCols, Column{titleColName, 100, types.StringKind, false, typeinfo.StringDefaultType, "", "", nil}) colColl, err := NewColCollection(cols...) require.NoError(t, err) diff --git a/go/libraries/doltcore/schema/super_schema_test.go b/go/libraries/doltcore/schema/super_schema_test.go index 159acb8f74..1d94b999ac 100644 --- a/go/libraries/doltcore/schema/super_schema_test.go +++ b/go/libraries/doltcore/schema/super_schema_test.go @@ -54,7 +54,7 @@ var nameCollisionWithSch1 = mustSchema([]Column{ var tagCollisionWithSch1 = mustSchema([]Column{ strCol("a", 1, true), - {"collision", 2, types.IntKind, false, typeinfo.Int32Type, "", nil}, + {"collision", 2, types.IntKind, false, typeinfo.Int32Type, "", "", nil}, }) type SuperSchemaTest struct { @@ -238,5 +238,5 @@ func mustColColl(cols []Column) *ColCollection { } func strCol(name string, tag uint64, isPK bool) Column { - return Column{name, tag, types.StringKind, isPK, typeinfo.StringDefaultType, "", nil} + return Column{name, tag, types.StringKind, isPK, typeinfo.StringDefaultType, "", "", nil} } diff --git a/go/libraries/doltcore/sql/sqltestutil/data.go b/go/libraries/doltcore/sql/sqltestutil/data.go index 21bdbf826f..9fef0a8ef4 100644 --- a/go/libraries/doltcore/sql/sqltestutil/data.go +++ b/go/libraries/doltcore/sql/sqltestutil/data.go @@ -119,7 +119,7 @@ func createAppearancesTestSchema() schema.Schema { } func newColumnWithTypeInfo(name string, tag uint64, info typeinfo.TypeInfo, partOfPk bool, constraints ...schema.ColConstraint) schema.Column { - col, err := schema.NewColumnWithTypeInfo(name, tag, info, partOfPk, "", constraints...) + col, err := schema.NewColumnWithTypeInfo(name, tag, info, partOfPk, "", "", constraints...) if err != nil { panic(fmt.Sprintf("unexpected error creating column: %s", err.Error())) } diff --git a/go/libraries/doltcore/sqle/common_test.go b/go/libraries/doltcore/sqle/common_test.go index cb5fb9744c..98c67f37ec 100644 --- a/go/libraries/doltcore/sqle/common_test.go +++ b/go/libraries/doltcore/sqle/common_test.go @@ -134,11 +134,23 @@ func schemaNewColumn(t *testing.T, name string, tag uint64, sqlType sql.Type, pa func schemaNewColumnWDefVal(t *testing.T, name string, tag uint64, sqlType sql.Type, partOfPK bool, defaultVal string, constraints ...schema.ColConstraint) schema.Column { typeInfo, err := typeinfo.FromSqlType(sqlType) require.NoError(t, err) - col, err := schema.NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, defaultVal, constraints...) + col, err := schema.NewColumnWithTypeInfo(name, tag, typeInfo, partOfPK, defaultVal, "", constraints...) require.NoError(t, err) return col } +func equalSchemas(t *testing.T, expectedSch schema.Schema, sch schema.Schema) { + require.NotNil(t, expectedSch) + require.NotNil(t, sch) + require.Equal(t, expectedSch.GetAllCols().Size(), sch.GetAllCols().Size()) + cols := sch.GetAllCols().GetColumns() + for i, expectedCol := range expectedSch.GetAllCols().GetColumns() { + col := cols[i] + col.Tag = expectedCol.Tag + assert.Equal(t, expectedCol, col) + } +} + // TODO: this shouldn't be here func CreateWorkingRootUpdate() map[string]envtestutils.TableUpdate { return map[string]envtestutils.TableUpdate{ diff --git a/go/libraries/doltcore/sqle/database.go b/go/libraries/doltcore/sqle/database.go index fd1a0edea4..b518ce2aa4 100644 --- a/go/libraries/doltcore/sqle/database.go +++ b/go/libraries/doltcore/sqle/database.go @@ -122,6 +122,11 @@ func (tc *tableCache) AllForRoot(root *doltdb.RootValue) (map[string]sql.Table, return nil, false } +type SqlDatabase interface { + sql.Database + GetRoot(*sql.Context) (*doltdb.RootValue, error) +} + // Database implements sql.Database for a dolt DB. type Database struct { name string @@ -132,7 +137,7 @@ type Database struct { tc *tableCache } -var _ sql.Database = Database{} +var _ SqlDatabase = Database{} var _ sql.VersionedDatabase = Database{} var _ sql.TableDropper = Database{} var _ sql.TableCreator = Database{} @@ -388,9 +393,9 @@ func (db Database) getTable(ctx context.Context, root *doltdb.RootValue, tableNa if doltdb.IsReadOnlySystemTable(tableName) { table = &readonlyTable } else if doltdb.HasDoltPrefix(tableName) { - table = &WritableDoltTable{DoltTable: readonlyTable} + table = &WritableDoltTable{DoltTable: readonlyTable, db: db} } else { - table = &AlterableDoltTable{WritableDoltTable{DoltTable: readonlyTable}} + table = &AlterableDoltTable{WritableDoltTable{DoltTable: readonlyTable, db: db}} } db.tc.Put(tableName, root, table) @@ -574,17 +579,6 @@ func (db Database) CreateTable(ctx *sql.Context, tableName string, sch sql.Schem return ErrInvalidTableName.New(tableName) } - for _, col := range sch { - commentTag := sqleSchema.ExtractTag(col) - if commentTag == schema.InvalidTag { - // we'll replace this invalid tag - continue - } - if commentTag >= schema.ReservedTagMin { - return fmt.Errorf("tag %d is within the reserved tag space", commentTag) - } - } - return db.createTable(ctx, tableName, sch) } diff --git a/go/libraries/doltcore/sqle/dolt_index.go b/go/libraries/doltcore/sqle/dolt_index.go index b9090a25b8..e282c144e8 100644 --- a/go/libraries/doltcore/sqle/dolt_index.go +++ b/go/libraries/doltcore/sqle/dolt_index.go @@ -30,14 +30,13 @@ type DoltIndex interface { sql.Index sql.AscendIndex sql.DescendIndex - DoltDatabase() Database Schema() schema.Schema TableData() types.Map } type doltIndex struct { cols []schema.Column - db Database + db sql.Database id string indexRowData types.Map indexSch schema.Schema @@ -121,12 +120,7 @@ func (di *doltIndex) DescendRange(lessOrEqual, greaterOrEqual []interface{}) (sq // Database implement sql.Index func (di *doltIndex) Database() string { - return di.db.name -} - -// DoltDatabase returns the dolt database that created this index. -func (di *doltIndex) DoltDatabase() Database { - return di.db + return di.db.Name() } // Expressions implements sql.Index diff --git a/go/libraries/doltcore/sqle/schema/schema.go b/go/libraries/doltcore/sqle/schema/schema.go index 96f113719e..bf5d398432 100644 --- a/go/libraries/doltcore/sqle/schema/schema.go +++ b/go/libraries/doltcore/sqle/schema/schema.go @@ -17,8 +17,6 @@ package schema import ( "context" "fmt" - "strconv" - "strings" sqle "github.com/liquidata-inc/go-mysql-server" "github.com/liquidata-inc/go-mysql-server/sql" @@ -29,12 +27,9 @@ import ( "github.com/liquidata-inc/dolt/go/libraries/doltcore/row" "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema" "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema/typeinfo" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle/sqlfmt" "github.com/liquidata-inc/dolt/go/store/types" ) -var ErrPartiallyDefinedTags = fmt.Errorf("must define tags for all or none of the schema columns") - // ApplyDefaults applies the default values to the given indices, returning the resulting row. func ApplyDefaults(ctx context.Context, doltSchema schema.Schema, sqlSchema sql.Schema, indicesOfColumns []int, dRow row.Row) (row.Row, error) { if len(indicesOfColumns) == 0 { @@ -140,7 +135,8 @@ func FromDoltSchema(tableName string, sch schema.Schema) (sql.Schema, error) { Nullable: col.IsNullable(), Source: tableName, PrimaryKey: col.IsPartOfPK, - Comment: fmt.Sprintf("tag:%d", col.Tag), + Comment: col.Comment, + Extra: fmt.Sprintf("tag:%d", tag), }, Default: col.Default, } @@ -157,39 +153,20 @@ func ToDoltSchema(ctx context.Context, root *doltdb.RootValue, tableName string, var cols []schema.Column var err error - // Users must define all or none of the column tags - userDefinedTags := ExtractTag(sqlSchema[0]) != schema.InvalidTag - var tags []uint64 - - if userDefinedTags { - for _, col := range sqlSchema { - commentTag := ExtractTag(col) - tags = append(tags, commentTag) - if commentTag == schema.InvalidTag { - return nil, ErrPartiallyDefinedTags - } - } - } else { - // generate tags for all columns - var names []string - var kinds []types.NomsKind - for _, col := range sqlSchema { - names = append(names, col.Name) - ti, err := typeinfo.FromSqlType(col.Type) - if err != nil { - return nil, err - } - kinds = append(kinds, ti.NomsKind()) - - // check for user defined tags - if ExtractTag(col) != schema.InvalidTag { - return nil, ErrPartiallyDefinedTags - } - } - tags, err = root.GenerateTagsForNewColumns(ctx, tableName, names, kinds) + // generate tags for all columns + var names []string + var kinds []types.NomsKind + for _, col := range sqlSchema { + names = append(names, col.Name) + ti, err := typeinfo.FromSqlType(col.Type) if err != nil { return nil, err } + kinds = append(kinds, ti.NomsKind()) + } + tags, err := root.GenerateTagsForNewColumns(ctx, tableName, names, kinds) + if err != nil { + return nil, err } if len(tags) != len(sqlSchema) { @@ -228,24 +205,5 @@ func ToDoltCol(tag uint64, col *sql.Column) (schema.Column, error) { return schema.Column{}, err } - return schema.NewColumnWithTypeInfo(col.Name, tag, typeInfo, col.PrimaryKey, col.Default.String(), constraints...) -} - -// ExtractTag extracts the optional comment tag from a column type defn, or InvalidTag if it can't be extracted -func ExtractTag(col *sql.Column) uint64 { - if len(col.Comment) == 0 { - return schema.InvalidTag - } - - i := strings.Index(col.Comment, sqlfmt.TagCommentPrefix) - if i >= 0 { - startIdx := i + len(sqlfmt.TagCommentPrefix) - tag, err := strconv.ParseUint(col.Comment[startIdx:], 10, 64) - if err != nil { - return schema.InvalidTag - } - return tag - } - - return schema.InvalidTag + return schema.NewColumnWithTypeInfo(col.Name, tag, typeInfo, col.PrimaryKey, col.Default.String(), col.Comment, constraints...) } diff --git a/go/libraries/doltcore/sqle/schema_table.go b/go/libraries/doltcore/sqle/schema_table.go index d4e09e6e4b..09c1856ad2 100644 --- a/go/libraries/doltcore/sqle/schema_table.go +++ b/go/libraries/doltcore/sqle/schema_table.go @@ -17,8 +17,6 @@ package sqle import ( "github.com/liquidata-inc/go-mysql-server/sql" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle/sqlfmt" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" ) @@ -26,12 +24,12 @@ import ( func SchemasTableSchema() sql.Schema { return []*sql.Column{ // Currently: `view`. - {Name: doltdb.SchemasTablesTypeCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: true, Comment: sqlfmt.FmtColTagComment(doltdb.DoltSchemasTypeTag)}, + {Name: doltdb.SchemasTablesTypeCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: true}, // The name of the database entity. - {Name: doltdb.SchemasTablesNameCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: true, Comment: sqlfmt.FmtColTagComment(doltdb.DoltSchemasNameTag)}, + {Name: doltdb.SchemasTablesNameCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: true}, // The schema fragment associated with the database entity. // For example, the SELECT statement for a CREATE VIEW. - {Name: doltdb.SchemasTablesFragmentCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: false, Comment: sqlfmt.FmtColTagComment(doltdb.DoltSchemasFragmentTag)}, + {Name: doltdb.SchemasTablesFragmentCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: false}, } } diff --git a/go/libraries/doltcore/sqle/schema_util_test.go b/go/libraries/doltcore/sqle/schema_util_test.go index 2ef22ea74b..c323be9c48 100644 --- a/go/libraries/doltcore/sqle/schema_util_test.go +++ b/go/libraries/doltcore/sqle/schema_util_test.go @@ -269,11 +269,11 @@ func CompressSchema(sch schema.Schema, colNames ...string) schema.Schema { } } else { cols = make([]schema.Column, sch.GetAllCols().Size()) - sch.GetAllCols().IterInSortedOrder(func(tag uint64, col schema.Column) (stop bool) { + sch.GetAllCols().Iter(func(tag uint64, col schema.Column) (stop bool, err error) { col.Tag = itag cols[itag] = col itag++ - return false + return false, nil }) } diff --git a/go/libraries/doltcore/sqle/show_create_table.go b/go/libraries/doltcore/sqle/show_create_table.go new file mode 100644 index 0000000000..dd98483ab8 --- /dev/null +++ b/go/libraries/doltcore/sqle/show_create_table.go @@ -0,0 +1,59 @@ +// Copyright 2020 Liquidata, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqle + +import ( + "context" + "fmt" + + sqle "github.com/liquidata-inc/go-mysql-server" + "github.com/liquidata-inc/go-mysql-server/sql" + + "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" +) + +// These functions cannot be in the sqlfmt package as the reliance on the sqle package creates a circular reference. + +func PrepareCreateTableStmt(ctx context.Context, root *doltdb.RootValue) (*sql.Context, *sqle.Engine, *DoltSession) { + dsess := DefaultDoltSession() + sqlCtx := sql.NewContext(ctx, + sql.WithSession(dsess), + sql.WithIndexRegistry(sql.NewIndexRegistry()), + sql.WithViewRegistry(sql.NewViewRegistry())) + engine := sqle.NewDefault() + sqlDb := &UserSpaceDatabase{RootValue: root} + engine.AddDatabase(sqlDb) + dsess.SetCurrentDatabase(sqlDb.Name()) + return sqlCtx, engine, dsess +} + +func GetCreateTableStmt(ctx *sql.Context, engine *sqle.Engine, tableName string) (string, error) { + _, rowIter, err := engine.Query(ctx, fmt.Sprintf("SHOW CREATE TABLE `%s`;", tableName)) + if err != nil { + return "", err + } + rows, err := sql.RowIterToRows(rowIter) + if err != nil { + return "", err + } + if len(rows) != 1 || len(rows[0]) != 2 { + return "", fmt.Errorf("unexpected result from SHOW CREATE TABLE") + } + stmt, ok := rows[0][1].(string) + if !ok { + return "", fmt.Errorf("expected string statement from SHOW CREATE TABLE") + } + return stmt + ";", nil +} diff --git a/go/libraries/doltcore/sqle/sqlddl_test.go b/go/libraries/doltcore/sqle/sqlddl_test.go index 9fbf8c5ade..b97b9db0d0 100644 --- a/go/libraries/doltcore/sqle/sqlddl_test.go +++ b/go/libraries/doltcore/sqle/sqlddl_test.go @@ -45,18 +45,18 @@ func TestCreateTable(t *testing.T) { }{ { name: "Test create single column schema", - query: "create table testTable (id int primary key comment 'tag:100')", + query: "create table testTable (id int primary key)", expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{})), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{})), }, { name: "Test create two column schema", - query: "create table testTable (id int primary key comment 'tag:100', age int comment 'tag:101')", + query: "create table testTable (id int primary key, age int)", expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, false)), }, { name: "Test syntax error", @@ -98,132 +98,123 @@ func TestCreateTable(t *testing.T) { { name: "Test types", query: `create table testTable ( - id int primary key comment 'tag:100', - age int comment 'tag:101', - first_name varchar(255) comment 'tag:102', - is_married boolean comment 'tag:103') `, + id int primary key, + age int, + first_name varchar(255), + is_married boolean) `, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, false), - schemaNewColumn(t, "first_name", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), - schemaNewColumn(t, "is_married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, false), + schemaNewColumn(t, "first_name", 3264, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), + schemaNewColumn(t, "is_married", 14626, sql.Boolean, false)), }, { name: "Test all supported types", expectedTable: "testTable", query: `create table testTable ( - c0 int primary key comment 'tag:100', - c1 tinyint comment 'tag:101', - c2 smallint comment 'tag:102', - c3 mediumint comment 'tag:103', - c4 integer comment 'tag:104', - c5 bigint comment 'tag:105', - c6 bool comment 'tag:106', - c7 boolean comment 'tag:107', - c8 bit(10) comment 'tag:108', - c9 text comment 'tag:109', - c10 tinytext comment 'tag:110', - c11 mediumtext comment 'tag:111', - c12 longtext comment 'tag:112', - c16 char(5) comment 'tag:116', - c17 varchar(255) comment 'tag:117', - c18 varchar(80) comment 'tag:118', - c19 float comment 'tag:119', - c20 double comment 'tag:120', - c22 int unsigned comment 'tag:122', - c23 tinyint unsigned comment 'tag:123', - c24 smallint unsigned comment 'tag:124', - c25 mediumint unsigned comment 'tag:125', - c26 bigint unsigned comment 'tag:126')`, + c0 int primary key, + c1 tinyint, + c2 smallint, + c3 mediumint, + c4 integer, + c5 bigint, + c6 bool, + c7 boolean, + c8 bit(10), + c9 text, + c10 tinytext, + c11 mediumtext, + c12 longtext, + c16 char(5), + c17 varchar(255), + c18 varchar(80), + c19 float, + c20 double, + c22 int unsigned, + c23 tinyint unsigned, + c24 smallint unsigned, + c25 mediumint unsigned, + c26 bigint unsigned)`, expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "c0", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "c1", 101, sql.Int8, false), - schemaNewColumn(t, "c2", 102, sql.Int16, false), - schemaNewColumn(t, "c3", 103, sql.Int24, false), - schemaNewColumn(t, "c4", 104, sql.Int32, false), - schemaNewColumn(t, "c5", 105, sql.Int64, false), - schemaNewColumn(t, "c6", 106, sql.Boolean, false), - schemaNewColumn(t, "c7", 107, sql.Boolean, false), - schemaNewColumn(t, "c8", 108, sql.MustCreateBitType(10), false), - schemaNewColumn(t, "c9", 109, sql.Text, false), - schemaNewColumn(t, "c10", 110, sql.TinyText, false), - schemaNewColumn(t, "c11", 111, sql.MediumText, false), - schemaNewColumn(t, "c12", 112, sql.LongText, false), + schemaNewColumn(t, "c0", 594, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "c1", 601, sql.Int8, false), + schemaNewColumn(t, "c2", 14542, sql.Int16, false), + schemaNewColumn(t, "c3", 13309, sql.Int24, false), + schemaNewColumn(t, "c4", 15884, sql.Int32, false), + schemaNewColumn(t, "c5", 14619, sql.Int64, false), + schemaNewColumn(t, "c6", 13192, sql.Boolean, false), + schemaNewColumn(t, "c7", 5981, sql.Boolean, false), + schemaNewColumn(t, "c8", 14871, sql.MustCreateBitType(10), false), + schemaNewColumn(t, "c9", 4167, sql.Text, false), + schemaNewColumn(t, "c10", 1965, sql.TinyText, false), + schemaNewColumn(t, "c11", 12860, sql.MediumText, false), + schemaNewColumn(t, "c12", 7155, sql.LongText, false), //schemaNewColumn(t, "c13", 113, sql.TinyBlob, false), //schemaNewColumn(t, "c14", 114, sql.Blob, false), //schemaNewColumn(t, "c15", 115, sql.LongBlob, false), - schemaNewColumn(t, "c16", 116, sql.MustCreateStringWithDefaults(sqltypes.Char, 5), false), - schemaNewColumn(t, "c17", 117, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), - schemaNewColumn(t, "c18", 118, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), - schemaNewColumn(t, "c19", 119, sql.Float32, false), - schemaNewColumn(t, "c20", 120, sql.Float64, false), + schemaNewColumn(t, "c16", 15859, sql.MustCreateStringWithDefaults(sqltypes.Char, 5), false), + schemaNewColumn(t, "c17", 11710, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), + schemaNewColumn(t, "c18", 6838, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "c19", 9377, sql.Float32, false), + schemaNewColumn(t, "c20", 15979, sql.Float64, false), //schemaNewColumn(t, "c21", 121, sql.MustCreateDecimalType(10, 5), false), - schemaNewColumn(t, "c22", 122, sql.Uint32, false), - schemaNewColumn(t, "c23", 123, sql.Uint8, false), - schemaNewColumn(t, "c24", 124, sql.Uint16, false), - schemaNewColumn(t, "c25", 125, sql.Uint24, false), - schemaNewColumn(t, "c26", 126, sql.Uint64, false), + schemaNewColumn(t, "c22", 2910, sql.Uint32, false), + schemaNewColumn(t, "c23", 8740, sql.Uint8, false), + schemaNewColumn(t, "c24", 8689, sql.Uint16, false), + schemaNewColumn(t, "c25", 5243, sql.Uint24, false), + schemaNewColumn(t, "c26", 9338, sql.Uint64, false), ), }, { name: "Test primary keys", query: `create table testTable ( - id int comment 'tag:100', - age int comment 'tag:101', - first_name varchar(80) comment 'tag:102', - is_married bool comment 'tag:103', + id int, + age int, + first_name varchar(80), + is_married bool, primary key (id, age))`, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "first_name", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), - schemaNewColumn(t, "is_married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "first_name", 3264, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "is_married", 14626, sql.Boolean, false)), }, { name: "Test not null constraints", query: `create table testTable ( - id int comment 'tag:100', - age int comment 'tag:101', - first_name varchar(80) not null comment 'tag:102', - is_married bool comment 'tag:103', + id int, + age int, + first_name varchar(80) not null, + is_married bool, primary key (id, age))`, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "first_name", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false, schema.NotNullConstraint{}), - schemaNewColumn(t, "is_married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "first_name", 3264, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false, schema.NotNullConstraint{}), + schemaNewColumn(t, "is_married", 14626, sql.Boolean, false)), }, { name: "Test quoted columns", query: "create table testTable (" + - "`id` int comment 'tag:100', " + - "`age` int comment 'tag:101', " + - "`timestamp` varchar(80) comment 'tag:102', " + - "`is married` bool comment 'tag:103', " + + "`id` int, " + + "`age` int, " + + "`timestamp` varchar(80), " + + "`is married` bool, " + "primary key (`id`, `age`))", expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "timestamp", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), - schemaNewColumn(t, "is married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "timestamp", 10168, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "is married", 14626, sql.Boolean, false)), }, { name: "Test tag comments", query: `create table testTable ( - id int primary key comment 'tag:5', age int comment 'tag:10')`, - expectedTable: "testTable", - expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 5, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 10, sql.Int32, false)), - }, - { - name: "Test faulty tag comments", - query: `create table testTable ( - id int primary key comment 'tag:a', age int comment 'this is my personal area')`, + id int primary key, age int)`, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), @@ -233,34 +224,34 @@ func TestCreateTable(t *testing.T) { { name: "Test ip2nation", query: `CREATE TABLE ip2nation ( - ip int(11) unsigned NOT NULL default 0 comment 'tag:100', - country char(2) NOT NULL default '' comment 'tag:101', + ip int(11) unsigned NOT NULL default 0, + country char(2) NOT NULL default '', PRIMARY KEY (ip));`, expectedTable: "ip2nation", expectedSchema: dtestutils.CreateSchema( - schemaNewColumnWDefVal(t, "ip", 100, sql.Uint32, true, "0", schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "country", 101, sql.MustCreateStringWithDefaults(sqltypes.Char, 2), false, `""`, schema.NotNullConstraint{})), + schemaNewColumnWDefVal(t, "ip", 7265, sql.Uint32, true, "0", schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "country", 6630, sql.MustCreateStringWithDefaults(sqltypes.Char, 2), false, `""`, schema.NotNullConstraint{})), }, { name: "Test ip2nationCountries", expectedTable: "ip2nationCountries", query: `CREATE TABLE ip2nationCountries ( - code varchar(4) NOT NULL default '' COMMENT 'tag:100', - iso_code_2 varchar(2) NOT NULL default '' COMMENT 'tag:101', - iso_code_3 varchar(3) default '' COMMENT 'tag:102', - iso_country varchar(255) NOT NULL default '' COMMENT 'tag:103', - country varchar(255) NOT NULL default '' COMMENT 'tag:104', - lat float NOT NULL default 0.0 COMMENT 'tag:105', - lon float NOT NULL default 0.0 COMMENT 'tag:106', + code varchar(4) NOT NULL default '', + iso_code_2 varchar(2) NOT NULL default '', + iso_code_3 varchar(3) default '', + iso_country varchar(255) NOT NULL default '', + country varchar(255) NOT NULL default '', + lat float NOT NULL default 0.0, + lon float NOT NULL default 0.0, PRIMARY KEY (code));`, expectedSchema: dtestutils.CreateSchema( - schemaNewColumnWDefVal(t, "code", 100, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 4), true, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "iso_code_2", 101, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 2), false, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "iso_code_3", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 3), false, `""`), - schemaNewColumnWDefVal(t, "iso_country", 103, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "country", 104, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "lat", 105, sql.Float32, false, "0", schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "lon", 106, sql.Float32, false, "0", schema.NotNullConstraint{})), + schemaNewColumnWDefVal(t, "code", 7802, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 4), true, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "iso_code_2", 9266, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 2), false, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "iso_code_3", 8427, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 3), false, `""`), + schemaNewColumnWDefVal(t, "iso_country", 7151, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "country", 879, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "lat", 3502, sql.Float32, false, "0", schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "lon", 9907, sql.Float32, false, "0", schema.NotNullConstraint{})), }, } @@ -289,7 +280,7 @@ func TestCreateTable(t *testing.T) { sch, err := table.GetSchema(ctx) require.NoError(t, err) - assert.Equal(t, tt.expectedSchema, sch) + equalSchemas(t, tt.expectedSchema, sch) }) } } @@ -375,16 +366,16 @@ func TestAddColumn(t *testing.T) { }{ { name: "alter add column", - query: "alter table people add (newColumn varchar(80) comment 'tag:100')", + query: "alter table people add (newColumn varchar(80))", expectedSchema: dtestutils.AddColumnToSchema(PeopleTestSchema, - schemaNewColumn(t, "newColumn", 100, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false)), - expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 100, nil), + schemaNewColumn(t, "newColumn", 4208, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false)), + expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 4208, nil), }, { name: "alter add column first", - query: "alter table people add newColumn varchar(80) comment 'tag:100' first", + query: "alter table people add newColumn varchar(80) first", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "newColumn", 100, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "newColumn", 4208, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), schema.NewColumn("id", IdTag, types.IntKind, true, schema.NotNullConstraint{}), schema.NewColumn("first_name", FirstNameTag, types.StringKind, false, schema.NotNullConstraint{}), schema.NewColumn("last_name", LastNameTag, types.StringKind, false, schema.NotNullConstraint{}), @@ -394,82 +385,77 @@ func TestAddColumn(t *testing.T) { schema.NewColumn("uuid", UuidTag, types.UUIDKind, false), schema.NewColumn("num_episodes", NumEpisodesTag, types.UintKind, false), ), - expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 100, nil), + expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 4208, nil), }, { name: "alter add column middle", - query: "alter table people add newColumn varchar(80) comment 'tag:100' after last_name", + query: "alter table people add newColumn varchar(80) after last_name", expectedSchema: dtestutils.CreateSchema( schema.NewColumn("id", IdTag, types.IntKind, true, schema.NotNullConstraint{}), schema.NewColumn("first_name", FirstNameTag, types.StringKind, false, schema.NotNullConstraint{}), schema.NewColumn("last_name", LastNameTag, types.StringKind, false, schema.NotNullConstraint{}), - schemaNewColumn(t, "newColumn", 100, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "newColumn", 4208, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), schema.NewColumn("is_married", IsMarriedTag, types.BoolKind, false), schema.NewColumn("age", AgeTag, types.IntKind, false), schema.NewColumn("rating", RatingTag, types.FloatKind, false), schema.NewColumn("uuid", UuidTag, types.UUIDKind, false), schema.NewColumn("num_episodes", NumEpisodesTag, types.UintKind, false), ), - expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 100, nil), + expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 4208, nil), }, { name: "alter add column not null", - query: "alter table people add (newColumn varchar(80) not null default 'default' comment 'tag:100')", + query: "alter table people add (newColumn varchar(80) not null default 'default')", expectedSchema: dtestutils.AddColumnToSchema(PeopleTestSchema, - schemaNewColumnWDefVal(t, "newColumn", 100, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false, `"default"`, schema.NotNullConstraint{})), - expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 100, types.String("default")), + schemaNewColumnWDefVal(t, "newColumn", 4208, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false, `"default"`, schema.NotNullConstraint{})), + expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 4208, types.String("default")), }, { name: "alter add column not null with expression default", - query: "alter table people add (newColumn int not null default 2+2/2 comment 'tag:100')", + query: "alter table people add (newColumn int not null default 2+2/2)", expectedSchema: dtestutils.AddColumnToSchema(PeopleTestSchema, - schemaNewColumnWDefVal(t, "newColumn", 100, sql.Int32, false, "(2 + 2 / 2)", schema.NotNullConstraint{})), - expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 100, types.Int(3)), + schemaNewColumnWDefVal(t, "newColumn", 4435, sql.Int32, false, "(2 + 2 / 2)", schema.NotNullConstraint{})), + expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 4435, types.Int(3)), }, { name: "alter add column not null with negative expression", - query: "alter table people add (newColumn float not null default -1.1 comment 'tag:100')", + query: "alter table people add (newColumn float not null default -1.1)", expectedSchema: dtestutils.AddColumnToSchema(PeopleTestSchema, - schemaNewColumnWDefVal(t, "newColumn", 100, sql.Float32, false, "-1.1", schema.NotNullConstraint{})), - expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 100, types.Float(float32(-1.1))), + schemaNewColumnWDefVal(t, "newColumn", 13066, sql.Float32, false, "-1.1", schema.NotNullConstraint{})), + expectedRows: dtestutils.AddColToRows(t, AllPeopleRows, 13066, types.Float(float32(-1.1))), }, { name: "alter add column not null with type mismatch in default", - query: "alter table people add (newColumn float not null default 'not a number' comment 'tag:100')", + query: "alter table people add (newColumn float not null default 'not a number')", expectedErr: "incompatible type", }, { name: "alter add column column not found", - query: "alter table people add column newColumn float comment 'tag:100' after notFound", + query: "alter table people add column newColumn float after notFound", expectedErr: `table "people" does not have column "notFound"`, }, { name: "alter add column table not found", - query: "alter table notFound add column newColumn float comment 'tag:100'", + query: "alter table notFound add column newColumn float", expectedErr: "table not found: notFound", }, - { - name: "alter add column with tag conflict", - query: fmt.Sprintf("alter table people add (newColumn float default 1.0 comment 'tag:%d')", IdTag), - expectedErr: fmt.Sprintf("Cannot create column newColumn, the tag %d was already used in table people", IdTag), - }, { name: "alter add column not null without default", - query: "alter table people add (newColumn varchar(80) not null comment 'tag:100')", + query: "alter table people add (newColumn varchar(80) not null)", expectedErr: "must have a non-null default value", }, { name: "alter add column nullable", - query: "alter table people add (newColumn bigint comment 'tag:100')", + query: "alter table people add (newColumn bigint)", expectedSchema: dtestutils.AddColumnToSchema(PeopleTestSchema, - schemaNewColumn(t, "newColumn", 100, sql.Int64, false)), + schemaNewColumn(t, "newColumn", 4435, sql.Int64, false)), expectedRows: AllPeopleRows, }, { name: "alter add column with optional column keyword", - query: "alter table people add column (newColumn varchar(80) comment 'tag:100')", + query: "alter table people add column (newColumn varchar(80))", expectedSchema: dtestutils.AddColumnToSchema(PeopleTestSchema, - schemaNewColumn(t, "newColumn", 100, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false)), + schemaNewColumn(t, "newColumn", 4208, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false)), expectedRows: AllPeopleRows, }, } @@ -496,7 +482,7 @@ func TestAddColumn(t *testing.T) { assert.NoError(t, err) sch, err := table.GetSchema(ctx) assert.NoError(t, err) - assert.Equal(t, tt.expectedSchema, sch) + equalSchemas(t, tt.expectedSchema, sch) updatedTable, ok, err := updatedRoot.GetTable(ctx, "people") assert.NoError(t, err) @@ -616,21 +602,11 @@ func TestModifyAndChangeColumn(t *testing.T) { ), expectedRows: AllPeopleRows, }, - { - name: "alter modify column change tag", - query: "alter table people modify column first_name longtext not null comment 'tag:100'", - expectedErr: "cannot change the tag of an existing column", - }, { name: "alter modify column not null with type mismatch in default", query: "alter table people modify rating double default 'not a number'", expectedErr: "incompatible type for default value", }, - { - name: "alter modify column with tag conflict", - query: "alter table people modify rating double default 1.0 comment 'tag:1'", - expectedErr: "cannot change the tag of an existing column", - }, { name: "alter modify column with type change", query: "alter table people modify rating varchar(10)", @@ -665,7 +641,7 @@ func TestModifyAndChangeColumn(t *testing.T) { assert.NoError(t, err) sch, err := table.GetSchema(ctx) assert.NoError(t, err) - assert.Equal(t, tt.expectedSchema, sch) + equalSchemas(t, tt.expectedSchema, sch) updatedTable, ok, err := updatedRoot.GetTable(ctx, "people") assert.NoError(t, err) @@ -1060,18 +1036,18 @@ func TestParseCreateTableStatement(t *testing.T) { }{ { name: "Test create single column schema", - query: "create table testTable (id int primary key comment 'tag:100')", + query: "create table testTable (id int primary key)", expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{})), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{})), }, { name: "Test create two column schema", - query: "create table testTable (id int primary key comment 'tag:100', age int comment 'tag:101')", + query: "create table testTable (id int primary key, age int)", expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, false)), }, { name: "Test syntax error", @@ -1092,132 +1068,123 @@ func TestParseCreateTableStatement(t *testing.T) { { name: "Test types", query: `create table testTable ( - id int primary key comment 'tag:100', - age int comment 'tag:101', - first_name varchar(255) comment 'tag:102', - is_married boolean comment 'tag:103') `, + id int primary key, + age int, + first_name varchar(255), + is_married boolean) `, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, false), - schemaNewColumn(t, "first_name", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), - schemaNewColumn(t, "is_married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, false), + schemaNewColumn(t, "first_name", 3264, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), + schemaNewColumn(t, "is_married", 14626, sql.Boolean, false)), }, { name: "Test all supported types", expectedTable: "testTable", query: `create table testTable ( - c0 int primary key comment 'tag:100', - c1 tinyint comment 'tag:101', - c2 smallint comment 'tag:102', - c3 mediumint comment 'tag:103', - c4 integer comment 'tag:104', - c5 bigint comment 'tag:105', - c6 bool comment 'tag:106', - c7 boolean comment 'tag:107', - c8 bit(10) comment 'tag:108', - c9 text comment 'tag:109', - c10 tinytext comment 'tag:110', - c11 mediumtext comment 'tag:111', - c12 longtext comment 'tag:112', - c16 char(5) comment 'tag:116', - c17 varchar(255) comment 'tag:117', - c18 varchar(80) comment 'tag:118', - c19 float comment 'tag:119', - c20 double comment 'tag:120', - c22 int unsigned comment 'tag:122', - c23 tinyint unsigned comment 'tag:123', - c24 smallint unsigned comment 'tag:124', - c25 mediumint unsigned comment 'tag:125', - c26 bigint unsigned comment 'tag:126')`, + c0 int primary key, + c1 tinyint, + c2 smallint, + c3 mediumint, + c4 integer, + c5 bigint, + c6 bool, + c7 boolean, + c8 bit(10), + c9 text, + c10 tinytext, + c11 mediumtext, + c12 longtext, + c16 char(5), + c17 varchar(255), + c18 varchar(80), + c19 float, + c20 double, + c22 int unsigned, + c23 tinyint unsigned, + c24 smallint unsigned, + c25 mediumint unsigned, + c26 bigint unsigned)`, expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "c0", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "c1", 101, sql.Int8, false), - schemaNewColumn(t, "c2", 102, sql.Int16, false), - schemaNewColumn(t, "c3", 103, sql.Int24, false), - schemaNewColumn(t, "c4", 104, sql.Int32, false), - schemaNewColumn(t, "c5", 105, sql.Int64, false), - schemaNewColumn(t, "c6", 106, sql.Boolean, false), - schemaNewColumn(t, "c7", 107, sql.Boolean, false), - schemaNewColumn(t, "c8", 108, sql.MustCreateBitType(10), false), - schemaNewColumn(t, "c9", 109, sql.Text, false), - schemaNewColumn(t, "c10", 110, sql.TinyText, false), - schemaNewColumn(t, "c11", 111, sql.MediumText, false), - schemaNewColumn(t, "c12", 112, sql.LongText, false), + schemaNewColumn(t, "c0", 594, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "c1", 601, sql.Int8, false), + schemaNewColumn(t, "c2", 14542, sql.Int16, false), + schemaNewColumn(t, "c3", 13309, sql.Int24, false), + schemaNewColumn(t, "c4", 15884, sql.Int32, false), + schemaNewColumn(t, "c5", 14619, sql.Int64, false), + schemaNewColumn(t, "c6", 13192, sql.Boolean, false), + schemaNewColumn(t, "c7", 5981, sql.Boolean, false), + schemaNewColumn(t, "c8", 14871, sql.MustCreateBitType(10), false), + schemaNewColumn(t, "c9", 4167, sql.Text, false), + schemaNewColumn(t, "c10", 1965, sql.TinyText, false), + schemaNewColumn(t, "c11", 12860, sql.MediumText, false), + schemaNewColumn(t, "c12", 7155, sql.LongText, false), //schemaNewColumn(t, "c13", 113, sql.TinyBlob, false), //schemaNewColumn(t, "c14", 114, sql.Blob, false), //schemaNewColumn(t, "c15", 115, sql.LongBlob, false), - schemaNewColumn(t, "c16", 116, sql.MustCreateStringWithDefaults(sqltypes.Char, 5), false), - schemaNewColumn(t, "c17", 117, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), - schemaNewColumn(t, "c18", 118, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), - schemaNewColumn(t, "c19", 119, sql.Float32, false), - schemaNewColumn(t, "c20", 120, sql.Float64, false), + schemaNewColumn(t, "c16", 15859, sql.MustCreateStringWithDefaults(sqltypes.Char, 5), false), + schemaNewColumn(t, "c17", 11710, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false), + schemaNewColumn(t, "c18", 6838, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "c19", 9377, sql.Float32, false), + schemaNewColumn(t, "c20", 15979, sql.Float64, false), //schemaNewColumn(t, "c21", 121, sql.MustCreateDecimalType(10, 5), false), - schemaNewColumn(t, "c22", 122, sql.Uint32, false), - schemaNewColumn(t, "c23", 123, sql.Uint8, false), - schemaNewColumn(t, "c24", 124, sql.Uint16, false), - schemaNewColumn(t, "c25", 125, sql.Uint24, false), - schemaNewColumn(t, "c26", 126, sql.Uint64, false), + schemaNewColumn(t, "c22", 2910, sql.Uint32, false), + schemaNewColumn(t, "c23", 8740, sql.Uint8, false), + schemaNewColumn(t, "c24", 8689, sql.Uint16, false), + schemaNewColumn(t, "c25", 5243, sql.Uint24, false), + schemaNewColumn(t, "c26", 9338, sql.Uint64, false), ), }, { name: "Test primary keys", query: `create table testTable ( - id int comment 'tag:100', - age int comment 'tag:101', - first_name varchar(80) comment 'tag:102', - is_married bool comment 'tag:103', + id int, + age int, + first_name varchar(80), + is_married bool, primary key (id, age))`, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "first_name", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), - schemaNewColumn(t, "is_married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "first_name", 3264, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "is_married", 14626, sql.Boolean, false)), }, { name: "Test not null constraints", query: `create table testTable ( - id int comment 'tag:100', - age int comment 'tag:101', - first_name varchar(80) not null comment 'tag:102', - is_married bool comment 'tag:103', + id int, + age int, + first_name varchar(80) not null, + is_married bool, primary key (id, age))`, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "first_name", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false, schema.NotNullConstraint{}), - schemaNewColumn(t, "is_married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "first_name", 3264, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false, schema.NotNullConstraint{}), + schemaNewColumn(t, "is_married", 14626, sql.Boolean, false)), }, { name: "Test quoted columns", query: "create table testTable (" + - "`id` int comment 'tag:100', " + - "`age` int comment 'tag:101', " + - "`timestamp` varchar(80) comment 'tag:102', " + - "`is married` bool comment 'tag:103', " + + "`id` int, " + + "`age` int, " + + "`timestamp` varchar(80), " + + "`is married` bool, " + "primary key (`id`, `age`))", expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 100, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 101, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "timestamp", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), - schemaNewColumn(t, "is married", 103, sql.Boolean, false)), + schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "age", 7208, sql.Int32, true, schema.NotNullConstraint{}), + schemaNewColumn(t, "timestamp", 10168, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 80), false), + schemaNewColumn(t, "is married", 14626, sql.Boolean, false)), }, { name: "Test tag comments", query: `create table testTable ( - id int primary key comment 'tag:5', age int comment 'tag:10')`, - expectedTable: "testTable", - expectedSchema: dtestutils.CreateSchema( - schemaNewColumn(t, "id", 5, sql.Int32, true, schema.NotNullConstraint{}), - schemaNewColumn(t, "age", 10, sql.Int32, false)), - }, - { - name: "Test faulty tag comments", - query: `create table testTable ( - id int primary key comment 'tag:a', age int comment 'this is my personal area')`, + id int primary key, age int)`, expectedTable: "testTable", expectedSchema: dtestutils.CreateSchema( schemaNewColumn(t, "id", 4817, sql.Int32, true, schema.NotNullConstraint{}), @@ -1227,34 +1194,34 @@ func TestParseCreateTableStatement(t *testing.T) { { name: "Test ip2nation", query: `CREATE TABLE ip2nation ( - ip int(11) unsigned NOT NULL default 0 comment 'tag:100', - country char(2) NOT NULL default '' comment 'tag:101', + ip int(11) unsigned NOT NULL default 0, + country char(2) NOT NULL default '', PRIMARY KEY (ip));`, expectedTable: "ip2nation", expectedSchema: dtestutils.CreateSchema( - schemaNewColumnWDefVal(t, "ip", 100, sql.Uint32, true, "0", schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "country", 101, sql.MustCreateStringWithDefaults(sqltypes.Char, 2), false, `""`, schema.NotNullConstraint{})), + schemaNewColumnWDefVal(t, "ip", 7265, sql.Uint32, true, "0", schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "country", 6630, sql.MustCreateStringWithDefaults(sqltypes.Char, 2), false, `""`, schema.NotNullConstraint{})), }, { name: "Test ip2nationCountries", expectedTable: "ip2nationCountries", query: `CREATE TABLE ip2nationCountries ( - code varchar(4) NOT NULL default '' COMMENT 'tag:100', - iso_code_2 varchar(2) NOT NULL default '' COMMENT 'tag:101', - iso_code_3 varchar(3) default '' COMMENT 'tag:102', - iso_country varchar(255) NOT NULL default '' COMMENT 'tag:103', - country varchar(255) NOT NULL default '' COMMENT 'tag:104', - lat float NOT NULL default 0.0 COMMENT 'tag:105', - lon float NOT NULL default 0.0 COMMENT 'tag:106', + code varchar(4) NOT NULL default '', + iso_code_2 varchar(2) NOT NULL default '', + iso_code_3 varchar(3) default '', + iso_country varchar(255) NOT NULL default '', + country varchar(255) NOT NULL default '', + lat float NOT NULL default 0.0, + lon float NOT NULL default 0.0, PRIMARY KEY (code));`, expectedSchema: dtestutils.CreateSchema( - schemaNewColumnWDefVal(t, "code", 100, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 4), true, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "iso_code_2", 101, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 2), false, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "iso_code_3", 102, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 3), false, `""`), - schemaNewColumnWDefVal(t, "iso_country", 103, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "country", 104, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "lat", 105, sql.Float32, false, "0", schema.NotNullConstraint{}), - schemaNewColumnWDefVal(t, "lon", 106, sql.Float32, false, "0", schema.NotNullConstraint{})), + schemaNewColumnWDefVal(t, "code", 7802, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 4), true, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "iso_code_2", 9266, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 2), false, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "iso_code_3", 8427, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 3), false, `""`), + schemaNewColumnWDefVal(t, "iso_country", 7151, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "country", 879, sql.MustCreateStringWithDefaults(sqltypes.VarChar, 255), false, `""`, schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "lat", 3502, sql.Float32, false, "0", schema.NotNullConstraint{}), + schemaNewColumnWDefVal(t, "lon", 9907, sql.Float32, false, "0", schema.NotNullConstraint{})), }, } @@ -1271,9 +1238,7 @@ func TestParseCreateTableStatement(t *testing.T) { assert.Contains(t, err.Error(), tt.expectedErr) } else { require.NoError(t, err) - eq, err := schema.SchemasAreEqual(tt.expectedSchema, sch) - require.NoError(t, err) - assert.True(t, eq) + equalSchemas(t, tt.expectedSchema, sch) assert.Equal(t, tt.expectedTable, tblName) } }) diff --git a/go/libraries/doltcore/sqle/sqlfmt/row_fmt_test.go b/go/libraries/doltcore/sqle/sqlfmt/row_fmt_test.go index 4d4c547745..39968f6923 100644 --- a/go/libraries/doltcore/sqle/sqlfmt/row_fmt_test.go +++ b/go/libraries/doltcore/sqle/sqlfmt/row_fmt_test.go @@ -30,19 +30,19 @@ import ( ) const expectedCreateSQL = "CREATE TABLE `table_name` (\n" + - " `id` BIGINT NOT NULL COMMENT 'tag:200',\n" + - " `first_name` LONGTEXT NOT NULL COMMENT 'tag:201',\n" + - " `last_name` LONGTEXT NOT NULL COMMENT 'tag:202',\n" + - " `is_married` BIT(1) COMMENT 'tag:203',\n" + - " `age` BIGINT COMMENT 'tag:204',\n" + - " `rating` DOUBLE COMMENT 'tag:206',\n" + - " `uuid` CHAR(36) CHARACTER SET ascii COLLATE ascii_bin COMMENT 'tag:207',\n" + - " `num_episodes` BIGINT UNSIGNED COMMENT 'tag:208',\n" + + " `id` BIGINT NOT NULL,\n" + + " `first_name` LONGTEXT NOT NULL,\n" + + " `last_name` LONGTEXT NOT NULL,\n" + + " `is_married` BIT(1),\n" + + " `age` BIGINT,\n" + + " `rating` DOUBLE,\n" + + " `uuid` CHAR(36) CHARACTER SET ascii COLLATE ascii_bin,\n" + + " `num_episodes` BIGINT UNSIGNED,\n" + " PRIMARY KEY (`id`)\n" + ");" const expectedDropSql = "DROP TABLE `table_name`;" const expectedDropIfExistsSql = "DROP TABLE IF EXISTS `table_name`;" -const expectedAddColSql = "ALTER TABLE `table_name` ADD `c0` BIGINT NOT NULL COMMENT 'tag:9';" +const expectedAddColSql = "ALTER TABLE `table_name` ADD `c0` BIGINT NOT NULL;" const expectedDropColSql = "ALTER TABLE `table_name` DROP `first_name`;" const expectedRenameColSql = "ALTER TABLE `table_name` RENAME COLUMN `id` TO `pk`;" const expectedRenameTableSql = "RENAME TABLE `table_name` TO `new_table_name`;" @@ -56,7 +56,7 @@ type test struct { func TestSchemaAsCreateStmt(t *testing.T) { tSchema := sqltestutil.PeopleTestSchema - stmt := CreateTableStmtWithTags("table_name", tSchema, nil, nil) + stmt := CreateTableStmt("table_name", tSchema, nil, nil) assert.Equal(t, expectedCreateSQL, stmt) } @@ -74,7 +74,7 @@ func TestTableDropIfExistsStmt(t *testing.T) { } func TestAlterTableAddColStmt(t *testing.T) { - newColDef := "`c0` BIGINT NOT NULL COMMENT 'tag:9'" + newColDef := "`c0` BIGINT NOT NULL" stmt := AlterTableAddColStmt("table_name", newColDef) assert.Equal(t, expectedAddColSql, stmt) diff --git a/go/libraries/doltcore/sqle/sqlfmt/schema_fmt.go b/go/libraries/doltcore/sqle/sqlfmt/schema_fmt.go index 0be0e3ecaf..4b06ec6da4 100644 --- a/go/libraries/doltcore/sqle/sqlfmt/schema_fmt.go +++ b/go/libraries/doltcore/sqle/sqlfmt/schema_fmt.go @@ -23,9 +23,6 @@ import ( "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema" ) -//TODO: This is a relic from before `SHOW CREATE TABLE` was implemented. We should remove this file altogether. -const TagCommentPrefix = "tag:" - // FmtCol converts a column to a string with a given indent space count, name width, and type width. If nameWidth or // typeWidth are 0 or less than the length of the name or type, then the length of the name or type will be used func FmtCol(indent, nameWidth, typeWidth int, col schema.Column) string { @@ -33,12 +30,6 @@ func FmtCol(indent, nameWidth, typeWidth int, col schema.Column) string { return FmtColWithNameAndType(indent, nameWidth, typeWidth, col.Name, sqlType.String(), col) } -// FmtColWithTag follows the same logic as FmtCol, but includes the column's tag as a comment -func FmtColWithTag(indent, nameWidth, typeWidth int, col schema.Column) string { - fc := FmtCol(indent, nameWidth, typeWidth, col) - return fmt.Sprintf("%s COMMENT '%s'", fc, FmtColTagComment(col.Tag)) -} - // FmtColWithNameAndType creates a string representing a column within a sql create table statement with a given indent // space count, name width, and type width. If nameWidth or typeWidth are 0 or less than the length of the name or // type, then the length of the name or type will be used. @@ -60,6 +51,10 @@ func FmtColWithNameAndType(indent, nameWidth, typeWidth int, colName, typeStr st colStr += " DEFAULT " + col.Default } + if col.Comment != "" { + colStr += " COMMENT " + QuoteComment(col.Comment) + } + return colStr } @@ -70,10 +65,6 @@ func FmtColPrimaryKey(indent int, colStr string) string { return fmt.Sprintf(fmtStr, "") } -func FmtColTagComment(tag uint64) string { - return fmt.Sprintf("%s%d", TagCommentPrefix, tag) -} - func FmtIndex(index schema.Index) string { sb := strings.Builder{} if index.IsUnique() { @@ -137,13 +128,6 @@ func CreateTableStmt(tableName string, sch schema.Schema, foreignKeys []doltdb.F }, foreignKeys, parentSchs) } -// CreateTableStmtWithTags generates a SQL CREATE TABLE command that includes the column tags as comments -func CreateTableStmtWithTags(tableName string, sch schema.Schema, foreignKeys []doltdb.ForeignKey, parentSchs map[string]schema.Schema) string { - return createTableStmt(tableName, sch, func(col schema.Column) string { - return FmtColWithTag(2, 0, 0, col) - }, foreignKeys, parentSchs) -} - type fmtColFunc func(col schema.Column) string func createTableStmt(tableName string, sch schema.Schema, fmtCol fmtColFunc, foreignKeys []doltdb.ForeignKey, parentSchs map[string]schema.Schema) string { diff --git a/go/libraries/doltcore/sqle/sqlfmt/schema_fmt_test.go b/go/libraries/doltcore/sqle/sqlfmt/schema_fmt_test.go index 0e1771fa79..2b85487bbb 100755 --- a/go/libraries/doltcore/sqle/sqlfmt/schema_fmt_test.go +++ b/go/libraries/doltcore/sqle/sqlfmt/schema_fmt_test.go @@ -36,34 +36,34 @@ func TestFmtCol(t *testing.T) { 0, 0, 0, - "`first` LONGTEXT COMMENT 'tag:0'", + "`first` LONGTEXT", }, { schema.NewColumn("last", 123, types.IntKind, true), 2, 0, 0, - " `last` BIGINT COMMENT 'tag:123'", + " `last` BIGINT", }, { schema.NewColumn("title", 2, types.UintKind, true), 0, 10, 0, - " `title` BIGINT UNSIGNED COMMENT 'tag:2'", + " `title` BIGINT UNSIGNED", }, { schema.NewColumn("aoeui", 52, types.UintKind, true), 0, 10, 15, - " `aoeui` BIGINT UNSIGNED COMMENT 'tag:52'", + " `aoeui` BIGINT UNSIGNED", }, } for _, test := range tests { t.Run(test.Expected, func(t *testing.T) { - actual := FmtColWithTag(test.Indent, test.NameWidth, test.TypeWidth, test.Col) + actual := FmtCol(test.Indent, test.NameWidth, test.TypeWidth, test.Col) assert.Equal(t, test.Expected, actual) }) } diff --git a/go/libraries/doltcore/sqle/tables.go b/go/libraries/doltcore/sqle/tables.go index 17f6cac1bb..322e8d1898 100644 --- a/go/libraries/doltcore/sqle/tables.go +++ b/go/libraries/doltcore/sqle/tables.go @@ -68,11 +68,12 @@ type DoltTable struct { table *doltdb.Table sch schema.Schema sqlSch sql.Schema - db Database + db SqlDatabase } var _ sql.Table = (*DoltTable)(nil) var _ sql.IndexedTable = (*DoltTable)(nil) +var _ sql.ForeignKeyTable = (*DoltTable)(nil) // WithIndexLookup implements sql.IndexedTable func (t *DoltTable) WithIndexLookup(lookup sql.IndexLookup) sql.Table { @@ -219,6 +220,7 @@ func (t *DoltTable) PartitionRows(ctx *sql.Context, partition sql.Partition) (sq // WritableDoltTable allows updating, deleting, and inserting new rows. It implements sql.UpdatableTable and friends. type WritableDoltTable struct { DoltTable + db Database ed *sqlTableEditor } @@ -284,6 +286,45 @@ func (t *WritableDoltTable) Updater(ctx *sql.Context) sql.RowUpdater { return te } +// GetForeignKeys implements sql.ForeignKeyTable +func (t *DoltTable) GetForeignKeys(ctx *sql.Context) ([]sql.ForeignKeyConstraint, error) { + root, err := t.db.GetRoot(ctx) + if err != nil { + return nil, err + } + + fkc, err := root.GetForeignKeyCollection(ctx) + if err != nil { + return nil, err + } + + declaredFk, _ := fkc.KeysForTable(t.name) + toReturn := make([]sql.ForeignKeyConstraint, len(declaredFk)) + + for i, fk := range declaredFk { + parent, ok, err := root.GetTable(ctx, fk.ReferencedTableName) + if err != nil { + return nil, err + } + if !ok { + return nil, fmt.Errorf("cannot find table %s "+ + "referenced in foreign key %s", fk.ReferencedTableName, fk.Name) + } + + parentSch, err := parent.GetSchema(ctx) + if err != nil { + return nil, err + } + + toReturn[i], err = toForeignKeyConstraint(fk, t.sch, parentSch) + if err != nil { + return nil, err + } + } + + return toReturn, nil +} + var _ sql.PartitionIter = singlePartitionIter{} type singlePartitionIter struct { @@ -394,22 +435,16 @@ func (t *AlterableDoltTable) AddColumn(ctx *sql.Context, column *sql.Column, ord return err } - tag := sqleSchema.ExtractTag(column) - if tag == schema.InvalidTag { - // generate a tag if we don't have a user-defined tag - ti, err := typeinfo.FromSqlType(column.Type) - if err != nil { - return err - } - - tt, err := root.GenerateTagsForNewColumns(ctx, t.name, []string{column.Name}, []types.NomsKind{ti.NomsKind()}) - if err != nil { - return err - } - tag = tt[0] + ti, err := typeinfo.FromSqlType(column.Type) + if err != nil { + return err + } + tags, err := root.GenerateTagsForNewColumns(ctx, t.name, []string{column.Name}, []types.NomsKind{ti.NomsKind()}) + if err != nil { + return err } - col, err := sqleSchema.ToDoltCol(tag, column) + col, err := sqleSchema.ToDoltCol(tags[0], column) if err != nil { return err } @@ -423,7 +458,7 @@ func (t *AlterableDoltTable) AddColumn(ctx *sql.Context, column *sql.Column, ord nullable = alterschema.Null } - updatedTable, err := alterschema.AddColumnToTable(ctx, root, table, t.name, col.Tag, col.Name, col.TypeInfo, nullable, col.Default, orderToOrder(order)) + updatedTable, err := alterschema.AddColumnToTable(ctx, root, table, t.name, col.Tag, col.Name, col.TypeInfo, nullable, col.Default, col.Comment, orderToOrder(order)) if err != nil { return err } @@ -521,11 +556,6 @@ func (t *AlterableDoltTable) ModifyColumn(ctx *sql.Context, columnName string, c panic(fmt.Sprintf("Column %s not found. This is a bug.", columnName)) } - tag := sqleSchema.ExtractTag(column) - if tag != existingCol.Tag && tag != schema.InvalidTag { - return errors.New("cannot change the tag of an existing column") - } - col, err := sqleSchema.ToDoltCol(existingCol.Tag, column) if err != nil { return err @@ -631,6 +661,10 @@ func (t *AlterableDoltTable) RenameIndex(ctx *sql.Context, fromIndexName string, if err != nil { return err } + newTable, err = newTable.RenameIndexRowData(ctx, fromIndexName, toIndexName) + if err != nil { + return err + } root, err := t.db.GetRoot(ctx) if err != nil { @@ -831,45 +865,6 @@ func (t *AlterableDoltTable) DropForeignKey(ctx *sql.Context, fkName string) err return t.updateFromRoot(ctx, newRoot) } -// GetForeignKeys implements sql.ForeignKeyTable -func (t *AlterableDoltTable) GetForeignKeys(ctx *sql.Context) ([]sql.ForeignKeyConstraint, error) { - root, err := t.db.GetRoot(ctx) - if err != nil { - return nil, err - } - - fkc, err := root.GetForeignKeyCollection(ctx) - if err != nil { - return nil, err - } - - declaredFk, _ := fkc.KeysForTable(t.name) - toReturn := make([]sql.ForeignKeyConstraint, len(declaredFk)) - - for i, fk := range declaredFk { - parent, ok, err := root.GetTable(ctx, fk.ReferencedTableName) - if err != nil { - return nil, err - } - if !ok { - return nil, fmt.Errorf("cannot find table %s "+ - "referenced in foreign key %s", fk.ReferencedTableName, fk.Name) - } - - parentSch, err := parent.GetSchema(ctx) - if err != nil { - return nil, err - } - - toReturn[i], err = toForeignKeyConstraint(fk, t.sch, parentSch) - if err != nil { - return nil, err - } - } - - return toReturn, nil -} - func toForeignKeyConstraint(fk doltdb.ForeignKey, childSch, parentSch schema.Schema) (cst sql.ForeignKeyConstraint, err error) { cst = sql.ForeignKeyConstraint{ Name: fk.Name, diff --git a/go/libraries/doltcore/sqle/user_space_database.go b/go/libraries/doltcore/sqle/user_space_database.go new file mode 100644 index 0000000000..4a38e70896 --- /dev/null +++ b/go/libraries/doltcore/sqle/user_space_database.go @@ -0,0 +1,62 @@ +// Copyright 2020 Liquidata, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqle + +import ( + "github.com/liquidata-inc/go-mysql-server/sql" + + "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" +) + +// UserSpaceDatabase in an implementation of sql.Database for root values. Does not expose any of the internal dolt tables. +type UserSpaceDatabase struct { + *doltdb.RootValue +} + +var _ SqlDatabase = (*UserSpaceDatabase)(nil) + +func (db *UserSpaceDatabase) Name() string { + return "dolt" +} + +func (db *UserSpaceDatabase) GetTableInsensitive(ctx *sql.Context, tableName string) (sql.Table, bool, error) { + if doltdb.HasDoltPrefix(tableName) { + return nil, false, nil + } + table, tableName, ok, err := db.RootValue.GetTableInsensitive(ctx, tableName) + if err != nil { + return nil, false, err + } + if !ok { + return nil, false, nil + } + sch, err := table.GetSchema(ctx) + if err != nil { + return nil, false, err + } + return &DoltTable{name: tableName, table: table, sch: sch, db: db}, true, nil +} + +func (db *UserSpaceDatabase) GetTableNames(ctx *sql.Context) ([]string, error) { + tableNames, err := db.RootValue.GetTableNames(ctx) + if err != nil { + return nil, err + } + return filterDoltInternalTables(tableNames), nil +} + +func (db *UserSpaceDatabase) GetRoot(*sql.Context) (*doltdb.RootValue, error) { + return db.RootValue, nil +} diff --git a/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter.go b/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter.go index 7276dbe4e1..0adaa022ba 100644 --- a/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter.go +++ b/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter.go @@ -22,10 +22,10 @@ import ( "strings" "github.com/liquidata-inc/dolt/go/cmd/dolt/errhand" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/row" "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema" + dsqle "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle" "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle/sqlfmt" "github.com/liquidata-inc/dolt/go/libraries/utils/filesys" "github.com/liquidata-inc/dolt/go/libraries/utils/iohelp" @@ -39,6 +39,7 @@ type SqlExportWriter struct { parentSchs map[string]schema.Schema foreignKeys []doltdb.ForeignKey wr io.WriteCloser + root *doltdb.RootValue writtenFirstRow bool } @@ -71,6 +72,7 @@ func OpenSQLExportWriter(ctx context.Context, path string, fs filesys.WritableFS sch: sch, parentSchs: allSchemas, foreignKeys: foreignKeys, + root: root, wr: wr, }, nil } @@ -87,7 +89,7 @@ func (w *SqlExportWriter) GetSchema() schema.Schema { // WriteRow will write a row to a table func (w *SqlExportWriter) WriteRow(ctx context.Context, r row.Row) error { - if err := w.maybeWriteDropCreate(); err != nil { + if err := w.maybeWriteDropCreate(ctx); err != nil { return err } @@ -100,12 +102,17 @@ func (w *SqlExportWriter) WriteRow(ctx context.Context, r row.Row) error { return iohelp.WriteLine(w.wr, stmt) } -func (w *SqlExportWriter) maybeWriteDropCreate() error { +func (w *SqlExportWriter) maybeWriteDropCreate(ctx context.Context) error { if !w.writtenFirstRow { var b strings.Builder b.WriteString(sqlfmt.DropTableIfExistsStmt(w.tableName)) b.WriteRune('\n') - b.WriteString(sqlfmt.CreateTableStmtWithTags(w.tableName, w.sch, w.foreignKeys, w.parentSchs)) + sqlCtx, engine, _ := dsqle.PrepareCreateTableStmt(ctx, w.root) + createTableStmt, err := dsqle.GetCreateTableStmt(sqlCtx, engine, w.tableName) + if err != nil { + return err + } + b.WriteString(createTableStmt) if err := iohelp.WriteLine(w.wr, b.String()); err != nil { return err } @@ -117,7 +124,7 @@ func (w *SqlExportWriter) maybeWriteDropCreate() error { // Close should flush all writes, release resources being held func (w *SqlExportWriter) Close(ctx context.Context) error { // exporting an empty table will not get any WriteRow calls, so write the drop / create here - if err := w.maybeWriteDropCreate(); err != nil { + if err := w.maybeWriteDropCreate(ctx); err != nil { return err } diff --git a/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter_test.go b/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter_test.go index 6befdf193e..584f1a2685 100644 --- a/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter_test.go +++ b/go/libraries/doltcore/table/untyped/sqlexport/sqlwriter_test.go @@ -21,11 +21,15 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/dtestutils" "github.com/liquidata-inc/dolt/go/libraries/doltcore/row" "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema" + "github.com/liquidata-inc/dolt/go/libraries/doltcore/schema/encoding" "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle/sqlfmt" + "github.com/liquidata-inc/dolt/go/store/types" ) type StringBuilderCloser struct { @@ -47,7 +51,7 @@ func TestEndToEnd(t *testing.T) { id := uuid.MustParse("00000000-0000-0000-0000-000000000000") tableName := "people" - dropCreateStatement := sqlfmt.DropTableIfExistsStmt(tableName) + "\n" + sqlfmt.CreateTableStmtWithTags(tableName, dtestutils.TypedSchema, nil, nil) + dropCreateStatement := sqlfmt.DropTableIfExistsStmt(tableName) + "\nCREATE TABLE `people` (\n `id` char(36) character set ascii collate ascii_bin NOT NULL,\n `name` longtext NOT NULL,\n `age` bigint unsigned NOT NULL,\n `is_married` bit(1) NOT NULL,\n `title` longtext,\n PRIMARY KEY (`id`),\n KEY `idx_name` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;" type test struct { name string @@ -78,18 +82,33 @@ func TestEndToEnd(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + ctx := context.Background() + dEnv := dtestutils.CreateTestEnv() + root, err := dEnv.WorkingRoot(ctx) + require.NoError(t, err) + + schVal, err := encoding.MarshalSchemaAsNomsValue(ctx, root.VRW(), tt.sch) + require.NoError(t, err) + emptyMap, err := types.NewMap(ctx, root.VRW()) + require.NoError(t, err) + tbl, err := doltdb.NewTable(ctx, root.VRW(), schVal, emptyMap, nil) + require.NoError(t, err) + root, err = root.PutTable(ctx, tableName, tbl) + require.NoError(t, err) + var stringWr StringBuilderCloser w := &SqlExportWriter{ tableName: tableName, sch: tt.sch, wr: &stringWr, + root: root, } for _, r := range tt.rows { - assert.NoError(t, w.WriteRow(context.Background(), r)) + assert.NoError(t, w.WriteRow(ctx, r)) } - assert.NoError(t, w.Close(context.Background())) + assert.NoError(t, w.Close(ctx)) assert.Equal(t, tt.expectedOutput, stringWr.String()) }) }