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 2009/09/01 20:06:31 UTC

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

Author: rhillegas
Date: Tue Sep  1 18:06:30 2009
New Revision: 810151

URL: http://svn.apache.org/viewvc?rev=810151&view=rev
Log:
DERBY-712: Committed Suran Jayathilaka's create_drop_sequence_d.patch. This adds CREATE/DROP SEQUENCE commands.

Added:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java   (with props)
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DropSequenceNode.java   (with props)
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/CreateSequenceConstantAction.java   (with props)
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DropSequenceConstantAction.java   (with props)
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SequenceTest.java   (with props)
Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/depend/DependencyManager.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/SYSSEQUENCESRowFactory.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/depend/BasicDependencyManager.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
    db/derby/code/trunk/tools/jar/DBMSnodes.properties

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java Tue Sep  1 18:06:30 2009
@@ -236,8 +236,12 @@
 	// OFFSET, FETCH FIRST node
 	static final int ROW_COUNT_NODE = 223;
 
+    // sequences
+    static final int CREATE_SEQUENCE_NODE = 224;
+    static final int DROP_SEQUENCE_NODE = 225;
+
     // Final value in set, keep up to date!
-    static final int FINAL_VALUE = ROW_COUNT_NODE;
+    static final int FINAL_VALUE = DROP_SEQUENCE_NODE;
 
     /**
      * Extensions to this interface can use nodetypes > MAX_NODE_TYPE with out fear of collision

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/depend/DependencyManager.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/depend/DependencyManager.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/depend/DependencyManager.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/depend/DependencyManager.java Tue Sep  1 18:06:30 2009
@@ -35,7 +35,7 @@
 	The dependency manager tracks needs that dependents have of providers. This
 	is a general purpose interface which is associated with a
 	DataDictinary object; infact the dependencymanager is really the
-	datadictionary keeping track of dependcies between objects that it handles
+	datadictionary keeping track of dependencies between objects that it handles
 	(descriptors) as well as prepared statements.
 	<p>
 	The primary example of this is a prepared statement's needs of 
@@ -335,7 +335,9 @@
 	// current role for privileges by recreating the activation.
 	public static final int RECHECK_PRIVILEGES = 48;
 
-	/**
+    public static final int DROP_SEQUENCE = 49;
+
+    /**
      * Extensions to this interface may use action codes > MAX_ACTION_CODE without fear of
      * clashing with action codes in this base interface.
      */

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=810151&r1=810150&r2=810151&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 Tue Sep  1 18:06:30 2009
@@ -24,19 +24,22 @@
 import org.apache.derby.catalog.UUID;
 import org.apache.derby.catalog.DependableFinder;
 import org.apache.derby.catalog.Dependable;
-import org.apache.derby.catalog.TypeDescriptor;
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.services.sanity.SanityManager;
 import org.apache.derby.iapi.services.io.StoredFormatIds;
 import org.apache.derby.iapi.sql.depend.Provider;
+import org.apache.derby.iapi.sql.depend.DependencyManager;
+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.store.access.TransactionController;
 import org.apache.derby.impl.sql.catalog.DDdependableFinder;
 
 /**
  * This class is used by rows in the SYS.SYSSEQUENCES system table.
  */
 public class SequenceDescriptor extends TupleDescriptor
-        implements Provider, UniqueSQLObjectDescriptor {
+        implements Provider, Dependent, UniqueSQLObjectDescriptor {
 
     private UUID sequenceUUID;
     private String sequenceName;
@@ -107,6 +110,86 @@
         }
     }
 
