[dna-commits] DNA SVN: r1553 - in trunk: dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle and 5 other directories.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Thu Jan 7 14:11:35 EST 2010


Author: blafond
Date: 2010-01-07 14:11:34 -0500 (Thu, 07 Jan 2010)
New Revision: 1553

Added:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl
Removed:
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl
Log:
DNA-49 Oracle Sequencer/Parser fixes/changes. Cleaned up COMMIT statements & added Create Materialized View

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -24,7 +24,6 @@
 package org.jboss.dna.test.integration.sequencer.ddl.dialect.oracle;
 
 import static org.junit.Assert.assertEquals;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -39,7 +38,6 @@
 import org.junit.Test;
 
 /**
- * @author blafond
  *
  */
 public class OracleDdlSequencerIntegrationTest extends DdlIntegrationTestUtil {
@@ -86,10 +84,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
-
     @After
     public void afterEach() throws Exception {
         if (this.session != null) {
@@ -103,9 +97,8 @@
     
     @Test
     public void shouldSequenceOracleDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
-        URL url = getUrl(resourceFolder + "oracle_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(resourceFolder, "oracle_test_statements.ddl", "shouldSequenceOracleDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -134,7 +127,77 @@
                 }
             }
         }
+    }
+    
+    @Test
+    public void shouldSequenceOracleCreateProceduresAndFunctions() throws Exception {
+
+        uploadFile(resourceFolder, "create_procedure_statements.ddl", "shouldSequenceOracleCreateProceduresAndFunctions");
         
-        System.out.println("FINISHED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(4, numStatements);
+                    
+                    //printNodeProperties(ddlNode);
+                    //remove_emp <ns001:startLineNumber = 1, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns002:createProcedureStatement, ns001:expression = 
+                    //  CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+                    //    BEGIN
+                    //       DELETE FROM employees
+                    //       WHERE employees.employee_id = remove_emp.employee_id;
+                    //    tot_emps := tot_emps - 1;
+                    //    END;
+                    //    /, ns001:startCharIndex = 0>
+                    // employee_id <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 0, jcr:mixinTypes = ns002:functionParameter, ns001:datatypeScale = 0>
+
+                    Node node = assertNode(ddlNode, "remove_emp", "oracleddl:createProcedureStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    Node paramNode = assertNode(node, "employee_id", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "NUMBER");
+                    
+                    //find_root <ns001:startLineNumber = 9, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns002:createProcedureStatement, ns001:expression = 
+                    //    CREATE PROCEDURE find_root ( x IN REAL ) 
+                    //    IS LANGUAGE C
+                    //    NAME c_find_root
+                    //    LIBRARY c_utils
+                    //    PARAMETERS ( x BY REFERENCE );, ns001:startCharIndex = 211>
+                    //     x <ns001:datatypeName = REAL, jcr:primaryType = nt:unstructured, ns002:inOutNoCopy = IN, jcr:mixinTypes = ns002:functionParameter>
+                    node = assertNode(ddlNode, "find_root", "oracleddl:createProcedureStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    paramNode = assertNode(node, "x", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "REAL");
+                    verifySimpleStringProperty(paramNode, "oracleddl:inOutNoCopy", "IN");
+                    
+                    //CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+                    //    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+                    node = assertNode(ddlNode, "SecondMax", "oracleddl:createFunctionStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    paramNode = assertNode(node, "input", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "NUMBER");
+
+                    //CREATE OR REPLACE FUNCTION text_length(a CLOB) 
+                    //   RETURN NUMBER DETERMINISTIC IS
+                    //    BEGIN 
+                    //      RETURN DBMS_LOB.GETLENGTH(a);
+                    //    END;
+                    ///
+                    node = assertNode(ddlNode, "text_length", "oracleddl:createFunctionStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    verifySimpleStringProperty(node, "ddl:datatypeName", "NUMBER");
+                    paramNode = assertNode(node, "a", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "CLOB");
+                }
+            }
+        }
     }
 }

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
@@ -51,6 +51,7 @@
 [oracleddl:operatorOperand]     > ddl:operand abstract
 [oracleddl:outlineOperand]      > ddl:operand abstract
 [oracleddl:packageOperand]      > ddl:operand abstract
+[oracleddl:parameterOperand]    > ddl:operand abstract
 [oracleddl:pfileOperand]        > ddl:operand abstract
 [oracleddl:procedureOperand]    > ddl:operand abstract
 [oracleddl:profileOperand]      > ddl:operand abstract
@@ -72,7 +73,18 @@
 // =============================================================================
 [oracleddl:columnDefinition] > ddl:columnDefinition
   - oracleddl:dropDefault (boolean)
-  
+
+//
+
+[oracleddl:functionParameter]     > oracleddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - oracleddl:default (STRING)
+  - oracleddl:defaultExpresssion (STRING)
+  - oracleddl:inOutNoCopy (STRING)
+
 // =============================================================================
 // ALTER STATEMENTS
 // =============================================================================
