You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by jo...@apache.org on 2013/08/22 23:30:58 UTC

svn commit: r1516617 - in /cayenne/sandbox/cayenne-migrations/src: main/java/org/apache/cayenne/migration/ test/java/org/apache/cayenne/migration/

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());