Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Makes several new kinds of alter table statements involving auto_increment columns work correctly #1924

Merged
merged 17 commits into from
Aug 4, 2023
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
80 changes: 0 additions & 80 deletions enginetest/enginetests.go
Original file line number Diff line number Diff line change
Expand Up @@ -5415,86 +5415,6 @@ func TestAddDropPks(t *testing.T, harness Harness) {
})
}

func TestAddAutoIncrementColumn(t *testing.T, harness Harness) {
zachmu marked this conversation as resolved.
Show resolved Hide resolved
harness.Setup([]setup.SetupScript{{
"create database mydb",
"use mydb",
}})
e := mustNewEngine(t, harness)
defer e.Close()
ctx := NewContext(harness)

t.Run("Add primary key column with auto increment", func(t *testing.T) {
ctx.SetCurrentDatabase("mydb")
RunQuery(t, e, harness, "CREATE TABLE t1 (i int, j int);")
RunQuery(t, e, harness, "insert into t1 values (1,1), (2,2), (3,3)")
AssertErr(
t, e, harness,
"alter table t1 add column pk int primary key;",
sql.ErrPrimaryKeyViolation,
)

TestQueryWithContext(
t, ctx, e, harness,
"alter table t1 add column pk int primary key auto_increment;",
[]sql.Row{{types.NewOkResult(0)}},
nil, nil,
)

TestQueryWithContext(
t, ctx, e, harness,
"select pk from t1;",
[]sql.Row{
{1},
{2},
{3},
},
nil, nil,
)

TestQueryWithContext(
t, ctx, e, harness,
"show create table t1;",
[]sql.Row{
{"t1", "CREATE TABLE `t1` (\n `i` int,\n `j` int,\n `pk` int NOT NULL AUTO_INCREMENT,\n PRIMARY KEY (`pk`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"},
},
nil, nil,
)
})

t.Run("Add primary key column with auto increment first", func(t *testing.T) {
ctx.SetCurrentDatabase("mydb")
RunQuery(t, e, harness, "CREATE TABLE t2 (i int, j int);")
RunQuery(t, e, harness, "insert into t2 values (1,1), (2,2), (3,3)")
TestQueryWithContext(
t, ctx, e, harness,
"alter table t2 add column pk int primary key auto_increment first;",
[]sql.Row{{types.NewOkResult(0)}},
nil, nil,
)

TestQueryWithContext(
t, ctx, e, harness,
"select pk from t2;",
[]sql.Row{
{1},
{2},
{3},
},
nil, nil,
)

TestQueryWithContext(
t, ctx, e, harness,
"show create table t2;",
[]sql.Row{
{"t2", "CREATE TABLE `t2` (\n `pk` int NOT NULL AUTO_INCREMENT,\n `i` int,\n `j` int,\n PRIMARY KEY (`pk`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"},
},
nil, nil,
)
})
}

