Author: tomdz
Date: Sun Mar 11 16:43:26 2007
New Revision: 517050
URL: http://svn.apache.org/viewvc?view=rev&rev=517050
Log:
Fix for DDLUTILS-159
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sapdb/SapDbBuilder.java
db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java
URL:
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java?view=diff&rev=517050&r1=517049&r2=517050
==============================================================================
---
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java
(original)
+++
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java
Sun Mar 11 16:43:26 2007
@@ -372,6 +372,27 @@
Map parameters,
List changes) throws
IOException
{
+ // While Oracle has an ALTER TABLE MODIFY statement, it is somewhat
limited
+ // esp. if there is data in the table, so we don't use it
+ for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
+ {
+ TableChange change = (TableChange)changeIt.next();
+
+ if (change instanceof AddColumnChange)
+ {
+ AddColumnChange addColumnChange = (AddColumnChange)change;
+
+ // Oracle can only add not insert columns
+ // Also, we cannot add NOT NULL columns unless they have a
default value
+ if (!addColumnChange.isAtEnd() ||
+ (addColumnChange.getNewColumn().isRequired() &&
(addColumnChange.getNewColumn().getDefaultValue() == null)))
+ {
+ // we need to rebuild the full table
+ return;
+ }
+ }
+ }
+
// First we drop primary keys as necessary
for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
{
@@ -401,16 +422,8 @@
if (change instanceof AddColumnChange)
{
- AddColumnChange addColumnChange = (AddColumnChange)change;
-
- // Oracle can only add not insert columns
- // Also, we cannot add NOT NULL columns unless they have a
default value
- if (addColumnChange.isAtEnd() &&
- (!addColumnChange.getNewColumn().isRequired() ||
(addColumnChange.getNewColumn().getDefaultValue() != null)))
- {
- processChange(currentModel, desiredModel, addColumnChange);
- changeIt.remove();
- }
+ processChange(currentModel, desiredModel,
(AddColumnChange)change);
+ changeIt.remove();
}
else if (change instanceof RemoveColumnChange)
{
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sapdb/SapDbBuilder.java
URL:
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sapdb/SapDbBuilder.java?view=diff&rev=517050&r1=517049&r2=517050
==============================================================================
---
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sapdb/SapDbBuilder.java
(original)
+++
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sapdb/SapDbBuilder.java
Sun Mar 11 16:43:26 2007
@@ -98,6 +98,22 @@
Map parameters,
List changes) throws
IOException
{
+ for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
+ {
+ TableChange change = (TableChange)changeIt.next();
+
+ if (change instanceof AddColumnChange)
+ {
+ AddColumnChange addColumnChange = (AddColumnChange)change;
+
+ // SapDB can only add not insert columns
+ if (!addColumnChange.isAtEnd())
+ {
+ return;
+ }
+ }
+ }
+
// First we drop primary keys as necessary
for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
{
@@ -126,14 +142,8 @@
if (change instanceof AddColumnChange)
{
- AddColumnChange addColumnChange = (AddColumnChange)change;
-
- // SapDB can only add not insert columns
- if (addColumnChange.isAtEnd())
- {
- processChange(currentModel, desiredModel, addColumnChange);
- changeIt.remove();
- }
+ processChange(currentModel, desiredModel,
(AddColumnChange)change);
+ changeIt.remove();
}
else if (change instanceof ColumnDefaultValueChange)
{
Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java
URL:
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java?view=diff&rev=517050&r1=517049&r2=517050
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java
(original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java Sun
Mar 11 16:43:26 2007
@@ -2119,7 +2119,7 @@
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database name='roundtriptest'>\n"+
" <table name='roundtrip'>\n"+
- " <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='VARCHAR' size='20'
required='true'/>\n"+
" </table>\n"+
"</database>";
@@ -2161,5 +2161,39 @@
String alterationSql = getPlatform().getAlterTablesSql(catalog,
schema, null, model);
assertEqualsIgnoringWhitespaces("", alterationSql);
+ }
+
+ /**
+ * Test for DDLUTILS-159.
+ */
+ public void testRenamePK() throws Exception
+ {
+ final String model1Xml =
+ "<?xml version='1.0'?>\n" +
+ "<database name='roundtriptest'>\n" +
+ " <table name='roundtrip'>\n" +
+ " <column name='id' primaryKey='true' required='true'
type='INTEGER'/>\n" +
+ " <column name='avalue' primaryKey='false' required='false'
type='VARCHAR' size='40'/>\n" +
+ " </table>\n" +
+ "</database>";
+ final String model2Xml =
+ "<?xml version='1.0'?>\n" +
+ "<database name='roundtriptest'>\n" +
+ " <table name='roundtrip'>\n" +
+ " <column name='pk' primaryKey='true' required='true'
type='INTEGER'/>\n" +
+ " <column name='avalue' primaryKey='false' required='false'
type='VARCHAR' size='40'/>\n" +
+ " </table>\n" +
+ "</database>";
+
+ createDatabase(model1Xml);
+
+ // note that we cannot do this test with values in the table because
+ // the primary key will be re-created and thus won't have values in it
+ // (no renaming)
+
+ alterDatabase(model2Xml);
+
+ assertEquals(getAdjustedModel(),
+ readModelFromDatabase("roundtriptest"));
}
}