+    /**
+     * Drop this sequence descriptor
+     *
+     * @throws StandardException Could not be dropped.
+     */
+    public void drop(LanguageConnectionContext lcc) throws StandardException
+    {
+        DataDictionary dd = getDataDictionary();
+        DependencyManager dm = getDataDictionary().getDependencyManager();
+        TransactionController tc = lcc.getTransactionExecute();
+
+        // invalidate compiled statements which depend on this sequence
+        dm.invalidateFor(this, DependencyManager.DROP_SEQUENCE, lcc);
+
+        // drop the sequence
+        dd.dropSequenceDescriptor(this, tc);
+
+        // Clear the dependencies for the sequence
+        dm.clearDependencies(lcc, this);
+
+    }
+
+    /**
+	 * Check that all of the dependent's dependencies are valid.
+	 *
+	 * @return true if the dependent is currently valid
+	 */
+	public synchronized boolean isValid()
+	{
+		return true;
+	}
+
+    /**
+	 * Prepare to mark the dependent as invalid (due to at least one of
+	 * its dependencies being invalid).
+	 *
+	 * @param action	The action causing the invalidation
+	 * @param p			the provider
+	 * @param lcc		the language connection context
+	 *
+	 * @exception StandardException thrown if unable to make it invalid
+	 */
+	public void prepareToInvalidate
+	(
+		Provider 					p,
+		int							action,
+		LanguageConnectionContext	lcc
+	) throws StandardException
+	{
+		switch (action)
+		{   			
+			default:
+				break;
+		}
+	}
+    /**
+	 * Mark the dependent as invalid (due to at least one of
+	 * its dependencies being invalid).
+	 *
+	 * @param 	lcc the language connection context
+	 * @param	action	The action causing the invalidation
+	 *
+	 * @exception StandardException thrown if called in sanity mode
+	 */
+	public void makeInvalid(int action, LanguageConnectionContext lcc) throws StandardException
+	{
+		switch (action)
+		{
+			// invalidate this sequence descriptor
+			case DependencyManager.USER_RECOMPILE_REQUEST:
+				DependencyManager dm = getDataDictionary().getDependencyManager();
+				dm.invalidateFor(this, DependencyManager.PREPARED_STATEMENT_RELEASE, lcc);
+				break;
+
+			default:
+				break;
+		}
+
+	}
+
     public String getName() {
         return sequenceName;
     }
@@ -115,6 +198,19 @@
         return schemaDescriptor;
     }
 
+    /**
+     * @see TupleDescriptor#getDescriptorType
+     */
+    public String getDescriptorType() {
+        return "Sequence";
+    }
+
+    /**
+     * @see TupleDescriptor#getDescriptorName
+     */
+    public String getDescriptorName() {
+        return sequenceName; }
+
     //////////////////////////////////////////////
     //
     // PROVIDER INTERFACE

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SYSSEQUENCESRowFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SYSSEQUENCESRowFactory.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SYSSEQUENCESRowFactory.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SYSSEQUENCESRowFactory.java Tue Sep  1 18:06:30 2009
@@ -232,8 +232,18 @@
         suuid = getUUIDFactory().recreateUUID(schemaIdString);
 
         // fourth column is the data type of this sequene generator
-        DataTypeDescriptor dataType = (DataTypeDescriptor) row.getColumn(SYSSEQUENCES_SEQUENCEDATATYPE).
+        /*
+          ** What is stored in the column is a TypeDescriptorImpl, which
+          ** points to a BaseTypeIdImpl.  These are simple types that are
+          ** intended to be movable to the client, so they don't have
+          ** the entire implementation.  We need to wrap them in DataTypeServices
+          ** and TypeId objects that contain the full implementations for
+          ** language processing.
+          */
+        TypeDescriptor catalogType = (TypeDescriptor) row.getColumn(SYSSEQUENCES_SEQUENCEDATATYPE).
                 getObject();
+        DataTypeDescriptor dataTypeServices =
+                DataTypeDescriptor.getType(catalogType);
 
         col = row.getColumn(SYSSEQUENCES_CURRENT_VALUE);
         currentValue = col.getLong();
