diff --git a/src/main/java/org/apache/ddlutils/Platform.java b/src/main/java/org/apache/ddlutils/Platform.java
index 79dc610..3653c5f 100644
--- a/src/main/java/org/apache/ddlutils/Platform.java
+++ b/src/main/java/org/apache/ddlutils/Platform.java
@@ -199,6 +199,42 @@
      */
     public void setForeignKeysSorted(boolean foreignKeysSorted);
 
+    /**
+     * Determines whether the default action for ON UPDATE is used if the specified one is not supported by the platform.
+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this
+     * is set to <code>true</code> meaning that the default action would be used.
+     * 
+     * @return <code>true</code> if the default action is used
+     */
+    public boolean isDefaultOnUpdateActionUsedIfUnsupported();
+
+    /**
+     * Specifies whether the default action for ON UPDATE shall be used if the specified one is not supported by the platform.
+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this
+     * is set to <code>true</code> meaning that the default action would be used.
+     * 
+     * @param useDefault If <code>true</code> then the default action will be used
+     */
+    public void setDefaultOnUpdateActionUsedIfUnsupported(boolean useDefault);
+
+    /**
+     * Determines whether the default action for ON DELETE is used if the specified one is not supported by the platform.
+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this
+     * is set to <code>true</code> meaning that the default action would be used.
+     * 
+     * @return <code>true</code> if the default action is used
+     */
+    public boolean isDefaultOnDeleteActionUsedIfUnsupported();
+
+    /**
+     * Specifies whether the default action for ON DELETE shall be used if the specified one is not supported by the platform.
+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this
+     * is set to <code>true</code> meaning that the default action would be used.
+     * 
+     * @param useDefault If <code>true</code> then the default action will be used
+     */
+    public void setDefaultOnDeleteActionUsedIfUnsupported(boolean useDefault);
+
     // functionality
     
     /**
diff --git a/src/main/java/org/apache/ddlutils/PlatformInfo.java b/src/main/java/org/apache/ddlutils/PlatformInfo.java
index f50d16a..64712da 100644
--- a/src/main/java/org/apache/ddlutils/PlatformInfo.java
+++ b/src/main/java/org/apache/ddlutils/PlatformInfo.java
@@ -21,11 +21,13 @@
 
 import java.lang.reflect.Field;
 import java.sql.Types;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ddlutils.model.CascadeActionEnum;
 
 /**
  * Conatains information about the database platform such as supported features and native type mappings.
@@ -166,6 +168,18 @@
     /** Contains those JDBC types whose corresponding native types are types that have precision and scale on this platform. */
     private HashSet _typesWithPrecisionAndScale = new HashSet();
 
+    /** The default ON UPDATE action. */
+    private CascadeActionEnum _defaultOnUpdateAction = CascadeActionEnum.NONE;
+
+    /** The default ON DELETE action. */
+    private CascadeActionEnum _defaultOnDeleteAction = CascadeActionEnum.NONE;
+
+    /** Contains the supported ON UPDATE actions. */
+    private HashSet _supportedOnUpdateActions = new HashSet();
+
+    /** Contains the supported ON DELETE actions. */
+    private HashSet _supportedOnDeleteActions = new HashSet();
+
     /**
      * Creates a new platform info object.
      */
@@ -187,6 +201,9 @@
 
         _typesWithPrecisionAndScale.add(new Integer(Types.DECIMAL));
         _typesWithPrecisionAndScale.add(new Integer(Types.NUMERIC));
+
+        _supportedOnUpdateActions.addAll(CascadeActionEnum.getEnumList());
+        _supportedOnDeleteActions.addAll(CascadeActionEnum.getEnumList());
     }
 
     // properties influencing the definition of columns
@@ -201,6 +218,7 @@
     {
         return _nullAsDefaultValueRequired;
     }
