You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2016/04/21 15:09:03 UTC

svn commit: r1740299 - in /db/derby/code/branches/10.12: ./ java/build/org/apache/derbyBuild/lastgoodjarcontents/ java/engine/org/apache/derby/impl/sql/catalog/ java/engine/org/apache/derby/impl/sql/compile/ java/engine/org/apache/derby/impl/sql/execut...

Author: rhillegas
Date: Thu Apr 21 13:09:03 2016
New Revision: 1740299

URL: http://svn.apache.org/viewvc?rev=1740299&view=rev
Log:
DERBY-6882: Port 1738368 from main to the 10.12 branch.

Modified:
    db/derby/code/branches/10.12/   (props changed)
    db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents
    db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents
    db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbynet.jar.lastcontents
    db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents
    db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents
    db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/catalog/SYSCOLUMNSRowFactory.java
    db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java
    db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ModifyColumnNode.java
    db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
    db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/AlterTableConstantAction.java
    db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/ColumnInfo.java
    db/derby/code/branches/10.12/java/engine/org/apache/derby/loc/messages.xml
    db/derby/code/branches/10.12/java/shared/org/apache/derby/shared/common/reference/SQLState.java
    db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java
    db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_12.java

Propchange: db/derby/code/branches/10.12/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Apr 21 13:09:03 2016
@@ -1,4 +1,4 @@
 /db/derby/code/branches/10.7:1061570,1061578,1082235
 /db/derby/code/branches/10.8:1177474,1234973,1464951
 /db/derby/code/branches/10.9:1373148
-/db/derby/code/trunk:1063809,1702820-1702830,1702836
+/db/derby/code/trunk:1063809,1702820-1702830,1702836,1738368

Modified: db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents (original)
+++ db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents Thu Apr 21 13:09:03 2016
@@ -1412,10 +1412,10 @@ org.apache.derby.mbeans.VersionMBean.cla
 org.apache.derby.osgi.EmbeddedActivator.class
 org.apache.derby.security.DatabasePermission.class
 org.apache.derby.security.SystemPermission.class
+org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
 org.apache.derby.shared.common.error.ExceptionSeverity.class
 org.apache.derby.shared.common.error.MessageUtils.class
 org.apache.derby.shared.common.error.ShutdownException.class
-org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
 org.apache.derby.shared.common.reference.JDBC40Translation.class
 org.apache.derby.shared.common.reference.MessageId.class
 org.apache.derby.shared.common.reference.SQLState.class

Modified: db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents (original)
+++ db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents Thu Apr 21 13:09:03 2016
@@ -164,11 +164,11 @@ org.apache.derby.jdbc.ClientDriver40.cla
 org.apache.derby.jdbc.ClientXADataSource.class
 org.apache.derby.jdbc.ClientXADataSource40.class
 org.apache.derby.jdbc.ClientXADataSourceInterface.class
+org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
 org.apache.derby.shared.common.error.ExceptionSeverity.class
 org.apache.derby.shared.common.error.ExceptionUtil.class
-org.apache.derby.shared.common.error.ShutdownException.class
 org.apache.derby.shared.common.error.MessageUtils.class
-org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
+org.apache.derby.shared.common.error.ShutdownException.class
 org.apache.derby.shared.common.i18n.MessageUtil.class
 org.apache.derby.shared.common.reference.Attribute.class
 org.apache.derby.shared.common.reference.JDBC40Translation.class

Modified: db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbynet.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbynet.jar.lastcontents?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbynet.jar.lastcontents (original)
+++ db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbynet.jar.lastcontents Thu Apr 21 13:09:03 2016
@@ -45,7 +45,7 @@ org.apache.derby.impl.drda.memCheck.clas
 org.apache.derby.impl.tools.sysinfo.Main.class
 org.apache.derby.impl.tools.sysinfo.ZipInfoProperties.class
 org.apache.derby.mbeans.drda.NetworkServerMBean.class
-org.apache.derby.shared.common.reference.MessageId.class
 org.apache.derby.shared.common.error.MessageUtils.class
 org.apache.derby.shared.common.error.ShutdownException.class
