Author: tomdz Date: Sat Feb 23 12:20:28 2008 New Revision: 630531 URL: http://svn.apache.org/viewvc?rev=630531&view=rev Log: Fixes to Db2 & Sql Server platforms and the model comparator
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/AddIndexChange.java db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ModelComparator.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelComparator.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestChangeColumn.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/AddIndexChange.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/AddIndexChange.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/AddIndexChange.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/AddIndexChange.java Sat Feb 23 12:20:28 2008 @@ -19,9 +19,11 @@ * under the License. */ -import org.apache.ddlutils.DdlUtilsException; +import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Database; import org.apache.ddlutils.model.Index; +import org.apache.ddlutils.model.IndexColumn; +import org.apache.ddlutils.model.Table; /** * Represents the addition of an index to a table. @@ -60,16 +62,15 @@ */ public void apply(Database model, boolean caseSensitive) { - Index newIndex = null; + Table table = findChangedTable(model, caseSensitive); - try + table.addIndex(_newIndex); + for (int idx = 0; idx < _newIndex.getColumnCount(); idx++) { - newIndex = (Index)_newIndex.clone(); - } - catch (CloneNotSupportedException ex) - { - throw new DdlUtilsException(ex); + IndexColumn idxColumn = _newIndex.getColumn(idx); + Column tmpColumn = idxColumn.getColumn(); + + idxColumn.setColumn(table.findColumn(tmpColumn.getName(), caseSensitive)); } - findChangedTable(model, caseSensitive).addIndex(newIndex); } } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ModelComparator.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ModelComparator.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ModelComparator.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ModelComparator.java Sat Feb 23 12:20:28 2008 @@ -239,13 +239,15 @@ { Table targetTable = targetModel.getTable(tableIdx); Table intermediateTable = intermediateModel.findTable(targetTable.getName(), _caseSensitive); + Table sourceTable = sourceModel.findTable(targetTable.getName(), _caseSensitive); for (int fkIdx = 0; fkIdx < targetTable.getForeignKeyCount(); fkIdx++) { ForeignKey targetFk = targetTable.getForeignKey(fkIdx); ForeignKey intermediateFk = findCorrespondingForeignKey(intermediateTable, targetFk); + ForeignKey sourceFk = sourceTable == null ? null : findCorrespondingForeignKey(sourceTable, targetFk); - if (intermediateFk == null) + if ((sourceFk == null) && (intermediateFk == null)) { if (_log.isInfoEnabled()) { @@ -515,10 +517,11 @@ for (int indexIdx = 0; indexIdx < targetTable.getIndexCount(); indexIdx++) { - Index targetIndex = targetTable.getIndex(indexIdx); - Index sourceIndex = findCorrespondingIndex(intermediateTable, targetIndex); + Index targetIndex = targetTable.getIndex(indexIdx); + Index intermediateIndex = findCorrespondingIndex(intermediateTable, targetIndex); + Index sourceIndex = findCorrespondingIndex(sourceTable, targetIndex); - if (sourceIndex == null) + if ((sourceIndex == null) && (intermediateIndex == null)) { if (_log.isInfoEnabled()) { Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java Sat Feb 23 12:20:28 2008 @@ -23,6 +23,7 @@ import java.sql.Types; import org.apache.ddlutils.Platform; +import org.apache.ddlutils.alteration.ColumnDefinitionChange; import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Index; import org.apache.ddlutils.model.Table; @@ -130,7 +131,8 @@ String sourceNativeType = getBareNativeType(sourceColumn); String targetNativeType = getBareNativeType(targetColumn); - if (sourceNativeType.equals(targetNativeType)) + if (sourceNativeType.equals(targetNativeType) && + !ColumnDefinitionChange.isSizeChanged(getPlatformInfo(), sourceColumn, targetColumn)) { printIdentifier(getColumnName(sourceColumn)); } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java Sat Feb 23 12:20:28 2008 @@ -27,6 +27,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.ddlutils.Platform; +import org.apache.ddlutils.alteration.ColumnDefinitionChange; import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Database; import org.apache.ddlutils.model.ForeignKey; @@ -510,5 +511,27 @@ println(" DEALLOCATE refcursor"); print("END"); printEndOfStatement(); + } + + /** + * [EMAIL PROTECTED] + */ + protected void writeCastExpression(Column sourceColumn, Column targetColumn) throws IOException + { + boolean sizeChanged = ColumnDefinitionChange.isSizeChanged(getPlatformInfo(), sourceColumn, targetColumn); + boolean typeChanged = ColumnDefinitionChange.isTypeChanged(getPlatformInfo(), sourceColumn, targetColumn); + + if (sizeChanged || typeChanged) + { + print("CAST("); + printIdentifier(getColumnName(sourceColumn)); + print(" AS "); + print(getSqlType(targetColumn)); + print(")"); + } + else + { + printIdentifier(getColumnName(sourceColumn)); + } } } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelComparator.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelComparator.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelComparator.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelComparator.java Sat Feb 23 12:20:28 2008 @@ -36,6 +36,7 @@ import org.apache.ddlutils.model.Database; import org.apache.ddlutils.model.ForeignKey; import org.apache.ddlutils.model.Index; +import org.apache.ddlutils.model.IndexColumn; import org.apache.ddlutils.model.Table; import org.apache.ddlutils.util.StringUtils; Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java Sat Feb 23 12:20:28 2008 @@ -211,7 +211,10 @@ Column curColumn = intermediateTable.findColumn(colDefChange.getChangedColumn(), isDelimitedIdentifierModeOn()); // Sql Server has no way of adding or removing an IDENTITY constraint - return curColumn.isAutoIncrement() == colDefChange.getNewColumn().isAutoIncrement(); + // Also, reducing the size of a column should be handled by recreation to avoid truncation errors + return (curColumn.isAutoIncrement() == colDefChange.getNewColumn().isAutoIncrement()) && + (ColumnDefinitionChange.isTypeChanged(getPlatformInfo(), curColumn, colDefChange.getNewColumn()) || + !ColumnDefinitionChange.isSizeChanged(getPlatformInfo(), curColumn, colDefChange.getNewColumn())); } else { Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java Sat Feb 23 12:20:28 2008 @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.ddlutils.Platform; +import org.apache.ddlutils.alteration.ColumnDefinitionChange; import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Database; import org.apache.ddlutils.model.Index; @@ -196,6 +197,28 @@ if (column.isAutoIncrement()) { dropAutoIncrementSequence(table, column); + } + } + + /** + * [EMAIL PROTECTED] + */ + protected void writeCastExpression(Column sourceColumn, Column targetColumn) throws IOException + { + boolean sizeChanged = ColumnDefinitionChange.isSizeChanged(getPlatformInfo(), sourceColumn, targetColumn); + boolean typeChanged = ColumnDefinitionChange.isTypeChanged(getPlatformInfo(), sourceColumn, targetColumn); + + if (sizeChanged || typeChanged) + { + print("CAST("); + printIdentifier(getColumnName(sourceColumn)); + print(" AS "); + print(getSqlType(targetColumn)); + print(")"); + } + else + { + printIdentifier(getColumnName(sourceColumn)); } } } Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestChangeColumn.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestChangeColumn.java?rev=630531&r1=630530&r2=630531&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestChangeColumn.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestChangeColumn.java Sat Feb 23 12:20:28 2008 @@ -20,7 +20,6 @@ */ import java.math.BigDecimal; -import java.math.BigInteger; import java.sql.Timestamp; import java.text.ParseException; import java.util.Date; @@ -3107,6 +3106,9 @@ Object value = isSybase ? (Object)new BigDecimal("0") : new Integer(0); Timestamp time = new Timestamp(new Date().getTime()); + // to avoid problems with the database's time resolution + time.setNanos(0); + insertRow("roundtrip", new Object[] { new Integer(1), value, time }); alterDatabase(model2Xml); @@ -3288,6 +3290,9 @@ createDatabase(model1Xml); Timestamp time = new Timestamp(new Date().getTime()); + + // to avoid problems with the database's time resolution + time.setNanos(0); insertRow("roundtrip", new Object[] { new Integer(1), null, time });