Author: tomdz
Date: Sat Mar 1 22:32:46 2008
New Revision: 632715
URL: http://svn.apache.org/viewvc?rev=632715&view=rev
Log:
More fixes for the Sql Server platform
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ColumnDefinitionChange.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
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ColumnDefinitionChange.java
URL:
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ColumnDefinitionChange.java?rev=632715&r1=632714&r2=632715&view=diff
==============================================================================
---
db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ColumnDefinitionChange.java
(original)
+++
db/ddlutils/trunk/src/java/org/apache/ddlutils/alteration/ColumnDefinitionChange.java
Sat Mar 1 22:32:46 2008
@@ -125,6 +125,41 @@
}
/**
+ * Determines whether the size or precision/scale of the given target
column is smaller than that of the given source column.
+ * If size and precision/scale do not matter for the target column's type,
then <code>false</code> is returned. Note that for
+ * columns with precision & scale, it also counted as being smaller if the
scale of the target column is smaller than the
+ * one of the source column, regardless of whether the precision of the
target column is smaller than precision of the source
+ * column or equal to it or even bigger. The reason for this is that the
reduced scale would still potentially lead to truncation
+ * errors.
+ *
+ * @param platformInfo The info object for the current platform
+ * @param sourceColumn The source column
+ * @param targetColumn The target column
+ * @return <code>true</code> if the size of the target column is smaller
+ */
+ public static boolean isSizeReduced(PlatformInfo platformInfo, Column
sourceColumn, Column targetColumn)
+ {
+ int targetTypeCode =
platformInfo.getTargetJdbcType(targetColumn.getTypeCode());
+ boolean sizeMatters = platformInfo.hasSize(targetTypeCode);
+ boolean scaleMatters =
platformInfo.hasPrecisionAndScale(targetTypeCode);
+
+ if (sizeMatters && (sourceColumn.getSizeAsInt() >
targetColumn.getSizeAsInt()))
+ {
+ return true;
+ }
+ else if (scaleMatters &&
+ ((sourceColumn.getPrecisionRadix() >
targetColumn.getPrecisionRadix()) ||
+ (sourceColumn.getScale() > targetColumn.getScale())))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
* Determines whether the default value of the given target column is
different from the one of the given source column.
* This method compares the parsed default values instead of their
representations in the columns.
*
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=632715&r1=632714&r2=632715&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 Mar 1 22:32:46 2008
@@ -33,6 +33,7 @@
import org.apache.ddlutils.model.ForeignKey;
import org.apache.ddlutils.model.Index;
import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.model.TypeMap;
import org.apache.ddlutils.platform.SqlBuilder;
/**
@@ -521,11 +522,25 @@
if (sizeChanged || typeChanged)
{
- print("CAST(");
- printIdentifier(getColumnName(sourceColumn));
- print(" AS ");
- print(getSqlType(targetColumn));
- print(")");
+ if (TypeMap.isTextType(targetColumn.getTypeCode()) &&
+ sizeChanged && (sourceColumn.getSizeAsInt() >
targetColumn.getSizeAsInt()))
+ {
+ print("SUBSTRING(CAST(");
+ printIdentifier(getColumnName(sourceColumn));
+ print(" AS ");
+ print(getNativeType(targetColumn));
+ print("),1,");
+ print(targetColumn.getSize());
+ print(")");
+ }
+ else
+ {
+ print("CAST(");
+ printIdentifier(getColumnName(sourceColumn));
+ print(" AS ");
+ print(getSqlType(targetColumn));
+ print(")");
+ }
}
else
{
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=632715&r1=632714&r2=632715&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 Mar 1 22:32:46 2008
@@ -27,6 +27,7 @@
import org.apache.ddlutils.alteration.AddForeignKeyChange;
import org.apache.ddlutils.alteration.AddIndexChange;
import org.apache.ddlutils.alteration.AddPrimaryKeyChange;
+import org.apache.ddlutils.alteration.ColumnDefinitionChange;
import org.apache.ddlutils.alteration.ModelComparator;
import org.apache.ddlutils.alteration.RemoveForeignKeyChange;
import org.apache.ddlutils.alteration.RemoveIndexChange;
@@ -36,9 +37,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.StringUtilsExt;
/**
* A model comparator customized for Sql Server.
@@ -293,29 +292,10 @@
if (sourceColumn != null)
{
- boolean hasChange = false;
- int targetTypeCode =
getPlatformInfo().getTargetJdbcType(targetColumn.getTypeCode());
- boolean sizeMatters =
getPlatformInfo().hasSize(targetTypeCode);
- boolean scaleMatters =
getPlatformInfo().hasPrecisionAndScale(targetTypeCode);
+ int targetTypeCode =
getPlatformInfo().getTargetJdbcType(targetColumn.getTypeCode());
- if (targetTypeCode != sourceColumn.getTypeCode())
- {
- hasChange = true;
- }
- else
- {
- if (sizeMatters &&
!StringUtilsExt.equals(sourceColumn.getSize(), targetColumn.getSize()))
- {
- hasChange = true;
- }
- else if (scaleMatters &&
- (!StringUtilsExt.equals(sourceColumn.getSize(),
targetColumn.getSize()) ||
- (sourceColumn.getScale() !=
targetColumn.getScale())))
- {
- hasChange = true;
- }
- }
- if (hasChange)
+ if ((targetTypeCode != sourceColumn.getTypeCode()) ||
+ ColumnDefinitionChange.isSizeChanged(getPlatformInfo(),
sourceColumn, targetColumn))
{
result.add(targetColumn);
}
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=632715&r1=632714&r2=632715&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 Mar 1 22:32:46 2008
@@ -209,12 +209,13 @@
{
ColumnDefinitionChange colDefChange =
(ColumnDefinitionChange)change;
Column curColumn =
intermediateTable.findColumn(colDefChange.getChangedColumn(),
isDelimitedIdentifierModeOn());
+ Column newColumn =
colDefChange.getNewColumn();
// Sql Server has no way of adding or removing an IDENTITY
constraint
- // Also, reducing the size of a column should be handled
by recreation to avoid truncation errors
+ // Also, Sql Server cannot handle reducing the size (even
with the CAST in place)
return (curColumn.isAutoIncrement() ==
colDefChange.getNewColumn().isAutoIncrement()) &&
-
(ColumnDefinitionChange.isTypeChanged(getPlatformInfo(), curColumn,
colDefChange.getNewColumn()) ||
-
!ColumnDefinitionChange.isSizeChanged(getPlatformInfo(), curColumn,
colDefChange.getNewColumn()));
+ (curColumn.isRequired() || (curColumn.isRequired()
== newColumn.isRequired())) &&
+
!ColumnDefinitionChange.isSizeReduced(getPlatformInfo(), curColumn, newColumn);
}
else
{