+org.apache.derby.shared.common.reference.MessageId.class
 org.apache.derby.tools.sysinfo.class

Modified: db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents (original)
+++ db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents Thu Apr 21 13:09:03 2016
@@ -1415,10 +1415,10 @@ org.apache.derby.mbeans.VersionMBean.cla
 org.apache.derby.osgi.EmbeddedActivator.class
 org.apache.derby.security.DatabasePermission.class
 org.apache.derby.security.SystemPermission.class
+org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
 org.apache.derby.shared.common.error.ExceptionSeverity.class
 org.apache.derby.shared.common.error.MessageUtils.class
 org.apache.derby.shared.common.error.ShutdownException.class
-org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
 org.apache.derby.shared.common.reference.JDBC40Translation.class
 org.apache.derby.shared.common.reference.MessageId.class
 org.apache.derby.shared.common.reference.SQLState.class

Modified: db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents (original)
+++ db/derby/code/branches/10.12/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents Thu Apr 21 13:09:03 2016
@@ -164,11 +164,11 @@ org.apache.derby.jdbc.ClientDriver40.cla
 org.apache.derby.jdbc.ClientXADataSource.class
 org.apache.derby.jdbc.ClientXADataSource40.class
 org.apache.derby.jdbc.ClientXADataSourceInterface.class
+org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
 org.apache.derby.shared.common.error.ExceptionSeverity.class
 org.apache.derby.shared.common.error.ExceptionUtil.class
-org.apache.derby.shared.common.error.ShutdownException.class
 org.apache.derby.shared.common.error.MessageUtils.class
-org.apache.derby.shared.common.error.DerbySQLIntegrityConstraintViolationException.class
+org.apache.derby.shared.common.error.ShutdownException.class
 org.apache.derby.shared.common.i18n.MessageUtil.class
 org.apache.derby.shared.common.reference.Attribute.class
 org.apache.derby.shared.common.reference.JDBC40Translation.class

Modified: db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/catalog/SYSCOLUMNSRowFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/catalog/SYSCOLUMNSRowFactory.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/catalog/SYSCOLUMNSRowFactory.java (original)
+++ db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/catalog/SYSCOLUMNSRowFactory.java Thu Apr 21 13:09:03 2016
@@ -222,9 +222,18 @@ public class SYSCOLUMNSRowFactory extend
 		/* 6th column is DEFAULTID (UUID - char(36)) */
 		row.setColumn(SYSCOLUMNS_COLUMNDEFAULTID, new SQLChar(defaultID));
 
