org.apache.ddlutils.io.TestChangeColumn.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.ddlutils.io.TestChangeColumn.java

Source

package org.apache.ddlutils.io;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

import junit.framework.Test;

import org.apache.commons.beanutils.DynaBean;
import org.apache.ddlutils.TestAgainstLiveDatabaseBase;
import org.apache.ddlutils.platform.sybase.SybasePlatform;

/**
 * Tests changing columns, e.g. changing the data type or size.
 *
 * TODO:
 * - more type conversion tests (parameterized ?)
 * - more size change tests (parameterized ?)
 *  
 * @version $Revision: $
 */
public class TestChangeColumn extends TestAgainstLiveDatabaseBase {
    /**
     * Parameterized test case pattern.
     * 
     * @return The tests
     */
    public static Test suite() throws Exception {
        return getTests(TestChangeColumn.class);
    }

    //  - change default value (add default, remove default, change default)
    //  - combined changes, e.g
    //    - type & size
    //    - type & auto increment status
    //    - type & required
    //    - size & required
    //    - required & default value
    //  - for each of the above: normal column, pk column, fk column (local), index column, unique index column

    /**
     * Tests the alteration of a column datatype change from integer to double.
     */
    public void testColumnTypeIntegerToDouble() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DOUBLE'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Double(2.0), beans.get(0), "avalue");
    }

    /**
     * Tests the alteration of a column datatype change from smallint to varchar.
     */
    public void testColumnTypeSmallintToVarchar() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='SMALLINT'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='20'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it
        if (bean.get("avalue") instanceof String) {
            bean.set("avalue", ((String) bean.get("avalue")).trim());
        }
        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "2", beans.get(0), "avalue");
    }

    /**
     * Tests the alteration of a pk column datatype change from integer to double.
     */
    public void testPKColumnTypeIntegerToDouble() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Double(2.0), beans.get(0), "pk");
    }

    /**
     * Tests the alteration of a pk column datatype change from integer to varchar.
     */
    public void testPKColumnTypeIntegerToVarchar() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='VARCHAR' size='20' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it
        if (bean.get("pk") instanceof String) {
            bean.set("pk", ((String) bean.get("pk")).trim());
        }
        assertEquals((Object) "1", beans.get(0), "pk");
    }

    /**
     * Tests the change of the datatypes of PK and FK columns from integer to varchar.
     */
    public void testPKAndFKColumnTypesIntegerToVarchar() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='INTEGER' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' size='128' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' size='128' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");
        DynaBean bean1 = (DynaBean) beans1.get(0);
        DynaBean bean2 = (DynaBean) beans2.get(0);

        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it
        if (bean1.get("pk") instanceof String) {
            bean1.set("pk", ((String) bean1.get("pk")).trim());
        }
        if (bean2.get("fk") instanceof String) {
            bean2.set("fk", ((String) bean2.get("fk")).trim());
        }
        assertEquals((Object) "1", bean1, "pk");
        assertEquals(new Integer(1), bean2, "pk");
        assertEquals((Object) "1", bean2, "fk");
    }

    /**
     * Tests the alteration of the datatypes of columns of a PK and FK that
     * will be dropped.
     */
    public void testPKAndFKColumnTypesAndDropFK() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='INTEGER' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' primaryKey='false' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' required='false'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");
        DynaBean bean1 = (DynaBean) beans1.get(0);
        DynaBean bean2 = (DynaBean) beans2.get(0);

        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it
        if (bean1.get("pk") instanceof String) {
            bean1.set("pk", ((String) bean1.get("pk")).trim());
        }
        if (bean2.get("fk") instanceof String) {
            bean2.set("fk", ((String) bean2.get("fk")).trim());
        }
        assertEquals((Object) "1", bean1, "pk");
        assertEquals(new Integer(1), bean2, "pk");
        assertEquals((Object) "1", bean2, "fk");
    }

    /**
     * Tests the alteration of an indexed column datatype change from integer to double.
     */
    public void testIndexColumnTypeIntegerToDouble() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='20'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DOUBLE'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='20'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Double(2.0), beans.get(0), "avalue1");
        assertEquals((Object) "text", beans.get(0), "avalue2");
    }

    /**
     * Tests the alteration of an indexed column datatype change from smallint to varchar.
     */
    public void testIndexColumnTypeSmallintToVarchar() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='SMALLINT'/>\n" + "    <column name='avalue2' type='DOUBLE'/>\n"
                + "    <index name='testindex'>\n" + "      <index-column name='avalue1'/>\n"
                + "      <index-column name='avalue2'/>\n" + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='20'/>\n"
                + "    <column name='avalue2' type='DOUBLE'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it
        if (bean.get("avalue1") instanceof String) {
            bean.set("avalue1", ((String) bean.get("avalue1")).trim());
        }
        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "2", beans.get(0), "avalue1");
        assertEquals(new Double(3.0), beans.get(0), "avalue2");
    }

    /**
     * Tests the alteration of the datatype of an indexed column where
     * the index will be dropped.
     */
    public void testIndexColumnTypeAndDropIndex() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='NUMERIC' size='8' required='false'/>\n"
                + "    <index name='avalue_index'>\n" + "      <index-column name='avalue'/>\n" + "    </index>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER' required='false'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(1), beans.get(0), "avalue");
        assertEquals(new Integer(2), beans.get(1), "pk");
        assertEquals(new Integer(10), beans.get(1), "avalue");
    }

    /**
     * Tests the alteration of an indexed column datatype change from integer to double.
     */
    public void testUniqueIndexColumnTypeIntegerToDouble() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='20'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DOUBLE'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='20'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Double(2.0), beans.get(0), "avalue1");
        assertEquals((Object) "text", beans.get(0), "avalue2");
    }

    /**
     * Tests the alteration of an indexed column datatype change from smallint to varchar.
     */
    public void testUniqueIndexColumnTypeSmallintToVarchar() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='SMALLINT'/>\n" + "    <column name='avalue2' type='DOUBLE'/>\n"
                + "    <unique name='testindex'>\n" + "      <unique-column name='avalue1'/>\n"
                + "      <unique-column name='avalue2'/>\n" + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='20'/>\n"
                + "    <column name='avalue2' type='DOUBLE'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        // Some databases (e.g. DB2) pad the string for some reason, so we manually trim it
        if (bean.get("avalue1") instanceof String) {
            bean.set("avalue1", ((String) bean.get("avalue1")).trim());
        }
        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "2", beans.get(0), "avalue1");
        assertEquals(new Double(3.0), beans.get(0), "avalue2");
    }

    /**
     * Tests increasng the size of a column.
     */
    public void testColumnIncreaseSize() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='20' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='32' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "test", beans.get(0), "avalue");
    }

    /**
     * Tests decreasing the size of a column.
     */
    public void testColumnDecreaseSize() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='32' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='16' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        assertTrue("12345678901234567890123456789012".equals(bean.get("avalue"))
                || "1234567890123456".equals(bean.get("avalue")));
    }

    /**
     * Tests increasing the size of a primary key column.
     */
    public void testPKColumnIncreaseSize() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='CHAR' size='20' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='CHAR' size='32' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals("test", ((String) bean.get("pk")).trim());
    }

    /**
     * Tests decreasing the size of a column.
     */
    public void testPKColumnDecreaseSize() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='CHAR' size='32' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='CHAR' size='16' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip", new Object[] { "12345678901234567890123456789012" });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertTrue("12345678901234567890123456789012".equals(bean.get("pk"))
                || "1234567890123456".equals(bean.get("pk")));
    }

    /**
     * Tests increasing the sizes of PK and FK columns.
     */
    public void testPKAndFKColumnIncreaseSize() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' size='32' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' size='128' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' size='128' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals((Object) "test", beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals((Object) "test", beans2.get(0), "fk");
    }

    /**
     * Tests decreasing the sizes of PK and FK columns.
     */
    public void testPKAndFKColumnDecreaseSize() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='CHAR' size='32' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='CHAR' size='32' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='CHAR' size='16' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='CHAR' size='16' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");
        DynaBean bean1 = (DynaBean) beans1.get(0);
        DynaBean bean2 = (DynaBean) beans2.get(0);

        assertEquals("test", ((String) bean1.get("pk")).trim());
        assertEquals(new Integer(1), bean2, "pk");
        assertEquals("test", ((String) bean2.get("fk")).trim());
    }

    /**
     * Tests increasing the size of an indexed column.
     */
    public void testIndexColumnIncreaseSize() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='20'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='40'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals((Object) "text", beans.get(0), "avalue2");
    }

    /**
     * Tests decreasing the size of an indexed column.
     */
    public void testIndexColumnDecreaseSize() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='CHAR' size='32'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='CHAR' size='20'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        assertEquals(new Integer(2), bean, "avalue1");
        assertEquals((Object) "text", ((String) bean.get("avalue2")).trim());
    }

    /**
     * Tests increasing the size of an indexed column.
     */
    public void testUniqueIndexColumnIncreaseSize() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='CHAR' size='16'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='CHAR' size='20'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        assertEquals(new Integer(2), bean, "avalue1");
        assertEquals((Object) "text", ((String) bean.get("avalue2")).trim());
    }

    /**
     * Tests decreasing the size of an indexed column.
     */
    public void testUniqueIndexColumnDecreaseSize() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='40'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='20'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals((Object) "text", beans.get(0), "avalue2");
    }

    /**
     * Tests increasing the precision of a column.
     */
    public void testColumnIncreasePrecision() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='NUMERIC' size='10,5' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='NUMERIC' size='16,5' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new BigDecimal("12345.12345"), beans.get(0), "avalue");
    }

    /**
     * Tests decreasng the precision of a column.
     */
    public void testColumnDecreasePrecision() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DECIMAL' size='12,5' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DECIMAL' size='10,5' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new BigDecimal("12345.12345"), beans.get(0), "avalue");
    }

    /**
     * Tests increasing the precision of a primary key column.
     */
    public void testPKColumnIncreasePrecision() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='DECIMAL' size='10,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='DECIMAL' size='16,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip", new Object[] { new BigDecimal("12345.12345") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new BigDecimal("12345.12345"), beans.get(0), "pk");
    }

    /**
     * Tests decreasing the precision of a primary key column.
     */
    public void testPKColumnDecreasePrecision() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='DECIMAL' size='12,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='DECIMAL' size='10,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip", new Object[] { new BigDecimal("12345.12345") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new BigDecimal("12345.12345"), beans.get(0), "pk");
    }

    /**
     * Tests increasing the precision of PK and FK columns.
     */
    public void testPKAndFKColumnIncreasePrecision() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='8,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='8,2' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='11,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='11,2' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip1", new Object[] { new BigDecimal("123456.12") });
        insertRow("roundtrip2", new Object[] { new Integer(1), new BigDecimal("123456.12") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new BigDecimal("123456.12"), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new BigDecimal("123456.12"), beans2.get(0), "fk");
    }

    /**
     * Tests decreasing the precision of PK and FK columns.
     */
    public void testPKAndFKColumnDecreasePrecision() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='10,2' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='8,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='8,2' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip1", new Object[] { new BigDecimal("123456.12") });
        insertRow("roundtrip2", new Object[] { new Integer(1), new BigDecimal("123456.12") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new BigDecimal("123456.12"), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new BigDecimal("123456.12"), beans2.get(0), "fk");
    }

    /**
     * Tests increasing the precision of an indexed column.
     */
    public void testIndexColumnIncreasePrecision() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DECIMAL' size='8,2'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DECIMAL' size='12,2'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new BigDecimal("123456.12"), beans.get(0), "avalue1");
        assertEquals(new Integer(2), beans.get(0), "avalue2");
    }

    /**
     * Tests decreasing the precision of an indexed column.
     */
    public void testIndexColumnDecreasePrecision() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DECIMAL' size='10,2'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DECIMAL' size='8,2'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new BigDecimal("123456.12"), beans.get(0), "avalue1");
        assertEquals(new Integer(2), beans.get(0), "avalue2");
    }

    /**
     * Tests increasing the precision of an indexed column.
     */
    public void testUniqueIndexColumnIncreasePrecision() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='8,2'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='9,2'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(new BigDecimal("123456.12"), beans.get(0), "avalue2");
    }

    /**
     * Tests decreasing the precision of an indexed column.
     */
    public void testUniqueIndexColumnDecreasePrecision() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='9,2'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='8,2'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(new BigDecimal("123456.12"), beans.get(0), "avalue2");
    }

    /**
     * Tests increasing the scale of a column.
     */
    public void testColumnIncreaseScale() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DECIMAL' size='10,4' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DECIMAL' size='10,5' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        // Some DBs return the BigDecimal with the five digits scale, some don't
        assertTrue(bean.get("avalue").equals(new BigDecimal("12345.1234"))
                || bean.get("avalue").equals(new BigDecimal("12345.12340")));
    }

    /**
     * Tests decreasing the scale of a column.
     */
    public void testColumnDecreaseScale() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DECIMAL' size='10,5' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DECIMAL' size='10,3' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new BigDecimal("12345.123"), beans.get(0), "avalue");
    }

    /**
     * Tests increasing the scale of a primary key column.
     */
    public void testPKColumnIncreaseScale() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,3' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip", new Object[] { new BigDecimal("12345.123") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        // Some DBs return the BigDecimal with the three digits scale, some don't
        assertTrue(bean.get("pk").equals(new BigDecimal("12345.123"))
                || bean.get("pk").equals(new BigDecimal("12345.12300")));
    }

    /**
     * Tests decreasing the scale of a primary key column.
     */
    public void testPKColumnDecreaseScale() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,3' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip", new Object[] { new BigDecimal("12345.123") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new BigDecimal("12345.123"), beans.get(0), "pk");
    }

    /**
     * Tests increasing the scale of PK and FK columns.
     */
    public void testPKAndFKColumnIncreaseScale() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DECIMAL' size='11,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DECIMAL' size='11,2' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DECIMAL' size='11,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DECIMAL' size='11,5' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip1", new Object[] { new BigDecimal("123456.12") });
        insertRow("roundtrip2", new Object[] { new Integer(1), new BigDecimal("123456.12") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");
        DynaBean bean1 = (DynaBean) beans1.get(0);
        DynaBean bean2 = (DynaBean) beans2.get(0);

        // Some DBs return the BigDecimal with the three digits scale, some don't
        assertTrue(bean1.get("pk").equals(new BigDecimal("123456.12"))
                || bean1.get("pk").equals(new BigDecimal("123456.12000")));
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertTrue(bean2.get("fk").equals(new BigDecimal("123456.12"))
                || bean2.get("fk").equals(new BigDecimal("123456.12000")));
    }

    /**
     * Tests decreasing the scale of PK and FK columns.
     */
    public void testPKAndFKColumnDecreaseScale() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='11,5' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='11,5' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='11,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='11,2' required='false'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip1", new Object[] { new BigDecimal("123456.12") });
        insertRow("roundtrip2", new Object[] { new Integer(1), new BigDecimal("123456.12") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new BigDecimal("123456.12"), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new BigDecimal("123456.12"), beans2.get(0), "fk");
    }

    /**
     * Tests increasing the scale of an indexed column.
     */
    public void testIndexColumnIncreaseScale() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='NUMERIC' size='11,2'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='NUMERIC' size='11,5'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        assertEquals(new Integer(2), bean, "avalue2");
        assertTrue(new BigDecimal("123456.12").equals(bean.get("avalue1"))
                || new BigDecimal("123456.12000").equals(bean.get("avalue1")));
    }

    /**
     * Tests decreasing the scale of an indexed column.
     */
    public void testIndexColumnDecreaseScale() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DECIMAL' size='11,5'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='DECIMAL' size='11,2'/>\n"
                + "    <column name='avalue2' type='INTEGER'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new BigDecimal("123456.12"), beans.get(0), "avalue1");
        assertEquals(new Integer(2), beans.get(0), "avalue2");
    }

    /**
     * Tests increasing the scale of an indexed column.
     */
    public void testUniqueIndexColumnIncreaseScale() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='DECIMAL' size='11,2'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='DECIMAL' size='11,5'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        assertEquals(new Integer(2), bean, "avalue1");
        assertTrue(new BigDecimal("123456.12").equals(bean.get("avalue2"))
                || new BigDecimal("123456.12000").equals(bean.get("avalue2")));
    }

    /**
     * Tests decreasing the scale of an indexed column.
     */
    public void testUniqueIndexColumnDecreaseScale() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='11,5'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='11,2'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(new BigDecimal("123456.12"), beans.get(0), "avalue2");
    }

    /**
     * Tests making a column required.
     */
    public void testColumnMakeRequired() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='20'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='20' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "test", beans.get(0), "avalue");
    }

    /**
     * Tests making a column no longer required.
     */
    public void testColumnUnmakeRequired() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER' required='true'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

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

    /**
     * Tests making a primary key column required.
     */
    public void testPKColumnMakeRequired() {
        if (getPlatformInfo().isPrimaryKeyColumnAutomaticallyRequired()
                || getPlatformInfo().isPrimaryKeyColumnsHaveToBeRequired()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,2' primaryKey='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip", new Object[] { new BigDecimal("12345678.12") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new BigDecimal("12345678.12"), beans.get(0), "pk");
    }

    /**
     * Tests making a primary key column no longer required.
     */
    public void testPKColumnUnmakeRequired() {
        if (getPlatformInfo().isPrimaryKeyColumnAutomaticallyRequired()
                || getPlatformInfo().isPrimaryKeyColumnsHaveToBeRequired()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,2' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='10,2' primaryKey='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip", new Object[] { new BigDecimal("12345678.12") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new BigDecimal("12345678.12"), beans.get(0), "pk");
    }

    /**
     * Tests making a FK column required.
     */
    public void testFKColumnMakeRequired() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE'/>\n" + "    <foreign-key foreignTable='roundtrip1'>\n"
                + "      <reference local='fk' foreign='pk'/>\n" + "    </foreign-key>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE' required='true'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new Double(2.0), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new Double(2.0), beans2.get(0), "fk");
    }

    /**
     * Tests making a FK column no longer required.
     */
    public void testFKColumnUnmakeRequired() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE' required='true'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE'/>\n" + "    <foreign-key foreignTable='roundtrip1'>\n"
                + "      <reference local='fk' foreign='pk'/>\n" + "    </foreign-key>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new Double(2.0), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new Double(2.0), beans2.get(0), "fk");
    }

    /**
     * Tests making PK and FK columns required.
     */
    public void testPKAndFKColumnMakeRequired() {
        if (getPlatformInfo().isPrimaryKeyColumnAutomaticallyRequired()
                || getPlatformInfo().isPrimaryKeyColumnsHaveToBeRequired()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='CHAR' size='10' primaryKey='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='CHAR' size='10'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='CHAR' size='10' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='CHAR' size='10' required='true'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals((Object) "1234567890", beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals((Object) "1234567890", beans2.get(0), "fk");
    }

    /**
     * Tests making PK and FK columns no longer required.
     */
    public void testPKAndFKColumnUnmakeRequired() {
        if (getPlatformInfo().isPrimaryKeyColumnAutomaticallyRequired()
                || getPlatformInfo().isPrimaryKeyColumnsHaveToBeRequired()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE' required='true'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE'/>\n" + "    <foreign-key foreignTable='roundtrip1'>\n"
                + "      <reference local='fk' foreign='pk'/>\n" + "    </foreign-key>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new Double(2.0), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new Double(2.0), beans2.get(0), "fk");
    }

    /**
     * Tests making an indexed column required.
     */
    public void testIndexColumnMakeRequired() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP' required='true'/>\n"
                + "    <index name='testindex'>\n" + "      <index-column name='avalue1'/>\n"
                + "      <index-column name='avalue2'/>\n" + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Timestamp time = new Timestamp(new Date().getTime());

        // some databases (such as MySql) don't store micro-/nanoseconds
        time.setNanos(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(time, beans.get(0), "avalue2");
    }

    /**
     * Tests making an indexed column no longer required.
     */
    public void testIndexColumnUnmakeRequired() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='SMALLINT' required='true'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='SMALLINT'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Timestamp time = new Timestamp(new Date().getTime());

        // some databases (such as MySql) don't store micro-/nanoseconds
        time.setNanos(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(time, beans.get(0), "avalue2");
    }

    /**
     * Tests making an indexed column required.
     */
    public void testUniqueIndexColumnMakeRequired() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='CHAR' size='16'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='CHAR' size='20' required='true'/>\n"
                + "    <index name='testindex'>\n" + "      <index-column name='avalue1'/>\n"
                + "      <index-column name='avalue2'/>\n" + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        assertEquals(new Integer(2), bean, "avalue1");
        assertEquals((Object) "text", ((String) bean.get("avalue2")).trim());
    }

    /**
     * Tests making an indexed column no longer required.
     */
    public void testUniqueIndexColumnUnmakeRequired() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER' required='true'/>\n"
                + "    <column name='avalue2' type='CHAR' size='16'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='CHAR' size='20'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        assertEquals(new Integer(1), bean, "pk");
        assertEquals(new Integer(2), bean, "avalue1");
        assertEquals((Object) "text", ((String) bean.get("avalue2")).trim());
    }

    /**
     * Tests making a column auto increment.
     */
    public void testColumnMakeAutoIncrement() {
        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='avalue' type='INTEGER'/>\n")
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='avalue' type='INTEGER' autoIncrement='true'/>\n")
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Object value = isSybase ? (Object) new BigDecimal("0") : new Integer(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

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

    /**
     * Tests making a column no longer auto increment.
     */
    public void testColumnUnmakeAutoIncrement() {
        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='avalue' type='INTEGER' autoIncrement='true'/>\n")
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='avalue' type='INTEGER'/>\n")
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        Object value = isSybase ? (Object) new BigDecimal("1") : new Integer(1);

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

    /**
     * Tests making a primary column auto increment.
     */
    public void testPKColumnMakeAutoIncrement() {
        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true' autoIncrement='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n")
                + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Object value = isSybase ? (Object) new BigDecimal("5") : new Integer(5);

        insertRow("roundtrip", new Object[] { value });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(value, beans.get(0), "pk");
    }

    /**
     * Tests making a primary column no longer auto increment.
     */
    public void testPKColumnUnmakeAutoIncrement() {
        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true' autoIncrement='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n")
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        Object value = isSybase ? (Object) new BigDecimal("1") : new Integer(1);

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

    /**
     * Tests making a FK column auto increment.
     */
    public void testFKColumnMakeAutoIncrement() {
        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='fk' type='INTEGER'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='fk' type='INTEGER' autoIncrement='true'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Object value = isSybase ? (Object) new BigDecimal("0") : new Integer(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(value, beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(value, beans2.get(0), "fk");
    }

    /**
     * Tests making a FK column no longer auto increment.
     */
    public void testFKColumnnUnmakeAutoIncrement() {
        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='fk' type='INTEGER' autoIncrement='true'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='fk' type='INTEGER'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Object value = isSybase ? (Object) new BigDecimal("1") : new Integer(1);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(value, beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(value, beans2.get(0), "fk");
    }

    /**
     * Tests making PK and FK columns auto increment.
     */
    public void testPKAndFKColumnMakeAutoIncrement() {
        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='fk' type='INTEGER'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true' autoIncrement='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n")
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='fk' type='INTEGER' autoIncrement='true'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Object value = isSybase ? (Object) new BigDecimal("0") : new Integer(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(value, beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(value, beans2.get(0), "fk");
    }

    /**
     * Tests making PK and FK columns no longer auto increment.
     */
    public void testPKAndFKColumnUnmakeAutoIncrement() {
        if (!getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true' autoIncrement='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n")
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='fk' type='INTEGER' autoIncrement='true'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + (isSybase
                        ? "    <column name='pk' type='NUMERIC' size='12,0' primaryKey='true' required='true'/>\n"
                        : "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n")
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='fk' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='fk' type='INTEGER'/>\n")
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip1", new Object[] { null, new Integer(2) });
        insertRow("roundtrip2", new Object[] { new Integer(1) });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        Object value = isSybase ? (Object) new BigDecimal("1") : new Integer(1);
        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(value, beans1.get(0), "pk");
        assertEquals(new Integer(2), beans1.get(0), "avalue");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(value, beans2.get(0), "fk");
    }

    /**
     * Tests making an indexed column auto increment.
     */
    public void testIndexColumnMakeAutoIncrement() {
        if (!getPlatformInfo().isIndicesSupported()
                || !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue1' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='avalue1' type='INTEGER'/>\n")
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue1' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='avalue1' type='INTEGER' autoIncrement='true'/>\n")
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Object value = isSybase ? (Object) new BigDecimal("0") : new Integer(0);
        Timestamp time = new Timestamp(new Date().getTime());

        // to avoid problems with the database's time resolution
        time.setNanos(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(time, beans.get(0), "avalue2");
        assertEquals(value, beans.get(0), "avalue1");
    }

    /**
     * Tests making an indexed column no longer auto increment.
     */
    public void testIndexColumnUnmakeAutoIncrement() {
        if (!getPlatformInfo().isIndicesSupported()
                || !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='16'/>\n"
                + (isSybase ? "    <column name='avalue2' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='avalue2' type='INTEGER' autoIncrement='true'/>\n")
                + "    <index name='testindex'>\n" + "      <index-column name='avalue1'/>\n"
                + "      <index-column name='avalue2'/>\n" + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='16'/>\n"
                + (isSybase ? "    <column name='avalue2' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='avalue2' type='INTEGER'/>\n")
                + "    <index name='testindex'>\n" + "      <index-column name='avalue1'/>\n"
                + "      <index-column name='avalue2'/>\n" + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        Object value = isSybase ? (Object) new BigDecimal("1") : new Integer(1);
        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "test", beans.get(0), "avalue1");
        assertEquals(value, beans.get(0), "avalue2");
    }

    /**
     * Tests making an indexed column auto increment.
     */
    public void testUniqueIndexColumnMakeAutoIncrement() {
        if (!getPlatformInfo().isIndicesSupported()
                || !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='16'/>\n"
                + (isSybase ? "    <column name='avalue2' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='avalue2' type='INTEGER'/>\n")
                + "    <unique name='testindex'>\n" + "      <unique-column name='avalue1'/>\n"
                + "      <unique-column name='avalue2'/>\n" + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='16'/>\n"
                + (isSybase ? "    <column name='avalue2' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='avalue2' type='INTEGER' autoIncrement='true'/>\n")
                + "    <unique name='testindex'>\n" + "      <unique-column name='avalue1'/>\n"
                + "      <unique-column name='avalue2'/>\n" + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Object value = isSybase ? (Object) new BigDecimal("0") : new Integer(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "test", beans.get(0), "avalue1");
        assertEquals(value, beans.get(0), "avalue2");
    }

    /**
     * Tests making an indexed column no longer auto increment.
     */
    public void testUniqeIndexColumnUnmakeAutoIncrement() {
        if (!getPlatformInfo().isIndicesSupported()
                || !getPlatformInfo().isNonPrimaryKeyIdentityColumnsSupported()) {
            return;
        }

        boolean isSybase = SybasePlatform.DATABASENAME.equals(getPlatform().getName());
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue1' type='NUMERIC' size='12,0' autoIncrement='true'/>\n"
                        : "    <column name='avalue1' type='INTEGER' autoIncrement='true'/>\n")
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + (isSybase ? "    <column name='avalue1' type='NUMERIC' size='12,0'/>\n"
                        : "    <column name='avalue1' type='INTEGER'/>\n")
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Timestamp time = new Timestamp(new Date().getTime());

        // to avoid problems with the database's time resolution
        time.setNanos(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        Object value = isSybase ? (Object) new BigDecimal("1") : new Integer(1);

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(value, beans.get(0), "avalue1");
        assertEquals(time, beans.get(0), "avalue2");
    }

    /**
     * Tests adding a default value to a column.
     */
    public void testColumnAddDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DOUBLE'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='DOUBLE' default='2.0'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Double(1.0), beans.get(0), "avalue");
    }

    /**
     * Tests changing the default value of a column.
     */
    public void testColumnChangeDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER' default='1'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER' default='20'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

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

    /**
     * Tests removing the default value of a column.
     */
    public void testColumnRemoveDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='20' default='test'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='20'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "test", beans.get(0), "avalue");
    }

    /**
     * Tests adding a default value to a primary key column.
     */
    public void testPKColumnAddDefault() throws ParseException {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='TIMESTAMP' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='TIMESTAMP' primaryKey='true' required='true' default='2000-01-01 00:00:00'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Timestamp time = new Timestamp(new Date().getTime());

        // some databases (such as MySql) don't store micro-/nanoseconds
        time.setNanos(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

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

        List beans = getRows("roundtrip", "avalue");
        Timestamp defaultTime = Timestamp.valueOf("2000-01-01 00:00:00");

        assertEquals(time, beans.get(0), "pk");
        assertEquals(new Integer(1), beans.get(0), "avalue");
        assertEquals(defaultTime, beans.get(1), "pk");
        assertEquals(new Integer(2), beans.get(1), "avalue");
    }

    /**
     * Tests changing the default value of a primary key column.
     */
    public void testPKColumnChangeDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='VARCHAR' size='20' primaryKey='true' required='true' default='old'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='VARCHAR' size='20' primaryKey='true' required='true' default='new'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

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

        List beans = getRows("roundtrip", "avalue");

        assertEquals((Object) "old", beans.get(0), "pk");
        assertEquals(new Integer(1), beans.get(0), "avalue");
        assertEquals((Object) "new", beans.get(1), "pk");
        assertEquals(new Integer(2), beans.get(1), "avalue");
    }

    /**
     * Tests removing the default value of a primary key column.
     */
    public void testPKColumnRemoveDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='12,2' primaryKey='true' required='true' default='2'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='NUMERIC' size='12,2' primaryKey='true' required='true' default='2.20'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");
        DynaBean bean = (DynaBean) beans.get(0);

        // Some DBs return the BigDecimal with the two digits scale, some don't
        assertTrue(bean.get("pk").equals(new BigDecimal("2")) || bean.get("pk").equals(new BigDecimal("2.00")));
        assertEquals(new Integer(1), bean, "avalue");
    }

    /**
     * Tests adding a default value to a FK column.
     */
    public void testFKColumnAddDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' size='12' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' size='12'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' size='12' primaryKey='true' required='true'/>\n"
                + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' size='12' default='text'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        insertRow("roundtrip1", new Object[] { "text" });
        insertRow("roundtrip2", new Object[] { new Integer(2) });

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals((Object) "test", beans1.get(0), "pk");
        assertEquals((Object) "text", beans1.get(1), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals((Object) "test", beans2.get(0), "fk");
        assertEquals(new Integer(2), beans2.get(1), "pk");
        assertEquals((Object) "text", beans2.get(1), "fk");
    }

    /**
     * Tests changing the default value of a FK column.
     */
    public void testFKColumnChangeDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE' default='2.0'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='DOUBLE' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='DOUBLE' default='3.0'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        insertRow("roundtrip1", new Object[] { new Double(3.0) });
        insertRow("roundtrip2", new Object[] { new Integer(2) });

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new Double(2.0), beans1.get(0), "pk");
        assertEquals(new Double(3.0), beans1.get(1), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new Double(2.0), beans2.get(0), "fk");
        assertEquals(new Integer(2), beans2.get(1), "pk");
        assertEquals(new Double(3.0), beans2.get(1), "fk");
    }

    /**
     * Tests removing the default value of a FK column.
     */
    public void testFKColumnRemoveDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='INTEGER' default='2'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n" + "  </table>\n"
                + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='INTEGER'/>\n" + "    <foreign-key foreignTable='roundtrip1'>\n"
                + "      <reference local='fk' foreign='pk'/>\n" + "    </foreign-key>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new Integer(2), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new Integer(2), beans2.get(0), "fk");
    }

    /**
     * Tests adding default values to PK and FK columns.
     */
    public void testPKAndFKColumnAddDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='12' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='12'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='NUMERIC' size='12' primaryKey='true' required='true' default='1'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='NUMERIC' size='12' default='1'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        insertRow("roundtrip1", new Object[] { new BigDecimal("0"), new Integer(1) });
        insertRow("roundtrip2", new Object[] { new Integer(1), new BigDecimal("0") });

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        insertRow("roundtrip1", new Object[] { null, new Integer(2) });
        insertRow("roundtrip2", new Object[] { new Integer(2) });

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new BigDecimal("0"), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans1.get(0), "avalue");
        assertEquals(new BigDecimal("1"), beans1.get(1), "pk");
        assertEquals(new Integer(2), beans1.get(1), "avalue");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new BigDecimal("0"), beans2.get(0), "fk");
        assertEquals(new Integer(2), beans2.get(1), "pk");
        assertEquals(new BigDecimal("1"), beans2.get(1), "fk");
    }

    /**
     * Tests changing the default values of PK and FK columns.
     */
    public void testPKAndFKColumnChangeDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true' default='2'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='INTEGER' default='2'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true' default='3'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='INTEGER' default='3'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        insertRow("roundtrip1", new Object[] { null, new Integer(2) });
        insertRow("roundtrip2", new Object[] { new Integer(2) });

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals(new Integer(2), beans1.get(0), "pk");
        assertEquals(new Integer(1), beans1.get(0), "avalue");
        assertEquals(new Integer(3), beans1.get(1), "pk");
        assertEquals(new Integer(2), beans1.get(1), "avalue");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals(new Integer(2), beans2.get(0), "fk");
        assertEquals(new Integer(2), beans2.get(1), "pk");
        assertEquals(new Integer(3), beans2.get(1), "fk");
    }

    /**
     * Tests removing the default values of PK and FK columns.
     */
    public void testPKAndFKColumnRemoveDefault() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' size='16' primaryKey='true' required='true' default='text'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' size='16' default='text'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip1'>\n"
                + "    <column name='pk' type='VARCHAR' size='16' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='INTEGER'/>\n" + "  </table>\n" + "  <table name='roundtrip2'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='fk' type='VARCHAR' size='16'/>\n"
                + "    <foreign-key foreignTable='roundtrip1'>\n" + "      <reference local='fk' foreign='pk'/>\n"
                + "    </foreign-key>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans1 = getRows("roundtrip1");
        List beans2 = getRows("roundtrip2");

        assertEquals((Object) "text", beans1.get(0), "pk");
        assertEquals(new Integer(1), beans1.get(0), "avalue");
        assertEquals(new Integer(1), beans2.get(0), "pk");
        assertEquals((Object) "text", beans2.get(0), "fk");
    }

    /**
     * Tests adding a default value to an indexed column.
     */
    public void testIndexColumnAddDefault() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER' default='3'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Timestamp time = new Timestamp(new Date().getTime());

        // some databases (such as MySql) don't store micro-/nanoseconds
        time.setNanos(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        insertRow("roundtrip", new Object[] { new Integer(2), null, time });

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(time, beans.get(0), "avalue2");
        assertEquals(new Integer(2), beans.get(1), "pk");
        assertEquals(new Integer(3), beans.get(1), "avalue1");
        assertEquals(time, beans.get(1), "avalue2");
    }

    /**
     * Tests changing the default value of an indexed column.
     */
    public void testIndexColumnChangeDefault() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='12' default='3'/>\n"
                + "    <index name='testindex'>\n" + "      <index-column name='avalue1'/>\n"
                + "      <index-column name='avalue2'/>\n" + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='12' default='4'/>\n"
                + "    <index name='testindex'>\n" + "      <index-column name='avalue1'/>\n"
                + "      <index-column name='avalue2'/>\n" + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

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

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(new BigDecimal("3"), beans.get(0), "avalue2");
        assertEquals(new Integer(2), beans.get(1), "pk");
        assertEquals(new Integer(3), beans.get(1), "avalue1");
        assertEquals(new BigDecimal("4"), beans.get(1), "avalue2");
    }

    /**
     * Tests removing the default value of an indexed column.
     */
    public void testIndexColumnRemoveDefault() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='16' default='text'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='12'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='VARCHAR' size='16'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='12'/>\n" + "    <index name='testindex'>\n"
                + "      <index-column name='avalue1'/>\n" + "      <index-column name='avalue2'/>\n"
                + "    </index>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

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

        List beans = getRows("roundtrip", "pk");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals((Object) "text", beans.get(0), "avalue1");
        assertEquals(new BigDecimal("3"), beans.get(0), "avalue2");
        assertEquals(new Integer(2), beans.get(1), "pk");
        assertEquals((Object) "test", beans.get(1), "avalue1");
        assertEquals(new BigDecimal("4"), beans.get(1), "avalue2");
    }

    /**
     * Tests adding a default value to an indexed column.
     */
    public void testUniqueIndexColumnAddDefault() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='TIMESTAMP' default='2000-01-01 00:00:00'/>\n"
                + "    <unique name='testindex'>\n" + "      <unique-column name='avalue1'/>\n"
                + "      <unique-column name='avalue2'/>\n" + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

        Timestamp time = new Timestamp(new Date().getTime());

        // some databases (such as MySql) don't store micro-/nanoseconds
        time.setNanos(0);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

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

        List beans = getRows("roundtrip");
        Timestamp defaultTime = Timestamp.valueOf("2000-01-01 00:00:00");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(2), beans.get(0), "avalue1");
        assertEquals(time, beans.get(0), "avalue2");
        assertEquals(new Integer(2), beans.get(1), "pk");
        assertEquals(new Integer(3), beans.get(1), "avalue1");
        assertEquals(defaultTime, beans.get(1), "avalue2");
    }

    /**
     * Tests changing the default value of an indexed column.
     */
    public void testUniqueIndexColumnChangeDefault() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER' default='3'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='12'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER' default='4'/>\n"
                + "    <column name='avalue2' type='NUMERIC' size='12'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

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

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(3), beans.get(0), "avalue1");
        assertEquals(new BigDecimal("2"), beans.get(0), "avalue2");
        assertEquals(new Integer(2), beans.get(1), "pk");
        assertEquals(new Integer(4), beans.get(1), "avalue1");
        assertEquals(new BigDecimal("3"), beans.get(1), "avalue2");
    }

    /**
     * Tests removing the default value of an indexed column.
     */
    public void testUniqueIndexColumnRemoveDefault() {
        if (!getPlatformInfo().isIndicesSupported()) {
            return;
        }

        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='16' default='text'/>\n"
                + "    <unique name='testindex'>\n" + "      <unique-column name='avalue1'/>\n"
                + "      <unique-column name='avalue2'/>\n" + "    </unique>\n" + "  </table>\n" + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue1' type='INTEGER'/>\n"
                + "    <column name='avalue2' type='VARCHAR' size='16'/>\n" + "    <unique name='testindex'>\n"
                + "      <unique-column name='avalue1'/>\n" + "      <unique-column name='avalue2'/>\n"
                + "    </unique>\n" + "  </table>\n" + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        insertRow("roundtrip", new Object[] { new Integer(2), new Integer(4), "test" });

        List beans = getRows("roundtrip");

        assertEquals(new Integer(1), beans.get(0), "pk");
        assertEquals(new Integer(3), beans.get(0), "avalue1");
        assertEquals((Object) "text", beans.get(0), "avalue2");
        assertEquals(new Integer(2), beans.get(1), "pk");
        assertEquals(new Integer(4), beans.get(1), "avalue1");
        assertEquals((Object) "test", beans.get(1), "avalue2");
    }

    /**
     * Tests the alteration of a column's datatype and size.
     */
    public void testChangeDatatypeAndSize1() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='CHAR' size='4' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='32' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

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

    /**
     * Tests the alteration of a column's datatype and size.
     */
    public void testChangeDatatypeAndSize2() {
        final String model1Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='NUMERIC' size='10,2' required='true'/>\n" + "  </table>\n"
                + "</database>";
        final String model2Xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n" + "<database xmlns='"
                + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n" + "  <table name='roundtrip'>\n"
                + "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"
                + "    <column name='avalue' type='VARCHAR' size='8' required='true'/>\n" + "  </table>\n"
                + "</database>";

        createDatabase(model1Xml);

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

        alterDatabase(model2Xml);

        assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest"));

        List beans = getRows("roundtrip");

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