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
                 {


Reply via email to