Additional fixes and test tweaks

git-svn-id: https://svn.apache.org/repos/asf/db/ddlutils/trunk@603834 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/ddlutils/PlatformInfo.java b/src/java/org/apache/ddlutils/PlatformInfo.java
index 0417f83..f50d16a 100644
--- a/src/java/org/apache/ddlutils/PlatformInfo.java
+++ b/src/java/org/apache/ddlutils/PlatformInfo.java
@@ -49,7 +49,13 @@
     

     /** Whether primary key constraints are embedded inside the create table statement. */

     private boolean _primaryKeyEmbedded = true;

-    

+

+    /** Whether primary key columns have to be required, too. */

+    private boolean _primaryKeyColumnsHaveToBeRequired = false;

+

+    /** Whether mixed identity and non-identity columns in a primary key is supported. */

+    private boolean _mixingIdentityAndNormalPrimaryKeyColumnsSupported = true;

+

     /** Whether foreign key constraints are embedded inside the create table statement. */

     private boolean _foreignKeysEmbedded = false;

 

@@ -63,7 +69,7 @@
     private boolean _indicesEmbedded = false;

 

     /** Whether identity specification is supported for non-primary key columns. */

-    private boolean _nonPKIdentityColumnsSupported = true;

+    private boolean _nonPrimaryKeyIdentityColumnsSupported = true;

 

     /** Whether multiple identity columns in the same table are supported. */

     private boolean _multipleIdentityColumnsSupported = true;

@@ -253,6 +259,47 @@
     }

 

     /**

+     * Determines whether the primary key constraints have to be required, as well.

+     * 

+     * @return <code>true</code> if pk constraints have to be required

+     */

+    public boolean isPrimaryKeyColumnsHaveToBeRequired()

+    {

+        return _primaryKeyColumnsHaveToBeRequired;

+    }

+

+    /**

+     * Specifies whether the primary key constraints have to be required, as well.

+     * 

+     * @param primaryKeyColumnsHaveToBeRequired Whether pk constraints need to be required

+     */

+    public void setPrimaryKeyColumnsHaveToBeRequired(boolean primaryKeyColumnsHaveToBeRequired)

+    {

+        _primaryKeyColumnsHaveToBeRequired = primaryKeyColumnsHaveToBeRequired;

+    }

+

+    /**

+     * Determines whether primary key can contain identity and non-identity columns at the same time.

+     * 

+     * @return <code>true</code> if idenity and non-identity columns can be mixed in the pk

+     */

+    public boolean isMixingIdentityAndNormalPrimaryKeyColumnsSupported()

+    {

+        return _mixingIdentityAndNormalPrimaryKeyColumnsSupported;

+    }

+

+    /**

+     * Specifies whether primary key can contain identity and non-identity columns at the same time.

+     * 

+     * @param mixingIdentityAndNormalPrimaryKeyColumnsSupported Whether idenity and non-identity columns

+     *                                                          can be mixed in the pk

+     */

+    public void setMixingIdentityAndNormalPrimaryKeyColumnsSupported(boolean mixingIdentityAndNormalPrimaryKeyColumnsSupported)

+    {

+        _mixingIdentityAndNormalPrimaryKeyColumnsSupported = mixingIdentityAndNormalPrimaryKeyColumnsSupported;

+    }

+    

+    /**

      * Determines whether foreign key constraints are embedded in the create 

      * table clause or as seperate alter table statements. Per default,

      * foreign keys are external.

@@ -342,9 +389,9 @@
      *

      * @return <code>true</code> if normal non-PK columns can be auto-incrementing

      */

-    public boolean isNonPKIdentityColumnsSupported()

+    public boolean isNonPrimaryKeyIdentityColumnsSupported()

     {

-        return _nonPKIdentityColumnsSupported;

+        return _nonPrimaryKeyIdentityColumnsSupported;

     }

 

     /**

@@ -353,9 +400,9 @@
      * @param supportingNonPKIdentityColumns <code>true</code> if normal non-PK columns can

      *                                       be auto-incrementing

      */

-    public void setNonPKIdentityColumnsSupported(boolean supportingNonPKIdentityColumns)

+    public void setNonPrimaryKeyIdentityColumnsSupported(boolean supportingNonPKIdentityColumns)

     {

-        _nonPKIdentityColumnsSupported = supportingNonPKIdentityColumns;

+        _nonPrimaryKeyIdentityColumnsSupported = supportingNonPKIdentityColumns;

     }

 

     /**

diff --git a/src/java/org/apache/ddlutils/platform/SqlBuilder.java b/src/java/org/apache/ddlutils/platform/SqlBuilder.java
index 09e93ae..e743940 100644
--- a/src/java/org/apache/ddlutils/platform/SqlBuilder.java
+++ b/src/java/org/apache/ddlutils/platform/SqlBuilder.java
@@ -1361,7 +1361,7 @@
         }
         if (column.isAutoIncrement() && !getPlatformInfo().isDefaultValueUsedForIdentitySpec())
         {
-            if (!getPlatformInfo().isNonPKIdentityColumnsSupported() && !column.isPrimaryKey())
+            if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported() && !column.isPrimaryKey())
             {
                 throw new ModelException("Column "+column.getName()+" in table "+table.getName()+" is auto-incrementing but not a primary key column, which is not supported by the platform");
             }
diff --git a/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java b/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java
index d22f327..99d26e0 100644
--- a/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java
+++ b/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java
@@ -73,6 +73,7 @@
 

         info.setMaxIdentifierLength(18);

         info.setIdentityColumnAutomaticallyRequired(true);

+        info.setPrimaryKeyColumnsHaveToBeRequired(true);

 

         // the BINARY types are also handled by Db2Builder.getSqlType(Column)

         info.addNativeTypeMapping(Types.ARRAY,         "BLOB",                      Types.BLOB);

diff --git a/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java b/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java
index 73443f1..0d89587 100644
--- a/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java
+++ b/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java
@@ -60,10 +60,11 @@
     {

         PlatformInfo info = getPlatformInfo();

 

-        info.setNonPKIdentityColumnsSupported(false);

+        info.setNonPrimaryKeyIdentityColumnsSupported(false);

         info.setIdentityOverrideAllowed(false);

         info.setSystemForeignKeyIndicesAlwaysNonUnique(true);

         info.setPrimaryKeyColumnAutomaticallyRequired(true);

+        info.setMixingIdentityAndNormalPrimaryKeyColumnsSupported(false);

 

         info.addNativeTypeMapping(Types.ARRAY,       "LONGVARBINARY", Types.LONGVARBINARY);

         info.addNativeTypeMapping(Types.BLOB,        "LONGVARBINARY", Types.LONGVARBINARY);

diff --git a/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java b/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java
index ee9ecdb..8700068 100644
--- a/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java
+++ b/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java
@@ -72,6 +72,7 @@
         info.setCommentPrefix("/*");

         info.setCommentSuffix("*/");

         info.setSystemForeignKeyIndicesAlwaysNonUnique(true);

