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 2011/06/13 21:05:19 UTC

svn commit: r1135226 - in /db/derby/code/trunk/java: engine/org/apache/derby/iapi/reference/ engine/org/apache/derby/iapi/sql/dictionary/ engine/org/apache/derby/impl/sql/catalog/ engine/org/apache/derby/impl/sql/compile/ engine/org/apache/derby/impl/s...

Author: rhillegas
Date: Mon Jun 13 19:05:19 2011
New Revision: 1135226

URL: http://svn.apache.org/viewvc?rev=1135226&view=rev
Log:
DERBY-4437: Replace old identity generator with a new, pre-allocating sequence generator.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/reference/Property.java
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SequenceDescriptor.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NextSequenceNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertConstantAction.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java
    db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AutoIncrementTest.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/reference/Property.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/reference/Property.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/reference/Property.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/reference/Property.java Mon Jun 13 19:05:19 2011
@@ -627,6 +627,15 @@ public interface Property { 
 	int		LANG_SEQGEN_CACHE_SIZE_DEFAULT =32;
 
 	/**
+	 * The size of the identity generator cache 
+	 * used by the data dictionary.  Database.  Static.
+	 * <p>
+	 * Externally visible.
+	 */
+	String	LANG_IDGEN_CACHE_SIZE = "derby.language.identityGeneratorCacheSize";
+	int		LANG_IDGEN_CACHE_SIZE_DEFAULT =32;
+
+	/**
 	  derby.language.stalePlanCheckInterval
 
 	  <P>

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java Mon Jun 13 19:05:19 2011
@@ -1718,29 +1718,6 @@ public interface DataDictionary
 		throws StandardException;
 
 	/**
-	 * getSetAutoincrementValue fetches the autoincrement value from 
-	 * SYSCOLUMNS given a row location. If doUpdate is true it updates
-	 * the autoincrement column with the new value.
-	 * the value returned by this routine is the new value and *NOT* the
-	 * value in the system catalogs.
-	 * 
-	 * @param rl		RowLocation of the entry in SYSCOLUMNS.
-	 * @param tc		TransactionController to use.
-	 * @param doUpdate  Write the new value to disk if TRUE.
-	 * @param newValue	A NumberDataValue to use to return incremented value. If
-	 * null, then the caller simply wants the current value fromd disk.
-	 * @param wait		If true, then the caller wants to wait for locks. When
-	 * using a nested user xaction we want to timeout right away if the parent
-	 * holds the lock.
-	 */
-	public NumberDataValue 	getSetAutoincrementValue(RowLocation rl,
-											 TransactionController tc,
-											 boolean doUpdate,
-											 NumberDataValue newValue,
-											 boolean wait)
-		throws StandardException;
-
-	/**
 	 * sets a new value in SYSCOLUMNS for a particular
 	 * autoincrement column.
 	 * 
@@ -1759,21 +1736,22 @@ public interface DataDictionary
 		throws StandardException;
 	
 	/**
-	 * Get the next number from an ANSI/ISO sequence generator
-     * which was created with the CREATE SEQUENCE statement. May
-     * raise an exception if the sequence was defined as NO CYCLE and
-     * the range of the sequence is exhausted. May allocate a range of
-     * sequence numbers and update the CURRENTVALUE column of the
-     * corresponding row in SYSSEQUENCES. This work is done in the
+	 * Get the next number from an identity or sequence generator
+     * which was created with the CREATE TABLE or CREATE SEQUENCE statement. May
+     * raise an exception if the generator was defined as NO CYCLE and
+     * the range of the generator is exhausted. May allocate a range of
+     * numbers and update the current column of the
+     * corresponding row in SYSCOLULMNS or SYSSEQUENCES. This work is done in the
      * execution transaction of the current session.
 	 * 
-	 * @param sequenceUUIDstring String value of the UUID which identifies the sequence
-	 * @param returnValue This is a data value to be stuffed with the next sequence number.
+	 * @param catalogNumber Number of the catalog that manages the values (either SYSCOLUMNS_CATALOG_NUM or SYSSEQUENCES_CATALOG_NUM)
+	 * @param uuidString String value of the UUID which identifies the table or the sequence
+	 * @param returnValue This is a data value to be stuffed with the next number in the range.
      *
-     * @throws StandardException if the sequence does not cycle and its range is exhausted
+     * @throws StandardException if the generator does not cycle and its range is exhausted
 	 */
     public void getCurrentValueAndAdvance
-        ( String sequenceUUIDstring, NumberDataValue returnValue )
+        ( int catalogNumber, String uuidString, NumberDataValue returnValue )
         throws StandardException;
 
 	/**

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SequenceDescriptor.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SequenceDescriptor.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SequenceDescriptor.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SequenceDescriptor.java Mon Jun 13 19:05:19 2011
@@ -32,6 +32,7 @@ import org.apache.derby.iapi.sql.depend.
 import org.apache.derby.iapi.sql.depend.Dependent;
 import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
 import org.apache.derby.iapi.types.DataTypeDescriptor;
+import org.apache.derby.iapi.types.TypeId;
 import org.apache.derby.iapi.store.access.TransactionController;
 import org.apache.derby.impl.sql.catalog.DDdependableFinder;
 
@@ -45,6 +46,9 @@ import org.apache.derby.impl.sql.catalog
 public class SequenceDescriptor extends TupleDescriptor
         implements Provider, Dependent, PrivilegedSQLObject
 {
+    // indexes into array of computed min/max values
+    public  static  final   int MIN_VALUE = 0;
+    public  static  final   int MAX_VALUE = MIN_VALUE + 1;
 
     private UUID sequenceUUID;
     private String sequenceName;
@@ -90,6 +94,35 @@ public class SequenceDescriptor extends 
         this.canCycle = canCycle;
     }
 
+    /**
+     * Compute the minimum and maximum values for a sequence range.
+     * Returns an array of two Longs. The first Long is the minimum value,
+     * The second is the maximum value.
+     */
+    public  static  Long[]  computeMinMax
+        (
+         DataTypeDescriptor dataType,
+         Object minValue,
+         Object maxValue
+         )
+    {
+        Long[]  retval = new Long[ 2 ];
+
+        if (dataType.getTypeId().equals(TypeId.SMALLINT_ID)) {
+            retval[ MIN_VALUE ] = (minValue != null ? (Long) minValue : new Long(Short.MIN_VALUE));
+            retval[ MAX_VALUE ] = (maxValue != null ? (Long) maxValue : new Long(Short.MAX_VALUE));
+        } else if (dataType.getTypeId().equals(TypeId.INTEGER_ID)) {
+            retval[ MIN_VALUE ]  = (minValue != null ? (Long) minValue : new Long(Integer.MIN_VALUE));
+            retval[ MAX_VALUE ]  = (maxValue != null ? (Long) maxValue : new Long(Integer.MAX_VALUE));
+        } else {
+            // Could only be BIGINT
+            retval[ MIN_VALUE ]  = (minValue != null ? (Long) minValue : new Long(Long.MIN_VALUE));
+            retval[ MAX_VALUE ]  = (maxValue != null ? (Long) maxValue : new Long(Long.MAX_VALUE));
+        }
+
+        return retval;
+    }
+
    /**
 	 * @see UniqueTupleDescriptor#getUUID
 	 */

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java Mon Jun 13 19:05:19 2011
@@ -385,11 +385,13 @@ public final class	DataDictionaryImpl
 	CacheManager	nameTdCache;
 	private CacheManager	spsNameCache;
     private CacheManager sequenceGeneratorCache;
+    private CacheManager idGeneratorCache;
 	private Hashtable		spsIdHash;
 	// private Hashtable       spsTextHash;
 	int				tdCacheSize;
 	int				stmtCacheSize;
     private int seqgenCacheSize;
+    private int idgenCacheSize;
 
     /* Cache of permissions data */
     CacheManager permissionsCache;
@@ -633,6 +635,10 @@ public final class	DataDictionaryImpl
 		seqgenCacheSize = PropertyUtil.intPropertyValue(Property.LANG_SEQGEN_CACHE_SIZE, value,
 									   0, Integer.MAX_VALUE, Property.LANG_SEQGEN_CACHE_SIZE_DEFAULT);
 
+		value = startParams.getProperty(Property.LANG_IDGEN_CACHE_SIZE);
+		idgenCacheSize = PropertyUtil.intPropertyValue(Property.LANG_IDGEN_CACHE_SIZE, value,
+									   0, Integer.MAX_VALUE, Property.LANG_IDGEN_CACHE_SIZE_DEFAULT);
+
 		value = startParams.getProperty(Property.LANG_PERMISSIONS_CACHE_SIZE);
 		permissionsCacheSize = PropertyUtil.intPropertyValue(Property.LANG_PERMISSIONS_CACHE_SIZE, value,
 									   0, Integer.MAX_VALUE, Property.LANG_PERMISSIONS_CACHE_SIZE_DEFAULT);
@@ -688,6 +694,9 @@ public final class	DataDictionaryImpl
 		sequenceGeneratorCache = cf.newCacheManager
             ( this, "SequenceGeneratorCache", seqgenCacheSize, seqgenCacheSize );
 
+		idGeneratorCache = cf.newCacheManager
+            ( this, "IdentityGeneratorCache", idgenCacheSize, idgenCacheSize );
+
 		/* Get the object to coordinate cache transitions */
 		cacheCoordinator = new ShExLockable();
 
@@ -979,6 +988,7 @@ public final class	DataDictionaryImpl
 		else if ( cm == nameTdCache ) { return new NameTDCacheable( this ); }
         else if ( cm == permissionsCache ) { return new PermissionsCacheable( this ); }
         else if ( cm == sequenceGeneratorCache ) { return new SequenceUpdater.SyssequenceUpdater( this ); }
+        else if ( cm == idGeneratorCache ) { return new SequenceUpdater.SyscolumnsUpdater( this ); }
 		else { return new SPSNameCacheable( this ); }
 	}
 