+
     /**
      * Specifies whether a NULL needs to be explicitly stated when the column
      * has no specified default value. Default is false.
@@ -1174,4 +1192,88 @@
             _typesWithPrecisionAndScale.remove(new Integer(sqlTypeCode));
         }
     }
+
+    /**
+     * Sets the actions that this platform supports for ON UPDATE.
+     * 
+     * @param actions The actions
+     */
+    public void setSupportedOnUpdateActions(CascadeActionEnum[] actions)
+    {
+        _supportedOnUpdateActions.clear();
+        _supportedOnUpdateActions.addAll(Arrays.asList(actions));
+    }
+    
+    /**
+     * Determines whether the given action is supported for ON UPDATE on this platform.
+     * 
+     * @param action The action
+     * @return <code>true</code> if the action is supported
+     */
+    public boolean isActionSupportedForOnUpdate(CascadeActionEnum action)
+    {
+        return _supportedOnUpdateActions.contains(action);
+    }
+
+    /**
+     * Sets the actions that this platform supports for ON DELETE.
+     * 
+     * @param actions The actions
+     */
+    public void setSupportedOnDeleteActions(CascadeActionEnum[] actions)
+    {
+        _supportedOnDeleteActions.clear();
+        _supportedOnDeleteActions.addAll(Arrays.asList(actions));
+    }
+
+    /**
+     * Determines whether the given action is supported for ON DELETE on this platform.
+     * 
+     * @param action The action
+     * @return <code>true</code> if the action is supported
+     */
+    public boolean isActionSupportedForOnDelete(CascadeActionEnum action)
+    {
+        return _supportedOnDeleteActions.contains(action);
+    }
+
+    /**
+     * Returns the default ON UPDATE action that is used if none is specified.
+     * 
+     * @return The default action
+     */
+    public CascadeActionEnum getDefaultOnUpdateAction()
+    {
+        return _defaultOnUpdateAction;
+    }
+
+    /**
+     * Sets the default ON UPDATE action that is used if none is specified.
+     * 
+     * @return The default action
+     */
+    public void setDefaultOnUpdateAction(CascadeActionEnum defaultOnUpdateAction)
+    {
+        _defaultOnUpdateAction = defaultOnUpdateAction;
+    }
+
+    /**
+     * Returns the default ON DELETE action that is used if none is specified.
+     * 
+     * @return The default action
+     */
+    public CascadeActionEnum getDefaultOnDeleteAction()
+    {
+        return _defaultOnDeleteAction;
+    }
+
+    /**
+     * Sets the default ON DELETE action that is used if none is specified.
+     * 
+     * @return The default action
+     */
+    public void setDefaultOnDeleteAction(CascadeActionEnum defaultOnDeleteAction)
+    {
+        _defaultOnDeleteAction = defaultOnDeleteAction;
+    }
 }
diff --git a/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java b/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
index 66661dd..06a5607 100644
--- a/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
+++ b/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
@@ -929,8 +929,8 @@
         {
             fk = new ForeignKey(fkName);
             fk.setForeignTableName((String)values.get("PKTABLE_NAME"));
-            fk.setOnUpdate(convertAction((Short)values.get("UPDATE_RULE")));
-            fk.setOnDelete(convertAction((Short)values.get("DELETE_RULE")));
+            fk.setOnUpdate(convertAction((Short)values.get("UPDATE_RULE"), getPlatformInfo().getDefaultOnUpdateAction()));
+            fk.setOnDelete(convertAction((Short)values.get("DELETE_RULE"), getPlatformInfo().getDefaultOnDeleteAction()));
             knownFks.put(fkName, fk);
         }
 
@@ -950,11 +950,12 @@
      * {@link DatabaseMetaData} class) to a {@link CascadeActionEnum}.
      * 
      * @param jdbcActionValue The jdbc action value
+     * @param defaultAction   The default action
      * @return The enum value
      */
