DBZ-408 Allowing for columns named "column" (escaped) in ALTER TABLE ADD/DROP... without COLUMN word

This commit is contained in:
Gunnar Morling 2017-10-25 15:41:15 +02:00 committed by Jiri Pechanec
parent 1d7f41af26
commit f86feaf9bd
2 changed files with 87 additions and 2 deletions

View File

@ -700,7 +700,7 @@ protected void parseCreateDefinition(Marker start, TableEditor table, boolean is
try {
// It's either quoted (meaning it's a column definition)
if (isAlterStatement) {
if (isAlterStatement && !quoted) {
tokens.canConsume("COLUMN"); // optional for ALTER TABLE
}
@ -1213,7 +1213,9 @@ protected void parseAlterSpecification(Marker start, TableEditor table, Consumer
} else if (tokens.canConsume("PARTITION")) {
parsePartitionNames(start);
} else {
tokens.canConsume("COLUMN");
if(!isNextTokenQuotedIdentifier()) {
tokens.canConsume("COLUMN");
}
String columnName = parseColumnName();
table.removeColumn(columnName);
}

View File

@ -13,6 +13,7 @@
import java.sql.Types;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import org.junit.Before;
import org.junit.Test;
@ -1108,6 +1109,7 @@ public void shouldParseStatementForDbz142() {
public void shouldParseCreateTableStatementWithColumnNamedColumn() {
String ddl = "CREATE TABLE `mytable` ( " + System.lineSeparator()
+ " `def` int(11) unsigned NOT NULL AUTO_INCREMENT, " + System.lineSeparator()
+ " `ghi` varchar(255) NOT NULL DEFAULT '', " + System.lineSeparator()
+ " `column` varchar(255) NOT NULL DEFAULT '', " + System.lineSeparator()
+ " PRIMARY KEY (`def`) " + System.lineSeparator()
+ " ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
@ -1117,6 +1119,87 @@ public void shouldParseCreateTableStatementWithColumnNamedColumn() {
Table mytable = tables.forTable(new TableId(null, null, "mytable"));
assertThat(mytable).isNotNull();
assertColumn(mytable, "column", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
assertColumn(mytable, "ghi", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
}
@Test
@FixFor("DBZ-408")
public void shouldParseAlterTableStatementWithColumnNamedColumnWithoutColumnWord() {
String ddl = "CREATE TABLE `mytable` ( " + System.lineSeparator()
+ " `def` int(11) unsigned NOT NULL AUTO_INCREMENT, " + System.lineSeparator()
+ " PRIMARY KEY (`def`) " + System.lineSeparator()
+ " ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
parser.parse(ddl, tables);
ddl = "ALTER TABLE `mytable` "
+ "ADD `column` varchar(255) NOT NULL DEFAULT '', "
+ "ADD `ghi` varchar(255) NOT NULL DEFAULT '', "
+ "ADD jkl varchar(255) NOT NULL DEFAULT '' ;";
parser.parse(ddl, tables);
assertThat(tables.size()).isEqualTo(1);
Table mytable = tables.forTable(new TableId(null, null, "mytable"));
assertThat(mytable).isNotNull();
assertColumn(mytable, "column", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
assertColumn(mytable, "ghi", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
assertColumn(mytable, "jkl", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
ddl = "ALTER TABLE `mytable` "
+ "DROP `column`, "
+ "DROP `ghi`, "
+ "DROP jkl";
parser.parse(ddl, tables);
mytable = tables.forTable(new TableId(null, null, "mytable"));
List<String> mytableColumnNames = mytable.columns()
.stream()
.map(Column::name)
.collect(Collectors.toList());
assertThat(mytableColumnNames).containsOnly("def");
}
@Test
@FixFor("DBZ-408")
public void shouldParseAlterTableStatementWithColumnNamedColumnWithColumnWord() {
String ddl = "CREATE TABLE `mytable` ( " + System.lineSeparator()
+ " `def` int(11) unsigned NOT NULL AUTO_INCREMENT, " + System.lineSeparator()
+ " PRIMARY KEY (`def`) " + System.lineSeparator()
+ " ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
parser.parse(ddl, tables);
ddl = "ALTER TABLE `mytable` "
+ "ADD COLUMN `column` varchar(255) NOT NULL DEFAULT '', "
+ "ADD COLUMN `ghi` varchar(255) NOT NULL DEFAULT '', "
+ "ADD COLUMN jkl varchar(255) NOT NULL DEFAULT '' ;";
parser.parse(ddl, tables);
assertThat(tables.size()).isEqualTo(1);
Table mytable = tables.forTable(new TableId(null, null, "mytable"));
assertThat(mytable).isNotNull();
assertColumn(mytable, "column", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
assertColumn(mytable, "ghi", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
assertColumn(mytable, "jkl", "VARCHAR", Types.VARCHAR, 255, -1, false, false, false);
ddl = "ALTER TABLE `mytable` "
+ "DROP COLUMN `column`, "
+ "DROP COLUMN `ghi`, "
+ "DROP COLUMN jkl";
parser.parse(ddl, tables);
mytable = tables.forTable(new TableId(null, null, "mytable"));
List<String> mytableColumnNames = mytable.columns()
.stream()
.map(Column::name)
.collect(Collectors.toList());
assertThat(mytableColumnNames).containsOnly("def");
}
@Test