@@ -257,7 +267,7 @@
                 (dd.getSchemaDescriptor(suuid, null),
                         ouuid,
                         sequenceName,
-                        dataType,
+                        dataTypeServices,
                         currentValue,
                         startValue,
                         minimumValue,

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java Tue Sep  1 18:06:30 2009
@@ -91,7 +91,9 @@
 
 	static final String CREATE_SCHEMA_NODE_NAME = "org.apache.derby.impl.sql.compile.CreateSchemaNode";
 
-	static final String CREATE_TABLE_NODE_NAME = "org.apache.derby.impl.sql.compile.CreateTableNode";
+    static final String CREATE_SEQUENCE_NODE_NAME = "org.apache.derby.impl.sql.compile.CreateSequenceNode";
+
+    static final String CREATE_TABLE_NODE_NAME = "org.apache.derby.impl.sql.compile.CreateTableNode";
 
 	static final String CREATE_TRIGGER_NODE_NAME = "org.apache.derby.impl.sql.compile.CreateTriggerNode";
 
@@ -126,7 +128,9 @@
 
 	static final String DROP_SCHEMA_NODE_NAME = "org.apache.derby.impl.sql.compile.DropSchemaNode";
 
-	static final String DROP_TABLE_NODE_NAME = "org.apache.derby.impl.sql.compile.DropTableNode";
+    static final String DROP_SEQUENCE_NODE_NAME = "org.apache.derby.impl.sql.compile.DropSequenceNode";
+
+    static final String DROP_TABLE_NODE_NAME = "org.apache.derby.impl.sql.compile.DropTableNode";
 
 	static final String DROP_TRIGGER_NODE_NAME = "org.apache.derby.impl.sql.compile.DropTriggerNode";
 

Added: 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=810151&view=auto
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java (added)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java Tue Sep  1 18:06:30 2009
@@ -0,0 +1,106 @@
+/*
+
+   Derby - Class org.apache.derby.impl.sql.compile.CreateSequenceNode
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to you under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+
+package org.apache.derby.impl.sql.compile;
+
+import org.apache.derby.iapi.error.StandardException;
+import org.apache.derby.iapi.services.sanity.SanityManager;
+import org.apache.derby.iapi.sql.compile.CompilerContext;
+import org.apache.derby.iapi.sql.execute.ConstantAction;
+import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
+
+/**
+ * A CreateSequenceNode is the root of a QueryTree that
+ * represents a CREATE SEQUENCE statement.
+ */
+
+public class CreateSequenceNode extends DDLStatementNode {
+    private TableName sequenceName;
+
+    public static final int SEQUENCE_ELEMENT_COUNT = 1;
+
+    /**
+     * Initializer for a CreateSequenceNode
+     *
+     * @param sequenceName The name of the new sequence
+     * @throws org.apache.derby.iapi.error.StandardException
+     *          Thrown on error
+     */
+    public void init(Object sequenceName) throws StandardException {
+        this.sequenceName = (TableName) sequenceName;
+        initAndCheck(sequenceName);
+
+        // automcatically create the schema if it doesn't exist
+        implicitCreateSchema = true;
+    }
+
+    /**
+     * Convert this object to a String.  See comments in QueryTreeNode.java
+     * for how this should be done for tree printing.
+     *
+     * @return This object as a String
+     */
+
+    public String toString() {
+        if (SanityManager.DEBUG) {
+            return super.toString() +
+                    "sequenceName: " + "\n" + sequenceName + "\n";
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * Bind this CreateSequenceNode.
+     * The main objectives of this method are to resolve the schema name, determine privilege checks,
+     * and vet the variables in the CREATE SEQUENCE statement.
+     */
+    public void bindStatement() throws StandardException {
+        CompilerContext cc = getCompilerContext();
+
+        // implicitly create the schema if it does not exist.
+        // this method also compiles permissions checks
+        SchemaDescriptor sd = getSchemaDescriptor();
+
+//        sequenceName.bind( getDataDictionary() );
+        // set the default schema name if the user did not explicitly specify a schema
+        if (sequenceName.getSchemaName() == null) {
+            sequenceName.setSchemaName(sd.getSchemaName());
+        }
+    }
+
+    public String statementToString() {
+        return "CREATE SEQUENCE";
+    }
+
+    // We inherit the generate() method from DDLStatementNode.
+
+    /**
+     * Create the Constant information that will drive the guts of Execution.
+     *
+     * @throws org.apache.derby.iapi.error.StandardException
+     *          Thrown on failure
+     */
+    public ConstantAction makeConstantAction() {
+        return getGenericConstantActionFactory().
+                getCreateSequenceConstantAction(sequenceName);
+    }
+}

Propchange: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateSequenceNode.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DropSequenceNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DropSequenceNode.java?rev=810151&view=auto
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DropSequenceNode.java (added)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DropSequenceNode.java Tue Sep  1 18:06:30 2009
@@ -0,0 +1,90 @@
+/*
+
+   Derby - Class org.apache.derby.impl.sql.compile.DropSequenceNode
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to you under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+
+package org.apache.derby.impl.sql.compile;
+
+import org.apache.derby.iapi.sql.execute.ConstantAction;
+import org.apache.derby.iapi.reference.SQLState;
+import org.apache.derby.iapi.error.StandardException;
+import org.apache.derby.iapi.sql.dictionary.DataDictionary;
+import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
+import org.apache.derby.iapi.sql.dictionary.SequenceDescriptor;
+
+/**
+ * A DropSequenceNode  represents a DROP SEQUENCE statement.
+ */
+
+public class DropSequenceNode extends DDLStatementNode {
+    private TableName dropItem;
+
+    /**
+     * Initializer for a DropSequenceNode
+     *
+     * @param dropSequenceName The name of the sequence being dropped
+     * @throws StandardException
+     */
+    public void init(Object dropSequenceName)
+            throws StandardException {
+        dropItem = (TableName) dropSequenceName;
+        initAndCheck(dropItem);
+    }
+
+    public String statementToString() {
+        return "DROP ".concat(dropItem.getTableName());
+    }
+
+    /**
+     * Bind this DropSequenceNode.
+     *
+     * @throws StandardException Thrown on error
+     */
+    public void bindStatement() throws StandardException {
+        DataDictionary dataDictionary = getDataDictionary();
+        String sequenceName = getRelativeName();
+
+        SequenceDescriptor seqDesc = null;
+        SchemaDescriptor sd = getSchemaDescriptor();
+
+        if (sd.getUUID() != null) {
+            seqDesc = dataDictionary.getSequenceDescriptor
+                    (sd, sequenceName);
+        }
+        if (seqDesc == null) {
+            throw StandardException.newException(SQLState.LANG_OBJECT_DOES_NOT_EXIST, statementToString(), sequenceName);
+        }
+
+        // Statement is dependent on the SequenceDescriptor
+        getCompilerContext().createDependency(seqDesc);
+    }
+
+    // inherit generate() method from DDLStatementNode
+
+
+    /**
+     * Create the Constant information that will drive the guts of Execution.
+     *
+     * @throws StandardException Thrown on failure
+     */
+    public ConstantAction makeConstantAction() throws StandardException {
+        return getGenericConstantActionFactory().getDropSequenceConstantAction(getSchemaDescriptor(), getRelativeName());
+	}
+
+}

Propchange: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DropSequenceNode.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java Tue Sep  1 18:06:30 2009
@@ -626,7 +626,13 @@
           case C_NodeTypes.ROW_COUNT_NODE:
             return C_NodeNames.ROW_COUNT_NODE_NAME;
 
-		  // WARNING: WHEN ADDING NODE TYPES HERE, YOU MUST ALSO ADD
+          case C_NodeTypes.CREATE_SEQUENCE_NODE:
+            return C_NodeNames.CREATE_SEQUENCE_NODE_NAME;
+
+          case C_NodeTypes.DROP_SEQUENCE_NODE:
+            return C_NodeNames.DROP_SEQUENCE_NODE_NAME;
+
+          // WARNING: WHEN ADDING NODE TYPES HERE, YOU MUST ALSO ADD
 		  // THEM TO tools/jar/DBMSnodes.properties
 
 		  default:

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj Tue Sep  1 18:06:30 2009
@@ -2822,7 +2822,8 @@
             statementNode = viewDefinition(beginToken) |
             statementNode = triggerDefinition() |
             statementNode = synonymDefinition() |
-            statementNode = roleDefinition()
+            statementNode = roleDefinition() |
+            statementNode = sequenceDefinition()
         )
         {
         }
@@ -2859,7 +2860,8 @@
             statementNode = dropAliasStatement() |
             statementNode = dropViewStatement() |
             statementNode = dropTriggerStatement() |
-            statementNode = dropRoleStatement()
+            statementNode = dropRoleStatement() |
+            statementNode = dropSequenceStatement()
         )
 	{
 		return statementNode;
@@ -9807,6 +9809,47 @@
 	}
 }
 