-    protected CascadeActionEnum convertAction(Short jdbcActionValue)
+    protected CascadeActionEnum convertAction(Short jdbcActionValue, CascadeActionEnum defaultAction)
     {
-        CascadeActionEnum action = CascadeActionEnum.NONE;
+        CascadeActionEnum action = defaultAction;
 
         if (jdbcActionValue != null)
         {
diff --git a/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java b/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
index ca67ff3..a3c9453 100644
--- a/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
+++ b/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
@@ -116,6 +116,10 @@
     private boolean _identityOverrideOn;
     /** Whether read foreign keys shall be sorted alphabetically. */
     private boolean _foreignKeysSorted;
+    /** Whether to use the default ON UPDATE action if the specified one is unsupported. */
+    private boolean _useDefaultOnUpdateActionIfUnsupported = true;
+    /** Whether to use the default ON DELETE action if the specified one is unsupported. */
+    private boolean _useDefaultOnDeleteActionIfUnsupported = true;
 
     /**
      * {@inheritDoc}
@@ -254,6 +258,38 @@
     }
 
     /**
+     * {@inheritDoc}
+     */
+    public boolean isDefaultOnUpdateActionUsedIfUnsupported()
+    {
+        return _useDefaultOnUpdateActionIfUnsupported;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setDefaultOnUpdateActionUsedIfUnsupported(boolean useDefault)
+    {
+        _useDefaultOnUpdateActionIfUnsupported = useDefault;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isDefaultOnDeleteActionUsedIfUnsupported()
+    {
+        return _useDefaultOnDeleteActionIfUnsupported;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setDefaultOnDeleteActionUsedIfUnsupported(boolean useDefault)
+    {
+        _useDefaultOnDeleteActionIfUnsupported = useDefault;
+    }
+
+    /**
      * Returns the log for this platform.
      * 
      * @return The log
diff --git a/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java b/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
index 33f8d2a..1c8eb70 100644
--- a/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
+++ b/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
@@ -1957,10 +1957,25 @@
      */
     private void writeForeignKeyOnDeleteAction(Table table, ForeignKey foreignKey) throws IOException
     {
-        if (foreignKey.getOnDelete() != CascadeActionEnum.NONE)
+        CascadeActionEnum action = foreignKey.getOnDelete();
+
+        if (!getPlatformInfo().isActionSupportedForOnDelete(action))
+        {
+            if (getPlatform().isDefaultOnDeleteActionUsedIfUnsupported())
+            {
+                _log.info("The platform does not support the " + action + " action for onDelete; using " + getPlatformInfo().getDefaultOnDeleteAction() + " instead");
+                action = getPlatformInfo().getDefaultOnDeleteAction();
+            }
+            else
+            {
+                throw new ModelException("The platform does not support the action '" + action +
+                                         "' for onDelete in foreign key in table " + table.getName());
+            }
+        }
+        if (action != getPlatformInfo().getDefaultOnDeleteAction())
         {
             print(" ON DELETE ");
-            switch (foreignKey.getOnDelete().getValue())
+            switch (action.getValue())
             {
                 case CascadeActionEnum.VALUE_CASCADE:
                     print("CASCADE");
@@ -1978,7 +1993,7 @@
                     print("NO ACTION");
                     break;
                 default:
-                    throw new ModelException("Unsupported cascade value '" + foreignKey.getOnDelete().getValue() +
+                    throw new ModelException("Unsupported cascade value '" + action +
                                              "' for onDelete in foreign key in table " + table.getName());
             }
         }
@@ -1992,10 +2007,25 @@
      */
     private void writeForeignKeyOnUpdateAction(Table table, ForeignKey foreignKey) throws IOException
     {
-        if (foreignKey.getOnUpdate() != CascadeActionEnum.NONE)
+        CascadeActionEnum action = foreignKey.getOnUpdate();
+
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(action))
+        {
+            if (getPlatform().isDefaultOnUpdateActionUsedIfUnsupported())
+            {
+                _log.info("The platform does not support the " + action + " action for onUpdate; using " + getPlatformInfo().getDefaultOnUpdateAction() + " instead");
+                action = getPlatformInfo().getDefaultOnUpdateAction();
+            }
+            else
+            {
+                throw new ModelException("The platform does not support the action '" + action +
+                                         "' for onUpdate in foreign key in table " + table.getName());
+            }
+        }
+        if (action != getPlatformInfo().getDefaultOnUpdateAction())
         {
             print(" ON UPDATE ");
-            switch (foreignKey.getOnUpdate().getValue())
+            switch (action.getValue())
             {
                 case CascadeActionEnum.VALUE_CASCADE:
                     print("CASCADE");
@@ -2013,7 +2043,7 @@
                     print("NO ACTION");
                     break;
                 default:
-                    throw new ModelException("Unsupported cascade value '" + foreignKey.getOnUpdate().getValue() +
+                    throw new ModelException("Unsupported cascade value '" + action +
                                              "' for onUpdate in foreign key in table " + table.getName());
             }
         }
diff --git a/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java b/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
index 91ee0e4..1f7e09a 100644
--- a/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
+++ b/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
@@ -27,9 +27,11 @@
 import java.util.Map;
 
 import org.apache.ddlutils.DatabaseOperationException;
+import org.apache.ddlutils.PlatformInfo;
 import org.apache.ddlutils.alteration.AddColumnChange;
 import org.apache.ddlutils.alteration.TableChange;
 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;
+import org.apache.ddlutils.model.CascadeActionEnum;
 import org.apache.ddlutils.model.Table;
 import org.apache.ddlutils.platform.DefaultTableDefinitionChangesPredicate;
 import org.apache.ddlutils.platform.cloudscape.CloudscapePlatform;
@@ -56,8 +58,15 @@
     public DerbyPlatform()
     {
         super();
-        getPlatformInfo().addNativeTypeMapping(Types.DOUBLE, "DOUBLE");
-        getPlatformInfo().addNativeTypeMapping(Types.FLOAT,  "DOUBLE", Types.DOUBLE);
+
+        PlatformInfo info = getPlatformInfo();
+
+        info.addNativeTypeMapping(Types.DOUBLE, "DOUBLE");
+        info.addNativeTypeMapping(Types.FLOAT,  "DOUBLE", Types.DOUBLE);
+        info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT });
+        info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT,
+                                                                   CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL });
+
         setSqlBuilder(new DerbyBuilder(this));
         setModelReader(new DerbyModelReader(this));
     }
diff --git a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
index c4aa27b..9dbd80c 100644
--- a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
+++ b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import java.sql.DatabaseMetaData;
 import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -32,6 +33,7 @@
 
 import org.apache.ddlutils.DdlUtilsException;
 import org.apache.ddlutils.Platform;
+import org.apache.ddlutils.model.CascadeActionEnum;
 import org.apache.ddlutils.model.Column;
 import org.apache.ddlutils.model.Index;
 import org.apache.ddlutils.model.Table;
@@ -228,4 +230,19 @@
 
 		return column;
 	}
+
+    /**
+     * {@inheritDoc}
+     */
+    protected CascadeActionEnum convertAction(Short jdbcActionValue, CascadeActionEnum defaultAction)
+    {
+        CascadeActionEnum action = defaultAction;
+
+        // for whatever reason, the sql server jdbc driver returns restrict even though the DB does not support RESTRICT
+        if ((jdbcActionValue != null) && (jdbcActionValue.shortValue() == DatabaseMetaData.importedKeyCascade))
+        {
+            action = CascadeActionEnum.CASCADE;
+        }
+        return action;
+    }
 }
diff --git a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
index 354487c..ada4af1 100644
--- a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
+++ b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
@@ -37,6 +37,7 @@
 import org.apache.ddlutils.alteration.RemovePrimaryKeyChange;
 import org.apache.ddlutils.alteration.TableChange;
 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;
+import org.apache.ddlutils.model.CascadeActionEnum;
 import org.apache.ddlutils.model.Column;
 import org.apache.ddlutils.model.Database;
 import org.apache.ddlutils.model.Table;
@@ -75,6 +76,8 @@
         info.setPrimaryKeyColumnAutomaticallyRequired(true);
         info.setIdentityColumnAutomaticallyRequired(true);
         info.setMultipleIdentityColumnsSupported(false);
+        info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.NONE });
+        info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.NONE });
 
         info.addNativeTypeMapping(Types.ARRAY,         "IMAGE",         Types.LONGVARBINARY);
         // BIGINT will be mapped back to BIGINT by the model reader 