-		if (autoinc_create_or_modify_Start_Increment == ColumnDefinitionNode.CREATE_AUTOINCREMENT ||
-				autoinc_create_or_modify_Start_Increment == ColumnDefinitionNode.MODIFY_AUTOINCREMENT_INC_VALUE)
-		{//user is adding an autoinc column or is changing the increment value of autoinc column
+		if (
+            (autoinc_create_or_modify_Start_Increment ==
+             ColumnDefinitionNode.CREATE_AUTOINCREMENT) ||
+            (autoinc_create_or_modify_Start_Increment ==
+             ColumnDefinitionNode.MODIFY_AUTOINCREMENT_INC_VALUE) ||
+            (autoinc_create_or_modify_Start_Increment ==
+             ColumnDefinitionNode.MODIFY_AUTOINCREMENT_ALWAYS_VS_DEFAULT)
+            )
+		{
+            //user is adding an autoinc column
+            // or is changing the increment value of autoinc column
+            // or is changing an autoinc column between ALWAYS and DEFAULT.
 			// This code also gets run when ALTER TABLE DROP COLUMN
 			// is used to drop a column other than the autoinc
 			// column, and the autoinc column gets removed from

Modified: db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java (original)
+++ db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java Thu Apr 21 13:09:03 2016
@@ -86,6 +86,8 @@ public class ColumnDefinitionNode extend
 	//MODIFY_AUTOINCREMENT_INC_VALUE - this column definition is for
 	//alter table command to change the increment value of the column
 	public static final int MODIFY_AUTOINCREMENT_INC_VALUE = 2;
+	//alter table command to change the ALWAYS vs DEFAULT nature of an autoinc column
+	public static final int MODIFY_AUTOINCREMENT_ALWAYS_VS_DEFAULT = 3;
 	
 	/**
      * Constructor for a ColumnDefinitionNode
@@ -668,7 +670,7 @@ public class ColumnDefinitionNode extend
 	}
 
 
-	private static DefaultInfoImpl createDefaultInfoOfAutoInc(){
+	protected static DefaultInfoImpl createDefaultInfoOfAutoInc(){
 		return new DefaultInfoImpl(true,
 					   null, 
 					   null);

Modified: db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ModifyColumnNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ModifyColumnNode.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ModifyColumnNode.java (original)
+++ db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/ModifyColumnNode.java Thu Apr 21 13:09:03 2016
@@ -54,6 +54,8 @@ class ModifyColumnNode extends ColumnDef
     final static int K_MODIFY_COLUMN_CONSTRAINT = 2;
     final static int K_MODIFY_COLUMN_CONSTRAINT_NOT_NULL = 3;
     final static int K_DROP_COLUMN = 4;
+    final static int K_MODIFY_COLUMN_GENERATED_ALWAYS = 5;
+    final static int K_MODIFY_COLUMN_GENERATED_BY_DEFAULT = 6;
 
     /**
      * This class is used to hold logically different objects for
@@ -317,6 +319,12 @@ class ModifyColumnNode extends ColumnDef
             case K_DROP_COLUMN:
                 return ColumnInfo.DROP;
 
+            case K_MODIFY_COLUMN_GENERATED_ALWAYS:
+                return ColumnInfo.MODIFY_COLUMN_GENERATED_ALWAYS;
+
+            case K_MODIFY_COLUMN_GENERATED_BY_DEFAULT:
+                return ColumnInfo.MODIFY_COLUMN_GENERATED_BY_DEFAULT;
+
             default:
                 if (SanityManager.DEBUG) {
                     SanityManager.THROWASSERT("Unexpected type = " + kind);
@@ -418,6 +426,28 @@ class ModifyColumnNode extends ColumnDef
 	{
 		ColumnDescriptor cd;
 
+		// only autoincrement columns can have their generation property changed
+        if (
+            (kind == K_MODIFY_COLUMN_GENERATED_ALWAYS) ||
+            (kind == K_MODIFY_COLUMN_GENERATED_BY_DEFAULT)
+            )
+		{
+			cd = getLocalColumnDescriptor(name, td);
+			if (!cd.isAutoincrement())
+			{
+				throw StandardException.newException(SQLState.LANG_AI_CANNOT_ALTER_IDENTITYNESS,
+						getColumnName());
+			}
+
+            if (kind == K_MODIFY_COLUMN_GENERATED_BY_DEFAULT)
+            {
+                defaultInfo = createDefaultInfoOfAutoInc();
+            }
+
+            // nothing more to do here
+            return;
+		}
+
 		// a column that has an autoincrement default can't be made nullable
         if (kind == K_MODIFY_COLUMN_CONSTRAINT)
 		{

Modified: db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj (original)
+++ db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj Thu Apr 21 13:09:03 2016
@@ -13658,6 +13658,7 @@ columnAlterClause(String columnName) thr
 	long				autoIncrementIncrement = 1;
 	long				autoIncrementRestartWith = 1;
 	DataTypeDescriptor	typeDescriptor = null;
+	int                 alterKind;
 }
 {
 	LOOKAHEAD( {getToken(2).kind == DATA} )
@@ -13672,6 +13673,19 @@ columnAlterClause(String columnName) thr
                                  getContextManager());
 	}
 |
+	LOOKAHEAD( {getToken(2).kind == GENERATED} )
+	<SET> <GENERATED> alterKind = alterGeneratedColumn()
+	{
+		checkVersion(DataDictionary.DD_VERSION_DERBY_10_11, "ALTER TABLE ALTER COLUMN SET GENERATED");
+        return
+            new ModifyColumnNode(alterKind,
+                                 columnName,
+                                 null,
+                                 null,
+                                 null,
+                                 getContextManager());
+	}
+|
 	LOOKAHEAD( {getToken(2).kind == INCREMENT} )
 	<SET> <INCREMENT> <BY> autoIncrementIncrement = exactNumber()
 	{
@@ -13760,6 +13774,28 @@ columnAlterClause(String columnName) thr
 	}
 }
 
+/*
+ * Various variants of the ALTER TABLE ALTER COLUMN SET GENERATED statement.
+ *
+ * By the time we get here, we've parsed
+ *    ALTER TABLE ALTER COLUMN SET GENERATED
+ */
+int
+alterGeneratedColumn() throws StandardException :
+{}
+{
+	<BY> <_DEFAULT>
+    {
+        return ModifyColumnNode.K_MODIFY_COLUMN_GENERATED_BY_DEFAULT;
+	}
+|
+	<ALWAYS>
+    {
+        return ModifyColumnNode.K_MODIFY_COLUMN_GENERATED_ALWAYS;
+	}
+}
+
+
 StatementNode
 dropTableConstraintDefinitionCore(TableName tableName, TableElementList tableElementList, int[] changeType, int[] behavior) throws StandardException :
 {

Modified: db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/AlterTableConstantAction.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/AlterTableConstantAction.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/AlterTableConstantAction.java (original)
+++ db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/AlterTableConstantAction.java Thu Apr 21 13:09:03 2016
@@ -532,6 +532,13 @@ class AlterTableConstantAction extends D
 				{
                     dropColumnFromTable(columnInfo[ix].name);
 				}
+				else if (
+                         (columnInfo[ix].action == ColumnInfo.MODIFY_COLUMN_GENERATED_ALWAYS) ||
+                         (columnInfo[ix].action == ColumnInfo.MODIFY_COLUMN_GENERATED_BY_DEFAULT)
+                         )
+				{
+                    modifyIdentityState(ix);
+				}
 				else if (SanityManager.DEBUG)
 				{
 					SanityManager.THROWASSERT(
@@ -2243,6 +2250,48 @@ class AlterTableConstantAction extends D
         }
 	}
 	
+	/**
+	 * Change an identity from ALWAYS to BY DEFAULT (or vice versa)
+	 * 
+	 * @param       ix 		the index of the column specfication in the ALTER 
+	 *						statement-- currently we allow only one.
+	 * @exception	StandardException, thrown on error.
+	 */
+    private void modifyIdentityState(int ix)
+			throws StandardException						 
+	{
+		ColumnDescriptor oldColumnDescriptor = td.getColumnDescriptor(columnInfo[ix].name);
+		int columnPosition = oldColumnDescriptor.getPosition();
+        boolean wasGeneratedAlways = oldColumnDescriptor.isAutoincAlways();
+        boolean willBeGeneratedAlways =
+          (columnInfo[ix].action == ColumnInfo.MODIFY_COLUMN_GENERATED_ALWAYS);
+
+        // nothing to do if the identity column already behaves the right way
+        if (wasGeneratedAlways == willBeGeneratedAlways) { return; }
+
+        UUID defaultUUID = willBeGeneratedAlways ? null : dd.getUUIDFactory().createUUID();
+
+        /* Get a ColumnDescriptor reflecting the new default */
+		ColumnDescriptor newColumnDescriptor = new ColumnDescriptor
+          (
+           columnInfo[ix].name,
+           columnPosition,
+           oldColumnDescriptor.getType(),
+           columnInfo[ix].defaultValue,
+           columnInfo[ix].defaultInfo,
+           td,
+           defaultUUID,
+           oldColumnDescriptor.getAutoincStart(),
+           oldColumnDescriptor.getAutoincInc(),
+           ColumnDefinitionNode.MODIFY_AUTOINCREMENT_ALWAYS_VS_DEFAULT
+           );
+
+		// Update the ColumnDescriptor with new default info
+		dd.dropColumnDescriptor(td.getUUID(), columnInfo[ix].name, tc);
+		dd.addDescriptor(newColumnDescriptor, td,
+						 DataDictionary.SYSCOLUMNS_CATALOG_NUM, false, tc);
+    }
+  
     /**
      * routine to process compress table or ALTER TABLE <t> DROP COLUMN <c>;
      * <p>

Modified: db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/ColumnInfo.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/ColumnInfo.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/ColumnInfo.java (original)
+++ db/derby/code/branches/10.12/java/engine/org/apache/derby/impl/sql/execute/ColumnInfo.java Thu Apr 21 13:09:03 2016
@@ -91,6 +91,10 @@ public class ColumnInfo implements Forma
 	//This indicates column is for ALTER TABLE to change the increment value of autoinc column 
 	public static final int MODIFY_COLUMN_DEFAULT_INCREMENT	= 6;
 	public static final int MODIFY_COLUMN_DEFAULT_VALUE	= 7;
+	//This change the generation property of autoinc columns
+	public static final int MODIFY_COLUMN_GENERATED_ALWAYS	= 8;
+	public static final int MODIFY_COLUMN_GENERATED_BY_DEFAULT	= 9;
+
 	// CONSTRUCTORS
 
 	/**

Modified: db/derby/code/branches/10.12/java/engine/org/apache/derby/loc/messages.xml
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/engine/org/apache/derby/loc/messages.xml?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/engine/org/apache/derby/loc/messages.xml (original)
+++ db/derby/code/branches/10.12/java/engine/org/apache/derby/loc/messages.xml Thu Apr 21 13:09:03 2016
@@ -2974,6 +2974,12 @@ Guide.
             </msg>
 
             <msg>
+                <name>42Z29</name>
+                <text>Column '{0}' is not an identity column, so its generation state cannot be changed. </text>
+                <arg>columnName</arg>
+            </msg>
+
+            <msg>
                 <name>42Z50</name>
                 <text>Internal Error: Unable to generate code for {0}.</text>
                 <arg>queryTreeNodeIdentifier</arg>

Modified: db/derby/code/branches/10.12/java/shared/org/apache/derby/shared/common/reference/SQLState.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/shared/org/apache/derby/shared/common/reference/SQLState.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/shared/org/apache/derby/shared/common/reference/SQLState.java (original)
+++ db/derby/code/branches/10.12/java/shared/org/apache/derby/shared/common/reference/SQLState.java Thu Apr 21 13:09:03 2016
@@ -1078,6 +1078,7 @@ public interface SQLState {
 	String LANG_AI_CANNOT_ADD_AI_TO_NULLABLE						   = "42Z27";
 	// String LANG_BUILT_IN_ALIAS_NAME						   = "42Z28";
 	// RUNTIMESTATISTICS
+	String LANG_AI_CANNOT_ALTER_IDENTITYNESS						   = "42Z29";
 	String LANG_TIME_SPENT_THIS										   = "42Z30.U";
 	String LANG_TIME_SPENT_THIS_AND_BELOW							   = "42Z31.U";
 	String LANG_TOTAL_TIME_BREAKDOWN								   = "42Z32.U";

Modified: db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java (original)
+++ db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java Thu Apr 21 13:09:03 2016
@@ -41,6 +41,10 @@ import org.apache.derbyTesting.junit.Tes
 
 public final class AlterTableTest extends BaseJDBCTestCase {
 
+    private static final String CANNOT_ALTER_NON_IDENTITY_COLUMN = "42Z29";
+    private static final String CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN = "42Z23";
+    private static final String DUPLICATE_KEY = "23505";
+
     /**
      * Public constructor required for running test as standalone JUnit.
      */
@@ -4577,5 +4581,269 @@ public final class AlterTableTest extend
             assertEquals( expected[ i ], actual[ i ] );
         }
     }
+
+    /**
+     * Test that identity columns can be switched between
+     * ALWAYS and DEFAULT modes.
+     */
+    public void test_6882() throws Exception
+    {
+        Connection conn = getConnection();
+
+        // initial schema
+        goodStatement
+          (
+           conn,
+           "create table t_6882\n" +
+           "(\n" +
+           "  a int generated always as identity,\n" +
+           "  b int\n" +
+           ")\n"
+           );
+        goodStatement
+          (
+           conn,
+           "create table s_6882\n" +
+           "(\n" +
+           "  a int generated by default as identity,\n" +
+           "  b int\n" +
+           ")\n"
+           );
+        goodStatement
+          (
+           conn,
+           "create table u_6882\n" +
+           "(\n" +
+           "  a int,\n" +
+           "  b int\n" +
+           ")\n"
+           );
+
+        // can't change the ALWAYS/DEFAULT state of a non-identity column
+        assertCompileError
+          (
+           CANNOT_ALTER_NON_IDENTITY_COLUMN,
+           "alter table u_6882 alter column a set generated by default"
+           );
+        assertCompileError
+          (
+           CANNOT_ALTER_NON_IDENTITY_COLUMN,
+           "alter table u_6882 alter column a set generated always"
+           );
+
+        // add some good tuples
+        goodStatement(conn, "insert into t_6882(b) values (100)");
+        goodStatement(conn, "insert into s_6882(b) values (100)");
+
+        //
+        // Demonstrate that t_6882 is ALWAYS and s_6882 is BY DEFAULT.
+        //
+        
+        assertCompileError
+          (
+           CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN,
+           "insert into t_6882(a, b) values (-1, -100)"
+           );
+        goodStatement(conn, "insert into s_6882(a, b) values (-1, -100)");
+        assertResults
+          (
+           conn,
+           "select * from t_6882 order by a",
+           new String[][]
+           {
+             { "1", "100" },
+           },
+           false
+           );
+        assertResults
+          (
+           conn,
+           "select * from s_6882 order by a",
+           new String[][]
+           {
+             { "-1", "-100" },
+             { "1", "100" },
+           },
+           false
+           );
+
+        //
+        // Now swap the ALWAYS/DEFAULT state of the tables
+        //
+        
+        goodStatement(conn, "alter table t_6882 alter column a set generated by default");
+        goodStatement(conn, "alter table s_6882 alter column a set generated always");
+
+        goodStatement(conn, "insert into t_6882(a, b) values (-2, -200)");
+        assertCompileError
+          (
+           CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN,
+           "insert into s_6882(a, b) values (-2, -200)"
+           );
+
+        goodStatement(conn, "insert into t_6882(b) values (200)");
+        goodStatement(conn, "insert into s_6882(b) values (200)");
+
+        assertResults
+          (
+           conn,
+           "select * from t_6882 order by a",
+           new String[][]
+           {
+             { "-2", "-200" },
+             { "1", "100" },
+             { "2", "200" },
+           },
+           false
+           );
+        assertResults
+          (
+           conn,
+           "select * from s_6882 order by a",
+           new String[][]
+           {
+             { "-1", "-100" },
+             { "1", "100" },
+             { "2", "200" },
+           },
+           false
+           );
+
+        //
+        // Swap the states again.
+        //
+        
+        goodStatement(conn, "alter table t_6882 alter column a set generated always");
+        goodStatement(conn, "alter table s_6882 alter column a set generated by default");
+        
+        assertCompileError
+          (
+           CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN,
+           "insert into t_6882(a, b) values (-3, -300)"
+           );
+        goodStatement(conn, "insert into s_6882(a, b) values (-3, -300)");
+
+        goodStatement(conn, "insert into t_6882(b) values (300)");
+        goodStatement(conn, "insert into s_6882(b) values (300)");
+
+        assertResults
+          (
+           conn,
+           "select * from t_6882 order by a",
+           new String[][]
+           {
+             { "-2", "-200" },
+             { "1", "100" },
+             { "2", "200" },
+             { "3", "300" },
+           },
+           false
+           );
+        assertResults
+          (
+           conn,
+           "select * from s_6882 order by a",
+           new String[][]
+           {
+             { "-3", "-300" },
+             { "-1", "-100" },
+             { "1", "100" },
+             { "2", "200" },
+             { "3", "300" },
+           },
+           false
+           );
+
+        // drop schema
+        goodStatement(conn, "drop table u_6882");
+        goodStatement(conn, "drop table s_6882");
+        goodStatement(conn, "drop table t_6882");
+    }
+
+    /**
+     * Second test for feature 6882. Verify that you
+     * can use the SET GENERATED feature in order to
+     * import data into a newly created table which has
+     * an ALWAYS generated column and a primary key.
+     */
+    public void test_6882_import() throws Exception
+    {
+        Connection conn = getConnection();
+
+        // initial schema
+        goodStatement
+          (
+           conn,
+           "create table source_6882\n" +
+           "(\n" +
+           "  a int generated always as identity primary key,\n" +
+           "  b int\n" +
+           ")\n"
+           );
+        goodStatement
+          (
+           conn,
+           "create table target_6882\n" +
+           "(\n" +
+           "  a int generated always as identity primary key,\n" +
+           "  b int\n" +
+           ")\n"
+           );
+
+        // populate the source table
+        goodStatement(conn, "insert into source_6882(b) values (100), (200), (300)");
+
+        // can't populate the target table yet because its key
+        // is generated ALWAYS
+        assertCompileError
+          (
+           CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN,
+           "insert into target_6882 select * from source_6882"
+           );
+
+        // alter the target table to allow the bulk insert to succeed
+        goodStatement(conn, "alter table target_6882 alter column a set generated by default");
+
+        // now the bulk insert works
+        goodStatement(conn, "insert into target_6882 select * from source_6882");
+
+        // set the target table back to its original, intended shape
+        goodStatement(conn, "alter table target_6882 alter column a set generated always");
+
+        // insert now fails because the sequence generator starts
+        // at 1 and there is already a key with that value
+        PreparedStatement ps = conn.prepareStatement("insert into target_6882(b) values (400)");
+        assertPreparedStatementError
+          (
+           DUPLICATE_KEY,
+           ps
+           );
+        ps.close();
+        
+        // move the generator's start value forward
+        goodStatement(conn, "alter table target_6882 alter column a restart with 4");
+
+        // now the insert succeeds
+        goodStatement(conn, "insert into target_6882(b) values (400)");
+
+        // verify the results
+        assertResults
+          (
+           conn,
+           "select * from target_6882 order by a",
+           new String[][]
+           {
+             { "1", "100" },
+             { "2", "200" },
+             { "3", "300" },
+             { "4", "400" },
+           },
+           false
+           );
+
+        // drop schema
+        goodStatement(conn, "drop table target_6882");
+        goodStatement(conn, "drop table source_6882");
+    }
     
 }