+        info.setPrimaryKeyColumnsHaveToBeRequired(true);

 

         // BINARY and VARBINARY are also handled by the InterbaseBuilder.getSqlType method

         info.addNativeTypeMapping(Types.ARRAY,         "BLOB",               Types.LONGVARBINARY);

diff --git a/src/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java b/src/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
index 8773f9e..80db511 100644
--- a/src/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
+++ b/src/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
@@ -66,7 +66,9 @@
         info.setNullAsDefaultValueRequired(true);

         info.setDefaultValuesForLongTypesSupported(false);

         // see http://dev.mysql.com/doc/refman/4.1/en/example-auto-increment.html

-        info.setNonPKIdentityColumnsSupported(false);

+        info.setNonPrimaryKeyIdentityColumnsSupported(false);

+        info.setMultipleIdentityColumnsSupported(false);

+        info.setMixingIdentityAndNormalPrimaryKeyColumnsSupported(false);

         // MySql returns synthetic default values for pk columns

         info.setSyntheticDefaultValueForRequiredReturned(true);

         info.setPrimaryKeyColumnAutomaticallyRequired(true);

diff --git a/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java b/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java
index 602a3b9..064e84b 100644
--- a/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java
+++ b/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlBuilder.java
@@ -168,6 +168,18 @@
     }
 
     /**
+     * {@inheritDoc}
+     */
+    public void addColumn(Table table, Column newColumn) throws IOException
+    {
+        if (newColumn.isAutoIncrement())
+        {
+            createAutoIncrementSequence(table, newColumn);
+        }
+        super.addColumn(table, newColumn);
+    }
+
+    /**
      * Writes the SQL to drop a column.
      * 
      * @param table  The table
diff --git a/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlModelReader.java b/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlModelReader.java
index ede7b88..fb1cb09 100644
--- a/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlModelReader.java
+++ b/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlModelReader.java
@@ -62,7 +62,7 @@
 

         if (table != null)

         {

-            // PostgreSQL also returns unique indics for non-pk auto-increment columns

+            // PostgreSQL also returns unique indexes for pk and non-pk auto-increment columns

             // which are of the form "[table]_[column]_key"

             HashMap uniquesByName = new HashMap();

     

@@ -78,7 +78,8 @@
             for (int columnIdx = 0; columnIdx < table.getColumnCount(); columnIdx++)

             {

                 Column column = table.getColumn(columnIdx);

-                if (column.isAutoIncrement() && !column.isPrimaryKey())

+

+                if (column.isAutoIncrement())

                 {

                     String indexName = table.getName() + "_" + column.getName() + "_key";

     

diff --git a/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlPlatform.java b/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlPlatform.java
index de73cfe..6842c74 100644
--- a/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlPlatform.java
+++ b/src/java/org/apache/ddlutils/platform/postgresql/PostgreSqlPlatform.java
@@ -33,6 +33,7 @@
 import org.apache.ddlutils.DatabaseOperationException;

 import org.apache.ddlutils.PlatformInfo;

 import org.apache.ddlutils.alteration.AddColumnChange;

+import org.apache.ddlutils.alteration.ModelComparator;

 import org.apache.ddlutils.alteration.RemoveColumnChange;

 import org.apache.ddlutils.alteration.TableChange;

 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;

@@ -65,6 +66,7 @@
     {

         PlatformInfo info = getPlatformInfo();

 

+        info.setPrimaryKeyColumnAutomaticallyRequired(true);

         // this is the default length though it might be changed when building PostgreSQL

         // in file src/include/postgres_ext.h

         info.setMaxIdentifierLength(31);

@@ -254,6 +256,17 @@
     /**

      * {@inheritDoc}

      */

+    protected ModelComparator getModelComparator()

+    {

+        ModelComparator comparator = super.getModelComparator();

+

+        comparator.setCanDropPrimaryKeyColumns(false);

+        return comparator;

+    }

+

+    /**

+     * {@inheritDoc}

+     */

     protected TableDefinitionChangesPredicate getTableDefinitionChangesPredicate()

     {

         return new DefaultTableDefinitionChangesPredicate()

diff --git a/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java b/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java
index feb13d4..eeed56d 100644
--- a/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java
+++ b/src/java/org/apache/ddlutils/platform/sybase/SybasePlatform.java
@@ -82,6 +82,7 @@
         info.setNullAsDefaultValueRequired(true);

         info.setIdentityColumnAutomaticallyRequired(true);

         info.setMultipleIdentityColumnsSupported(false);

+        info.setPrimaryKeyColumnsHaveToBeRequired(true);

         info.setCommentPrefix("/*");

         info.setCommentSuffix("*/");

 

diff --git a/src/test/org/apache/ddlutils/RunAllTests.java b/src/test/org/apache/ddlutils/RunAllTests.java
index 5256107..4dc21b4 100644
--- a/src/test/org/apache/ddlutils/RunAllTests.java
+++ b/src/test/org/apache/ddlutils/RunAllTests.java
@@ -24,6 +24,7 @@
 import org.apache.ddlutils.dynabean.TestDynaSqlQueries;

 import org.apache.ddlutils.io.TestAddColumn;

 import org.apache.ddlutils.io.TestAlteration;

+import org.apache.ddlutils.io.TestChangeColumn;

 import org.apache.ddlutils.io.TestConstraints;

 import org.apache.ddlutils.io.TestDataReaderAndWriter;

 import org.apache.ddlutils.io.TestDatabaseIO;

@@ -129,6 +130,7 @@
             suite.addTestSuite(TestConstraints.class);

             suite.addTestSuite(TestAlteration.class);

             suite.addTestSuite(TestAddColumn.class);

+            suite.addTestSuite(TestChangeColumn.class);

             suite.addTestSuite(TestDropColumn.class);

             suite.addTestSuite(TestMisc.class);

         }

diff --git a/src/test/org/apache/ddlutils/io/TestAddColumn.java b/src/test/org/apache/ddlutils/io/TestAddColumn.java
index 500202c..93e5b3a 100644
--- a/src/test/org/apache/ddlutils/io/TestAddColumn.java
+++ b/src/test/org/apache/ddlutils/io/TestAddColumn.java
@@ -25,11 +25,10 @@
 import junit.framework.Test;

 

 import org.apache.commons.beanutils.DynaBean;

-import org.apache.ddlutils.platform.db2.Db2Platform;

-import org.apache.ddlutils.platform.db2.Db2v8Platform;

 import org.apache.ddlutils.platform.firebird.FirebirdPlatform;

 import org.apache.ddlutils.platform.hsqldb.HsqlDbPlatform;

 import org.apache.ddlutils.platform.interbase.InterbasePlatform;

+import org.apache.ddlutils.platform.mckoi.MckoiPlatform;

 import org.apache.ddlutils.platform.mysql.MySql50Platform;

 import org.apache.ddlutils.platform.mysql.MySqlPlatform;

 import org.apache.ddlutils.platform.sybase.SybasePlatform;