diff --git a/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java b/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
index f01c166..dd135ae 100644
--- a/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
+++ b/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
@@ -32,6 +32,7 @@
 import org.apache.ddlutils.alteration.RemovePrimaryKeyChange;
 import org.apache.ddlutils.alteration.TableChange;
 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;
+import org.apache.ddlutils.model.CascadeActionEnum;
 import org.apache.ddlutils.model.Column;
 import org.apache.ddlutils.model.Database;
 import org.apache.ddlutils.model.Table;
@@ -75,6 +76,10 @@
         info.setCommentPrefix("#");
         // Double quotes are only allowed for delimiting identifiers if the server SQL mode includes ANSI_QUOTES 
         info.setDelimiterToken("`");
+        info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT,
+                                                                   CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL });
+        info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT,
+                                                                   CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL });
 
         info.addNativeTypeMapping(Types.ARRAY,         "LONGBLOB",   Types.LONGVARBINARY);
         info.addNativeTypeMapping(Types.BIT,           "TINYINT(1)");
diff --git a/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java b/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
index f008a87..545ce1d 100644
--- a/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
+++ b/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
@@ -1308,28 +1308,27 @@
                          getPlatform().getSqlBuilder().shortenName(expected.getForeignTableName().toUpperCase(), getSqlBuilder().getMaxTableNameLength()),
                          getPlatform().getSqlBuilder().shortenName(actual.getForeignTableName().toUpperCase(), getSqlBuilder().getMaxTableNameLength()));
         }