+/*
+ * <A NAME="sequenceDefinition">sequenceDefinition</A>
+ */
+StatementNode
+sequenceDefinition() throws StandardException :
+{
+	TableName qualifiedSequenceName = null;
+}
+{
+	<SEQUENCE> qualifiedSequenceName = qualifiedName(Limits.MAX_IDENTIFIER_LENGTH)
+	{
+		checkVersion( DataDictionary.DD_VERSION_DERBY_10_6, "SEQUENCES");
+		return (StatementNode) nodeFactory.getNode(
+			C_NodeTypes.CREATE_SEQUENCE_NODE,
+			qualifiedSequenceName,
+			getContextManager());
+	}
+}
+
+/*
+ * <A NAME="dropSequenceStatement">dropSequenceStatement</A>
+ */
+StatementNode
+dropSequenceStatement() throws StandardException :
+{
+	TableName sequenceName;
+}
+{
+	/*
+	 * DROP SEQUENCE <sequencename>
+	 */
+	<SEQUENCE> sequenceName = qualifiedName(Limits.MAX_IDENTIFIER_LENGTH)
+	{
+		checkVersion( DataDictionary.DD_VERSION_DERBY_10_6, "SEQUENCES");
+
+		return (StatementNode) nodeFactory.getNode(
+			C_NodeTypes.DROP_SEQUENCE_NODE,
+			sequenceName,
+			getContextManager());
+	}
+}
 
 /*
  * <A NAME="tableDefinition">tableDefinition</A>

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/depend/BasicDependencyManager.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/depend/BasicDependencyManager.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/depend/BasicDependencyManager.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/depend/BasicDependencyManager.java Tue Sep  1 18:06:30 2009
@@ -886,7 +886,10 @@
 		    case RECHECK_PRIVILEGES:
 				return "RECHECK PRIVILEGES";
 
-			default:
+            case DROP_SEQUENCE:
+				return "DROP SEQUENCE";
+
+            default:
 				if (SanityManager.DEBUG)
 				{
 					SanityManager.THROWASSERT("getActionString() passed an invalid value (" + action + ")");

Added: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/CreateSequenceConstantAction.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/CreateSequenceConstantAction.java?rev=810151&view=auto
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/CreateSequenceConstantAction.java (added)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/CreateSequenceConstantAction.java Tue Sep  1 18:06:30 2009
@@ -0,0 +1,108 @@
+/*
+
+   Derby - Class org.apache.derby.impl.sql.execute.CreateSequenceConstantAction
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to you under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+
+package org.apache.derby.impl.sql.execute;
+
+import org.apache.derby.iapi.error.StandardException;
+import org.apache.derby.iapi.sql.Activation;
+import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
+import org.apache.derby.iapi.sql.dictionary.SequenceDescriptor;
+import org.apache.derby.iapi.sql.dictionary.DataDictionary;
+import org.apache.derby.iapi.sql.dictionary.DataDescriptorGenerator;
+import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
+import org.apache.derby.iapi.store.access.TransactionController;
+import org.apache.derby.iapi.types.DataTypeDescriptor;
+import org.apache.derby.shared.common.reference.SQLState;
+
+/**
+ * This class performs actions that are ALWAYS performed for a
+ * CREATE SEQUENCE statement at execution time.
+ * These SQL objects are stored in the SYS.SYSSEQUENCES table.
+ */
+class CreateSequenceConstantAction extends DDLConstantAction {
+
+    private String sequenceName;
+    private String schemaName;
+
+    // CONSTRUCTORS
+    /**
+     * Make the ConstantAction for a CREATE SEQUENCE statement.
+     * When executed, will create a sequence by the given name.
+     *
+     * @param sequenceName The name of the sequence being created
+     */
+    public CreateSequenceConstantAction(String schemaName, String sequenceName) {
+        this.schemaName = schemaName;
+        this.sequenceName = sequenceName;
+    }
+
+    // INTERFACE METHODS
+
+    /**
+     * This is the guts of the Execution-time logic for CREATE SEQUENCE.
+     *
+     * @throws org.apache.derby.iapi.error.StandardException
+     *          Thrown on failure
+     * @see org.apache.derby.iapi.sql.execute.ConstantAction#executeConstantAction
+     */
+    public void executeConstantAction(Activation activation)
+            throws StandardException {
+        SchemaDescriptor schemaDescriptor;
+        LanguageConnectionContext lcc =
+                activation.getLanguageConnectionContext();
+        DataDictionary dd = lcc.getDataDictionary();
+        TransactionController tc = lcc.getTransactionExecute();
+        DataDescriptorGenerator ddg = dd.getDataDescriptorGenerator();
+
+        dd.startWriting(lcc);
+
+        schemaDescriptor = DDLConstantAction.getSchemaDescriptorForCreate(dd, activation, schemaName);
+
+        //
+        // Check if this sequence already exists. If it does, throw.
+        //
+        SequenceDescriptor seqDef = dd.getSequenceDescriptor(schemaDescriptor, sequenceName);
+
+        if (seqDef != null) {
+            throw StandardException.
+                    newException(SQLState.LANG_OBJECT_ALREADY_EXISTS,
+                            seqDef.getDescriptorType(), sequenceName);
+        }
+
+        seqDef = ddg.newSequenceDescriptor(schemaDescriptor,
+                dd.getUUIDFactory().createUUID(),
+                sequenceName, DataTypeDescriptor.INTEGER_NOT_NULL, 0, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 1, false);        // is definition
+
+        dd.addDescriptor(seqDef,
+                null,  // parent
+                DataDictionary.SYSSEQUENCES_CATALOG_NUM,
+                false, // duplicatesAllowed
+                tc);
+    }
+
+    // OBJECT SHADOWS
+
+    public String toString() {
+        // Do not put this under SanityManager.DEBUG - it is needed for
+        // error reporting.
+        return "CREATE SEQUENCE " + sequenceName;
+    }
+}