@@ -91,7 +90,7 @@
      */

     public void testAddAutoIncrementColumn()

     {

-    	if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+    	if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

     	{

     		return;

     	}

@@ -156,10 +155,9 @@
      */

     public void testAddSecondAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported() ||

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported() ||

             !getPlatformInfo().isMultipleIdentityColumnsSupported())

         {

-            // Some databases do not support more than one identity column per table

             return;

         }

 

@@ -232,10 +230,7 @@
     }

 

     /**

-     * Tests the addition of a column with a default value. Note that depending

-     * on whether the database supports this via a statement, this test may fail.

-     * For instance, Sql Server has a statement for this which means that the

-     * existing value in column avalue won't be changed and thus the test fails.

+     * Tests the addition of a column with a default value.

      */

     public void testAddColumnWithDefault()

     {

@@ -264,11 +259,7 @@
         assertEquals(getAdjustedModel(),

                      readModelFromDatabase("roundtriptest"));

 

-        List beans = getRows("roundtrip");

-

-        // we cannot be sure whether the default algorithm is used (which will apply the

-        // default value even to existing columns with NULL in it) or the database supports

-        // it directly (in which case it might still be NULL)

+        List   beans  = getRows("roundtrip");

         Object avalue = ((DynaBean)beans.get(0)).get("avalue");

 

         assertTrue((avalue == null) || new Double(2).equals(avalue));

@@ -279,7 +270,7 @@
      */

     public void testAddRequiredAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -340,10 +331,7 @@
     }

 

     /**

-     * Tests the addition of a column with a default value. Note that depending

-     * on whether the database supports this via a statement, this test may fail.

-     * For instance, Sql Server has a statement for this which means that the

-     * existing value in column avalue won't be changed and thus the test fails.

+     * Tests the addition of a column with a default value.

      */

     public void testAddRequiredColumnWithDefault()

     {

@@ -372,11 +360,7 @@
         assertEquals(getAdjustedModel(),

                      readModelFromDatabase("roundtriptest"));

 

-        List beans = getRows("roundtrip");

-

-        // we cannot be sure whether the default algorithm is used (which will apply the

-        // default value even to existing columns with NULL in it) or the database supports

-        // it directly (in which case it might still be NULL)

+        List   beans  = getRows("roundtrip");

         Object avalue = ((DynaBean)beans.get(0)).get("avalue");

 

         assertTrue((avalue == null) || "sometext".equals(avalue));

@@ -417,18 +401,12 @@
         assertEquals(getAdjustedModel(),

                      readModelFromDatabase("roundtriptest"));

 

-        List beans = getRows("roundtrip");

+        List   beans   = getRows("roundtrip");

+        Object avalue3 = ((DynaBean)beans.get(0)).get("avalue3");

 

         assertEquals((Object)"test", beans.get(0), "avalue1");

         assertEquals(new Integer(3), beans.get(0), "avalue2");

-

-        // we cannot be sure whether the default algorithm is used (which will apply the

-        // default value even to existing columns with NULL in it) or the database supports

-        // it dircetly (in which case it might still be NULL)

-        Object avalue3 = ((DynaBean)beans.get(0)).get("avalue3");

-

         assertTrue((avalue3 == null) || new Double(1.0).equals(avalue3));

-        

         assertEquals((Object)null, beans.get(0), "avalue4");

     }

 

@@ -471,6 +449,12 @@
             assertEquals((Object)"",     beans.get(0), "pk");

             assertEquals(new Integer(1), beans.get(0), "avalue");

         }

+        else if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            // Mckoi uses null to initialize the new pk column

+            assertEquals((Object)null,   beans.get(0), "pk");

+            assertEquals(new Integer(1), beans.get(0), "avalue");

+        }

         else

         {

             assertTrue(beans.isEmpty());

@@ -545,12 +529,8 @@
      */

     public void testAddPKAndMultipleColumns()

     {

-        if (Db2Platform.DATABASENAME.equals(getPlatform().getName()) ||

-            Db2v8Platform.DATABASENAME.equals(getPlatform().getName()) ||

-            SybasePlatform.DATABASENAME.equals(getPlatform().getName()) ||

-            InterbasePlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (getPlatformInfo().isPrimaryKeyColumnsHaveToBeRequired())

         {

-            // Db2, Sybase, Interbase require that all primary key columns be required, but they don't make them so automatically

             return;

         }

 

@@ -591,6 +571,13 @@
             assertEquals(new Double(2.0), beans.get(0), "pk3");

             assertEquals(new Integer(1),  beans.get(0), "avalue");

         }

+        else if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals((Object)null,    beans.get(0), "pk1");

+            assertEquals((Object)null,    beans.get(0), "pk2");

+            assertEquals(new Double(2.0), beans.get(0), "pk3");

+            assertEquals(new Integer(1),  beans.get(0), "avalue");

+        }

         else

         {

             assertTrue(beans.isEmpty());

@@ -639,6 +626,13 @@
             assertEquals(new Double(2.0), beans.get(0), "pk3");

             assertEquals(new Integer(1),  beans.get(0), "avalue");

         }

+        else if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals((Object)null,    beans.get(0), "pk1");

+            assertEquals((Object)null,    beans.get(0), "pk2");

+            assertEquals(new Double(2.0), beans.get(0), "pk3");

+            assertEquals(new Integer(1),  beans.get(0), "avalue");

+        }

         else

         {

             assertTrue(beans.isEmpty());

@@ -650,9 +644,8 @@
      */

     public void testAddPKAndMultipleColumnsInclAutoIncrement()

     {

-        if (HsqlDbPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isMixingIdentityAndNormalPrimaryKeyColumnsSupported())

         {

-            // the IDENTITY column has to be the only PK column

             return;

         }

 

@@ -683,7 +676,19 @@
         assertEquals(getAdjustedModel(),

                      readModelFromDatabase("roundtriptest"));

 

-        assertTrue(getRows("roundtrip").isEmpty());

+        List beans = getRows("roundtrip");

+

+        if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals(new Integer(1), beans.get(0), "pk1");

+            assertEquals((Object)null,   beans.get(0), "pk2");

+            assertEquals((Object)null,   beans.get(0), "pk3");

+            assertEquals(new Integer(1), beans.get(0), "avalue");

+        }

+        else

+        {

+            assertTrue(beans.isEmpty());

+        }

     }

 

     /**

@@ -727,6 +732,12 @@
             assertEquals(new Integer(0),  beans.get(0), "pk2");

             assertEquals(new Integer(2),  beans.get(0), "avalue");

         }

+        else if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals(new Integer(1), beans.get(0), "pk1");

+            assertEquals((Object)null,   beans.get(0), "pk2");

+            assertEquals(new Integer(2), beans.get(0), "avalue");

+        }

         else

         {

             assertTrue(beans.isEmpty());

@@ -738,11 +749,8 @@
      */

     public void testAddAutoIncrementColumnIntoPK()

     {

-        if (HsqlDbPlatform.DATABASENAME.equals(getPlatform().getName()) ||

-            MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

-            MySql50Platform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isMixingIdentityAndNormalPrimaryKeyColumnsSupported())

         {

-            // the IDENTITY column has to be the only PK column

             return;

         }

 

@@ -847,6 +855,13 @@
             assertEquals(new Double(0.0), beans.get(0), "pk3");

             assertEquals((Object)null,    beans.get(0), "avalue");

         }

