Skip to content

Commit

Permalink
0000713: Upgrade from 2.x to 3.x requires a type change of some sym_ …
Browse files Browse the repository at this point in the history
…table columns from INT to BIGINT. Tables should not be rebuilt.
  • Loading branch information
chenson42 committed Jul 16, 2012
1 parent e3e7b5d commit e5deeab
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 33 deletions.
Expand Up @@ -42,7 +42,7 @@
* The DDL Builder for DB2.
*/
public class Db2DdlBuilder extends AbstractDdlBuilder {

public Db2DdlBuilder() {
super();
// the BINARY types are also handled by Db2Builder.getSqlType(Column)
Expand All @@ -54,7 +54,8 @@ public Db2DdlBuilder() {
databaseInfo.addNativeTypeMapping(Types.JAVA_OBJECT, "BLOB", Types.BLOB);
databaseInfo.addNativeTypeMapping(Types.LONGVARBINARY, "LONG VARCHAR FOR BIT DATA");
databaseInfo.addNativeTypeMapping(Types.LONGVARCHAR, "LONG VARCHAR");
databaseInfo.addNativeTypeMapping(Types.NULL, "LONG VARCHAR FOR BIT DATA", Types.LONGVARBINARY);
databaseInfo.addNativeTypeMapping(Types.NULL, "LONG VARCHAR FOR BIT DATA",
Types.LONGVARBINARY);
databaseInfo.addNativeTypeMapping(Types.NUMERIC, "DECIMAL", Types.DECIMAL);
databaseInfo.addNativeTypeMapping(Types.OTHER, "BLOB", Types.BLOB);
databaseInfo.addNativeTypeMapping(Types.STRUCT, "BLOB", Types.BLOB);
Expand All @@ -66,18 +67,17 @@ public Db2DdlBuilder() {
databaseInfo.setDefaultSize(Types.VARCHAR, 254);
databaseInfo.setDefaultSize(Types.BINARY, 254);
databaseInfo.setDefaultSize(Types.VARBINARY, 254);


databaseInfo.setMaxIdentifierLength(128);
databaseInfo.setMaxColumnNameLength(128);
databaseInfo.setMaxConstraintNameLength(128);
databaseInfo.setMaxForeignKeyNameLength(128);

databaseInfo.setNonBlankCharColumnSpacePadded(true);
databaseInfo.setBlankCharColumnSpacePadded(true);
databaseInfo.setCharColumnSpaceTrimmed(false);
databaseInfo.setEmptyStringNulled(false);

addEscapedCharSequence("'", "''");
}

Expand All @@ -86,15 +86,15 @@ protected String getNativeDefaultValue(Column column) {
if ((column.getMappedTypeCode() == Types.BIT)
|| (PlatformUtils.supportsJava14JdbcTypes() && (column.getMappedTypeCode() == PlatformUtils
.determineBooleanTypeCode()))) {
return getDefaultValueHelper().convert(column.getDefaultValue(), column.getMappedTypeCode(),
Types.SMALLINT).toString();
return getDefaultValueHelper().convert(column.getDefaultValue(),
column.getMappedTypeCode(), Types.SMALLINT).toString();
} else {
return super.getNativeDefaultValue(column);
}
}

@Override
protected void writeColumnAutoIncrementStmt(Table table, Column column, StringBuilder ddl) {
protected void writeColumnAutoIncrementStmt(Table table, Column column, StringBuilder ddl) {
ddl.append("GENERATED BY DEFAULT AS IDENTITY");
}

Expand All @@ -104,7 +104,7 @@ public String getSelectLastIdentityValues(Table table) {
}

@Override
public void writeExternalIndexDropStmt(Table table, IIndex index, StringBuilder ddl) {
public void writeExternalIndexDropStmt(Table table, IIndex index, StringBuilder ddl) {
// Index names in DB2 are unique to a schema and hence Derby does not
// use the ON <tablename> clause
ddl.append("DROP INDEX ");
Expand All @@ -113,7 +113,7 @@ public void writeExternalIndexDropStmt(Table table, IIndex index, StringBuilder
}

@Override
protected void writeCastExpression(Column sourceColumn, Column targetColumn, StringBuilder ddl) {
protected void writeCastExpression(Column sourceColumn, Column targetColumn, StringBuilder ddl) {
String sourceNativeType = getBareNativeType(sourceColumn);
String targetNativeType = getBareNativeType(targetColumn);

Expand All @@ -129,8 +129,7 @@ protected void writeCastExpression(Column sourceColumn, Column targetColumn, Str
Object sizeSpec = targetColumn.getSize();

if (sizeSpec == null) {
sizeSpec = databaseInfo
.getDefaultSize(targetColumn.getMappedTypeCode());
sizeSpec = databaseInfo.getDefaultSize(targetColumn.getMappedTypeCode());
}
type = "CHAR(" + sizeSpec.toString() + ")";
}
Expand All @@ -145,7 +144,7 @@ protected void writeCastExpression(Column sourceColumn, Column targetColumn, Str

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel,
Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
// DB2 provides only limited ways to alter a column, so we don't use
// them
for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext();) {
Expand Down Expand Up @@ -181,29 +180,33 @@ protected void processTableStructureChanges(Database currentModel, Database desi
changeIt.remove();
}
}
super.processTableStructureChanges(currentModel, desiredModel,
sourceTable, targetTable, changes, ddl);

super.processTableStructureChanges(currentModel, desiredModel, sourceTable, targetTable,
changes, ddl);
}

@Override
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" ALTER COLUMN ");
Column column = change.getChangedColumn();
column.setTypeCode(change.getNewTypeCode());
printIdentifier(getColumnName(column), ddl);
ddl.append(" SET DATA TYPE ");
ddl.append(getSqlType(column));
printEndOfStatement(ddl);
return true;
if (!change.getChangedColumn().isPrimaryKey()) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" ALTER COLUMN ");
Column column = change.getChangedColumn();
column.setTypeCode(change.getNewTypeCode());
printIdentifier(getColumnName(column), ddl);
ddl.append(" SET DATA TYPE ");
ddl.append(getSqlType(column));
printEndOfStatement(ddl);
return true;
} else {
return false;
}
}

/*
* Processes the addition of a column to a table.
*/
protected void processChange(Database currentModel, Database desiredModel,
AddColumnChange change, StringBuilder ddl) {
AddColumnChange change, StringBuilder ddl) {
ddl.append("ALTER TABLE ");
printlnIdentifier(getTableName(change.getChangedTable().getName()), ddl);
printIndent(ddl);
Expand All @@ -217,7 +220,7 @@ protected void processChange(Database currentModel, Database desiredModel,
* Processes the removal of a column from a table.
*/
protected void processChange(Database currentModel, Database desiredModel,
RemoveColumnChange change, StringBuilder ddl) {
RemoveColumnChange change, StringBuilder ddl) {
ddl.append("ALTER TABLE ");
printlnIdentifier(getTableName(change.getChangedTable().getName()), ddl);
printIndent(ddl);
Expand All @@ -231,7 +234,7 @@ protected void processChange(Database currentModel, Database desiredModel,
* Processes the removal of a primary key from a table.
*/
protected void processChange(Database currentModel, Database desiredModel,
RemovePrimaryKeyChange change, StringBuilder ddl) {
RemovePrimaryKeyChange change, StringBuilder ddl) {
ddl.append("ALTER TABLE ");
printlnIdentifier(getTableName(change.getChangedTable().getName()), ddl);
printIndent(ddl);
Expand All @@ -244,7 +247,7 @@ protected void processChange(Database currentModel, Database desiredModel,
* Processes the change of the primary key of a table.
*/
protected void processChange(Database currentModel, Database desiredModel,
PrimaryKeyChange change, StringBuilder ddl) {
PrimaryKeyChange change, StringBuilder ddl) {
ddl.append("ALTER TABLE ");
printlnIdentifier(getTableName(change.getChangedTable().getName()), ddl);
printIndent(ddl);
Expand All @@ -254,5 +257,5 @@ protected void processChange(Database currentModel, Database desiredModel,
change.getNewPrimaryKeyColumns(), ddl);
change.apply(currentModel, delimitedIdentifierModeOn);
}

}
Expand Up @@ -659,6 +659,7 @@ protected void processColumnChange(Table sourceTable, Table targetTable, Column
ddl.append("ALTER COLUMN ");
if (typeChange) {
printIdentifier(getColumnName(targetColumn), ddl);
ddl.append(" ");
ddl.append(getSqlType(targetColumn));
} else {
writeColumn(sourceTable, targetColumn, ddl);
Expand Down
Expand Up @@ -46,10 +46,11 @@ public void turnOffDebug() {
}

@Test
public void testUpgradeFromIntToBigInt() throws Exception {
public void testUpgradePrimaryKeyAutoIncrementFromIntToBigInt() throws Exception {
boolean upgradeSupported = platform.getName() != DatabaseNamesConstants.DERBY &&
platform.getName() != DatabaseNamesConstants.HSQLDB2 &&
platform.getName() != DatabaseNamesConstants.INFORMIX;
platform.getName() != DatabaseNamesConstants.INFORMIX &&
platform.getName() != DatabaseNamesConstants.DB2;

if (upgradeSupported) {
Table table = new Table("TEST_UPGRADE");
Expand Down

0 comments on commit e5deeab

Please sign in to comment.