Author: johnthuss
Date: Thu Aug 22 21:30:58 2013
New Revision: 1516617

URL: http://svn.apache.org/r1516617
Log:
Fix adding a new column to an existing table with a NOT NULL constraint

Modified:
    
cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java
    
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationColumnNewTest.java
    
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableExistingTest.java

Modified: 
cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java
URL: 
http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java?rev=1516617&r1=1516616&r2=1516617&view=diff
==============================================================================
--- 
cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java
 (original)
+++ 
cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java
 Thu Aug 22 21:30:58 2013
@@ -35,9 +35,7 @@ public class MigrationColumnNew extends 
                super(table, name, jdbcType, maxLength, precision, scale, 
isMandatory, defaultValue);
                if (!table.isNew()) {
                        create();
-               }
-             
-        if (getDefaultValue() != null) {
+               } else if (getDefaultValue() != null) {
             setDefault(getDefaultValue());
         }
        }
@@ -50,6 +48,17 @@ public class MigrationColumnNew extends 
        protected void create() {
                MergerToken op = 
factory().createAddColumnToDb(getTable().getEntity(), getAttribute());
                getTable().getDatabase().addOperation(op);
+               
+               if (getDefaultValue() != null) {
+            setDefault(getDefaultValue());
+        }
+               
+               if (getAttribute().isMandatory()) {
+                   getTable().getDatabase().execute("UPDATE " +  
getTable().getEntity().getFullyQualifiedName() + " SET " + 
getAttribute().getName() + " = " + sqlForLiteral(getDefaultValue()));
+                   
+            op = factory().createSetNotNullToDb(getTable().getEntity(), 
getAttribute());
+            getTable().getDatabase().addOperation(op);
+               }
        }
        
 }

Modified: 
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationColumnNewTest.java
URL: 
http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationColumnNewTest.java?rev=1516617&r1=1516616&r2=1516617&view=diff
==============================================================================
--- 
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationColumnNewTest.java
 (original)
+++ 
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationColumnNewTest.java
 Thu Aug 22 21:30:58 2013
@@ -28,7 +28,9 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.postgres.PostgresAdapter;
 import org.apache.cayenne.merge.AddColumnToDb;
+import org.apache.cayenne.merge.ArbitrarySqlToDb;
 import org.apache.cayenne.merge.CreateTableToDb;
+import org.apache.cayenne.merge.SetNotNullToDb;
 import org.apache.cayenne.merge.SetValueForNullToDb;
 
 public class MigrationColumnNewTest extends TestCase {
@@ -87,9 +89,11 @@ public class MigrationColumnNewTest exte
                MigrationTable table = db.alterTable("table");
                subject = new MigrationColumnNew(table, "column", 
Types.INTEGER, 0, 0, 0, true, 1);
 
-               assertEquals(2, 
subject.getTable().getDatabase().getOperations().size());
+               assertEquals(4, 
subject.getTable().getDatabase().getOperations().size());
                
assertTrue(subject.getTable().getDatabase().getOperations().get(0) instanceof 
AddColumnToDb);
            assertTrue(subject.getTable().getDatabase().getOperations().get(1) 
instanceof SetValueForNullToDb);
+           assertTrue(subject.getTable().getDatabase().getOperations().get(2) 
instanceof ArbitrarySqlToDb);
+        assertTrue(subject.getTable().getDatabase().getOperations().get(3) 
instanceof SetNotNullToDb);
 
 //             AddColumnToDb op = (AddColumnToDb) 
subject.getTable().getDatabase().getOperations().get(0);
 //             List<String> statements = op.createSql(node.getAdapter());

Modified: 
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableExistingTest.java
URL: 
http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableExistingTest.java?rev=1516617&r1=1516616&r2=1516617&view=diff
==============================================================================
--- 
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableExistingTest.java
 (original)
+++ 
cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableExistingTest.java
 Thu Aug 22 21:30:58 2013
@@ -31,8 +31,10 @@ import org.apache.cayenne.map.DbAttribut
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.merge.AddColumnToDb;
 import org.apache.cayenne.merge.AddRelationshipToDb;
+import org.apache.cayenne.merge.ArbitrarySqlToDb;
 import org.apache.cayenne.merge.DropColumnToDb;
 import org.apache.cayenne.merge.DropRelationshipToDb;
+import org.apache.cayenne.merge.SetNotNullToDb;
 import org.apache.cayenne.merge.SetPrimaryKeyToDb;
 import org.apache.cayenne.merge.SetValueForNullToDb;
 
@@ -87,9 +89,11 @@ public class MigrationTableExistingTest 
        public void testAddColumnWithDefault() {
            MigrationTableExisting table = db.alterTable("table");
            table.addColumn("column", Types.INTEGER, true, 1);
-           assertEquals(2, table.getDatabase().getOperations().size());
+           assertEquals(4, table.getDatabase().getOperations().size());
            assertTrue(table.getDatabase().getOperations().get(0) instanceof 
AddColumnToDb);
            assertTrue(table.getDatabase().getOperations().get(1) instanceof 
SetValueForNullToDb);
+           assertTrue(table.getDatabase().getOperations().get(2) instanceof 
ArbitrarySqlToDb);
+        assertTrue(table.getDatabase().getOperations().get(3) instanceof 
SetNotNullToDb);
 
         AddColumnToDb operation = (AddColumnToDb) 
table.getDatabase().getOperations().get(0);
         assertEquals("column", operation.getColumn().getName());


Reply via email to