+        else if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals(new Integer(1), beans.get(0), "pk1");

+            assertEquals((Object)null,   beans.get(0), "pk2");

+            assertEquals((Object)null,   beans.get(0), "pk3");

+            assertEquals((Object)null,   beans.get(0), "avalue");

+        }

         else

         {

             assertTrue(beans.isEmpty());

@@ -858,11 +873,8 @@
      */

     public void testAddMultipleColumnsIntoPKWithAutoIncrement()

     {

-        if (HsqlDbPlatform.DATABASENAME.equals(getPlatform().getName()) ||

-            MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

-            MySql50Platform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isMixingIdentityAndNormalPrimaryKeyColumnsSupported())

         {

-            // the IDENTITY column has to be the only PK column

             return;

         }

 

@@ -887,14 +899,26 @@
 

         createDatabase(model1Xml);

 

-        insertRow("roundtrip", new Object[] { new Integer(1) });

+        insertRow("roundtrip", new Object[] { null, new Integer(1) });

 

         alterDatabase(model2Xml);

 

         assertEquals(getAdjustedModel(),

                      readModelFromDatabase("roundtriptest"));

 

-        assertTrue(getRows("roundtrip").isEmpty());

+        List beans = getRows("roundtrip");

+

+        if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals(new Integer(1), beans.get(0), "pk1");

+            assertEquals((Object)null,   beans.get(0), "pk2");

+            assertEquals((Object)null,   beans.get(0), "pk3");

+            assertEquals(new Integer(1), beans.get(0), "avalue");

+        }

+        else

+        {

+            assertTrue(beans.isEmpty());

+        }

     }

 

     /**

@@ -902,9 +926,8 @@
      */

     public void testAddMultipleColumnsInclAutoIncrementIntoPK()

     {

-        if (HsqlDbPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isMixingIdentityAndNormalPrimaryKeyColumnsSupported())

         {

-            // the IDENTITY column has to be the only PK column

             return;

         }

 

@@ -936,7 +959,19 @@
         assertEquals(getAdjustedModel(),

                      readModelFromDatabase("roundtriptest"));

 

-        assertTrue(getRows("roundtrip").isEmpty());

+        List beans = getRows("roundtrip");

+

+        if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals(new Integer(1), beans.get(0), "pk1");

+            assertEquals((Object)"text", beans.get(0), "pk2");

+            assertEquals((Object)null,   beans.get(0), "pk3");

+            assertEquals(new Integer(1), beans.get(0), "avalue");

+        }

+        else