Modified: db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_12.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_12.java?rev=1740299&r1=1740298&r2=1740299&view=diff
==============================================================================
--- db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_12.java (original)
+++ db/derby/code/branches/10.12/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_12.java Thu Apr 21 13:09:03 2016
@@ -42,6 +42,11 @@ public class Changes10_12 extends Upgrad
     private static  final   String  LANG_AI_CANNOT_MODIFY_AI = "42Z23";
     private static  final   String  LANG_NULL_INTO_NON_NULL = "23502";
 
+    private static final String SYNTAX_ERROR = "42X01";
+    private static final String UPGRADE_REQUIRED = "XCL47";
+    private static final String CANNOT_ALTER_NON_IDENTITY_COLUMN = "42Z29";
+    private static final String CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN = "42Z23";
+
     //////////////////////////////////////////////////////////////////
     //
     // CONSTRUCTOR
@@ -322,4 +327,154 @@ public class Changes10_12 extends Upgrad
                 break;
         };
     }
+  
+    /**
+     * Test the addition of support for changing identity columns
+     * from ALWAYS to BY DEFAULT and vice versa via
+     * an ALTER TABLE statement. DERBY-6882.
+     */
+    public void testAlterTableSetGenerated() throws SQLException {
+        Statement s = createStatement();
+
+        // GENERATED BY DEFAULT not supported prior to 10.1
+        if (!oldAtLeast(10, 1)) { return; }
+
+        // 10.11 upgraded all identity columns to be backed by sequences
+        boolean atLeast10_11 = oldAtLeast(10,11);
+        
+        switch (getPhase()) {
+            case PH_CREATE:
+                s.execute("create table t_always_6882(a int generated always as identity, b int)");
+                s.execute("create table t_default_6882(a int generated by default as identity, b int)");
+                s.execute("create table t_none_6882(a int, b int)");
+                s.execute("insert into t_always_6882(b) values (100)");
+                s.execute("insert into t_default_6882(b) values (100)");
+                assertCompileError
+                  (
+                   CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN,
+                   "insert into t_always_6882(a, b) values (-1, -100)"
+                   );
+                s.execute("insert into t_default_6882(a, b) values (-1, -100)");
+                break;
+
+            case PH_SOFT_UPGRADE:
+                // We only support the SET GENERATED clause if the database
+                // is at level 10.11 or higher.
+                if (atLeast10_11)
+                {
+                    assertCompileError
+                      (
+                       CANNOT_ALTER_NON_IDENTITY_COLUMN,
+                       "alter table t_none_6882 alter column a set generated by default"
+                       );
+                    s.execute("alter table t_always_6882 alter column a set generated by default");
+                    s.execute("alter table t_default_6882 alter column a set generated always");
+                    s.execute("insert into t_always_6882(a, b) values (-2, -200)");
+                    assertCompileError
+                      (
+                       CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN,
+                       "insert into t_default_6882(a, b) values (-2, -200)"
+                       );
+                    s.execute("insert into t_always_6882(b) values (200)");
+                    s.execute("insert into t_default_6882(b) values (200)");
+                    JDBC.assertFullResultSet(
+                        s.executeQuery("select * from t_always_6882 order by a"),
+                        new String[][]
+                        {
+                          { "-2", "-200" },
+                          { "1", "100" },
+                          { "2", "200" },
+                        });
+                    JDBC.assertFullResultSet(
+                        s.executeQuery("select * from t_default_6882 order by a"),
+                        new String[][]
+                        {
+                          { "-1", "-100" },
+                          { "1", "100" },
+                          { "2", "200" },
+                        });
+                } else {
+                    assertCompileError
+                      (
+                       UPGRADE_REQUIRED,
+                       "alter table t_none_6882 alter column a set generated by default"
+                       );
+                    assertCompileError
+                      (
+                       UPGRADE_REQUIRED,
+                       "alter table t_always_6882 alter column a set generated by default"
+                       );
+                    assertCompileError
+                      (
+                       UPGRADE_REQUIRED,
+                       "alter table t_default_6882 alter column a set generated always"
+                       );
+                }
+                break;
+                
+            case PH_HARD_UPGRADE:
+                assertCompileError
+                  (
+                   CANNOT_ALTER_NON_IDENTITY_COLUMN,
+                   "alter table t_none_6882 alter column a set generated by default"
+                   );
+                s.execute("alter table t_always_6882 alter column a set generated always");
+                s.execute("alter table t_default_6882 alter column a set generated by default");
+                assertCompileError
+                  (
+                   CANNOT_MODIFY_ALWAYS_IDENTITY_COLUMN,
+                   "insert into t_always_6882(a, b) values (-3, -300)"
+                   );
+                s.execute("insert into t_default_6882(a, b) values (-3, -300)");
+                s.execute("insert into t_always_6882(b) values (300)");
+                s.execute("insert into t_default_6882(b) values (300)");
+
+                String[][] alwaysResults;
+                String[][] defaultResults;
+                if (atLeast10_11)
+                {
+                    alwaysResults =  new String[][]  
+                      {
+                        { "-2", "-200" },
+                        { "1", "100" },
+                        { "2", "200" },
+                        { "3", "300" },
+                      };
+                    defaultResults = new String[][]
+                      {
+                        { "-3", "-300" },
+                        { "-1", "-100" },
+                        { "1", "100" },
+                        { "2", "200" },
+                        { "3", "300" },
+                      };
+                }
+                else
+                {
+                    alwaysResults = new String[][]  
+                      {
+                        { "1", "100" },
+                        { "2", "300" },
+                      };
+                    defaultResults = new String[][]
+                      {
+                        { "-3", "-300" },
+                        { "-1", "-100" },
+                        { "1", "100" },
+                        { "2", "300" },
+                      };
+                }
+
+                JDBC.assertFullResultSet
+                  (
+                   s.executeQuery("select * from t_always_6882 order by a"),
+                   alwaysResults
+                   );
+                JDBC.assertFullResultSet
+                  (
+                   s.executeQuery("select * from t_default_6882 order by a"),
+                   defaultResults);
+                break;
+        };
+    }
 }