@@ -8633,91 +8643,26 @@ public final class	DataDictionaryImpl
 		return rla;
 	}
     
-
-	/**
-	 * @see DataDictionary#getSetAutoincrementValue
-	 */
-	public NumberDataValue getSetAutoincrementValue(
-											RowLocation rl, 
-											TransactionController tc,
-											boolean doUpdate,
-											NumberDataValue newValue,
-											boolean wait)
-	       throws StandardException
-	{
-
-		FormatableBitSet columnToUpdate = new 
-  			FormatableBitSet(SYSCOLUMNSRowFactory.SYSCOLUMNS_COLUMN_COUNT);
-  		int columnNum = SYSCOLUMNSRowFactory.SYSCOLUMNS_AUTOINCREMENTVALUE;
-		TabInfoImpl ti = coreInfo[SYSCOLUMNS_CORE_NUM];
-  		ConglomerateController heapCC = null;
-		SYSCOLUMNSRowFactory	rf = (SYSCOLUMNSRowFactory) ti.getCatalogRowFactory();
-		ExecRow row = rf.makeEmptyRow();
-
-  		FormatableBitSet  columnToRead = new
-  			FormatableBitSet(SYSCOLUMNSRowFactory.SYSCOLUMNS_COLUMN_COUNT);
-		
-		// FormatableBitSet is 0 based.
-  		columnToRead.set(columnNum - 1); // current value.
-		columnToRead.set(columnNum);     // start value.
-		columnToRead.set(columnNum + 1); // increment value.
-
-        try
-        {
-			/* if wait is true then we need to do a wait while trying to
-			   open/fetch from the conglomerate. note we use wait both to
-			   open as well as fetch from the conglomerate.
-			*/
-            heapCC = 
-                tc.openConglomerate(
-                    ti.getHeapConglomerate(), 
-                    false,
-                    (TransactionController.OPENMODE_FORUPDATE |
-                     ((wait) ? 0 : TransactionController.OPENMODE_LOCK_NOWAIT)),
-                    TransactionController.MODE_RECORD,
-                    TransactionController.ISOLATION_REPEATABLE_READ);
-
-            boolean baseRowExists = 
-                heapCC.fetch(rl, row.getRowArray(), columnToRead, wait);
-
-            columnToUpdate.set(columnNum - 1); // current value.
-
-            // while the Row interface is 1 based.
-            NumberDataValue currentAI = (NumberDataValue)row.getColumn(columnNum);
-            long currentAIValue = currentAI.getLong();
-            
-            if (doUpdate)
-            {
-                // we increment and store the new value in SYSCOLUMNS
-                NumberDataValue increment = (NumberDataValue)row.getColumn(columnNum + 2);
-                currentAI = currentAI.plus(currentAI, increment, currentAI);
-                row.setColumn(columnNum, currentAI);
-                heapCC.replace(rl, row.getRowArray(), columnToUpdate);
-            }
-                
-            // but we return the "currentAIValue"-- i.e the value before
-            // incrementing it. 
-            if (newValue != null)
-            {
-                // user has passed in an object; set the current value in there and
-                // return it.
-                newValue.setValue(currentAIValue);
-                return newValue;
-            }
-            
-            else
+	private RowLocation computeIdentityRowLocation(TransactionController tc,
+ 													TableDescriptor td)
+ 				throws StandardException
+ 	{
+ 		int size;
+		if (!(td.tableHasAutoincrement())) { return null; }
+ 
+ 		size = td.getNumberOfColumns();
+ 
+ 		for (int i = 0; i < size; i++)
+ 		{
+ 			ColumnDescriptor cd = td.getColumnDescriptor(i + 1);
+ 			if (cd.isAutoincrement())
             {
-                // reuse the object read from row.
-                currentAI.setValue(currentAIValue);
-                return currentAI;
+				return computeRowLocation(tc, td, cd.getColumnName());
             }
-        }
-        finally
-        {
-            if (heapCC != null)
-                heapCC.close();
-        }
-	}
+ 		}
+        
+		return null;
+ 	}
 
 	private	ConglomerateDescriptor	bootstrapOneIndex
 	(
@@ -8884,10 +8829,16 @@ public final class	DataDictionaryImpl
 	{
 		nameTdCache.cleanAll();
 		nameTdCache.ageOut();
+
 		OIDTdCache.cleanAll();
 		OIDTdCache.ageOut();
+
 		sequenceGeneratorCache.cleanAll();
 		sequenceGeneratorCache.ageOut();
+
+		idGeneratorCache.cleanAll();
+		idGeneratorCache.ageOut();
+
 		if (spsNameCache != null)
 		{
 			//System.out.println("CLEARING SPS CACHE");
@@ -10013,7 +9964,8 @@ public final class	DataDictionaryImpl
 
 	/**
 	 * sets a new value in SYSCOLUMNS for a particular
-	 * autoincrement column.
+	 * autoincrement column. this throws away the sequence generator for the
+     * value so that it must be created from scratch.
 	 * 
 	 * @param tc		 Transaction Controller to use.
 	 * @param columnName Name of the column.
@@ -10063,9 +10015,23 @@ public final class	DataDictionaryImpl
 					 bArray, 
 					 colsToUpdate,
 					 tc);
+
+        // remove the generator for this identity column so that it will be reinitialized with the new value.
+        flushIdentityFromCache( tableUUID );
+        
 		return;
 	}
 
+    /**
+     * Remove an id generator from the cache so that it will have to be recreated.
+     * This method is called after changing the generator on disk.
+     */
+    private void    flushIdentityFromCache( UUID tableID ) throws StandardException
+    {
+        Cacheable   idGenerator = idGeneratorCache.findCached( tableID.toString() );
+        if ( idGenerator != null ) { idGeneratorCache.remove( idGenerator ); }
+    }
+
 	/**
 	 * Computes the RowLocation in SYSCOLUMNS for a particular 
 	 * autoincrement column.
@@ -10094,6 +10060,108 @@ public final class	DataDictionaryImpl
 	}
 
 	/**
+	 * Computes the RowLocation in SYSCOLUMNS for the identity column of a table. Also
+     * constructs a sequence descriptor describing the current state of the identity sequence.
+	 * 
+	 * @param tc			Transaction Controller to use.
+	 * @param tableIDstring UUID of the table as a string
+	 * @param rowLocation OUTPUT param for returing the row location
+	 * @param sequenceDescriptor OUTPUT param for return the sequence descriptor
+     *
+	 * @exception StandardException thrown on failure.
+	 */ 
+	void computeIdentityRowLocation
+        ( TransactionController tc, String tableIDstring, RowLocation[] rowLocation, SequenceDescriptor[] sequenceDescriptor )
+		throws StandardException								  
+	{
+        UUID    tableID = getUUIDFactory().recreateUUID( tableIDstring );
+        TableDescriptor td = getTableDescriptor( tableID );
+
+        // there should only be 1 identity column per table
+        rowLocation[ 0 ] = computeIdentityRowLocation( tc, td );
+
+		TabInfoImpl ti = coreInfo[SYSCOLUMNS_CORE_NUM];
+  		ConglomerateController heapCC = null;
+		SYSCOLUMNSRowFactory	rf = (SYSCOLUMNSRowFactory) ti.getCatalogRowFactory();
+		ExecRow row = rf.makeEmptyRow();
+		FormatableBitSet columnsToFetch = new FormatableBitSet( SYSCOLUMNSRowFactory.SYSCOLUMNS_COLUMN_COUNT );
+
+        for ( int i = 0; i < SYSCOLUMNSRowFactory.SYSCOLUMNS_COLUMN_COUNT; i++ )
+        {
+            columnsToFetch.set( i );
+        }
+
+        try
+        {
+            heapCC = 
+                tc.openConglomerate(
+                    ti.getHeapConglomerate(), 
+                    false,
+                    0,
+                    TransactionController.MODE_RECORD,
+                    TransactionController.ISOLATION_REPEATABLE_READ);
+
+            heapCC.fetch( rowLocation[ 0 ], row.getRowArray(), columnsToFetch, true );
+
+            ColumnDescriptor    cd = (ColumnDescriptor) rf.buildDescriptor( row, td, this );
+            DataTypeDescriptor  dtd = cd.getType();
+            Long[]  minMax = SequenceDescriptor.computeMinMax( dtd, null, null );
+
+            sequenceDescriptor[ 0 ] = getDataDescriptorGenerator().newSequenceDescriptor
+                (
+                 td.getSchemaDescriptor(),
+                 td.getUUID(),
+                 td.getName(),
+                 dtd,
+                 new Long( cd.getAutoincValue() ),
+                 cd.getAutoincStart(),
+                 minMax[ SequenceDescriptor.MIN_VALUE ].longValue(),
+                 minMax[ SequenceDescriptor.MAX_VALUE ].longValue(),
+                 cd.getAutoincInc(),
+                 false
+                 );
+        }
+        finally
+        {
+            if (heapCC != null) { heapCC.close(); }
+        }
+	}
+
+	/**
+	 * Set the current value of an identity sequence. This method does not perform
+     * any sanity checking but assumes that the caller knows what they are doing. If the
+     * old value on disk is not what we expect it to be, then we are in a race with another
+     * session. They won and we don't update the value on disk. However, if the old value
+     * is null, that is a signal to us that we should update the value on disk anyway.
+	 * 
+	 * @param tc			Transaction Controller to use.
+	 * @param rowLocation Row in SYSCOLUMNS to update.
+     * @param wait True if we should wait for locks
+     * @param oldValue What we expect to find in the AUTOINCREMENTVALUE column.
+     * @param newValue What to stuff into the AUTOINCREMENTVALUE column.
+	 * 
+	 * @return Returns true if the value was successfully updated, false if we lost a race with another session.
+     *
+	 * @exception StandardException thrown on failure.
+	 */
+    boolean updateCurrentIdentityValue
+        ( TransactionController tc, RowLocation rowLocation, boolean wait, Long oldValue, Long newValue )
+        throws StandardException
+    {
+        return updateCurrentSeqValue
+            (
+             tc,
+             rowLocation,
+             wait,
+             oldValue,
+             newValue,
+             coreInfo[SYSCOLUMNS_CORE_NUM],
+             SYSCOLUMNSRowFactory.SYSCOLUMNS_COLUMN_COUNT,
+             SYSCOLUMNSRowFactory.SYSCOLUMNS_AUTOINCREMENTVALUE
+             );
+    }
+    
+	/**
 	 * Computes the RowLocation in SYSSEQUENCES for a particular sequence. Also
      * constructs the sequence descriptor.
 	 * 
@@ -10151,11 +10219,55 @@ public final class	DataDictionaryImpl
         ( TransactionController tc, RowLocation rowLocation, boolean wait, Long oldValue, Long newValue )
         throws StandardException
     {
-  		int columnNum = SYSSEQUENCESRowFactory.SYSSEQUENCES_CURRENT_VALUE;
-		FormatableBitSet columnToUpdate = new FormatableBitSet( SYSSEQUENCESRowFactory.SYSSEQUENCES_COLUMN_COUNT );
-		TabInfoImpl ti = getNonCoreTI( SYSSEQUENCES_CATALOG_NUM );
+        return updateCurrentSeqValue
+            (
+             tc,
+             rowLocation,
+             wait,
+             oldValue,
+             newValue,
+             getNonCoreTI( SYSSEQUENCES_CATALOG_NUM ),
+             SYSSEQUENCESRowFactory.SYSSEQUENCES_COLUMN_COUNT,
+             SYSSEQUENCESRowFactory.SYSSEQUENCES_CURRENT_VALUE
+             );
+    }
+    
+	/**
+	 * Set the current value of an ANSI/ISO sequence or identity column. This method does not perform
+     * any sanity checking but assumes that the caller knows what they are doing. If the
+     * old value on disk is not what we expect it to be, then we are in a race with another
+     * session. They won and we don't update the value on disk. However, if the old value
+     * is null, that is a signal to us that we should update the value on disk anyway.
+	 * 
+	 * @param tc			Transaction Controller to use.
+	 * @param rowLocation Row in SYSSEQUENCES or SYSCOLUMNS to update.
+     * @param wait True if we should wait for locks
+     * @param oldValue What we expect to find in the currentvalue column.
+     * @param newValue What to stuff into the current value column.
+     * @param ti Table info for the catalog that is being updated.
+     * @param columnsInRow Number of columns in the catalog row.
+     * @param columnNum ID of the current value column
+	 * 
+	 * @return Returns true if the value was successfully updated, false if we lost a race with another session.
+     *
+	 * @exception StandardException thrown on failure.
+	 */
+    private boolean updateCurrentSeqValue
+        (
+         TransactionController tc,
+         RowLocation rowLocation,
+         boolean wait,
+         Long oldValue,
+         Long newValue,
+         TabInfoImpl    ti,
+         int    columnsInRow,
+         int    columnNum
+         )
+        throws StandardException
+    {
+		FormatableBitSet columnToUpdate = new FormatableBitSet( columnsInRow );
   		ConglomerateController heapCC = null;
-		SYSSEQUENCESRowFactory	rf = (SYSSEQUENCESRowFactory) ti.getCatalogRowFactory();
+		CatalogRowFactory	rf = ti.getCatalogRowFactory();
 		ExecRow row = rf.makeEmptyRow();
         
 		// FormatableBitSet is 0 based.
@@ -10211,13 +10323,28 @@ public final class	DataDictionaryImpl
 	 * @see org.apache.derby.iapi.sql.dictionary.DataDictionary#getCurrentValueAndAdvance
 	 */
     public void getCurrentValueAndAdvance
-        ( String sequenceUUIDstring, NumberDataValue returnValue )
+        ( int catalogNumber, String uuidString, NumberDataValue returnValue )
         throws StandardException
     {
+        CacheManager    cm = null;
         SequenceUpdater sequenceUpdater = null;
 
         try {
-            sequenceUpdater = (SequenceUpdater) sequenceGeneratorCache.find( sequenceUUIDstring );
+            switch( catalogNumber )
+            {
+            case SYSSEQUENCES_CATALOG_NUM:
+                cm = sequenceGeneratorCache;
+                break;
+
+            case SYSCOLUMNS_CATALOG_NUM:
+                cm = idGeneratorCache;
+                break;
+
+            default:
+                throw StandardException.newException( SQLState.BTREE_UNIMPLEMENTED_FEATURE );
+            }
+
+            sequenceUpdater = (SequenceUpdater) cm.find( uuidString );
 
             sequenceUpdater.getCurrentValueAndAdvance( returnValue );
         }
@@ -10225,7 +10352,7 @@ public final class	DataDictionaryImpl
         {
             if ( sequenceUpdater != null )
             {
-                sequenceGeneratorCache.release( sequenceUpdater );
+                cm.release( sequenceUpdater );
             }
         }
     }

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java Mon Jun 13 19:05:19 2011
@@ -454,13 +454,60 @@ public abstract class SequenceUpdater im
 
     ///////////////////////////////////////////////////////////////////////////////////
     //
-    // INNER CLASSES
+    // NESTED CLASSES
     //
     ///////////////////////////////////////////////////////////////////////////////////
 
     /**
      * <p>
      * Specific implementation of SequenceUpdater for the sequences managed by
+     * SYSCOLUMNS.
+     * </p>
+     */
+    public static final class SyscolumnsUpdater extends SequenceUpdater
+    {
+        private RowLocation _sequenceRowLocation;
+
+        public SyscolumnsUpdater() { super(); }
+        public SyscolumnsUpdater( DataDictionaryImpl dd ) { super( dd ); }
+    
+        //
+        // SequenceUpdater BEHAVIOR
+        //
+
+        protected SequenceGenerator createSequenceGenerator( TransactionController readOnlyTC )
+            throws StandardException
+        {
+            RowLocation[] rowLocation = new RowLocation[ 1 ];
+            SequenceDescriptor[] sequenceDescriptor = new SequenceDescriptor[ 1 ];
+            
+            _dd.computeIdentityRowLocation( readOnlyTC, _uuidString, rowLocation, sequenceDescriptor );
+            
+            _sequenceRowLocation = rowLocation[ 0 ];
+            
+            SequenceDescriptor isd = sequenceDescriptor[ 0 ];
+            
+            return new SequenceGenerator
+                (
+                 isd.getCurrentValue(),
+                 isd.canCycle(),
+                 isd.getIncrement(),
+                 isd.getMaximumValue(),
+                 isd.getMinimumValue(),
+                 isd.getStartValue(),
+                 isd.getSequenceName()
+                 );
+        }
+
+        protected boolean updateCurrentValueOnDisk( TransactionController tc, Long oldValue, Long newValue, boolean wait ) throws StandardException
+        {
+            return _dd.updateCurrentIdentityValue( tc, _sequenceRowLocation, wait, oldValue, newValue );
+        }
+    }
+
+    /**
+     * <p>
+     * Specific implementation of SequenceUpdater for the sequences managed by
      * SYSSEQUENCES.
      * </p>
      */

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java Mon Jun 13 19:05:19 2011
@@ -26,6 +26,7 @@ import org.apache.derby.iapi.services.sa
 import org.apache.derby.iapi.sql.compile.CompilerContext;
 import org.apache.derby.iapi.sql.execute.ConstantAction;
 import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
+import org.apache.derby.iapi.sql.dictionary.SequenceDescriptor;
 import org.apache.derby.iapi.types.DataTypeDescriptor;
 import org.apache.derby.iapi.reference.SQLState;
 import org.apache.derby.iapi.types.TypeId;
@@ -83,17 +84,9 @@ public class CreateSequenceNode extends 
 
         _stepValue = (stepValue != null ? (Long) stepValue : new Long(1));
 
-        if (_dataType.getTypeId().equals(TypeId.SMALLINT_ID)) {
-            _minValue = (minValue != null ? (Long) minValue : new Long(Short.MIN_VALUE));
-            _maxValue = (maxValue != null ? (Long) maxValue : new Long(Short.MAX_VALUE));
-        } else if (_dataType.getTypeId().equals(TypeId.INTEGER_ID)) {
-            _minValue = (minValue != null ? (Long) minValue : new Long(Integer.MIN_VALUE));
-            _maxValue = (maxValue != null ? (Long) maxValue : new Long(Integer.MAX_VALUE));
-        } else {
-            // Could only be BIGINT
-            _minValue = (minValue != null ? (Long) minValue : new Long(Long.MIN_VALUE));
-            _maxValue = (maxValue != null ? (Long) maxValue : new Long(Long.MAX_VALUE));
-        }
+        Long[]  minMax = SequenceDescriptor.computeMinMax( _dataType, minValue, maxValue );
+        _minValue = minMax[ SequenceDescriptor.MIN_VALUE ];
+        _maxValue = minMax[ SequenceDescriptor.MAX_VALUE ];
 
         if (initialValue != null) {
             _initialValue = (Long) initialValue;

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NextSequenceNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NextSequenceNode.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NextSequenceNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NextSequenceNode.java Mon Jun 13 19:05:19 2011
@@ -28,6 +28,7 @@ import org.apache.derby.iapi.services.co
 import org.apache.derby.iapi.services.compiler.LocalField;
 import org.apache.derby.iapi.sql.compile.CompilerContext;
 import org.apache.derby.iapi.services.classfile.VMOpcode;
+import org.apache.derby.iapi.sql.dictionary.DataDictionary;
 import org.apache.derby.iapi.sql.dictionary.SequenceDescriptor;
 import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
 
@@ -133,6 +134,7 @@ public class NextSequenceNode extends Va
         int dataTypeFormatID = sequenceDescriptor.getDataType().getNull().getTypeFormatId();
         
 		mb.pushThis();
+		mb.push( DataDictionary.SYSSEQUENCES_CATALOG_NUM );
 		mb.push( sequenceUUIDstring );
 		mb.push( dataTypeFormatID );
 		mb.callMethod
@@ -141,7 +143,7 @@ public class NextSequenceNode extends Va
              ClassName.BaseActivation,
              "getCurrentValueAndAdvance",
              ClassName.NumberDataValue,
-             2
+             3
              );
     }
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java Mon Jun 13 19:05:19 2011
@@ -670,22 +670,23 @@ public abstract class BaseActivation imp
 	}
 
 	/**
-	 * Called by generated code to get the next number in an ANSI/ISO sequence
-     * and advance the sequence. Raises an exception if the sequence was declared
+	 * Called by generated code to get the next number in an identity or sequence generator
+     * and advance the generator. Raises an exception if the generator was declared
      * NO CYCLE and its range is exhausted.
 	 *
-     * @param sequenceUUIDstring The string value of the sequence's UUID
+     * @param catalogNumber SYSCOLUMNS_CATALOG_NUM or SYSSEQUENCES_CATALOG_NUM, depending on the kind of generator
+     * @param uuidString The string value of the generator's uuid (table uuid for identity generators and sequence uuid for sequence generators)
      * @param typeFormatID The format id of the data type to be returned. E.g., StoredFormatIds.SQL_INTEGER_ID.
      *
 	 * @return The next number in the sequence
 	 */
 	protected NumberDataValue getCurrentValueAndAdvance
-        ( String sequenceUUIDstring, int typeFormatID )
+        ( int catalogNumber, String uuidString, int typeFormatID )
 	       throws StandardException
 	{
         NumberDataValue ndv = (NumberDataValue) getDataValueFactory().getNull( typeFormatID, StringDataValue.COLLATION_TYPE_UCS_BASIC );
 
-        lcc.getDataDictionary().getCurrentValueAndAdvance( sequenceUUIDstring, ndv );
+        lcc.getDataDictionary().getCurrentValueAndAdvance( catalogNumber, uuidString, ndv );
 
         return ndv;
 	}

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertConstantAction.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertConstantAction.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertConstantAction.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertConstantAction.java Mon Jun 13 19:05:19 2011
@@ -251,24 +251,6 @@ public class InsertConstantAction extend
 	public long   getAutoincIncrement(int i) { return autoincIncrement[i]; }
 
 	/**
-	 * Does the target table has autoincrement columns.
-	 *
-	 * @return 	True if the table has ai columns
-	 */
-	public boolean hasAutoincrement()
-	{
-		return (autoincRowLocation != null);
-	}
-
-	/**
-	 * gets the row location 
-	 */
-	public RowLocation[] getAutoincRowLocation()
-	{
-		return autoincRowLocation;
-	}
-	
-	/**
 	 * Get the formatID which corresponds to this class.
 	 *
 	 *	@return	the formatID of this class

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java Mon Jun 13 19:05:19 2011
@@ -350,19 +350,18 @@ class InsertResultSet extends DMLWriteRe
 		// Is this a bulkInsert or regular insert?
 		String insertMode = constants.getProperty("insertMode");
 
-                RowLocation[] rla;
-
-		if ((rla = constants.getAutoincRowLocation()) != null)
+		if ( hasAutoincrement() )
 		{
-			aiCache = 
-				new NumberDataValue[rla.length];
-			for (int i = 0; i < resultDescription.getColumnCount(); i++)
+            int cacheLength = resultDescription.getColumnCount();
+			aiCache = new NumberDataValue[ cacheLength ];
+			for (int i = 0; i < cacheLength; i++)
 			{
-				if (rla[i] == null)
-					continue;
 				ResultColumnDescriptor rcd = 
 					resultDescription.getColumnDescriptor(i + 1);
-				aiCache[i] = (NumberDataValue)rcd.getType().getNull();
+                if ( rcd.getType().getTypeId().isNumericTypeId() )
+                {
+                    aiCache[i] = (NumberDataValue)rcd.getType().getNull();
+                }
 			}
 		}
 
@@ -392,6 +391,18 @@ class InsertResultSet extends DMLWriteRe
 
 		//System.out.println("new InsertResultSet " + sourceResultSet.getClass());
 	}
+
+    /**
+     * Return true if the table has an autoincrement column.
+     */
+    private boolean hasAutoincrement()  throws StandardException
+    {
+        // Global temporary tables don't have table descriptors but they
+        // don't have identity columns either
+        TableDescriptor tabdesc = getTableDescriptor();
+        if ( tabdesc == null ) { return false; }
+        else { return tabdesc.tableHasAutoincrement(); }
+    }
 	
 	/**
 		@exception StandardException Standard Derby error policy
@@ -584,6 +595,28 @@ class InsertResultSet extends DMLWriteRe
 		}
 	}
 
+    /**
+     * Get the table descriptor if it hasn't already been looked up.
+     */
+    private TableDescriptor getTableDescriptor()
+        throws StandardException
+    {
+        if ( td == null ) { td = getDataDictionary().getTableDescriptor(constants.targetUUID); }
+
+        return td;
+    }
+    
+    /**
+     * Get the data dictionary if it hasn't already been looked up.
+     */
+    private DataDictionary getDataDictionary()
+        throws StandardException
+    {
+        if ( dd == null ) { dd = lcc.getDataDictionary(); }
+
+        return dd;
+    }
+    
 	/**
 	 * If user didn't provide columns list for auto-generated columns, then only include
 	 * columns with auto-generated values in the resultset. Those columns would be ones
@@ -768,9 +801,9 @@ class InsertResultSet extends DMLWriteRe
 				}
 				else
 				{
-					dvd = dd.getSetAutoincrementValue(
-						    constants.autoincRowLocation[index],
-							tc, false, aiCache[index], true);
+                    dvd = (NumberDataValue) aiCache[ index ].getNewNull();
+                    dd.getCurrentValueAndAdvance
+                        ( DataDictionary.SYSCOLUMNS_CATALOG_NUM, getTableDescriptor().getUUID().toString(), dvd );
 					startValue = dvd.getLong();
 				}
 				lcc.autoincrementCreateCounter(td.getSchemaName(),
@@ -789,77 +822,12 @@ class InsertResultSet extends DMLWriteRe
 
 		else
 		{
-			NumberDataValue newValue;
-			TransactionController nestedTC = null, tcToUse = tc;
-
-			try
-			{
-				nestedTC = tc.startNestedUserTransaction(false);
-				tcToUse = nestedTC;
-			}
-
-			catch (StandardException se)
-			{
-				// If I cannot start a Nested User Transaction use the parent
-				// transaction to do all the work.
-				tcToUse = tc;
-			}
-
-			try 
-			{
-				/* If tcToUse == tc, then we are using parent xaction-- this
-				   can happen if for some reason we couldn't start a nested
-				   transaction
-				*/
-				newValue = dd.getSetAutoincrementValue(
-						   constants.autoincRowLocation[index],
-						   tcToUse, true, aiCache[index], (tcToUse == tc));
-			}
+			NumberDataValue newValue = aiCache[ index ];
 
-			catch (StandardException se)
-			{
-				if (tcToUse == tc)
-				{
-					/* we've using the parent xaction and we've timed out; just
-					   throw an error and exit.
-					*/
-					throw se;
-				}
+            dd.getCurrentValueAndAdvance
+                ( DataDictionary.SYSCOLUMNS_CATALOG_NUM, getTableDescriptor().getUUID().toString(), newValue );
 
-				if (se.getMessageId().equals(SQLState.LOCK_TIMEOUT))
-				{
-					// if we couldn't do this with a nested xaction, retry with
-					// parent-- we need to wait this time!
-					newValue = dd.getSetAutoincrementValue(
-									constants.autoincRowLocation[index],
-									tc, true, aiCache[index], true);
-				}
-				else if (se.getMessageId().equals(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE))
-				{
-					// if we got an overflow error, throw a more meaningful
-					// error message
-					throw StandardException.newException(
-												 SQLState.LANG_AI_OVERFLOW,
-												 se,
-												 constants.getTableName(),
-												 constants.getColumnName(index));
-				}
-				else throw se;
-			}
-			finally 
-			{
-				// no matter what, commit the nested transaction; if something
-				// bad happened in the child xaction lets not abort the parent
-				// here.
-				if (nestedTC != null)
-				{
-					nestedTC.commit();
-					nestedTC.destroy();
-				}
-			}
-			aiCache[index] = newValue;
-			if (setIdentity)
-				identityVal = newValue.getLong();
+			if (setIdentity) { identityVal = newValue.getLong(); }
 		}
 
 		return aiCache[index];