@@ -119,6 +131,11 @@
 [oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
 [oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
 [oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
 [oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
   - oracleddl:tableName (string) mandatory
   - oracleddl:unique (boolean)
@@ -133,6 +150,7 @@
 [oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
 [oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
 [oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
 [oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
 [oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
 [oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl	2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,24 @@
+CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+    BEGIN
+       DELETE FROM employees
+       WHERE employees.employee_id = remove_emp.employee_id;
+    tot_emps := tot_emps - 1;
+    END;
+/
+
+CREATE PROCEDURE find_root
+   ( x IN REAL ) 
+   IS LANGUAGE C
+   NAME c_find_root
+   LIBRARY c_utils
+   PARAMETERS ( x BY REFERENCE );
+   
+CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+
+CREATE OR REPLACE FUNCTION text_length(a CLOB) 
+   RETURN NUMBER DETERMINISTIC IS
+    BEGIN 
+      RETURN DBMS_LOB.GETLENGTH(a);
+    END;
+/
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -84,7 +84,28 @@
 		static final String[] STMT_ANALYZE = {"ANALYZE"};
 		static final String[] STMT_ASSOCIATE_STATISTICS = {"ASSOCIATE", "STATISTICS"};
 		static final String[] STMT_AUDIT = {"AUDIT"};
-		static final String[] STMT_COMMIT = {"COMMIT"};
+		
+		/*
+                COMMIT [ WORK ] [ [ COMMENT string ]
+                    | [ WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ] ]
+                    | FORCE string [, integer ] ] ;
+                
+                COMMIT WORK COMMENT "some comment"
+                
+                COMMIT COMMENT "some comment"
+                
+                COMMIT WORK WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ]
+                
+                COMMIT WRITE IMMEDIATE NOWAIT;
+                
+                COMMIT WORK WRITE IMMEDIATE NOWAIT;
+                
+                COMMIT FORCE "some string", 10;
+		 */
+		static final String[] STMT_COMMIT_WORK = {"COMMIT", "WORK"};
+		static final String[] STMT_COMMIT_WRITE = {"COMMIT", "WRITE"};
+		static final String[] STMT_COMMIT_FORCE = {"COMMIT", "FORCE"};
+		static final String[] STMT_COMMIT       = {"COMMIT"}; // DON"T REGISTER THIS STMT
 		static final String[] STMT_COMMENT_ON = {"COMMENT", "ON"};
 		
 		static final String[] STMT_CREATE_CLUSTER = {CREATE, "CLUSTER"};
@@ -99,7 +120,8 @@
 		static final String[] STMT_CREATE_INDEXTYPE = {CREATE, "INDEXTYPE"};
 		static final String[] STMT_CREATE_JAVA = {CREATE, "JAVA"};
 		static final String[] STMT_CREATE_LIBRARY = {CREATE, "LIBRARY"}; // PARSE UNTIL '/'
-		static final String[] STMT_CREATE_MATERIALIZED = {CREATE, "MATERIALIZED"};
+		static final String[] STMT_CREATE_MATERIALIZED_VIEW = {CREATE, "MATERIALIZED", "VIEW"};
+		static final String[] STMT_CREATE_MATERIALIZED_VEIW_LOG = {CREATE, "MATERIALIZED", "VIEW", "LOG"};
 		static final String[] STMT_CREATE_OPERATOR = {CREATE, "OPERATOR"};
 		static final String[] STMT_CREATE_OR_REPLACE_DIRECTORY = {CREATE, "OR", "REPLACE", "DIRECTORY"};    // PARSE UNTIL '/'
 		static final String[] STMT_CREATE_OR_REPLACE_FUNCTION = {CREATE, "OR", "REPLACE", "FUNCTION"};    // PARSE UNTIL '/'
@@ -108,6 +130,7 @@
 		static final String[] STMT_CREATE_OR_REPLACE_PUBLIC_OUTLINE = {CREATE,"OR", "REPLACE", "PUBLIC", "OUTLINE"}; // TODO: BML
 		static final String[] STMT_CREATE_OR_REPLACE_PRIVATE_OUTLINE = {CREATE,"OR", "REPLACE", "PRIVATE", "OUTLINE"}; // TODO: BML
 		static final String[] STMT_CREATE_OR_REPLACE_PACKAGE = {CREATE,"OR", "REPLACE", "PACKAGE"};
+		static final String[] STMT_CREATE_OR_REPLACE_PROCEDURE = {CREATE,"OR", "REPLACE", "PROCEDURE"}; // PARSE UNTIL '/'
 		static final String[] STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM = {CREATE, "OR", "REPLACE", "PUBLIC", "SYNONYM"};
 		static final String[] STMT_CREATE_OR_REPLACE_SYNONYM = {CREATE, "OR", "REPLACE", "SYNONYM"};
 		static final String[] STMT_CREATE_OR_REPLACE_TRIGGER = {CREATE, "OR", "REPLACE", "TRIGGER"}; // PARSE UNTIL '/
@@ -135,24 +158,29 @@
 		public static final String[][] CREATE_PHRASES = {
 			STMT_CREATE_CLUSTER, STMT_CREATE_CONTEXT, STMT_CREATE_CONTROLFILE, STMT_CREATE_DATABASE, STMT_CREATE_DIMENSION, 
 			STMT_CREATE_DIRECTORY, STMT_CREATE_DISKGROUP, STMT_CREATE_FUNCTION, STMT_CREATE_INDEX, STMT_CREATE_INDEXTYPE, 
-			STMT_CREATE_JAVA, STMT_CREATE_MATERIALIZED, STMT_CREATE_OPERATOR, STMT_CREATE_OR_REPLACE_DIRECTORY, 
-			STMT_CREATE_OR_REPLACE_OUTLINE,
-			STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM, STMT_CREATE_OR_REPLACE_SYNONYM,
+			STMT_CREATE_JAVA, STMT_CREATE_MATERIALIZED_VIEW, STMT_CREATE_MATERIALIZED_VEIW_LOG, STMT_CREATE_OPERATOR, 
+			STMT_CREATE_OR_REPLACE_DIRECTORY, STMT_CREATE_OR_REPLACE_FUNCTION, STMT_CREATE_LIBRARY,
+            STMT_CREATE_OR_REPLACE_LIBRARY, STMT_CREATE_OR_REPLACE_OUTLINE, STMT_CREATE_OR_REPLACE_PROCEDURE,
+			STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM, STMT_CREATE_OR_REPLACE_SYNONYM, STMT_CREATE_OR_REPLACE_PACKAGE, STMT_CREATE_OR_REPLACE_TRIGGER,
 			STMT_CREATE_OR_REPLACE_TYPE, STMT_CREATE_OUTLINE, STMT_CREATE_PACKAGE, STMT_CREATE_PFILE, STMT_CREATE_PROCEDURE, 
 			STMT_CREATE_PROFILE, STMT_CREATE_PUBLIC_DATABASE, STMT_CREATE_PUBLIC_ROLLBACK, STMT_CREATE_PUBLIC_SYNONYM, STMT_CREATE_ROLE,
-			STMT_CREATE_ROLLBACK, STMT_CREATE_SEQUENCE, STMT_CREATE_SPFILE, STMT_CREATE_SYNONYM, STMT_CREATE_TABLESPACE, 
+			STMT_CREATE_ROLLBACK, STMT_CREATE_SEQUENCE, STMT_CREATE_SPFILE, STMT_CREATE_SYNONYM, STMT_CREATE_TABLESPACE, STMT_CREATE_TRIGGER, 
 			STMT_CREATE_TYPE, STMT_CREATE_USER, STMT_CREATE_UNIQUE_INDEX, STMT_CREATE_BITMAP_INDEX,
 			STMT_CREATE_TABLESPACE, STMT_CREATE_PROCEDURE
 		};
 		
-		public static final String[][] IGNORABLE_CREATE_PHRASES_WITH_SLASHES = {
-			STMT_CREATE_LIBRARY, STMT_CREATE_OR_REPLACE_FUNCTION,
-			STMT_CREATE_OR_REPLACE_LIBRARY,
-			STMT_CREATE_OR_REPLACE_PACKAGE, STMT_CREATE_OR_REPLACE_TRIGGER,
-			STMT_CREATE_TRIGGER
-		};
+	      static final String[][] SLASHED_STMT_PHRASES = {
+	          STMT_CREATE_FUNCTION, 
+	          STMT_CREATE_LIBRARY, 
+	          STMT_CREATE_OR_REPLACE_DIRECTORY, 
+	          STMT_CREATE_OR_REPLACE_FUNCTION,
+	          STMT_CREATE_OR_REPLACE_LIBRARY, 
+	          STMT_CREATE_OR_REPLACE_PROCEDURE, 
+	          STMT_CREATE_OR_REPLACE_TRIGGER,
+	          STMT_CREATE_PACKAGE, 
+	          STMT_CREATE_PROCEDURE
+	        };
 		
-		
 		static final String[] STMT_DISASSOCIATE_STATISTICS = {"DISASSOCIATE", "STATISTICS"};
 		
 		static final String[] STMT_DROP_CLUSTER = {DROP, "CLUSTER"};
@@ -214,7 +242,8 @@
 		};
 		
 		static final String[][] MISC_PHRASES = {
-			STMT_ANALYZE, STMT_ASSOCIATE_STATISTICS, STMT_AUDIT, STMT_COMMIT, STMT_COMMENT_ON, STMT_DISASSOCIATE_STATISTICS,
+			STMT_ANALYZE, STMT_ASSOCIATE_STATISTICS, STMT_AUDIT, STMT_COMMIT_WORK, STMT_COMMIT_WRITE, STMT_COMMIT_FORCE, 
+			STMT_COMMENT_ON, STMT_DISASSOCIATE_STATISTICS,
 			STMT_EXPLAIN_PLAN, STMT_FLASHBACK, STMT_LOCK_TABLE, STMT_MERGE, STMT_NOAUDIT, STMT_PURGE, 
 			STMT_RENAME, STMT_ROLLBACK_TO_SAVEPOINT, STMT_ROLLBACK_WORK, STMT_ROLLBACK, STMT_SAVEPOINT, STMT_TRUNCATE
 		};

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -51,7 +51,8 @@
     public static final Name TYPE_CREATE_INDEXTYPE_STATEMENT 		= new BasicName(Namespace.URI, "createIndextypeStatement");
     public static final Name TYPE_CREATE_JAVA_STATEMENT 			= new BasicName(Namespace.URI, "createJavaStatement");
     public static final Name TYPE_CREATE_LIBRARY_STATEMENT 			= new BasicName(Namespace.URI, "createLibraryStatement");
-    public static final Name TYPE_CREATE_MATERIALIZED_STATEMENT 	= new BasicName(Namespace.URI, "createMaterializedStatement");
+    public static final Name TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT 	      = new BasicName(Namespace.URI, "createMaterializedViewStatement");
+    public static final Name TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT      = new BasicName(Namespace.URI, "createMaterializedViewLogStatement");
     public static final Name TYPE_CREATE_OPERATOR_STATEMENT 		= new BasicName(Namespace.URI, "createOperatorStatement");
     public static final Name TYPE_CREATE_OUTLINE_STATEMENT 			= new BasicName(Namespace.URI, "createOutlineStatement");
     public static final Name TYPE_CREATE_PACKAGE_STATEMENT 			= new BasicName(Namespace.URI, "createPackageStatement");
@@ -149,13 +150,19 @@
     
     public static final Name TYPE_RENAME_COLUMN 					= new BasicName(Namespace.URI, "renameColumn");
     public static final Name TYPE_RENAME_CONSTRAINT 				= new BasicName(Namespace.URI, "renameConstraint");
+    public static final Name TYPE_FUNCTION_PARAMETER                = new BasicName(Namespace.URI, "functionParameter");
 
     // PROPERTY NAMES
     public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType");
     public static final Name TARGET_OBJECT_NAME = new BasicName(Namespace.URI, "targetObjectName");
-    public static final Name COMMENT = new BasicName(Namespace.URI, "comment");
-    public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI, "unique");
-    public static final Name BITMAP_INDEX = new BasicName(Namespace.URI, "bitmap");
-    public static final Name TABLE_NAME = new BasicName(Namespace.URI, "tableName");
+    public static final Name COMMENT            = new BasicName(Namespace.URI, "comment");
+    public static final Name UNIQUE_INDEX       = new BasicName(Namespace.URI, "unique");
+    public static final Name BITMAP_INDEX       = new BasicName(Namespace.URI, "bitmap");
+    public static final Name TABLE_NAME         = new BasicName(Namespace.URI, "tableName");
+    public static final Name DEFAULT            = new BasicName(Namespace.URI, "default");
+    public static final Name DEFAULT_EXPRESSION = new BasicName(Namespace.URI, "defaultExpression");
+    public static final Name IN_OUT_NO_COPY     = new BasicName(Namespace.URI, "inOutNoCopy");
+    public static final Name AUTHID_VALUE       = new BasicName(Namespace.URI, "authIdValue");
+    
 
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -24,20 +24,18 @@
 package org.jboss.dna.sequencer.ddl.dialect.oracle;
 
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CREATE_VIEW_QUERY_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_OPTION_TYPE;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NEW_NAME;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_GRANT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_UNKNOWN_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.dialect.oracle.OracleDdlLexicon.*;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_PREPARE_STATEMENT;
 import java.util.ArrayList;
 import java.util.List;
 import org.jboss.dna.common.text.ParsingException;
@@ -101,7 +99,6 @@
         registerStatementStartPhrase(ALTER_PHRASES);
         registerStatementStartPhrase(CREATE_PHRASES);
         registerStatementStartPhrase(DROP_PHRASES);
-        registerStatementStartPhrase(IGNORABLE_CREATE_PHRASES_WITH_SLASHES);
         registerStatementStartPhrase(MISC_PHRASES);
         registerStatementStartPhrase(SET_PHRASES);
     }
@@ -112,29 +109,17 @@
         assert tokens != null;
         assert rootNode != null;
 
-        // We may hava a prepare statement that is followed by a missing terminator node
+        // We may have a prepare statement that is followed by a missing terminator node
         // We also may have nodes that have an extra terminator node representing the '/' backslash
         // These nodes will have type "TYPE_BACKSLASH_TERMINATOR".
 
         List<AstNode> copyOfNodes = new ArrayList<AstNode>(rootNode.getChildren());
-        AstNode prepareNode = null;
+
         AstNode complexNode = null;
-        boolean mergeNextStatement = false;
+
         for (AstNode child : copyOfNodes) {
 
-            if (prepareNode != null && mergeNextStatement) {
-                mergeNodes(tokens, prepareNode, child);
-                rootNode.removeChild(child);
-                prepareNode = null;
-            }
 
-            if (prepareNode != null && nodeFactory().hasMixinType(child, TYPE_MISSING_TERMINATOR)) {
-                mergeNextStatement = true;
-            } else {
-                prepareNode = null;
-                mergeNextStatement = false;
-            }
-
             if ((complexNode != null && nodeFactory().hasMixinType(child, TYPE_UNKNOWN_STATEMENT))
                 || (complexNode != null && nodeFactory().hasMixinType(child, TYPE_BACKSLASH_TERMINATOR))) {
                 mergeNodes(tokens, complexNode, child);
@@ -143,16 +128,13 @@
                 complexNode = null;
             }
 
-            if (nodeFactory().hasMixinType(child, TYPE_PREPARE_STATEMENT)) {
-                prepareNode = child;
-                complexNode = null;
-            } else if (nodeFactory().hasMixinType(child, TYPE_CREATE_FUNCTION_STATEMENT)
+
+            if (nodeFactory().hasMixinType(child, TYPE_CREATE_FUNCTION_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_TRIGGER_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_LIBRARY_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_PACKAGE_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_PROCEDURE_STATEMENT)) {
                 complexNode = child;
-                prepareNode = null;
             }
         }
 
@@ -249,7 +231,7 @@
             return parseStatement(tokens, STMT_ASSOCIATE_STATISTICS, parentNode, TYPE_ASSOCIATE_STATISTICS_STATEMENT);
         } else if (tokens.matches(STMT_AUDIT)) {
             return parseStatement(tokens, STMT_AUDIT, parentNode, TYPE_AUDIT_STATEMENT);
-        } else if (tokens.matches(STMT_COMMIT)) {
+        } else if (tokens.matches(STMT_COMMIT_FORCE) || tokens.matches(STMT_COMMIT_WORK) || tokens.matches(STMT_COMMIT_WRITE)) {
             return parseStatement(tokens, STMT_COMMIT, parentNode, TYPE_COMMIT_STATEMENT);
         } else if (tokens.matches(STMT_DISASSOCIATE_STATISTICS)) {
             return parseStatement(tokens, STMT_DISASSOCIATE_STATISTICS, parentNode, TYPE_DISASSOCIATE_STATISTICS_STATEMENT);
@@ -314,10 +296,10 @@
             return parseStatement(tokens, STMT_CREATE_DISKGROUP, parentNode, TYPE_CREATE_DISKGROUP_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_FUNCTION)) {
             // ============ > PARSE UNTIL '/' for STMT_CREATE_FUNCTION
-            return parseStatement(tokens, STMT_CREATE_FUNCTION, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+            return parseCreateFunctionStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_OR_REPLACE_FUNCTION)) {
             // ============ > PARSE UNTIL '/' for STMT_CREATE_OR_REPLACE_FUNCTION
-            return parseStatement(tokens, STMT_CREATE_OR_REPLACE_FUNCTION, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+            return parseCreateFunctionStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_INDEXTYPE)) {
             return parseStatement(tokens, STMT_CREATE_INDEXTYPE, parentNode, TYPE_CREATE_INDEXTYPE_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_JAVA)) {
@@ -328,8 +310,8 @@
         } else if (tokens.matches(STMT_CREATE_OR_REPLACE_LIBRARY)) {
             // ============ > PARSE UNTIL '/' STMT_CREATE_OR_REPLACE_LIBRARY
             return parseStatement(tokens, STMT_CREATE_OR_REPLACE_LIBRARY, parentNode, TYPE_CREATE_LIBRARY_STATEMENT);
-        } else if (tokens.matches(STMT_CREATE_MATERIALIZED)) {
-            return parseStatement(tokens, STMT_CREATE_MATERIALIZED, parentNode, TYPE_CREATE_MATERIALIZED_STATEMENT);
+        } else if (tokens.matches(STMT_CREATE_MATERIALIZED_VIEW)) {
+            return parseMaterializedViewStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_OPERATOR)) {
             return parseStatement(tokens, STMT_CREATE_OPERATOR, parentNode, TYPE_CREATE_OPERATOR_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_OUTLINE)) {
@@ -346,7 +328,10 @@
             return parseStatement(tokens, STMT_CREATE_PFILE, parentNode, TYPE_CREATE_PFILE_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_PROCEDURE)) {
             // ============ > PARSE UNTIL '/' for STMT_CREATE_PROCEDURE
-            return parseStatement(tokens, STMT_CREATE_PROCEDURE, parentNode, TYPE_CREATE_PROCEDURE_STATEMENT);
+            return parseCreateProcedureStatement(tokens, parentNode);
+        } else if (tokens.matches(STMT_CREATE_OR_REPLACE_PROCEDURE)) {
+            // ============ > PARSE UNTIL '/' for STMT_CREATE_PROCEDURE
+            return parseCreateProcedureStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_PROFILE)) {
             return parseStatement(tokens, STMT_CREATE_PROFILE, parentNode, TYPE_CREATE_PROFILE_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_ROLE)) {
@@ -413,7 +398,263 @@
 
         return node;
     }
+    
+    /**
+     * Parses DDL CREATE FUNCTION statement
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE FUNCTION statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateFunctionStatement( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
 
+        markStartOfStatement(tokens);
+        
+        /* ----------------------------------------------------------------------
+            CREATE [ OR REPLACE ] FUNCTION [ schema. ] function_name
+              [ ( parameter_declaration [, parameter_declaration] ) 
+              ]
+              RETURN datatype
+              [ { invoker_rights_clause
+                | DETERMINISTIC
+                | parallel_enable_clause
+                | result_cache_clause
+                }...
+              ]
+              { { AGGREGATE | PIPELINED }
+                USING [ schema. ] implementation_type
+              | [ PIPELINED ] { IS | AS } { [ declare_section ] body | call_spec }
+              } ;
+            
+            parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+        ---------------------------------------------------------------------- */
+        
+        boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_FUNCTION);
+        
+        tokens.canConsume(STMT_CREATE_FUNCTION);
+
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+        
+        if (isReplace) {
+            // TODO: SET isReplace = TRUE to node (possibly a cnd mixin of "replaceable"
+        }
+        
+        boolean ok = parseParameters(tokens, node);
+        
+        if( ok ) {
+            if( tokens.canConsume("RETURN")) {
+                DataType dType = getDatatypeParser().parse(tokens);
+                if( dType != null ) {
+                    getDatatypeParser().setPropertiesOnNode(node, dType);
+                }
+            }
+        }
+        
+        parseUntilFwdSlash(tokens, false);
+        
+        tokens.canConsume("/");
+        
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE PROCEDURE statement
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE PROCEDURE statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateProcedureStatement( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        /* ----------------------------------------------------------------------
+            CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name
+                [ ( parameter_declaration [, parameter_declaration ] ) ]
+                [ AUTHID { CURRENT_USER | DEFINER  ]
+                { IS | AS }
+                { [ declare_section ] body | call_spec | EXTERNAL} ;
+            
+             call_spec = LANGUAGE { Java_declaration | C_declaration }
+            
+             Java_declaration = JAVA NAME string
+            
+             C_declaration = 
+                C [ NAME name ]
+                    LIBRARY lib_name
+                    [ AGENT IN (argument[, argument ]...) ]
+                    [ WITH CONTEXT ]
+                    [ PARAMETERS (parameter[, parameter ]...) ]
+                    
+            parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+        ---------------------------------------------------------------------- */
+        
+        boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_PROCEDURE);
+        
+        tokens.canConsume(STMT_CREATE_PROCEDURE);
+
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_PROCEDURE_STATEMENT);
+
+        if (isReplace) {
+            // TODO: SET isReplace = TRUE to node (possibly a cnd mixin of "replaceable"
+        }
+        
+        boolean ok = parseParameters(tokens, node);
+        
+        if( ok ) {
+            if( tokens.canConsume("AUTHID")) {
+                if( tokens.canConsume("CURRENT_USER")) {
+                    node.setProperty(AUTHID_VALUE, "AUTHID CURRENT_USER");
+                } else {
+                    tokens.consume("DEFINER");
+                    node.setProperty(AUTHID_VALUE, "DEFINER");
+                }
+            }
+        }
+        
+        parseUntilFwdSlash(tokens, false);
+        
+        tokens.canConsume("/");
+        
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+    
+    
+    private boolean parseParameters( DdlTokenStream tokens, AstNode procedureNode) throws ParsingException {
+        assert tokens != null;
+        assert procedureNode != null;
+
+        //  parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+        // Assume we start with open parenthesis '(', then we parse comma separated list of function parameters
+        // which have the form:  [ parameter-Name ] DataType
+        // So, try getting datatype, if datatype == NULL, then parseName() & parse datatype, then repeat as long as next token is ","
+        
+        tokens.consume(L_PAREN); // EXPECTED
+
+        while (!tokens.canConsume(R_PAREN)) {
+
+            String paramName = parseName(tokens);
+            String inOutStr = null;
+            if( tokens.matches("IN")) {
+                if( tokens.canConsume("IN", "OUT")){
+                    if( tokens.canConsume("NOCOPY")) {
+                        inOutStr = "IN OUT NOCOPY";
+                    } else {
+                        inOutStr = "IN OUT";
+                    }
+                } else {
+                    tokens.consume("IN");
+                    inOutStr = "IN";
+                }
+                
+            } else if( tokens.matches("OUT")) {
+                if( tokens.canConsume("OUT", "NOCOPY")) {
+                    inOutStr = "OUT NOCOPY";
+                } else {
+                    tokens.consume("OUT");
+                    inOutStr = "OUT";
+                }
+            }
+            
+            DataType datatype = getDatatypeParser().parse(tokens);
+            AstNode paramNode = nodeFactory().node(paramName, procedureNode, TYPE_FUNCTION_PARAMETER);
+            if( datatype != null ) {
+                getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+            }
+            
+            if( tokens.matchesAnyOf(":=", "DEFAULT") || !tokens.matchesAnyOf(COMMA, R_PAREN)) {
+                String msg = DdlSequencerI18n.unsupportedProcedureParameterDeclaration.text(procedureNode.getProperty(StandardDdlLexicon.NAME));
+                DdlParserProblem problem = new DdlParserProblem(Problems.WARNING, getCurrentMarkedPosition(), msg);
+                addProblem(problem, procedureNode);
+                return false;
+            }
+            
+            if( inOutStr != null ) {
+                paramNode.setProperty(IN_OUT_NO_COPY, inOutStr);
+            }
+
+            tokens.canConsume(COMMA);
+        }
+        
+        return true;
+    }
+    
+    /**
+     * Parses DDL CREATE MATERIALIZED VIEW statement
+     * 
+     * This could either be a standard view or a VIEW LOG ON statement.
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE MATERIALIZED VIEW statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseMaterializedViewStatement( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        /* ----------------------------------------------------------------------
+            CREATE MATERIALIZED VIEW
+              [ schema. ]materialized_view
+              [ column_alias [, column_alias]... ]
+              [ OF [ schema. ]object_type ] .................... (MORE...)
+
+            EXAMPLES:
+            
+                CREATE MATERIALIZED VIEW LOG ON products
+                   WITH ROWID, SEQUENCE (prod_id)
+                   INCLUDING NEW VALUES;
+                
+                CREATE MATERIALIZED VIEW sales_mv
+                   BUILD IMMEDIATE
+                   REFRESH FAST ON COMMIT
+                   AS SELECT t.calendar_year, p.prod_id, 
+                      SUM(s.amount_sold) AS sum_sales
+                      FROM times t, products p, sales s
+                      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id
+                      GROUP BY t.calendar_year, p.prod_id;
+        ---------------------------------------------------------------------- */
+        
+        boolean isLog = tokens.canConsume(STMT_CREATE_MATERIALIZED_VEIW_LOG);
+        
+        tokens.canConsume(STMT_CREATE_MATERIALIZED_VIEW);
+
+        String name = parseName(tokens);
+
+        AstNode node = null;
+        
+        if( isLog ) {
+            node = nodeFactory().node(name, parentNode, TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT);
+        } else {
+            node = nodeFactory().node(name, parentNode, TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT);
+        }
+        
+        parseUntilTerminator(tokens);
+        
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+
+    
     @Override
     protected AstNode parseGrantStatement( DdlTokenStream tokens,
                                            AstNode parentNode ) throws ParsingException {
@@ -1192,7 +1433,7 @@
 
         // TODO: Oracle has changed some things between versions 9i, and 10/11,
         // Basically they've added column properties (i.e. SORT option, ENCRYPT encryption_spec)
-        // Need to 1) Override parseColumnDefinition to handle these.
+        // Need to 1) Override parseColumnDefinition shouldParseOracleProceduresAndFunctionsto handle these.
 
         String tableElementString = getTableElementsString(tokens, false);
 
@@ -1265,17 +1506,32 @@
                                        boolean stopAtStatementStart ) throws ParsingException {
         StringBuffer sb = new StringBuffer();
         if (stopAtStatementStart) {
-            while (tokens.hasNext() && !tokens.matches(DdlTokenizer.STATEMENT_KEY) && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY)
+            while (tokens.hasNext() 
+                    
+                    && !tokens.matches(DdlTokenizer.STATEMENT_KEY) 
+                    && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY)
                 // &&
                 sb.append(SPACE).append(tokens.consume());
             }
         } else {
-            while (tokens.hasNext() && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY) &&
+            while (tokens.hasNext() 
+                    && !isFwdSlashedStatement(tokens)
+                    && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY) &&
                 sb.append(SPACE).append(tokens.consume());
             }
         }
         return sb.toString();
     }
+    
+    private boolean isFwdSlashedStatement( DdlTokenStream tokens ) throws ParsingException {
+        for(int i=0; i< SLASHED_STMT_PHRASES.length; i++ ) {
+            if( tokens.matches(SLASHED_STMT_PHRASES[i])) {
+                return true;
+            }
+        }
+        
+        return false;
+    }
 
     private void consumeSlash( DdlTokenStream tokens ) throws ParsingException {
         tokens.canConsume("/");

Modified: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties	2010-01-07 19:11:34 UTC (rev 1553)
@@ -30,4 +30,5 @@
 unusedTokensParsingColumnDefinition = The following unused tokens were found parsing a column definition for table: {0}.
 alterTableOptionNotFound = ALTER TABLE Option not found. Check your DDL for incomplete statement near line {0}, column {1} 
 unusedTokensParsingCreateIndex = The following unused tokens were found parsing a create index statement: {0}.
-missingReturnTypeForFunction = The function {0} is missing a return data type.
\ No newline at end of file
+missingReturnTypeForFunction = The function {0} is missing a return data type.
+unsupportedProcedureParameterDeclaration  = The procedure {0} contains parameters with unsupported expression info.
\ No newline at end of file

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
@@ -1,202 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[oracleddl:clusterOperand]      > ddl:operand abstract
-[oracleddl:commentOperand]      > ddl:operand abstract
-[oracleddl:contextOperand]      > ddl:operand abstract
-[oracleddl:controlfileOperand]  > ddl:operand abstract
-[oracleddl:databaseOperand]     > ddl:operand abstract
-[oracleddl:dimensionOperand]    > ddl:operand abstract
-[oracleddl:directoryOperand]    > ddl:operand abstract
-[oracleddl:diskgroupOperand]    > ddl:operand abstract
-[oracleddl:functionOperand]     > ddl:operand abstract
-[oracleddl:indexOperand]        > ddl:operand abstract
-[oracleddl:indextypeOperand]    > ddl:operand abstract
-[oracleddl:javaOperand]         > ddl:operand abstract
-[oracleddl:libraryOperand]      > ddl:operand abstract
-[oracleddl:materializedOperand] > ddl:operand abstract
-[oracleddl:operatorOperand]     > ddl:operand abstract
-[oracleddl:outlineOperand]      > ddl:operand abstract
-[oracleddl:packageOperand]      > ddl:operand abstract
-[oracleddl:pfileOperand]        > ddl:operand abstract
-[oracleddl:procedureOperand]    > ddl:operand abstract
-[oracleddl:profileOperand]      > ddl:operand abstract
-[oracleddl:resourceOperand]     > ddl:operand abstract
-[oracleddl:roleOperand]         > ddl:operand abstract
-[oracleddl:rollbackOperand]     > ddl:operand abstract
-[oracleddl:sequenceOperand]     > ddl:operand abstract
-[oracleddl:sessionOperand]      > ddl:operand abstract
-[oracleddl:spfileOperand]       > ddl:operand abstract
-[oracleddl:systemOperand]       > ddl:operand abstract
-[oracleddl:synonymOperand]      > ddl:operand abstract
-[oracleddl:tablespaceOperand]   > ddl:operand abstract
-[oracleddl:triggerOperand]      > ddl:operand abstract
-[oracleddl:typeOperand]         > ddl:operand abstract
-[oracleddl:userOperand]         > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[oracleddl:columnDefinition] > ddl:columnDefinition
-  - oracleddl:dropDefault (boolean)
-  
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[oracleddl:alterClusterStatement]       > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:alterDatabaseStatement]      > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:alterDimensionStatement]     > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:alterDiskgroupStatement]     > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:alterFunctionStatement]      > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:alterIndexStatement]         > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:alterIndextypeStatement]     > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:alterJavaStatement]          > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:alterMaterializedStatement]  > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:alterOperatorStatement]      > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:alterOutlineStatement]       > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:alterPackageStatement]       > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:alterProcedureStatement]     > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:alterProfileStatement]       > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:alterResourceStatement]      > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
-[oracleddl:alterRoleStatement]          > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:alterRollbackStatement]      > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:alterSequenceStatement]      > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:alterSessionStatement]       > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
-[oracleddl:alterSystemStatement]        > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
-[oracleddl:alterTablespaceStatement]    > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:alterTriggerStatement]       > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:alterTypeStatement]          > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:alterUserStatement]          > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
-[oracleddl:alterViewStatement]          > ddl:alterable, ddl:statement,       ddl:viewOperand mixin
-
-[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
-  - oracleddl:newTableName (STRING)
-  + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
-  + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
-
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[oracleddl:createClusterStatement]      > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:createContextStatement]      > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:createControlfileStatement]  > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
-[oracleddl:createDatabaseStatement]     > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:createDimensionStatement]    > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
-  - oracleddl:tableName (string) mandatory
-  - oracleddl:unique (boolean)
-  - oracleddl:bitmap (boolean)
-  + * (ddl:columnReference) = ddl:columnReference multiple
-[oracleddl:createIndexTypeStatement]    > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:createJavaStatement]         > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:createLibraryStatement]      > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:createOperatorStatement]     > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:createOutlineStatement]      > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
-[oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:createSpfileStatement]       > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
-[oracleddl:createSynonymStatement]      > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:createTablespaceStatement]   > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:createTriggerStatement]      > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:createTypeStatement]         > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:createUserStatement]         > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[oracleddl:dropClusterStatement]        > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:dropContextStatement]        > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:dropDatabaseStatement]       > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:dropDimensionStatement]      > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:dropDirectoryStatement]      > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:dropDiskgroupStatement]      > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:dropFunctionStatement]       > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:dropIndexStatement]          > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:dropIndextypeStatement]      > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:dropJavaStatement]           > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:dropLibraryStatement]        > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:dropMaterializedStatement]   > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:dropOperatorStatement]       > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:dropOutlineStatement]        > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:dropPackageStatement]        > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:dropProcedureStatement]      > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:dropProfileStatement]        > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:dropRoleStatement]           > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:dropRollbackStatement]       > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:dropSequenceStatement]       > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:dropSynonymStatement]        > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:dropTablespaceStatement]     > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:dropTriggerStatement]        > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:dropTypeStatement]           > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:dropUserStatement]           > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[oracleddl:analyzeStatement]         > ddl:statement mixin
-[oracleddl:associateStatisticsStatement]     > ddl:statement mixin
-[oracleddl:auditStatement]           > ddl:statement mixin
-[oracleddl:commitStatement]          > ddl:statement mixin
-[oracleddl:commentOnStatement]       > ddl:statement, oracleddl:commentOperand mixin
-  - oracleddl:targetObjectType (STRING) mandatory
-  - oracleddl:targetObjectName (STRING)
-  - oracleddl:comment (STRING) mandatory
-[oracleddl:disassociateStatisticsStatement]     > ddl:statement mixin
-[oracleddl:explainPlanStatement]     > ddl:statement mixin
-[oracleddl:flashbackStatement]       > ddl:statement mixin
-[oracleddl:lockTableStatement]       > ddl:statement mixin
-[oracleddl:mergeStatement]           > ddl:statement mixin
-[oracleddl:nestedTableStatement]     > ddl:statement mixin
-[oracleddl:noauditStatement]         > ddl:statement mixin
-[oracleddl:purgeStatement]           > ddl:statement mixin
-[oracleddl:renameStatement]          > ddl:statement mixin
-[oracleddl:revokeStatement]          > ddl:statement mixin
-[oracleddl:rollbackStatement]        > ddl:statement mixin
-[oracleddl:setConstraintsStatement]  > ddl:statement, ddl:settable mixin
-[oracleddl:setRoleStatement]         > ddl:statement, ddl:settable mixin
-[oracleddl:setTransactionStatement]  > ddl:statement, ddl:settable mixin
-[oracleddl:truncateStatement]        > ddl:statement mixin

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,220 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[oracleddl:clusterOperand]      > ddl:operand abstract
+[oracleddl:commentOperand]      > ddl:operand abstract
+[oracleddl:contextOperand]      > ddl:operand abstract
+[oracleddl:controlfileOperand]  > ddl:operand abstract
+[oracleddl:databaseOperand]     > ddl:operand abstract
+[oracleddl:dimensionOperand]    > ddl:operand abstract
+[oracleddl:directoryOperand]    > ddl:operand abstract
+[oracleddl:diskgroupOperand]    > ddl:operand abstract
+[oracleddl:functionOperand]     > ddl:operand abstract
+[oracleddl:indexOperand]        > ddl:operand abstract
+[oracleddl:indextypeOperand]    > ddl:operand abstract
+[oracleddl:javaOperand]         > ddl:operand abstract
+[oracleddl:libraryOperand]      > ddl:operand abstract
+[oracleddl:materializedOperand] > ddl:operand abstract
+[oracleddl:operatorOperand]     > ddl:operand abstract
+[oracleddl:outlineOperand]      > ddl:operand abstract
+[oracleddl:packageOperand]      > ddl:operand abstract
+[oracleddl:parameterOperand]    > ddl:operand abstract
+[oracleddl:pfileOperand]        > ddl:operand abstract
+[oracleddl:procedureOperand]    > ddl:operand abstract
+[oracleddl:profileOperand]      > ddl:operand abstract
+[oracleddl:resourceOperand]     > ddl:operand abstract
+[oracleddl:roleOperand]         > ddl:operand abstract
+[oracleddl:rollbackOperand]     > ddl:operand abstract
+[oracleddl:sequenceOperand]     > ddl:operand abstract
+[oracleddl:sessionOperand]      > ddl:operand abstract
+[oracleddl:spfileOperand]       > ddl:operand abstract
+[oracleddl:systemOperand]       > ddl:operand abstract
+[oracleddl:synonymOperand]      > ddl:operand abstract
+[oracleddl:tablespaceOperand]   > ddl:operand abstract
+[oracleddl:triggerOperand]      > ddl:operand abstract
+[oracleddl:typeOperand]         > ddl:operand abstract
+[oracleddl:userOperand]         > ddl:operand abstract
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[oracleddl:columnDefinition] > ddl:columnDefinition
+  - oracleddl:dropDefault (boolean)
+
+//
+
+[oracleddl:functionParameter]     > oracleddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - oracleddl:default (STRING)
+  - oracleddl:defaultExpresssion (STRING)
+  - oracleddl:inOutNoCopy (STRING)
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[oracleddl:alterClusterStatement]       > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:alterDatabaseStatement]      > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:alterDimensionStatement]     > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:alterDiskgroupStatement]     > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:alterFunctionStatement]      > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:alterIndexStatement]         > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:alterIndextypeStatement]     > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:alterJavaStatement]          > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:alterMaterializedStatement]  > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:alterOperatorStatement]      > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:alterOutlineStatement]       > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:alterPackageStatement]       > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:alterProcedureStatement]     > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:alterProfileStatement]       > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:alterResourceStatement]      > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
+[oracleddl:alterRoleStatement]          > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:alterRollbackStatement]      > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:alterSequenceStatement]      > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:alterSessionStatement]       > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
+[oracleddl:alterSystemStatement]        > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
+[oracleddl:alterTablespaceStatement]    > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:alterTriggerStatement]       > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:alterTypeStatement]          > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:alterUserStatement]          > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
+[oracleddl:alterViewStatement]          > ddl:alterable, ddl:statement,       ddl:viewOperand mixin
+
+[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
+  - oracleddl:newTableName (STRING)
+  + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
+  + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
+
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[oracleddl:createClusterStatement]      > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:createContextStatement]      > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:createControlfileStatement]  > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
+[oracleddl:createDatabaseStatement]     > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:createDimensionStatement]    > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
+[oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
+  - oracleddl:tableName (string) mandatory
+  - oracleddl:unique (boolean)
+  - oracleddl:bitmap (boolean)
+  + * (ddl:columnReference) = ddl:columnReference multiple
+[oracleddl:createIndexTypeStatement]    > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:createJavaStatement]         > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:createLibraryStatement]      > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:createOperatorStatement]     > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:createOutlineStatement]      > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
+[oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
+[oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:createSpfileStatement]       > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
+[oracleddl:createSynonymStatement]      > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:createTablespaceStatement]   > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:createTriggerStatement]      > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:createTypeStatement]         > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:createUserStatement]         > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[oracleddl:dropClusterStatement]        > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:dropContextStatement]        > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:dropDatabaseStatement]       > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:dropDimensionStatement]      > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:dropDirectoryStatement]      > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:dropDiskgroupStatement]      > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:dropFunctionStatement]       > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:dropIndexStatement]          > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:dropIndextypeStatement]      > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:dropJavaStatement]           > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:dropLibraryStatement]        > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:dropMaterializedStatement]   > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:dropOperatorStatement]       > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:dropOutlineStatement]        > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:dropPackageStatement]        > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:dropProcedureStatement]      > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:dropProfileStatement]        > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:dropRoleStatement]           > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:dropRollbackStatement]       > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:dropSequenceStatement]       > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:dropSynonymStatement]        > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:dropTablespaceStatement]     > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:dropTriggerStatement]        > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:dropTypeStatement]           > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:dropUserStatement]           > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[oracleddl:analyzeStatement]         > ddl:statement mixin
+[oracleddl:associateStatisticsStatement]     > ddl:statement mixin
+[oracleddl:auditStatement]           > ddl:statement mixin
+[oracleddl:commitStatement]          > ddl:statement mixin
+[oracleddl:commentOnStatement]       > ddl:statement, oracleddl:commentOperand mixin
+  - oracleddl:targetObjectType (STRING) mandatory
+  - oracleddl:targetObjectName (STRING)
+  - oracleddl:comment (STRING) mandatory
+[oracleddl:disassociateStatisticsStatement]     > ddl:statement mixin
+[oracleddl:explainPlanStatement]     > ddl:statement mixin
+[oracleddl:flashbackStatement]       > ddl:statement mixin
+[oracleddl:lockTableStatement]       > ddl:statement mixin
+[oracleddl:mergeStatement]           > ddl:statement mixin
+[oracleddl:nestedTableStatement]     > ddl:statement mixin
+[oracleddl:noauditStatement]         > ddl:statement mixin
+[oracleddl:purgeStatement]           > ddl:statement mixin
+[oracleddl:renameStatement]          > ddl:statement mixin
+[oracleddl:revokeStatement]          > ddl:statement mixin
+[oracleddl:rollbackStatement]        > ddl:statement mixin
+[oracleddl:setConstraintsStatement]  > ddl:statement, ddl:settable mixin
+[oracleddl:setRoleStatement]         > ddl:statement, ddl:settable mixin
+[oracleddl:setTransactionStatement]  > ddl:statement, ddl:settable mixin
+[oracleddl:truncateStatement]        > ddl:statement mixin