Propchange: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/CreateSequenceConstantAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DropSequenceConstantAction.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DropSequenceConstantAction.java?rev=810151&view=auto
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DropSequenceConstantAction.java (added)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DropSequenceConstantAction.java Tue Sep  1 18:06:30 2009
@@ -0,0 +1,106 @@
+/*
+
+   Derby - Class org.apache.derby.impl.sql.execute.DropSequenceConstantAction
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to you under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+
+package org.apache.derby.impl.sql.execute;
+
+import org.apache.derby.iapi.error.StandardException;
+import org.apache.derby.iapi.sql.Activation;
+import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
+import org.apache.derby.iapi.sql.depend.DependencyManager;
+import org.apache.derby.iapi.sql.dictionary.DataDictionary;
+import org.apache.derby.iapi.sql.dictionary.SequenceDescriptor;
+import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
+import org.apache.derby.iapi.store.access.TransactionController;
+import org.apache.derby.shared.common.reference.SQLState;
+
+/**
+ * This class  describes actions that are ALWAYS performed for a
+ * DROP SEQUENCE Statement at Execution time.
+ */
+
+class DropSequenceConstantAction extends DDLConstantAction {
+
+
+    private final String sequenceName;
+    private final SchemaDescriptor schemaDescriptor;
+
+    // CONSTRUCTORS
+
+    /**
+     * Make the ConstantAction for a DROP SEQUENCE statement.
+     *
+     * @param sequenceName sequence name to be dropped
+     */
+    DropSequenceConstantAction(SchemaDescriptor sd, String sequenceName) {
+        this.sequenceName = sequenceName;
+        this.schemaDescriptor = sd;
+    }
+
+    ///////////////////////////////////////////////
+    //
+    // OBJECT SHADOWS
+    //
+    ///////////////////////////////////////////////
+
+    public String toString() {
+        // Do not put this under SanityManager.DEBUG - it is needed for
+        // error reporting.
+        return "DROP SEQUENCE " + sequenceName;
+    }
+
+    // INTERFACE METHODS
+
+
+    /**
+     * This is the guts of the Execution-time logic for DROP SEQUENCE.
+     *
+     * @see org.apache.derby.iapi.sql.execute.ConstantAction#executeConstantAction
+     */
+    public void executeConstantAction(Activation activation)
+            throws StandardException {
+        LanguageConnectionContext lcc =
+                activation.getLanguageConnectionContext();
+        DataDictionary dd = lcc.getDataDictionary();
+        TransactionController tc = lcc.getTransactionExecute();
+
+        /*
+        ** Inform the data dictionary that we are about to write to it.
+        ** There are several calls to data dictionary "get" methods here
+        ** that might be done in "read" mode in the data dictionary, but
+        ** it seemed safer to do this whole operation in "write" mode.
+        **
+        ** We tell the data dictionary we're done writing at the end of
+        ** the transaction.
+        */
+        dd.startWriting(lcc);
+
+        SequenceDescriptor sequenceDescriptor = dd.getSequenceDescriptor(schemaDescriptor, sequenceName);
+
+        if (sequenceDescriptor == null) {
+
+            throw StandardException.newException(SQLState.LANG_OBJECT_NOT_FOUND_DURING_EXECUTION, "SEQUENCE",
+                    (schemaDescriptor.getObjectName() + "." + sequenceName));
+        }
+
+        sequenceDescriptor.drop(lcc);
+
+    }
+}