+        {

+            assertTrue(beans.isEmpty());

+        }

     }

 

     /**

@@ -987,7 +1022,8 @@
      */

     public void testAddNonUniqueIndexAndAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isIndicesSupported() || !getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isIndicesSupported() ||

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -1133,7 +1169,8 @@
      */

     public void testAddNonUniqueIndexAndRequiredAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isIndicesSupported() || !getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isIndicesSupported() ||

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -1292,6 +1329,7 @@
      */

     public void testAddUniqueIndexAndColumn()

     {

+        // TODO

         if (!getPlatformInfo().isIndicesSupported() ||

             InterbasePlatform.DATABASENAME.equals(getPlatform().getName()))

         {

@@ -1336,7 +1374,8 @@
      */

     public void testAddUniqueIndexAndAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isIndicesSupported() || !getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isIndicesSupported() ||

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -1481,7 +1520,8 @@
      */

     public void testAddUniqueIndexAndRequiredAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isIndicesSupported() || !getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isIndicesSupported() ||

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -1575,6 +1615,7 @@
      */

     public void testAddUniqueIndexAndMultipleColumns()

     {

+        // TODO

         if (!getPlatformInfo().isIndicesSupported() ||

             InterbasePlatform.DATABASENAME.equals(getPlatform().getName()))

         {

@@ -1748,7 +1789,8 @@
      */

     public void testAddAutoIncrementColumnIntoNonUniqueIndex()

     {

-        if (!getPlatformInfo().isIndicesSupported() || !getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isIndicesSupported() ||

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -1916,7 +1958,8 @@
      */

     public void testAddRequiredAutoIncrementColumnIntoNonUniqueIndex()

     {

-        if (!getPlatformInfo().isIndicesSupported() || !getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isIndicesSupported() ||

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -2097,6 +2140,7 @@
      */

     public void testAddColumnIntoUniqueIndex()

     {

+        // TODO

         if (!getPlatformInfo().isIndicesSupported() ||

             InterbasePlatform.DATABASENAME.equals(getPlatform().getName()))

         {

@@ -2149,7 +2193,7 @@
     public void testAddAutoIncrementColumnIntoUniqueIndex()

     {

         if (!getPlatformInfo().isIndicesSupported() ||

-            !getPlatformInfo().isNonPKIdentityColumnsSupported())

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -2241,6 +2285,7 @@
 

         List beans = getRows("roundtrip");

 

+        // TODO

         if (MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

             MySql50Platform.DATABASENAME.equals(getPlatform().getName()))

         {

@@ -2318,7 +2363,8 @@
      */

     public void testAddRequiredAutoIncrementColumnIntoUniqueIndex()

     {

-        if (!getPlatformInfo().isIndicesSupported() || !getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isIndicesSupported() ||

+            !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -2426,6 +2472,7 @@
      */

     public void testAddMultipleColumnsIntoUniqueIndex()

     {

+        // TODO

         if (!getPlatformInfo().isIndicesSupported() ||

             InterbasePlatform.DATABASENAME.equals(getPlatform().getName()))

         {

@@ -2613,7 +2660,7 @@
      */

     public void testAddFKAndLocalAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -2667,11 +2714,11 @@
      */

     public void testAddFKAndLocalRequiredColumn()

     {

+        // TODO

         if (MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

             MySql50Platform.DATABASENAME.equals(getPlatform().getName()))

         {

             // MySql does not allow adding a required column to a fk without a default value

-            // or as an IDENTITY column

             return;

         }

 

@@ -2715,7 +2762,8 @@
 

         assertEquals(new BigDecimal(1), beans1.get(0), "pk");

         if (FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()) ||

-            InterbasePlatform.DATABASENAME.equals(getPlatform().getName()))

+            InterbasePlatform.DATABASENAME.equals(getPlatform().getName()) ||

+            MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

         {

             assertEquals(new Integer(2), beans2.get(0), "pk");

             assertEquals((Object)null,   beans2.get(0), "avalue");

@@ -2780,7 +2828,7 @@
      */

     public void testAddFKAndLocalRequiredAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -2889,11 +2937,11 @@
      */

     public void testAddFKAndMultipleLocalColumns()

     {

+        // TODO

         if (MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

             MySql50Platform.DATABASENAME.equals(getPlatform().getName()))

         {

             // MySql does not allow adding a required column to a fk without a default value

-            // or as an IDENTITY column

             return;

         }

 

@@ -2948,6 +2996,12 @@
             assertEquals((Object)null,   beans2.get(0), "avalue1");

             assertEquals((Object)null,   beans2.get(0), "avalue2");

         }

+        else if (MckoiPlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            assertEquals(new Integer(3), beans2.get(0), "pk");

+            assertEquals(new Integer(1), beans2.get(0), "avalue1");

+            assertEquals((Object)null,   beans2.get(0), "avalue2");

+        }

         else

         {

             assertTrue(beans2.isEmpty());

@@ -2999,7 +3053,7 @@
      */

     public void testAddFKAndForeignAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -3195,7 +3249,7 @@
      */

     public void testAddAutoIncrementColumnIntoFK()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -3358,7 +3412,7 @@
      */

     public void testAddRequiredAutoIncrementColumnIntoFK()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

diff --git a/src/test/org/apache/ddlutils/io/TestAlteration.java b/src/test/org/apache/ddlutils/io/TestAlteration.java
index 2991587..a2af82f 100644
--- a/src/test/org/apache/ddlutils/io/TestAlteration.java
+++ b/src/test/org/apache/ddlutils/io/TestAlteration.java
@@ -19,13 +19,11 @@
  * under the License.

  */

 

-import java.math.BigDecimal;

 import java.util.List;

 import java.util.Properties;

 

 import junit.framework.Test;

 

-import org.apache.commons.beanutils.DynaBean;

 import org.apache.ddlutils.model.Database;

 import org.apache.ddlutils.platform.firebird.FirebirdPlatform;

 import org.apache.ddlutils.platform.mckoi.MckoiPlatform;

@@ -57,695 +55,6 @@
     }

 

     /**

-     * Tests the alteration of a column datatype.

-     */

-    public void testChangeDatatype1()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='DOUBLE' required='false'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

-

-    	alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals(new Double(2.0), beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the alteration of a column datatype.

-     */

-    public void testChangeDatatype2()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='SMALLINT' required='true'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='VARCHAR' size='20' required='true'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), new Short((short)2) });

-

-    	alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List     beans = getRows("roundtrip");

-        DynaBean bean  = (DynaBean)beans.get(0); 

-

-        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it

-        if (bean.get("avalue") instanceof String)

-        {

-            bean.set("avalue", ((String)bean.get("avalue")).trim());

-        }

-        assertEquals((Object)"2", beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the alteration of the datatypes of PK and FK columns.

-     */

-    public void testChangePKAndFKDatatypes()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip1'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "  </table>\n"+

-            "  <table name='roundtrip2'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='fk' type='INTEGER' required='false'/>\n"+

-            "    <foreign-key foreignTable='roundtrip1'>\n"+

-            "      <reference local='fk' foreign='pk'/>\n"+

-            "    </foreign-key>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip1'>\n"+

-            "    <column name='pk' type='VARCHAR' size='128' primaryKey='true' required='true'/>\n"+

-            "  </table>\n"+

-            "  <table name='roundtrip2'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='fk' type='VARCHAR' size='128' required='false'/>\n"+

-            "    <foreign-key foreignTable='roundtrip1'>\n"+

-            "      <reference local='fk' foreign='pk'/>\n"+

-            "    </foreign-key>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip1", new Object[] { new Integer(1) });

-        insertRow("roundtrip2", new Object[] { new Integer(1), new Integer(1) });

-

-        alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List     beans = getRows("roundtrip2");

-        DynaBean bean  = (DynaBean)beans.get(0);

-

-        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it

-        if (bean.get("fk") instanceof String)

-        {

-            bean.set("fk", ((String)bean.get("fk")).trim());

-        }

-        assertEquals((Object)"1", bean, "fk");

-    }

-

-    /**

-     * Tests the alteration of the sizes of PK and FK columns.

-     */

-    public void testChangePKAndFKSizes()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip1'>\n"+

-            "    <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+

-            "  </table>\n"+

-            "  <table name='roundtrip2'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='fk' type='VARCHAR' size='32' required='false'/>\n"+

-            "    <foreign-key foreignTable='roundtrip1'>\n"+

-            "      <reference local='fk' foreign='pk'/>\n"+

-            "    </foreign-key>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip1'>\n"+

-            "    <column name='pk' type='VARCHAR' size='128' primaryKey='true' required='true'/>\n"+

-            "  </table>\n"+

-            "  <table name='roundtrip2'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='fk' type='VARCHAR' size='128' required='false'/>\n"+

-            "    <foreign-key foreignTable='roundtrip1'>\n"+

-            "      <reference local='fk' foreign='pk'/>\n"+

-            "    </foreign-key>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip1", new Object[] { "test" });

-        insertRow("roundtrip2", new Object[] { new Integer(1), "test" });

-

-        alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List     beans = getRows("roundtrip2");

-        DynaBean bean  = (DynaBean)beans.get(0);

-

-        assertEquals((Object)"test", bean, "fk");

-    }

-

-    /**

-     * Tests the alteration of the datatypes of columns of a PK and FK that

-     * will be dropped.

-     */

-    public void testChangeDroppedPKAndFKDatatypes()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip1'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "  </table>\n"+

-            "  <table name='roundtrip2'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='fk' type='INTEGER' required='false'/>\n"+

-            "    <foreign-key foreignTable='roundtrip1'>\n"+

-            "      <reference local='fk' foreign='pk'/>\n"+

-            "    </foreign-key>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip1'>\n"+

-            "    <column name='pk' type='VARCHAR' primaryKey='false' required='true'/>\n"+

-            "  </table>\n"+

-            "  <table name='roundtrip2'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='fk' type='VARCHAR' required='false'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip1", new Object[] { new Integer(1) });

-        insertRow("roundtrip2", new Object[] { new Integer(1), new Integer(1) });

-

-        alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List     beans = getRows("roundtrip2");

-        DynaBean bean  = (DynaBean)beans.get(0);

-

-        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it

-        if (bean.get("fk") instanceof String)

-        {

-            bean.set("fk", ((String)bean.get("fk")).trim());

-        }

-        assertEquals((Object)"1", bean, "fk");

-    }

-    

-    /**

-     * Tests the alteration of the datatypes of a column that is indexed.

-     */

-    public void testChangeIndexColumnDatatype()

-    {

-        if (!getPlatformInfo().isIndicesSupported())

-        {

-            return;

-        }

-

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='NUMERIC' size='8' required='false'/>\n"+

-            "    <index name='avalue_index'>\n"+

-            "      <index-column name='avalue'/>\n"+

-            "    </index>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

-            "    <index name='avalue_index'>\n"+

-            "      <index-column name='avalue'/>\n"+

-            "    </index>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(1) });

-        insertRow("roundtrip", new Object[] { new Integer(2), new Integer(10) });

-

-        alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals(new Integer(1), beans.get(0), "avalue");

-        assertEquals(new Integer(10), beans.get(1), "avalue");

-    }

-

-    /**

-     * Tests the alteration of the datatypes of an indexed column where

-     * the index will be dropped.

-     */

-    public void testChangeDroppedIndexColumnDatatype()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='NUMERIC' size='8' required='false'/>\n"+

-            "    <index name='avalue_index'>\n"+

-            "      <index-column name='avalue'/>\n"+

-            "    </index>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(1) });

-        insertRow("roundtrip", new Object[] { new Integer(2), new Integer(10) });

-

-        alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals(new Integer(1), beans.get(0), "avalue");

-        assertEquals(new Integer(10), beans.get(1), "avalue");

-    }

-

-    /**

-     * Tests the alteration of a column size.

-     */

-    public void testChangeSize()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='VARCHAR' size='20' required='true'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='VARCHAR' size='32' required='true'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), "test" });

-

-        alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals((Object)"test", beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the alteration of a column's datatype and size.

-     */

-    public void testChangeDatatypeAndSize()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='CHAR' size='4' required='true'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='VARCHAR' size='32' required='true'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), "test" });

-

-        alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals((Object)"test", beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the alteration of a column null constraint.

-     */

-    public void testChangeNull()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='INTEGER' required='true'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

-

-    	alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals(new Integer(2), beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the addition of a column's default value.

-     */

-    public void testAddDefault()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='DOUBLE'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='DOUBLE' default='2.0'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), new Double(2.0) });

-

-    	alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals(new Double(2.0), beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the change of a column default value.

-     */

-    public void testChangeDefault()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='INTEGER' default='1'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='INTEGER' default='20'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

-

-    	alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals(new Integer(2), beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the removal of a column default value.

-     */

-    public void testDropDefault()

-    {

-        final String model1Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='VARCHAR' size='20' default='test'/>\n"+

-            "  </table>\n"+

-            "</database>";

-        final String model2Xml = 

-            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-            "<database name='roundtriptest'>\n"+

-            "  <table name='roundtrip'>\n"+

-            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-            "    <column name='avalue' type='VARCHAR' size='20'/>\n"+

-            "  </table>\n"+

-            "</database>";

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1) });

-

-    	alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        assertEquals((Object)"test", beans.get(0), "avalue");

-    }

-

-    /**

-     * Tests the change of a column's auto-increment state.

-     */

-    public void testMakeAutoIncrement()

-    {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

-        {

-            return;

-        }

-        // Sybase does not like INTEGER auto-increment columns

-        if (SybasePlatform.DATABASENAME.equals(getPlatform().getName()))

-        {

-            String  model1Xml = 

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database name='roundtriptest'>\n"+

-                "  <table name='roundtrip'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='NUMERIC' size='12,0'/>\n"+

-                "  </table>\n"+

-                "</database>";

-            String model2Xml =

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database name='roundtriptest'>\n"+

-                "  <table name='roundtrip'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='NUMERIC' size='12,0' autoIncrement='true' required='true'/>\n"+

-                "  </table>\n"+

-                "</database>";

-

-            createDatabase(model1Xml);

-

-            insertRow("roundtrip", new Object[] { new Integer(1), new BigDecimal(2) });

-

-            alterDatabase(model2Xml);

-

-            assertEquals(getAdjustedModel(),

-                         readModelFromDatabase("roundtriptest"));

-

-            List beans = getRows("roundtrip");

-

-            assertEquals(new BigDecimal(2), beans.get(0), "avalue");

-        }

-        else

-        {

-            String  model1Xml = 

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database name='roundtriptest'>\n"+

-                "  <table name='roundtrip'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER'/>\n"+

-                "  </table>\n"+

-                "</database>";

-            String model2Xml=

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database name='roundtriptest'>\n"+

-                "  <table name='roundtrip'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER' autoIncrement='true' required='true'/>\n"+

-                "  </table>\n"+

-                "</database>";

-

-            createDatabase(model1Xml);

-

-            insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

-

-            alterDatabase(model2Xml);

-

-            assertEquals(getAdjustedModel(),

-                         readModelFromDatabase("roundtriptest"));

-

-            List beans = getRows("roundtrip");

-

-            assertEquals(new Integer(2), beans.get(0), "avalue");

-        }

-    }

-

-    /**

-     * Tests the removal the column auto-increment status.

-     */

-    public void testDropAutoIncrement()

-    {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

-        {

-            return;

-        }

-

-        boolean      isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());

-        final String model1Xml; 

-        final String model2Xml;

-

-        if (isSybase)

-        {

-            model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                        "<database name='roundtriptest'>\n"+

-                        "  <table name='roundtrip'>\n"+

-                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                        "    <column name='avalue' type='NUMERIC' size='12,0' required='true' autoIncrement='true'/>\n"+

-                        "  </table>\n"+

-                        "</database>";

-            model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                        "<database name='roundtriptest'>\n"+

-                        "  <table name='roundtrip'>\n"+

-                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                        "    <column name='avalue' type='NUMERIC' size='12,0' required='true' autoIncrement='false'/>\n"+

-                        "  </table>\n"+

-                        "</database>";

-        }

-        else

-        {

-            model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                        "<database name='roundtriptest'>\n"+

-                        "  <table name='roundtrip'>\n"+

-                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                        "    <column name='avalue' type='INTEGER' autoIncrement='true'/>\n"+

-                        "  </table>\n"+

-                        "</database>";

-            model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                        "<database name='roundtriptest'>\n"+

-                        "  <table name='roundtrip'>\n"+

-                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                        "    <column name='avalue' type='INTEGER' autoIncrement='false'/>\n"+

-                        "  </table>\n"+

-                        "</database>";

-        }

-

-        createDatabase(model1Xml);

-

-        insertRow("roundtrip", new Object[] { new Integer(1) });

-

-    	alterDatabase(model2Xml);

-

-        assertEquals(getAdjustedModel(),

-                     readModelFromDatabase("roundtriptest"));

-

-        List beans = getRows("roundtrip");

-

-        if (isSybase)

-        {

-            assertEquals(new BigDecimal(1), beans.get(0), "avalue");

-        }

-        else

-        {

-            assertEquals(new Integer(1), beans.get(0), "avalue");

-        }

-    }

-

-    /**

      * Tests the change of the order of the columns of a table.

      */

     public void testChangeColumnOrder()

@@ -830,7 +139,7 @@
      */

     public void testDropAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -1417,7 +726,8 @@
      */

     public void testDropFKAndCorrespondingIndex()

     {

-        if (FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isIndicesSupported() ||

+            FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

         {

             // Firebird does not allow an index and a foreign key in the same table to have the same name

             return;

@@ -1483,7 +793,8 @@
      */

     public void testDropFKButNotCorrespondingIndex()

     {

-        if (FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isIndicesSupported() ||

+            FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

         {

             // Firebird does not allow an index and a foreign key in the same table to have the same name

             return;

@@ -1556,7 +867,8 @@
         // MySql/InnoDB doesn't allow the creation of a foreign key and index with the same name

         // unless the index can be used as the FK's index

         // Firebird does not allow an index and a foreign key in the same table to have the same name at all

-        if (MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

+        if (!getPlatformInfo().isIndicesSupported() ||

+            MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

             MySql50Platform.DATABASENAME.equals(getPlatform().getName()) ||

             FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

         {

@@ -1625,7 +937,8 @@
         // MySql/InnoDB doesn't allow the creation of a foreign key and index with the same name

         // unless the index can be used as the FK's index

         // Firebird does not allow an index and a foreign key in the same table to have the same name at all

-        if (MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

+        if (!getPlatformInfo().isIndicesSupported() ||

+            MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) ||

             MySql50Platform.DATABASENAME.equals(getPlatform().getName()) ||

             FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

         {

diff --git a/src/test/org/apache/ddlutils/io/TestChangeColumn.java b/src/test/org/apache/ddlutils/io/TestChangeColumn.java
new file mode 100644
index 0000000..25b65f3
--- /dev/null
+++ b/src/test/org/apache/ddlutils/io/TestChangeColumn.java
@@ -0,0 +1,735 @@
+package org.apache.ddlutils.io;

+

+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+

+import java.math.BigDecimal;

+import java.util.List;

+

+import junit.framework.Test;

+

+import org.apache.commons.beanutils.DynaBean;

+import org.apache.ddlutils.platform.sybase.SybasePlatform;

+

+/**

+ * Tests changing columns, e.g. changing the data type or size.

+ *

+ * @version $Revision: $

+ */

+public class TestChangeColumn extends RoundtripTestBase

+{

+    /**

+     * Parameterized test case pattern.

+     * 

+     * @return The tests

+     */

+    public static Test suite() throws Exception

+    {

+        return getTests(TestChangeColumn.class);

+    }

+

+    /**

+     * Tests the alteration of a column datatype.

+     */

+    public void testChangeDatatype1()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='DOUBLE' required='false'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

+

+    	alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals(new Double(2.0), beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the alteration of a column datatype.

+     */

+    public void testChangeDatatype2()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='SMALLINT' required='true'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='VARCHAR' size='20' required='true'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), new Short((short)2) });

+

+    	alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List     beans = getRows("roundtrip");

+        DynaBean bean  = (DynaBean)beans.get(0); 

+

+        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it

+        if (bean.get("avalue") instanceof String)

+        {

+            bean.set("avalue", ((String)bean.get("avalue")).trim());

+        }

+        assertEquals((Object)"2", beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the alteration of the datatypes of PK and FK columns.

+     */

+    public void testChangePKAndFKDatatypes()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='fk' type='INTEGER' required='false'/>\n"+

+            "    <foreign-key foreignTable='roundtrip1'>\n"+

+            "      <reference local='fk' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip1'>\n"+

+            "    <column name='pk' type='VARCHAR' size='128' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='fk' type='VARCHAR' size='128' required='false'/>\n"+

+            "    <foreign-key foreignTable='roundtrip1'>\n"+

+            "      <reference local='fk' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip1", new Object[] { new Integer(1) });

+        insertRow("roundtrip2", new Object[] { new Integer(1), new Integer(1) });

+

+        alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List     beans = getRows("roundtrip2");

+        DynaBean bean  = (DynaBean)beans.get(0);

+

+        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it

+        if (bean.get("fk") instanceof String)

+        {

+            bean.set("fk", ((String)bean.get("fk")).trim());

+        }

+        assertEquals((Object)"1", bean, "fk");

+    }

+

+    /**

+     * Tests the alteration of the sizes of PK and FK columns.

+     */

+    public void testChangePKAndFKSizes()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip1'>\n"+

+            "    <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='fk' type='VARCHAR' size='32' required='false'/>\n"+

+            "    <foreign-key foreignTable='roundtrip1'>\n"+

+            "      <reference local='fk' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip1'>\n"+

+            "    <column name='pk' type='VARCHAR' size='128' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='fk' type='VARCHAR' size='128' required='false'/>\n"+

+            "    <foreign-key foreignTable='roundtrip1'>\n"+

+            "      <reference local='fk' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip1", new Object[] { "test" });

+        insertRow("roundtrip2", new Object[] { new Integer(1), "test" });

+

+        alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List     beans = getRows("roundtrip2");

+        DynaBean bean  = (DynaBean)beans.get(0);

+

+        assertEquals((Object)"test", bean, "fk");

+    }

+

+    /**

+     * Tests the alteration of the datatypes of columns of a PK and FK that

+     * will be dropped.

+     */

+    public void testChangeDroppedPKAndFKDatatypes()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='fk' type='INTEGER' required='false'/>\n"+

+            "    <foreign-key foreignTable='roundtrip1'>\n"+

+            "      <reference local='fk' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip1'>\n"+

+            "    <column name='pk' type='VARCHAR' primaryKey='false' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='fk' type='VARCHAR' required='false'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip1", new Object[] { new Integer(1) });

+        insertRow("roundtrip2", new Object[] { new Integer(1), new Integer(1) });

+

+        alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List     beans = getRows("roundtrip2");

+        DynaBean bean  = (DynaBean)beans.get(0);

+

+        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it

+        if (bean.get("fk") instanceof String)

+        {

+            bean.set("fk", ((String)bean.get("fk")).trim());

+        }

+        assertEquals((Object)"1", bean, "fk");

+    }

+    

+    /**

+     * Tests the alteration of the datatypes of a column that is indexed.

+     */

+    public void testChangeIndexColumnDatatype()

+    {

+        if (!getPlatformInfo().isIndicesSupported())

+        {

+            return;

+        }

+

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='NUMERIC' size='8' required='false'/>\n"+

+            "    <index name='avalue_index'>\n"+

+            "      <index-column name='avalue'/>\n"+

+            "    </index>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

+            "    <index name='avalue_index'>\n"+

+            "      <index-column name='avalue'/>\n"+

+            "    </index>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(1) });

+        insertRow("roundtrip", new Object[] { new Integer(2), new Integer(10) });

+

+        alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals(new Integer(1), beans.get(0), "avalue");

+        assertEquals(new Integer(10), beans.get(1), "avalue");

+    }

+

+    /**

+     * Tests the alteration of the datatypes of an indexed column where

+     * the index will be dropped.

+     */

+    public void testChangeDroppedIndexColumnDatatype()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='NUMERIC' size='8' required='false'/>\n"+

+            "    <index name='avalue_index'>\n"+

+            "      <index-column name='avalue'/>\n"+

+            "    </index>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(1) });

+        insertRow("roundtrip", new Object[] { new Integer(2), new Integer(10) });

+

+        alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals(new Integer(1), beans.get(0), "avalue");

+        assertEquals(new Integer(10), beans.get(1), "avalue");

+    }

+

+    /**

+     * Tests the alteration of a column size.

+     */

+    public void testChangeSize()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='VARCHAR' size='20' required='true'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='VARCHAR' size='32' required='true'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), "test" });

+

+        alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals((Object)"test", beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the alteration of a column's datatype and size.

+     */

+    public void testChangeDatatypeAndSize()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='CHAR' size='4' required='true'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='VARCHAR' size='32' required='true'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), "test" });

