You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2008/11/06 07:34:25 UTC

svn commit: r711776 - in /db/ddlutils/trunk/src: main/java/org/apache/ddlutils/ main/java/org/apache/ddlutils/platform/ main/java/org/apache/ddlutils/platform/derby/ main/java/org/apache/ddlutils/platform/mssql/ main/java/org/apache/ddlutils/platform/m...

Author: tomdz
Date: Wed Nov  5 22:34:24 2008
New Revision: 711776

URL: http://svn.apache.org/viewvc?rev=711776&view=rev
Log:
Added a more generic way to handle cascade action capabilities of the individual platforms which also fixes DDLUTILS-222: ON UPDATE, ON DELETE errors for MS Sql Server - does not implement default "RESTRICT"

Modified:
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/Platform.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
    db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
    db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestConstraints.java

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/Platform.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/Platform.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/Platform.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/Platform.java Wed Nov  5 22:34:24 2008
@@ -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
     
     /**

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java Wed Nov  5 22:34:24 2008
@@ -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;
+    }
 }

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java Wed Nov  5 22:34:24 2008
@@ -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)
         {

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java Wed Nov  5 22:34:24 2008
@@ -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

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java Wed Nov  5 22:34:24 2008
@@ -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());
             }
         }

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java Wed Nov  5 22:34:24 2008
@@ -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));
     }

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java Wed Nov  5 22:34:24 2008
@@ -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;
+    }
 }

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java Wed Nov  5 22:34:24 2008
@@ -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 

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java Wed Nov  5 22:34:24 2008
@@ -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)");

Modified: db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java (original)
+++ db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java Wed Nov  5 22:34:24 2008
@@ -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))
-        {
-            assertTrue("Not the same onUpdate setting in foreign key "+actual.getName()+".",
-                       (actual.getOnUpdate() == CascadeActionEnum.NONE) || (actual.getOnUpdate() == CascadeActionEnum.RESTRICT));
-        }
-        else
-        {
-            assertEquals("Not the same onUpdate setting in foreign key "+actual.getName()+".",
-                         expected.getOnUpdate(),
-                         actual.getOnUpdate());
-        }
-        if ((expected.getOnDelete() == CascadeActionEnum.NONE) || (expected.getOnDelete() == CascadeActionEnum.RESTRICT))
+
+        CascadeActionEnum realExpectedOnUpdateAction = expected.getOnUpdate();
+
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(realExpectedOnUpdateAction))
         {
-            assertTrue("Not the same onDelete setting in foreign key "+actual.getName()+".",
-                       (actual.getOnDelete() == CascadeActionEnum.NONE) || (actual.getOnDelete() == 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 onDelete setting in foreign key "+actual.getName()+".",
-                         expected.getOnDelete(),
-                         actual.getOnDelete());
+            realExpectedOnDeleteAction = getPlatformInfo().getDefaultOnDeleteAction();
         }
+        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());

Modified: db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestConstraints.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestConstraints.java?rev=711776&r1=711775&r2=711776&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestConstraints.java (original)
+++ db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestConstraints.java Wed Nov  5 22:34:24 2008
@@ -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()))
-        {
-            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");
+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.SET_DEFAULT))
+        {
+            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()))
-        {
-            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");
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.SET_DEFAULT))
+        {
+            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");
     }
 }