-        if ((expected.getOnUpdate() == CascadeActionEnum.NONE) || (expected.getOnUpdate() == CascadeActionEnum.RESTRICT))
+
+        CascadeActionEnum realExpectedOnUpdateAction = expected.getOnUpdate();
+
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(realExpectedOnUpdateAction))
         {
-            assertTrue("Not the same onUpdate setting in foreign key "+actual.getName()+".",
-                       (actual.getOnUpdate() == CascadeActionEnum.NONE) || (actual.getOnUpdate() == CascadeActionEnum.RESTRICT));
+            realExpectedOnUpdateAction = getPlatformInfo().getDefaultOnUpdateAction();
         }
-        else
+        assertEquals("Not the same onUpdate setting in foreign key "+actual.getName()+".",
+                     realExpectedOnUpdateAction,
+                     actual.getOnUpdate());
+
+        CascadeActionEnum realExpectedOnDeleteAction = expected.getOnDelete();
+
+        if (!getPlatformInfo().isActionSupportedForOnDelete(realExpectedOnDeleteAction))
         {
-            assertEquals("Not the same onUpdate setting in foreign key "+actual.getName()+".",
-                         expected.getOnUpdate(),
-                         actual.getOnUpdate());
+            realExpectedOnDeleteAction = getPlatformInfo().getDefaultOnDeleteAction();
         }
-        if ((expected.getOnDelete() == CascadeActionEnum.NONE) || (expected.getOnDelete() == CascadeActionEnum.RESTRICT))
-        {
-            assertTrue("Not the same onDelete setting in foreign key "+actual.getName()+".",
-                       (actual.getOnDelete() == CascadeActionEnum.NONE) || (actual.getOnDelete() == CascadeActionEnum.RESTRICT));
-        }
-        else
-        {
-            assertEquals("Not the same onDelete setting in foreign key "+actual.getName()+".",
-                         expected.getOnDelete(),
-                         actual.getOnDelete());
-        }
+        assertEquals("Not the same onDelete setting in foreign key "+actual.getName()+".",
+                     realExpectedOnDeleteAction,
+                     actual.getOnDelete());
+
         assertEquals("Not the same number of references in foreign key "+actual.getName()+".",
                      expected.getReferenceCount(),
                      actual.getReferenceCount());
diff --git a/src/test/java/org/apache/ddlutils/io/TestConstraints.java b/src/test/java/org/apache/ddlutils/io/TestConstraints.java
index 2af6c91..e66ea20 100644
--- a/src/test/java/org/apache/ddlutils/io/TestConstraints.java
+++ b/src/test/java/org/apache/ddlutils/io/TestConstraints.java
@@ -27,11 +27,8 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.ddlutils.DdlUtilsException;
 import org.apache.ddlutils.TestAgainstLiveDatabaseBase;
+import org.apache.ddlutils.model.CascadeActionEnum;
 import org.apache.ddlutils.model.Database;