@@ -892,7 +860,7 @@ class InsertResultSet extends DMLWriteRe
 	private void normalInsertCore(LanguageConnectionContext lcc, boolean firstExecute)
 		throws StandardException
 	{
-		boolean setUserIdentity = constants.hasAutoincrement() && isSingleRowResultSet();
+		boolean setUserIdentity = hasAutoincrement() && isSingleRowResultSet();
 		boolean	firstDeferredRow = true;
 		ExecRow	deferredRowBuffer = null;
                 long user_autoinc=0;

Modified: db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java (original)
+++ db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java Mon Jun 13 19:05:19 2011
@@ -702,7 +702,7 @@ public class EmptyDictionary implements 
 	}
 
     public void getCurrentValueAndAdvance
-        ( String sequenceUUIDstring, NumberDataValue returnValue )
+        ( int catalogNumber, String uuidString, NumberDataValue returnValue )
         throws StandardException
     {
 		// TODO Auto-generated method stub
@@ -714,13 +714,6 @@ public class EmptyDictionary implements 
 		return null;
 	}
 
-	public NumberDataValue getSetAutoincrementValue(RowLocation rl,
-			TransactionController tc, boolean doUpdate,
-			NumberDataValue newValue, boolean wait) throws StandardException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
 	public void setAutoincrementValue(TransactionController tc, UUID tableUUID,
 			String columnName, long aiValue, boolean incrementNeeded)
 			throws StandardException {

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterTableTest.java Mon Jun 13 19:05:19 2011
@@ -3006,7 +3006,7 @@ public final class AlterTableTest extend
                 "where c.referenceid = t.tableid and t.tablename='D3175'");
         JDBC.assertUnorderedResultSet(rs, new String[][]{
                     {"X", "1", "VARCHAR(12)", null, null, null, null, "D3175", "T", "R"},
-                    {"ID", "2", "INTEGER NOT NULL", "GENERATED_BY_DEFAULT", "3", "1", "1", "D3175", "T", "R"}
+                    {"ID", "2", "INTEGER NOT NULL", "GENERATED_BY_DEFAULT", "7", "1", "1", "D3175", "T", "R"}
                 });
     }
 

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AutoIncrementTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AutoIncrementTest.java?rev=1135226&r1=1135225&r2=1135226&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AutoIncrementTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AutoIncrementTest.java Mon Jun 13 19:05:19 2011
@@ -35,6 +35,9 @@ import org.apache.derbyTesting.junit.Cle
 import org.apache.derbyTesting.junit.JDBC;
 
 public class AutoIncrementTest extends BaseJDBCTestCase {
+
+    private static  final   String  SEQUENCE_OVERFLOW = "2200H";
+    
 	public AutoIncrementTest(String name)
 	{
 		super (name);
@@ -221,7 +224,7 @@ public class AutoIncrementTest extends B
 		String[][]expectedRows=new String[][]{{"0","0"},{"1","2"},{"2","4"},{"33","6"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 		rs = s.executeQuery("select COLUMNNAME, AUTOINCREMENTVALUE, AUTOINCREMENTSTART, AUTOINCREMENTINC from sys.syscolumns where COLUMNNAME = 'AIS'");
-		expectedRows=new String[][]{{"AIS","8","0","2"}};
+		expectedRows=new String[][]{{"AIS","10","0","2"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 
 	}
@@ -378,7 +381,7 @@ public class AutoIncrementTest extends B
 		expectedRows=new String[][]{{"1","1"},{"2","2"},{"3","3"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 		rs=s.executeQuery("select b.tablename, a.autoincrementvalue, a.autoincrementstart, a.autoincrementinc from sys.syscolumns a, sys.systables b where a.referenceid=b.tableid and a.columnname ='S1' and b.tablename = 'TAB1'");
-		expectedRows=new String[][]{{"TAB1","4","1","1"}};
+		expectedRows=new String[][]{{"TAB1","6","1","1"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 		s.executeUpdate("create table tab2 (lvl int, s1  bigint generated always as identity)");
 		s.executeUpdate("create trigger tab1_after2 after insert on tab3 referencing new as newrow for each row insert into tab2 (lvl) values 1,2,3");
@@ -490,7 +493,7 @@ public class AutoIncrementTest extends B
 		JDBC.assertFullResultSet(rs,expectedRows);
 		s.execute("insert into lockt1 (x) values (3)");
 		rs=s.executeQuery("select * from lock_table order by tabname, type desc, mode, cnt");
-		expectedRows=new String[][]{{"APP     ","UserTran","TABLE   ","1  ","IX","LOCKT1      ","GRANT","ACTIVE"},{"APP     ","UserTran","ROW     ","1  ","X","LOCKT1      ","GRANT","ACTIVE"},{"APP     ","UserTran","TABLE   ","1  ","IX","SYSCOLUMNS  ","GRANT","ACTIVE"},{"APP     ","UserTran","TABLE   ","1  ","S","SYSCOLUMNS  ","GRANT","ACTIVE"},{"APP     ","UserTran","ROW     ","2  ","X","SYSCOLUMNS  ","GRANT","ACTIVE"}};
+		expectedRows=new String[][]{{"APP     ","UserTran","TABLE   ","1  ","IX","LOCKT1      ","GRANT","ACTIVE"},{"APP     ","UserTran","ROW     ","1  ","X","LOCKT1      ","GRANT","ACTIVE"},{"APP     ","UserTran","TABLE   ","1  ","S","SYSCOLUMNS  ","GRANT","ACTIVE"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 		commit();
 		
@@ -596,10 +599,10 @@ public class AutoIncrementTest extends B
 		ResultSet rs;
 		Statement pst=createStatement();
 		Statement s=createStatement();
-		assertStatementError("22003", pst,"insert into ai_over1 (x) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19)");
-		assertStatementError("22003", pst,"insert into ai_over1 (x) values (1)");		
+		assertStatementError(SEQUENCE_OVERFLOW, pst,"insert into ai_over1 (x) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19)");
+		assertStatementError(SEQUENCE_OVERFLOW, pst,"insert into ai_over1 (x) values (1)");		
 		s.executeUpdate("insert into ai_over2 (x) values (1),(2),(3),(4),(5),(6),(7),(8)");
-		assertStatementError("22003", pst,"insert into ai_over2 (x) values (9),(10)");
+		assertStatementError(SEQUENCE_OVERFLOW, pst,"insert into ai_over2 (x) values (9),(10)");
 		String[][]expectedRows=new String[][]{{"1","-32760"},{"2","-32761"},{"3","-32762"},{"4","-32763"},{"5","-32764"},{"6","-32765"},{"7","-32766"},{"8","-32767"}};
 		rs=s.executeQuery("select * from ai_over2");
 		JDBC.assertFullResultSet(rs,expectedRows);		
@@ -608,12 +611,12 @@ public class AutoIncrementTest extends B
 		rs=s.executeQuery("select * from ai_over3");
 		expectedRows=new String[][]{{"1","2147483646"},{"2","2147483647"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
-		assertStatementError("22003", pst,"insert into ai_over3 (x) select x from ai_over3");			
+		assertStatementError(SEQUENCE_OVERFLOW, pst,"insert into ai_over3 (x) select x from ai_over3");			
 		//bigint overflow check		
-		s.executeUpdate("insert into ai_over4 (x) values (1),(2)");
-		assertStatementError("22003", pst,"insert into ai_over4 (x) values (3)");
+		s.executeUpdate("insert into ai_over4 (x) values (1),(2),(3)");
+		assertStatementError(SEQUENCE_OVERFLOW, pst,"insert into ai_over4 (x) values (4)");
 		rs=s.executeQuery("select * from ai_over4");
-		expectedRows=new String[][]{{"1","9223372036854775805"},{"2","9223372036854775806"}};
+		expectedRows=new String[][]{{"1","9223372036854775805"},{"2","9223372036854775806"},{"3","9223372036854775807"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 
 	}
@@ -939,7 +942,7 @@ public class AutoIncrementTest extends B
 		expectedRows=new String[][]{{"2","2"},{"2","9999"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 		rs=s.executeQuery("select COLUMNNAME, AUTOINCREMENTVALUE, AUTOINCREMENTSTART, AUTOINCREMENTINC from sys.syscolumns where COLUMNNAME = 'REC11'");
-		expectedRows=new String[][]{{"REC11","4","2","2"}};
+		expectedRows=new String[][]{{"REC11","12","2","2"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 		assertStatementError("42837",s,"alter table restartt1 alter column c12 RESTART WITH 2");
 		assertStatementError("42X49",s,"alter table restartt1 alter column rec11 RESTART WITH 2.20");
@@ -974,7 +977,7 @@ public class AutoIncrementTest extends B
 		assertStatementError("23505",s,"insert into t1lock(c12) values(3)");
 		rs=s.executeQuery("select COLUMNNAME, AUTOINCREMENTVALUE, AUTOINCREMENTSTART, AUTOINCREMENTINC from sys.syscolumns where COLUMNNAME = 'LOCKC11'");
 		//Utilities.showResultSet(rs);
-		expectedRows=new String[][]{{"LOCKC11","2","1","1"}};
+		expectedRows=new String[][]{{"LOCKC11","6","1","1"}};
 		JDBC.assertFullResultSet(rs,expectedRows);
 
 		rs=s.executeQuery("select * from t1lock");