@Override public void exitAlterByAddColumn(MySqlParser.AlterByAddColumnContext ctx) { parser.runIfNotNull(() -> { Column column = columnDefinitionListener.getColumn(); tableEditor.addColumn(column); String columnName = column.name(); if (ctx.FIRST() != null) { tableEditor.reorderColumn(columnName, null); } else if (ctx.AFTER() != null) { String afterColumn = parser.parseName(ctx.uid(1)); tableEditor.reorderColumn(columnName, afterColumn); } listeners.remove(columnDefinitionListener); }, tableEditor, columnDefinitionListener); super.exitAlterByAddColumn(ctx); }
@Override public void exitAlterByModifyColumn(MySqlParser.AlterByModifyColumnContext ctx) { parser.runIfNotNull(() -> { Column column = columnDefinitionListener.getColumn(); tableEditor.addColumn(column); if (ctx.FIRST() != null) { tableEditor.reorderColumn(column.name(), null); } else if (ctx.AFTER() != null) { String afterColumn = parser.parseName(ctx.uid(1)); tableEditor.reorderColumn(column.name(), afterColumn); } listeners.remove(columnDefinitionListener); }, tableEditor, columnDefinitionListener); super.exitAlterByModifyColumn(ctx); }
@Override public void exitAlterByChangeColumn(MySqlParser.AlterByChangeColumnContext ctx) { parser.runIfNotNull(() -> { Column column = columnDefinitionListener.getColumn(); tableEditor.addColumn(column); String newColumnName = parser.parseName(ctx.newColumn); if (newColumnName != null && !column.name().equalsIgnoreCase(newColumnName)) { tableEditor.renameColumn(column.name(), newColumnName); } if (ctx.FIRST() != null) { tableEditor.reorderColumn(newColumnName, null); } else if (ctx.afterColumn != null) { tableEditor.reorderColumn(newColumnName, parser.parseName(ctx.afterColumn)); } listeners.remove(columnDefinitionListener); }, tableEditor, columnDefinitionListener); super.exitAlterByChangeColumn(ctx); }
protected Column parseCreateColumn(Marker start, TableEditor table, String columnName, String newColumnName) { // Obtain the column editor ... Column existingColumn = table.columnWithName(columnName); ColumnEditor column = existingColumn != null ? existingColumn.edit() : Column.editor().name(columnName); AtomicBoolean isPrimaryKey = new AtomicBoolean(false); parseColumnDefinition(start, columnName, tokens, table, column, isPrimaryKey); convertDefaultValueToSchemaType(column); // Update the table ... Column newColumnDefn = column.create(); table.addColumns(newColumnDefn); if (isPrimaryKey.get()) { table.setPrimaryKeyNames(newColumnDefn.name()); } if (newColumnName != null && !newColumnName.equalsIgnoreCase(columnName)) { table.renameColumn(columnName, newColumnName); columnName = newColumnName; } // ALTER TABLE allows reordering the columns after the definition ... if (tokens.canConsume("FIRST")) { table.reorderColumn(columnName, null); } else if (tokens.canConsume("AFTER")) { table.reorderColumn(columnName, tokens.consume()); } return table.columnWithName(newColumnDefn.name()); }
editor.addColumns(c1, c2, c3); assertValidPositions(editor); editor.reorderColumn("C1", null); assertThat(editor.columns()).containsExactly(editor.columnWithName("C1"), editor.columnWithName("C2"), editor.columnWithName("C3")); assertValidPositions(editor); editor.reorderColumn("C2", "C1"); assertThat(editor.columns()).containsExactly(editor.columnWithName("C1"), editor.columnWithName("C2"), editor.columnWithName("C3")); assertValidPositions(editor); editor.reorderColumn("C3", "C2"); assertThat(editor.columns()).containsExactly(editor.columnWithName("C1"), editor.columnWithName("C2"), editor.columnWithName("C3")); assertValidPositions(editor); editor.reorderColumn("C3", "C1"); assertThat(editor.columns()).containsExactly(editor.columnWithName("C1"), editor.columnWithName("C3"), editor.columnWithName("C2")); assertValidPositions(editor); editor.reorderColumn("C3", null); assertThat(editor.columns()).containsExactly(editor.columnWithName("C3"), editor.columnWithName("C1"),
@Test(expected = IllegalArgumentException.class) public void shouldNotReorderColumnIfNameDoesNotMatch() { editor.tableId(id); Column c1 = columnEditor.name("C1").type("VARCHAR").jdbcType(Types.VARCHAR).length(10).position(1).create(); Column c2 = columnEditor.name("C2").type("NUMBER").jdbcType(Types.NUMERIC).length(5).autoIncremented(true).create(); Column c3 = columnEditor.name("C3").type("DATE").jdbcType(Types.DATE).autoIncremented(true).create(); editor.addColumns(c1, c2, c3); editor.reorderColumn("WOOPS", "C2"); assertValidPositions(editor); }