Propchange: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DropSequenceConstantAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java Tue Sep  1 18:06:30 2009
@@ -52,6 +52,7 @@
 import org.apache.derby.catalog.AliasInfo;
 
 import org.apache.derby.iapi.services.io.FormatableBitSet;
+import org.apache.derby.impl.sql.compile.TableName;
 
 import java.util.List;
 import java.util.Properties;
@@ -318,8 +319,17 @@
 		return new SetRoleConstantAction(roleName, type);
 	}
 
+    /**
+	 * Make the ConstantAction for a CREATE SEQUENCE statement.
+	 *
+	 * @param sequenceName	Name of sequence.
+	 */
+	public	ConstantAction	getCreateSequenceConstantAction(TableName sequenceName)
+	{
+        return new CreateSequenceConstantAction(sequenceName.getSchemaName(), sequenceName.getTableName());
+	}
 
-	/**
+    /**
 	 *	Make the ConstantAction for a CREATE TABLE statement.
 	 *
 	 *  @param schemaName	name for the schema that table lives in.
@@ -570,8 +580,20 @@
 		return new DropRoleConstantAction(roleName);
 	}
 
+    /**
+	 *	Make the ConstantAction for a DROP SEQUENCE statement.
+	 *
+     *  @param sd the schema the sequence object belongs to
+	 *	@param	seqName	name of sequence to be dropped
+	 *
+	 */
+	public ConstantAction getDropSequenceConstantAction(SchemaDescriptor sd, String seqName)
+	{
+		return new DropSequenceConstantAction(sd, seqName);
+	}
+
 