+

+        alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals((Object)"test", beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the alteration of a column null constraint.

+     */

+    public void testChangeNull()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

+

+    	alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals(new Integer(2), beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the addition of a column's default value.

+     */

+    public void testAddDefault()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='DOUBLE'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='DOUBLE' default='2.0'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), new Double(2.0) });

+

+    	alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals(new Double(2.0), beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the change of a column default value.

+     */

+    public void testChangeDefault()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' default='1'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' default='20'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

+

+    	alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals(new Integer(2), beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the removal of a column default value.

+     */

+    public void testDropDefault()

+    {

+        final String model1Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='VARCHAR' size='20' default='test'/>\n"+

+            "  </table>\n"+

+            "</database>";

+        final String model2Xml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='roundtriptest'>\n"+

+            "  <table name='roundtrip'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='VARCHAR' size='20'/>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1) });

+

+    	alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        assertEquals((Object)"test", beans.get(0), "avalue");

+    }

+

+    /**

+     * Tests the change of a column's auto-increment state.

+     */

+    public void testMakeAutoIncrement()

+    {

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

+        {

+            return;

+        }

+        // Sybase does not like INTEGER auto-increment columns

+        if (SybasePlatform.DATABASENAME.equals(getPlatform().getName()))

+        {

+            String  model1Xml = 

+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                "<database name='roundtriptest'>\n"+

+                "  <table name='roundtrip'>\n"+

+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                "    <column name='avalue' type='NUMERIC' size='12,0'/>\n"+

+                "  </table>\n"+

+                "</database>";

+            String model2Xml =

+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                "<database name='roundtriptest'>\n"+

+                "  <table name='roundtrip'>\n"+

+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                "    <column name='avalue' type='NUMERIC' size='12,0' autoIncrement='true' required='true'/>\n"+

+                "  </table>\n"+

+                "</database>";

+

+            createDatabase(model1Xml);

+

+            insertRow("roundtrip", new Object[] { new Integer(1), new BigDecimal(2) });

+

+            alterDatabase(model2Xml);

+

+            assertEquals(getAdjustedModel(),

+                         readModelFromDatabase("roundtriptest"));

+

+            List beans = getRows("roundtrip");

+

+            assertEquals(new BigDecimal(2), beans.get(0), "avalue");

+        }

+        else

+        {

+            String  model1Xml = 

+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                "<database name='roundtriptest'>\n"+

+                "  <table name='roundtrip'>\n"+

+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                "    <column name='avalue' type='INTEGER'/>\n"+

+                "  </table>\n"+

+                "</database>";

+            String model2Xml=

+                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                "<database name='roundtriptest'>\n"+

+                "  <table name='roundtrip'>\n"+

+                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                "    <column name='avalue' type='INTEGER' autoIncrement='true' required='true'/>\n"+

+                "  </table>\n"+

+                "</database>";

+

+            createDatabase(model1Xml);

+

+            insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) });

+

+            alterDatabase(model2Xml);

+

+            assertEquals(getAdjustedModel(),

+                         readModelFromDatabase("roundtriptest"));

+

+            List beans = getRows("roundtrip");

+

+            assertEquals(new Integer(2), beans.get(0), "avalue");

+        }