Property changes on: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -303,6 +303,95 @@
 		assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_FUNCTION_STATEMENT));
     }
     
+    @Test
+    public void shouldParseCreateProcedure_1() {
+        printTest("shouldParseCreateProcedure_1()");
+        String content = "CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;" + NEWLINE
+                               + "BEGIN" + NEWLINE
+                               + "   DELETE FROM employees" + NEWLINE
+                               + "   WHERE employees.employee_id = remove_emp.employee_id;" + NEWLINE
+                               + "tot_emps := tot_emps - 1;" + NEWLINE
+                               + "END;" + NEWLINE
+                               + "/";
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_PROCEDURE_STATEMENT));
+    }
+    
+    @Test
+    public void shouldParseCreateProcedure_2() {
+        printTest("shouldParseCreateProcedure_2()");
+        String content = "CREATE OR REPLACE PROCEDURE add_emp (employee_id NUMBER, employee_age NUMBER) AS tot_emps NUMBER;" + NEWLINE
+                               + "BEGIN" + NEWLINE
+                               + "   INSERT INTO employees" + NEWLINE
+                               + "   WHERE employees.employee_id = remove_emp.employee_id;" + NEWLINE
+                               + "tot_emps := tot_emps + 1;" + NEWLINE
+                               + "END;" + NEWLINE
+                               + "/";
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_PROCEDURE_STATEMENT));
+        assertEquals(2, childNode.getChildCount());
+    }
+    
+    @Test
+    public void shouldParseOracleProceduresAndFunctions() {
+        printTest("shouldParseOracleProceduresAndFunctions()");
+        String content = getFileContent(DDL_FILE_PATH + "create_procedure_statements.ddl");
+
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(4, rootNode.getChildCount());
+    }
+    
+    @Test
+    public void shouldParseCreateMaterializedView() {
+        setPrintToConsole(true);
+        parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateMaterializedView()");
+        String content = " CREATE MATERIALIZED VIEW sales_mv" + NEWLINE
+                                + "BUILD IMMEDIATE" + NEWLINE
+                                + "REFRESH FAST ON COMMIT" + NEWLINE
+                                + "AS SELECT t.calendar_year, p.prod_id, " + NEWLINE
+                                + "   SUM(s.amount_sold) AS sum_sales" + NEWLINE
+                                + "   FROM times t, products p, sales s" + NEWLINE
+                                + "   WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id" + NEWLINE
+                                + "   GROUP BY t.calendar_year, p.prod_id;" + NEWLINE;
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT));
+    }
+    
+    @Test
+    public void shouldParseCreateMaterializedViewLog() {
+        setPrintToConsole(true);
+        parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateMaterializedViewLog()");
+        String content = "CREATE MATERIALIZED VIEW LOG ON products" + NEWLINE
+                                + "WITH ROWID, SEQUENCE (prod_id)" + NEWLINE
+                                + "INCLUDING NEW VALUES;";
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT));
+    }
+    
 	@Test
 	public void shouldParseOracleStatements_1() {
 		printTest("shouldParseOracleStatements_1()");

Added: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl	2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,24 @@
+CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+    BEGIN
+       DELETE FROM employees
+       WHERE employees.employee_id = remove_emp.employee_id;
+    tot_emps := tot_emps - 1;
+    END;
+/
+
+CREATE PROCEDURE find_root
+   ( x IN REAL ) 
+   IS LANGUAGE C
+   NAME c_find_root
+   LIBRARY c_utils
+   PARAMETERS ( x BY REFERENCE );
+   
+CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+
+CREATE OR REPLACE FUNCTION text_length(a CLOB) 
+   RETURN NUMBER DETERMINISTIC IS
+    BEGIN 
+      RETURN DBMS_LOB.GETLENGTH(a);
+    END;
+/
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl	2010-01-07 19:11:34 UTC (rev 1553)
@@ -72,7 +72,7 @@
 
 COMMIT WORK; 
 
-COMMIT  COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637'; 
+COMMIT COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637'; 
 
 CREATE CLUSTER personnel
    (department NUMBER(4))



More information about the dna-commits mailing list