-	/**
+    /**
 	 *	Make the ConstantAction for a DROP SCHEMA statement.
 	 *
 	 *	@param	schemaName			Table name.

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SequenceTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SequenceTest.java?rev=810151&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SequenceTest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SequenceTest.java Tue Sep  1 18:06:30 2009
@@ -0,0 +1,187 @@
+/*
+
+   Derby - Class org.apache.derbyTesting.functionTests.tests.lang.SequenceTest
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+package org.apache.derbyTesting.functionTests.tests.lang;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
+import org.apache.derbyTesting.junit.DatabasePropertyTestSetup;
+import org.apache.derbyTesting.junit.JDBC;
+import org.apache.derbyTesting.junit.TestConfiguration;
+
+/**
+ * Test sequences.
+ */
+public class SequenceTest extends BaseJDBCTestCase {
+
+    private static final String TEST_DBO = "TEST_DBO";
+    private static final String ALPHA = "ALPHA";
+    private static final String BETA = "BETA";
+    private static final String[] LEGAL_USERS = {TEST_DBO, ALPHA, BETA};
+
+    public SequenceTest(String name) {
+        super(name);
+        // TODO Auto-generated constructor stub
+    }
+
+    // SETUP
+
+    /**
+     * Construct top level suite in this JUnit test
+     */
+    public static Test suite() {
+        TestSuite suite = new TestSuite(SequenceTest.class, "Sequence Test");
+        // Need atleast JSR169 to run these tests
+        if (!JDBC.vmSupportsJSR169() && !JDBC.vmSupportsJDBC3()) {
+            return suite;
+        }
+
+        Test cleanTest = new CleanDatabaseTestSetup(suite);
+        Test authenticatedTest = DatabasePropertyTestSetup.builtinAuthentication
+                (cleanTest, LEGAL_USERS, "sequence");
+        Test authorizedTest = TestConfiguration.sqlAuthorizationDecorator(authenticatedTest);
+
+        return authorizedTest;
+    }
+
+    public void testCreateSequence() throws SQLException {
+        Statement s = createStatement();
+        s.executeUpdate("CREATE SEQUENCE mySeq");
+    }
+
+    public void testDropSequence() throws SQLException {
+        Statement s = createStatement();
+        s.executeUpdate("CREATE SEQUENCE mySeq1");
+        s.executeUpdate("DROP SEQUENCE mySeq1");
+    }
+
+    public void testDuplicateCreationFailure() {
+        try {
+            Statement s = createStatement();
+            s.executeUpdate("CREATE SEQUENCE mySeq1");
+            s.executeUpdate("CREATE SEQUENCE mySeq1");
+        } catch (SQLException sqle) {
+            assertSQLState("X0Y68", sqle);
+        }
+    }
+
+    public void testImplicitSchemaCreation() throws SQLException {
+        Connection adminCon = openUserConnection(TEST_DBO);
+
+        Connection alphaCon = openUserConnection(ALPHA);
+        Statement stmt = alphaCon.createStatement();
+
+        // should implicitly create schema ALPHA
+        stmt.executeUpdate("CREATE SEQUENCE alpha_seq");
+        stmt.executeUpdate("DROP SEQUENCE alpha_seq");
+        stmt.close();
+        alphaCon.close();
+        adminCon.close();
+    }
+
+    public void testCreateWithSchemaSpecified() throws SQLException {
+
+        // create DB
+        Connection alphaCon = openUserConnection(ALPHA);
+        Statement stmt = alphaCon.createStatement();
+
+        // should implicitly create schema ALPHA
+        stmt.executeUpdate("CREATE SEQUENCE alpha.alpha_seq");
+        stmt.executeUpdate("DROP SEQUENCE alpha.alpha_seq");
+        stmt.close();
+        alphaCon.close();
+    }
+
+    public void testCreateWithSchemaSpecifiedCreateTrue() throws SQLException {
+        Connection alphaCon = openUserConnection(ALPHA);
+        Statement stmt = alphaCon.createStatement();
+
+        // should implicitly create schema ALPHA
+        stmt.executeUpdate("CREATE SEQUENCE alpha.alpha_seq");
+        stmt.executeUpdate("DROP SEQUENCE alpha.alpha_seq");
+        stmt.close();
+        alphaCon.close();
+    }
+
+    public void testCreateWithSchemaDropWithNoSchema() throws SQLException {
+        Connection alphaCon = openUserConnection(ALPHA);
+        Statement stmt = alphaCon.createStatement();
+
+        // should implicitly create schema ALPHA
+        stmt.executeUpdate("CREATE SEQUENCE alpha.alpha_seq");
+        stmt.executeUpdate("DROP SEQUENCE alpha_seq");
+        stmt.close();
+        alphaCon.close();
+    }
+
+    /**
+     * Test trying to drop a sequence in a schema that doesn't belong to one
+     */
+    public void testDropOtherSchemaSequence() throws SQLException {
+        Connection adminCon = openUserConnection(TEST_DBO);
+
+        Connection alphaCon = openUserConnection(ALPHA);
+        Statement stmtAlpha = alphaCon.createStatement();
+        stmtAlpha.executeUpdate("CREATE SEQUENCE alpha_seq");
+
+        Connection betaCon = openUserConnection(BETA);
+        Statement stmtBeta = betaCon.createStatement();
+
+        // should implicitly create schema ALPHA
+        assertStatementError("42507", stmtBeta, "DROP SEQUENCE alpha.alpha_seq");
+
+        stmtAlpha.close();
+        stmtBeta.close();
+        alphaCon.close();
+        betaCon.close();
+        adminCon.close();
+    }
+
+    /**
+     * Test trying to create a sequence in a schema that doesn't belong to one
+     */
+    public void testCreateOtherSchemaSequence() throws SQLException {
+        // create DB
+        Connection adminCon = openUserConnection(TEST_DBO);
+
+        Connection alphaCon = openUserConnection(ALPHA);
+        Statement stmtAlpha = alphaCon.createStatement();
+
+        Connection betaCon = openUserConnection(BETA);
+        Statement stmtBeta = betaCon.createStatement();
+
+        // should implicitly create schema ALPHA
+        assertStatementError("42507", stmtBeta, "CREATE SEQUENCE alpha.alpha_seq3");
+
+        stmtAlpha.close();
+        stmtBeta.close();
+        alphaCon.close();
+        betaCon.close();
+        adminCon.close();
+    }
+
+}

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/SequenceTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java Tue Sep  1 18:06:30 2009
@@ -197,6 +197,7 @@
         suite.addTest(AlterColumnTest.suite());
         suite.addTest(UserLobTest.suite());
         suite.addTest(OffsetFetchNextTest.suite());
+        suite.addTest(SequenceTest.suite());
 
         return suite;
 	}

Modified: db/derby/code/trunk/tools/jar/DBMSnodes.properties
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/tools/jar/DBMSnodes.properties?rev=810151&r1=810150&r2=810151&view=diff
==============================================================================
--- db/derby/code/trunk/tools/jar/DBMSnodes.properties (original)
+++ db/derby/code/trunk/tools/jar/DBMSnodes.properties Tue Sep  1 18:06:30 2009
@@ -143,6 +143,8 @@
 derby.module.cloudscapenodes.gt=org.apache.derby.impl.sql.compile.RowNumberColumnNode
 derby.module.cloudscapenodes.gu=org.apache.derby.impl.sql.compile.WindowNode
 derby.module.cloudscapenodes.gv=org.apache.derby.impl.sql.compile.RowCountNode
+derby.module.cloudscapenodes.gw=org.apache.derby.impl.sql.compile.CreateSequenceNode
+derby.module.cloudscapenodes.gx=org.apache.derby.impl.sql.compile.DropSequenceNode
 
 # Warning: make sure this file is properly terminated with a newline,
 # else the build can fail silently. Symptom: derby.jar lacks many