+    }

+

+    /**

+     * Tests the removal the column auto-increment status.

+     */

+    public void testDropAutoIncrement()

+    {

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

+        {

+            return;

+        }

+

+        boolean      isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());

+        final String model1Xml; 

+        final String model2Xml;

+

+        if (isSybase)

+        {

+            model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                        "<database name='roundtriptest'>\n"+

+                        "  <table name='roundtrip'>\n"+

+                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                        "    <column name='avalue' type='NUMERIC' size='12,0' required='true' autoIncrement='true'/>\n"+

+                        "  </table>\n"+

+                        "</database>";

+            model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                        "<database name='roundtriptest'>\n"+

+                        "  <table name='roundtrip'>\n"+

+                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                        "    <column name='avalue' type='NUMERIC' size='12,0' required='true' autoIncrement='false'/>\n"+

+                        "  </table>\n"+

+                        "</database>";

+        }

+        else

+        {

+            model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                        "<database name='roundtriptest'>\n"+

+                        "  <table name='roundtrip'>\n"+

+                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                        "    <column name='avalue' type='INTEGER' autoIncrement='true'/>\n"+

+                        "  </table>\n"+

+                        "</database>";

+            model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+                        "<database name='roundtriptest'>\n"+

+                        "  <table name='roundtrip'>\n"+

+                        "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+                        "    <column name='avalue' type='INTEGER' autoIncrement='false'/>\n"+

+                        "  </table>\n"+

+                        "</database>";

+        }

