DBZ-408 Allowing for columns named "column" (escaped) in ALTER TABLE ADD/DROP... without COLUMN word
This commit is contained in:
parent
1d7f41af26
commit
f86feaf9bd
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user