func TestNullRanges(t *testing.T, harness Harness) {
harness.Setup(setup.NullsSetup...)
for _, tt := range queries.NullRangeTests {
Expand Down
32 changes: 4 additions & 28 deletions enginetest/memory_engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -271,33 +271,7 @@ func TestSingleQueryPrepared(t *testing.T) {
// Convenience test for debugging a single query. Unskip and set to the desired query.
func TestSingleScript(t *testing.T) {
t.Skip()
var scripts = []queries.ScriptTest{
{
Name: "renaming views with RENAME TABLE ... TO .. statement",
SetUpScript: []string{
"create table t1 (id int primary key, v1 int);",
"create view v1 as select * from t1;",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "rename table v1 to view1",
Expected: []sql.Row{{types.OkResult{RowsAffected: 0}}},
},
{
Query: "show tables;",
Expected: []sql.Row{{"myview"}, {"t1"}, {"view1"}},
},
{
Query: "rename table view1 to newViewName, t1 to newTableName",
Expected: []sql.Row{{types.OkResult{RowsAffected: 0}}},
},
{
Query: "show tables;",
Expected: []sql.Row{{"myview"}, {"newTableName"}, {"newViewName"}},
},
},
},
}
var scripts = []queries.ScriptTest{}

for _, test := range scripts {
harness := enginetest.NewMemoryHarness("", 1, testNumPartitions, true, nil)
Expand Down Expand Up @@ -1307,7 +1281,9 @@ func TestAddDropPks_Exp(t *testing.T) {

func TestAddAutoIncrementColumn(t *testing.T) {
t.Skip("in memory tables don't implement sql.RewritableTable yet")
enginetest.TestAddAutoIncrementColumn(t, enginetest.NewDefaultMemoryHarness())
for _, script := range queries.AlterTableAddAutoIncrementScripts {
enginetest.TestScript(t, enginetest.NewDefaultMemoryHarness(), script)
}
}

func TestNullRanges(t *testing.T) {
Expand Down
178 changes: 178 additions & 0 deletions enginetest/queries/alter_table_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -355,4 +355,182 @@ var AlterTableScripts = []ScriptTest{
},
},
},
{
Name: "multi-alter ddl column errors",
SetUpScript: []string{
"create table tbl_i (i int primary key)",
"create table tbl_ij (i int primary key, j int)",
},
Assertions: []ScriptTestAssertion{
{
Query: "alter table tbl_i add column j int, drop column j",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_i add column j int, rename column j to k;",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_i add column j int, modify column j varchar(10)",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_ij drop column j, rename column j to k;",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_ij drop column k, rename column j to k;",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_i add index(j), add column j int;",
ExpectedErr: sql.ErrKeyColumnDoesNotExist,
},
},
},
{
Name: "Add column and make unique in separate clauses",
SetUpScript: []string{
"create table t (c1 int primary key, c2 int, c3 int)",
"insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3)",
},
Assertions: []ScriptTestAssertion{
{
Query: "alter table t add column c4 int null, add unique index uniq(c4)",
Expected: []sql.Row{
{types.NewOkResult(0)},
},
},
{
Query: "show create table t",
Expected: []sql.Row{sql.Row{"t",
"CREATE TABLE `t` (\n" +
" `c1` int NOT NULL,\n" +
" `c2` int,\n" +
" `c3` int,\n" +
" `c4` int,\n" +
" PRIMARY KEY (`c1`),\n" +
" UNIQUE KEY `uniq` (`c4`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
{
Query: "select * from t",
Expected: []sql.Row{
{1, 1, 1, nil},
{2, 2, 2, nil},
{3, 3, 3, nil},
},
},
},
},
}

var AlterTableAddAutoIncrementScripts = []ScriptTest{
{
Name: "Add primary key column with auto increment",
SetUpScript: []string{
"CREATE TABLE t1 (i int, j int);",
"insert into t1 values (1,1), (2,2), (3,3)",
},
Assertions: []ScriptTestAssertion{
{
Query: "alter table t1 add column pk int primary key auto_increment;",
Expected: []sql.Row{{types.NewOkResult(0)}},
},
{
Query: "show create table t1",
Expected: []sql.Row{{"t1",
"CREATE TABLE `t1` (\n" +
" `i` int,\n" +
" `j` int,\n" +
" `pk` int NOT NULL AUTO_INCREMENT,\n" +
" PRIMARY KEY (`pk`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
{
Query: "select pk from t1 order by pk",
Expected: []sql.Row{
{1}, {2}, {3},
},
},
},
},
{
Name: "Add primary key column with auto increment, first",
SetUpScript: []string{
"CREATE TABLE t1 (i int, j int);",
"insert into t1 values (1,1), (2,2), (3,3)",
},
Assertions: []ScriptTestAssertion{
{
Query: "alter table t1 add column pk int primary key",
ExpectedErr: sql.ErrPrimaryKeyViolation,
},
{
Query: "alter table t1 add column pk int primary key auto_increment first",
Expected: []sql.Row{{types.NewOkResult(0)}},
},
{
Query: "show create table t1",
Expected: []sql.Row{{"t1",
"CREATE TABLE `t1` (\n" +
" `pk` int NOT NULL AUTO_INCREMENT,\n" +
" `i` int,\n" +
" `j` int,\n" +
" PRIMARY KEY (`pk`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
{
Query: "select pk from t1 order by pk",
Expected: []sql.Row{
{1}, {2}, {3},
},
},
},
},
{
Name: "add column auto_increment, non primary key",
SetUpScript: []string{
"CREATE TABLE t1 (i bigint primary key, s varchar(20))",
"INSERT INTO t1 VALUES (1, 'a'), (2, 'b'), (3, 'c')",
},
Assertions: []ScriptTestAssertion{
{
Query: "alter table t1 add column j int auto_increment unique",
Expected: []sql.Row{{types.NewOkResult(0)}},
},
{
Query: "show create table t1",
Expected: []sql.Row{{"t1",
"CREATE TABLE `t1` (\n" +
" `i` bigint NOT NULL,\n" +
" `s` varchar(20),\n" +
" `j` int AUTO_INCREMENT,\n" +
" PRIMARY KEY (`i`),\n" +
" UNIQUE KEY `j` (`j`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}},
},
{
Query: "select * from t1 order by i",
Expected: []sql.Row{
{1, "a", 1},
{2, "b", 2},
{3, "c", 3},
},
},
},
},
{
Name: "add column auto_increment, non key",
SetUpScript: []string{
"CREATE TABLE t1 (i bigint primary key, s varchar(20))",
"INSERT INTO t1 VALUES (1, 'a'), (2, 'b'), (3, 'c')",
},
Assertions: []ScriptTestAssertion{
{
Query: "alter table t1 add column j int auto_increment",
ExpectedErr: sql.ErrInvalidAutoIncCols,
},
},
},
}
57 changes: 0 additions & 57 deletions enginetest/queries/script_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -3100,63 +3100,6 @@ var ScriptTests = []ScriptTest{
},
},
},
{
Name: "multi-alter ddl column statements",
SetUpScript: []string{
"create table tbl_i (i int primary key)",
"create table tbl_ij (i int primary key, j int)",
},
Assertions: []ScriptTestAssertion{
{
Query: "alter table tbl_i add column j int, drop column j",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_i add column j int, rename column j to k;",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_i add column j int, modify column j varchar(10)",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_ij add index (j), drop column j;",
ExpectedErr: sql.ErrKeyColumnDoesNotExist,
},
{
Query: "alter table tbl_ij drop column j, rename column j to k;",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_ij drop column k, rename column j to k;",
ExpectedErr: sql.ErrTableColumnNotFound,
},
{
Query: "alter table tbl_i add index(j), add column j int;",
Expected: []sql.Row{
{types.NewOkResult(0)},
},
},
{
Query: "show create table tbl_i",
Expected: []sql.Row{
{"tbl_i", "CREATE TABLE `tbl_i` (\n `i` int NOT NULL,\n `j` int,\n PRIMARY KEY (`i`),\n KEY `j` (`j`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"},
},
},
{
Query: "alter table tbl_ij add index (j), drop column j, add column j int;",
Expected: []sql.Row{
{types.NewOkResult(0)},
},
},
{
Query: "show create table tbl_ij",
Expected: []sql.Row{
{"tbl_ij", "CREATE TABLE `tbl_ij` (\n `i` int NOT NULL,\n `j` int,\n PRIMARY KEY (`i`),\n KEY `j` (`j`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"},
},
},
},
},
{
Name: "Keyless Table with Unique Index",
SetUpScript: []string{
Expand Down