+

+        createDatabase(model1Xml);

+

+        insertRow("roundtrip", new Object[] { new Integer(1) });

+

+    	alterDatabase(model2Xml);

+

+        assertEquals(getAdjustedModel(),

+                     readModelFromDatabase("roundtriptest"));

+

+        List beans = getRows("roundtrip");

+

+        if (isSybase)

+        {

+            assertEquals(new BigDecimal(1), beans.get(0), "avalue");

+        }

+        else

+        {

+            assertEquals(new Integer(1), beans.get(0), "avalue");

+        }

+    }

+}

diff --git a/src/test/org/apache/ddlutils/io/TestConstraints.java b/src/test/org/apache/ddlutils/io/TestConstraints.java
index b294637..083e69d 100644
--- a/src/test/org/apache/ddlutils/io/TestConstraints.java
+++ b/src/test/org/apache/ddlutils/io/TestConstraints.java
@@ -215,7 +215,7 @@
     public void testAutoIncrementIntegerColumn()

     {

         // only test this if the platform supports it

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

diff --git a/src/test/org/apache/ddlutils/io/TestDropColumn.java b/src/test/org/apache/ddlutils/io/TestDropColumn.java
index 610fde0..2570b04 100644
--- a/src/test/org/apache/ddlutils/io/TestDropColumn.java
+++ b/src/test/org/apache/ddlutils/io/TestDropColumn.java
@@ -82,7 +82,7 @@
      */

     public void testDropAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

@@ -266,7 +266,7 @@
      */

     public void testDropMultipleColumnsInclAutoIncrement()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }

diff --git a/src/test/org/apache/ddlutils/io/TestInsertColumn.java b/src/test/org/apache/ddlutils/io/TestInsertColumn.java
index 6fd8255..7cedcf1 100644
--- a/src/test/org/apache/ddlutils/io/TestInsertColumn.java
+++ b/src/test/org/apache/ddlutils/io/TestInsertColumn.java
@@ -84,7 +84,7 @@
      */

     public void testInsertAutoIncrementColumn()

     {

-    	if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+    	if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

     	{

     		return;

     	}

@@ -227,7 +227,7 @@
      */

     public void testInsertRequiredAutoIncrementColumn()

     {

-        if (!getPlatformInfo().isNonPKIdentityColumnsSupported())

+        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported())

         {

             return;

         }