-import org.apache.ddlutils.platform.derby.DerbyPlatform;
-import org.apache.ddlutils.platform.firebird.FirebirdPlatform;
-import org.apache.ddlutils.platform.mysql.MySql50Platform;
-import org.apache.ddlutils.platform.mysql.MySqlPlatform;
 import org.apache.ddlutils.platform.sybase.SybasePlatform;
 
 /**
@@ -485,45 +482,47 @@
      */
     public void testForeignKeyWithOnDeleteRestrict()
     {
-        if (!FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))
+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.RESTRICT))
         {
-            final String modelXml = 
-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
-                "  <table name='roundtrip_1'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "  </table>\n"+
-                "  <table name='roundtrip_2'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "    <column name='avalue' type='INTEGER' required='true'/>\n"+
-                "    <foreign-key foreignTable='roundtrip_1' onDelete='restrict'>\n"+
-                "      <reference local='avalue' foreign='pk'/>\n"+
-                "    </foreign-key>\n"+
-                "  </table>\n"+
-                "</database>";
-    
-            performConstraintsTest(modelXml, true);
-    
-            insertRow("roundtrip_1", new Object[] { new Integer(1) });
-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
-    
-            List beansTable1 = getRows("roundtrip_1");
-            List beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(1, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(1), beansTable1.get(0), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");
-    
-            try
-            {
-                deleteRow("roundtrip_1", new Object[] { new Integer(1) });
-                fail();
-            }
-            catch (DdlUtilsException ex)
-            {}
+            return;
         }
+
+        final String modelXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
+            "  <table name='roundtrip_1'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "  </table>\n"+
+            "  <table name='roundtrip_2'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+
+            "    <foreign-key foreignTable='roundtrip_1' onDelete='restrict'>\n"+
+            "      <reference local='avalue' foreign='pk'/>\n"+
+            "    </foreign-key>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+
+        insertRow("roundtrip_1", new Object[] { new Integer(1) });
+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
+
+        List beansTable1 = getRows("roundtrip_1");
+        List beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(1, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(1), beansTable1.get(0), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");
+
+        try
+        {
+            deleteRow("roundtrip_1", new Object[] { new Integer(1) });
+            fail();
+        }
+        catch (DdlUtilsException ex)
+        {}
     }
 
     /**
@@ -531,6 +530,11 @@
      */
     public void testForeignKeyWithOnDeleteCascade()
     {
+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.CASCADE))
+        {
+            return;
+        }
+
         final String modelXml = 
             "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
             "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
@@ -574,6 +578,11 @@
      */
     public void testForeignKeyWithOnDeleteSetNull()
     {
+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.SET_NULL))
+        {
+            return;
+        }
+
         final String modelXml = 
             "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
             "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
@@ -615,56 +624,56 @@
     }
 
     /**
-     * Tests two tables with a foreign key with a det-default onDelete action. 
+     * Tests two tables with a foreign key with a set-default onDelete action. 
      */
     public void testForeignKeyWithOnDeleteSetDefault()
     {
-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()) &&
-            !MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) &&
-            !MySql50Platform.DATABASENAME.equals(getPlatform().getName()))
+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.SET_DEFAULT))
         {
-            final String modelXml = 
-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
-                "  <table name='roundtrip_1'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "  </table>\n"+
-                "  <table name='roundtrip_2'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "    <column name='avalue' type='INTEGER' required='false' default='2'/>\n"+
-                "    <foreign-key foreignTable='roundtrip_1' onDelete='setdefault'>\n"+
-                "      <reference local='avalue' foreign='pk'/>\n"+
-                "    </foreign-key>\n"+
-                "  </table>\n"+
-                "</database>";
-    
-            performConstraintsTest(modelXml, true);
-    
-            insertRow("roundtrip_1", new Object[] { new Integer(1) });
-            insertRow("roundtrip_1", new Object[] { new Integer(2) });
-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
-    
-            List beansTable1 = getRows("roundtrip_1");
-            List beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(2, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(1), beansTable1.get(0), "pk");
-            assertEquals(new Integer(2), beansTable1.get(1), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");
-    
-            deleteRow("roundtrip_1", new Object[] { new Integer(1) });
-    
-            beansTable1 = getRows("roundtrip_1");
-            beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(1, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(2), beansTable1.get(0), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(2), beansTable2.get(0), "avalue");
+            return;
         }
+
+        final String modelXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
+            "  <table name='roundtrip_1'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "  </table>\n"+
+            "  <table name='roundtrip_2'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='false' default='2'/>\n"+
+            "    <foreign-key foreignTable='roundtrip_1' onDelete='setdefault'>\n"+
+            "      <reference local='avalue' foreign='pk'/>\n"+
+            "    </foreign-key>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+
+        insertRow("roundtrip_1", new Object[] { new Integer(1) });
+        insertRow("roundtrip_1", new Object[] { new Integer(2) });
+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
+
+        List beansTable1 = getRows("roundtrip_1");
+        List beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(2, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(1), beansTable1.get(0), "pk");
+        assertEquals(new Integer(2), beansTable1.get(1), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");
+
+        deleteRow("roundtrip_1", new Object[] { new Integer(1) });
+
+        beansTable1 = getRows("roundtrip_1");
+        beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(1, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(2), beansTable1.get(0), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(2), beansTable2.get(0), "avalue");
     }
 
     /**
@@ -672,45 +681,47 @@
      */
     public void testForeignKeyWithOnUpdateRestrict()
     {
-        if (!FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.RESTRICT))
         {
-            final String modelXml = 
-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
-                "  <table name='roundtrip_1'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "  </table>\n"+
-                "  <table name='roundtrip_2'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "    <column name='avalue' type='INTEGER' required='true'/>\n"+
-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='restrict'>\n"+
-                "      <reference local='avalue' foreign='pk'/>\n"+
-                "    </foreign-key>\n"+
-                "  </table>\n"+
-                "</database>";
-    
-            performConstraintsTest(modelXml, true);
-    
-            insertRow("roundtrip_1", new Object[] { new Integer(1) });
-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
-    
-            List beansTable1 = getRows("roundtrip_1");
-            List beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(1, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(1), beansTable1.get(0), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");
-    
-            try
-            {
-                updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(5) });
-                fail();
-            }
-            catch (DdlUtilsException ex)
-            {}
+            return;
         }
+
+        final String modelXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
+            "  <table name='roundtrip_1'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "  </table>\n"+
+            "  <table name='roundtrip_2'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+
+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='restrict'>\n"+
+            "      <reference local='avalue' foreign='pk'/>\n"+
+            "    </foreign-key>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+
+        insertRow("roundtrip_1", new Object[] { new Integer(1) });
+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
+
+        List beansTable1 = getRows("roundtrip_1");
+        List beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(1, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(1), beansTable1.get(0), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");
+
+        try
+        {
+            updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(5) });
+            fail();
+        }
+        catch (DdlUtilsException ex)
+        {}
     }
 
     /**
@@ -718,48 +729,50 @@
      */
     public void testForeignKeyWithOnUpdateCascade()
     {
-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()))
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.CASCADE))
         {
-            final String modelXml = 
-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
-                "  <table name='roundtrip_1'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "  </table>\n"+
-                "  <table name='roundtrip_2'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "    <column name='avalue' type='INTEGER' required='true'/>\n"+
-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='cascade'>\n"+
-                "      <reference local='avalue' foreign='pk'/>\n"+
-                "    </foreign-key>\n"+
-                "  </table>\n"+
-                "</database>";
-    
-            performConstraintsTest(modelXml, true);
-    
-            insertRow("roundtrip_1", new Object[] { new Integer(1) });
-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
-    
-            List beansTable1 = getRows("roundtrip_1");
-            List beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(1, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(1), beansTable1.get(0), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");
-    
-            updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });
-    
-            beansTable1 = getRows("roundtrip_1");
-            beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(1, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(2), beansTable1.get(0), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(2), beansTable2.get(0), "avalue");
+            return;
         }
+
+        final String modelXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
+            "  <table name='roundtrip_1'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "  </table>\n"+
+            "  <table name='roundtrip_2'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+
+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='cascade'>\n"+
+            "      <reference local='avalue' foreign='pk'/>\n"+
+            "    </foreign-key>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+
+        insertRow("roundtrip_1", new Object[] { new Integer(1) });
+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
+
+        List beansTable1 = getRows("roundtrip_1");
+        List beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(1, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(1), beansTable1.get(0), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");
+
+        updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });
+
+        beansTable1 = getRows("roundtrip_1");
+        beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(1, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(2), beansTable1.get(0), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(2), beansTable2.get(0), "avalue");
     }
 
     /**
@@ -767,48 +780,50 @@
      */
     public void testForeignKeyWithOnUpdateSetNull()
     {
-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()))
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.SET_NULL))
         {
-            final String modelXml = 
-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
-                "  <table name='roundtrip_1'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "  </table>\n"+
-                "  <table name='roundtrip_2'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "    <column name='avalue' type='INTEGER' required='false'/>\n"+
-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='setnull'>\n"+
-                "      <reference local='avalue' foreign='pk'/>\n"+
-                "    </foreign-key>\n"+
-                "  </table>\n"+
-                "</database>";
-    
-            performConstraintsTest(modelXml, true);
-    
-            insertRow("roundtrip_1", new Object[] { new Integer(1) });
-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
-    
-            List beansTable1 = getRows("roundtrip_1");
-            List beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(1, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(1), beansTable1.get(0), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");
-    
-            updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });
-    
-            beansTable1 = getRows("roundtrip_1");
-            beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(1, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(2), beansTable1.get(0), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals((Object)null, beansTable2.get(0), "avalue");
+            return;
         }
+
+        final String modelXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
+            "  <table name='roundtrip_1'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "  </table>\n"+
+            "  <table name='roundtrip_2'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='false'/>\n"+
+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='setnull'>\n"+
+            "      <reference local='avalue' foreign='pk'/>\n"+
+            "    </foreign-key>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+
+        insertRow("roundtrip_1", new Object[] { new Integer(1) });
+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });
+
+        List beansTable1 = getRows("roundtrip_1");
+        List beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(1, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(1), beansTable1.get(0), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");
+
+        updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });
+
+        beansTable1 = getRows("roundtrip_1");
+        beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(1, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(2), beansTable1.get(0), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals((Object)null, beansTable2.get(0), "avalue");
     }
 
     /**
@@ -816,52 +831,52 @@
      */
     public void testForeignKeyWithOnUpdateSetDefault()
     {
-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()) &&
-            !MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) &&
-            !MySql50Platform.DATABASENAME.equals(getPlatform().getName()))
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.SET_DEFAULT))
         {
-            final String modelXml =
-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
-                "  <table name='roundtrip_1'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "  </table>\n"+
-                "  <table name='roundtrip_2'>\n"+
-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
-                "    <column name='avalue' type='INTEGER' required='false' default='1'/>\n"+
-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='setdefault'>\n"+
-                "      <reference local='avalue' foreign='pk'/>\n"+
-                "    </foreign-key>\n"+
-                "  </table>\n"+
-                "</database>";
-
-            performConstraintsTest(modelXml, true);
-    
-            insertRow("roundtrip_1", new Object[] { new Integer(1) });
-            insertRow("roundtrip_1", new Object[] { new Integer(2) });
-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(2) });
-    
-            List beansTable1 = getRows("roundtrip_1");
-            List beansTable2 = getRows("roundtrip_2");
-    
-            assertEquals(2, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(1), beansTable1.get(0), "pk");
-            assertEquals(new Integer(2), beansTable1.get(1), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(2), beansTable2.get(0), "avalue");
-    
-            updateRow("roundtrip_1", (DynaBean)beansTable1.get(1), new Object[] { new Integer(0) });
-    
-            beansTable1 = getRows("roundtrip_1", "pk");
-            beansTable2 = getRows("roundtrip_2", "pk");
-    
-            assertEquals(2, beansTable1.size());
-            assertEquals(1, beansTable2.size());
-            assertEquals(new Integer(0), beansTable1.get(0), "pk");
-            assertEquals(new Integer(1), beansTable1.get(1), "pk");
-            assertEquals(new Integer(5), beansTable2.get(0), "pk");
-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");
+            return;
         }
+
+        final String modelXml =
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+
+            "  <table name='roundtrip_1'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "  </table>\n"+
+            "  <table name='roundtrip_2'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='false' default='1'/>\n"+
+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='setdefault'>\n"+
+            "      <reference local='avalue' foreign='pk'/>\n"+
+            "    </foreign-key>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+
+        insertRow("roundtrip_1", new Object[] { new Integer(1) });
+        insertRow("roundtrip_1", new Object[] { new Integer(2) });
+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(2) });
+
+        List beansTable1 = getRows("roundtrip_1");
+        List beansTable2 = getRows("roundtrip_2");
+
+        assertEquals(2, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(1), beansTable1.get(0), "pk");
+        assertEquals(new Integer(2), beansTable1.get(1), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(2), beansTable2.get(0), "avalue");
+
+        updateRow("roundtrip_1", (DynaBean)beansTable1.get(1), new Object[] { new Integer(0) });
+
+        beansTable1 = getRows("roundtrip_1", "pk");
+        beansTable2 = getRows("roundtrip_2", "pk");
+
+        assertEquals(2, beansTable1.size());
+        assertEquals(1, beansTable2.size());
+        assertEquals(new Integer(0), beansTable1.get(0), "pk");
+        assertEquals(new Integer(1), beansTable1.get(1), "pk");
+        assertEquals(new Integer(5), beansTable2.get(0), "pk");
+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");
     }
 }
