[dna-commits] DNA SVN: r1527 - in trunk/extensions/dna-sequencer-ddl/src: main/java/org/jboss/dna/sequencer/ddl/dialect/derby and 10 other directories.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Tue Jan 5 08:31:48 EST 2010


Author: blafond
Date: 2010-01-05 08:31:47 -0500 (Tue, 05 Jan 2010)
New Revision: 1527

Added:
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
Removed:
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
Modified:
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.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/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.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/DdlParserTestHelper.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl
Log:
DNA-49 Adding additional parsing and tests. Includes parsing for Grant statements in Standard, Derby & Postgres

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -40,6 +40,9 @@
     public static final String GRANT = "GRANT";
     public static final String INDEX = "INDEX";
     public static final String INSERT = "INSERT";
+    public static final String UPDATE = "UPDATE";
+    public static final String DELETE = "DELETE";
+    public static final String SELECT = "SELECT";
     public static final String KEY = "KEY";
     public static final String OFF = "OFF";
     public static final String ON = "ON";
@@ -125,7 +128,9 @@
         // | <translation definition>
         // | <assertion definition>
         public final static Name[] VALID_SCHEMA_CHILD_TYPES = {StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT,
-            StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT, StandardDdlLexicon.TYPE_GRANT_STATEMENT,
+            StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT, StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT,
+            StandardDdlLexicon.TYPE_GRANT_ON_DOMAIN_STATEMENT, StandardDdlLexicon.TYPE_GRANT_ON_TRANSLATION_STATEMENT,
+            StandardDdlLexicon.TYPE_GRANT_ON_COLLATION_STATEMENT, StandardDdlLexicon.TYPE_GRANT_ON_CHARACTER_SET_STATEMENT,
             StandardDdlLexicon.TYPE_CREATE_DOMAIN_STATEMENT, StandardDdlLexicon.TYPE_CREATE_CHARACTER_SET_STATEMENT,
             StandardDdlLexicon.TYPE_CREATE_COLLATION_STATEMENT, StandardDdlLexicon.TYPE_CREATE_TRANSLATION_STATEMENT,
             StandardDdlLexicon.TYPE_CREATE_ASSERTION_STATEMENT};

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -42,11 +42,11 @@
     public static I18n unusedTokensParsingColumnDefinition;
     public static I18n alterTableOptionNotFound;
     public static I18n unusedTokensParsingCreateIndex;
+    public static I18n missingReturnTypeForFunction;
 //    public static I18n 
 //    public static I18n 
 //    public static I18n 
 //    public static I18n 
-//    public static I18n 
     
 
     static {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -95,6 +95,11 @@
     public static final Name TYPE_ALTER_TABLE_STATEMENT = new BasicName(Namespace.URI, "alterTableStatement");
     public static final Name TYPE_ALTER_DOMAIN_STATEMENT = new BasicName(Namespace.URI, "alterDomainStatement");
     public static final Name TYPE_GRANT_STATEMENT = new BasicName(Namespace.URI, "grantStatement");
+    public static final Name TYPE_GRANT_ON_TABLE_STATEMENT = new BasicName(Namespace.URI, "grantOnTableStatement");
+    public static final Name TYPE_GRANT_ON_DOMAIN_STATEMENT = new BasicName(Namespace.URI, "grantOnDomainStatement");
+    public static final Name TYPE_GRANT_ON_COLLATION_STATEMENT = new BasicName(Namespace.URI, "grantOnCollationStatement");
+    public static final Name TYPE_GRANT_ON_CHARACTER_SET_STATEMENT = new BasicName(Namespace.URI, "grantOnCharacterSetStatement");
+    public static final Name TYPE_GRANT_ON_TRANSLATION_STATEMENT = new BasicName(Namespace.URI, "grantOnTranslationStatement");
     public static final Name TYPE_SET_STATEMENT = new BasicName(Namespace.URI, "setStatement");
     public static final Name TYPE_INSERT_STATEMENT = new BasicName(Namespace.URI, "insertStatement");
 
@@ -122,18 +127,21 @@
     public static final Name TYPE_FK_COLUMN_REFERENCE = new BasicName(Namespace.URI, "fkColumnReference");
     public static final Name TYPE_CLAUSE = new BasicName(Namespace.URI, "clause");
 
-    public static final Name DDL_EXPRESSION = new BasicName(Namespace.URI, "expression");
-    public static final Name DDL_ORIGINAL_EXPRESSION = new BasicName(Namespace.URI, "originalExpression");
-    public static final Name DDL_START_LINE_NUMBER = new BasicName(Namespace.URI, "startLineNumber");
-    public static final Name DDL_START_COLUMN_NUMBER = new BasicName(Namespace.URI, "startColumnNumber");
-    public static final Name DDL_START_CHAR_INDEX = new BasicName(Namespace.URI, "startCharIndex");
+    public static final Name DDL_EXPRESSION                 = new BasicName(Namespace.URI, "expression");
+    public static final Name DDL_ORIGINAL_EXPRESSION        = new BasicName(Namespace.URI, "originalExpression");
+    public static final Name DDL_START_LINE_NUMBER          = new BasicName(Namespace.URI, "startLineNumber");
+    public static final Name DDL_START_COLUMN_NUMBER        = new BasicName(Namespace.URI, "startColumnNumber");
+    public static final Name DDL_START_CHAR_INDEX           = new BasicName(Namespace.URI, "startCharIndex");
     // public static final Name DDL_LENGTH = new BasicName(Namespace.URI, "length");
 
     /*
      * node property names
      */
     public static final Name NAME = new BasicName(Namespace.URI, "name");
+    public static final Name OPTION = new BasicName(Namespace.URI, "option");
+    public static final Name TYPE = new BasicName(Namespace.URI, "type");
     public static final Name NEW_NAME = new BasicName(Namespace.URI, "newName");
+    public static final Name SQL = new BasicName(Namespace.URI, "sql");
     public static final Name TEMPORARY = new BasicName(Namespace.URI, "temporary");
     public static final Name ON_COMMIT_VALUE = new BasicName(Namespace.URI, "onCommitValue");
     public static final Name COLUMN_DEFINITIONS = new BasicName(Namespace.URI, "datatypeScale");
@@ -153,6 +161,10 @@
     public static final Name DROP_BEHAVIOR = new BasicName(Namespace.URI, "dropBehavior");
     public static final Name PROPERTY_VALUE = new BasicName(Namespace.URI, "propValue");
     public static final Name PROBLEM_LEVEL = new BasicName(Namespace.URI, "problemLevel");
+    public static final Name GRANT_PRIVILEGE = new BasicName(Namespace.URI, "grantPrivilege");
+    public static final Name ALL_PRIVILEGES = new BasicName(Namespace.URI, "allPrivileges");
+    public static final Name WITH_GRANT_OPTION = new BasicName(Namespace.URI, "withGrantOption");
+    public static final Name GRANTEE = new BasicName(Namespace.URI, "grantee");
 
     public static final Name CREATE_VIEW_QUERY_EXPRESSION = new BasicName(Namespace.URI, "queryExpression");
     public static final Name CREATE_VIEW_OPTION_CLAUSE = new BasicName(Namespace.URI, "createViewOption");
@@ -163,15 +175,7 @@
      * node child types
      */
 
-    // public static final Name COLUMN_REFERENCE_TYPE = new BasicName(Namespace.URI, "columnReference");
-    // public static final Name TABLE_CONSTRAINT_TYPE = new BasicName(Namespace.URI, "tableConstraint");
-    // public static final Name STATEMENT_OPTION_TYPE = new BasicName(Namespace.URI, "statementOption");
     public static final Name DROP_OPTION_TYPE = new BasicName(Namespace.URI, "dropOption");
-    // public static final Name DROP_COLUMN_DEFINITION_TYPE = new BasicName(Namespace.URI, "dropColumnDefinition");
-    // public static final Name DROP_TABLE_CONSTRAINT_TYPE = new BasicName(Namespace.URI, "dropTableConstraint");
-    // public static final Name ALTER_COLUMN_DEFINITION_TYPE = new BasicName(Namespace.URI, "alterColumnDefinition");
-    // public static final Name TABLE_REFERENCE_TYPE = new BasicName(Namespace.URI, "tableReference ");
-    // public static final Name FK_COLUMN_REFERENCE_TYPE = new BasicName(Namespace.URI, "fkColumnReference ");
     public static final Name COLUMN_ATTRIBUTE_TYPE = new BasicName(Namespace.URI, "columnAttribute");
     public static final Name CONSTRAINT_ATTRIBUTE_TYPE = new BasicName(Namespace.URI, "constraintAttribute ");
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -29,60 +29,7 @@
  */
 package org.jboss.dna.sequencer.ddl;
 
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CHECK_SEARCH_CONDITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.COLLATION_NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CONSTRAINT_ATTRIBUTE_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CONSTRAINT_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CREATE_VIEW_QUERY_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_CHAR_INDEX;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_COLUMN_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_LINE_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_PRECISION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.MESSAGE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NULLABLE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROBLEM_LEVEL;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROPERTY_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TEMPORARY;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_ASSERTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_CHARACTER_SET_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_COLLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TRANSLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_ASSERTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_CHARACTER_SET_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_SCHEMA_STATEMENT;
-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_DROP_TRANSLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_FK_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_GRANT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_INSERT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_SET_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_TABLE_CONSTRAINT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_TABLE_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.VALUE;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -828,24 +775,140 @@
                                            AstNode parentNode ) throws ParsingException {
         assert tokens != null;
         assert parentNode != null;
-
-        // Original implementation does NOT parse Insert statement, but just returns a generic TypedStatement
+        assert tokens.matches(GRANT);
+        
         markStartOfStatement(tokens);
 
-        tokens.consume(GRANT);
-        String name = GRANT;
+        //      Syntax for tables
+        //
+        //             GRANT <privileges> ON <object name>
+        //                      TO <grantee> [ { <comma> <grantee> }... ]
+        //                      [ WITH GRANT OPTION ]
+        //
+        //        <object name> ::=
+        //            [ TABLE ] <table name>
+        //          | DOMAIN <domain name>
+        //          | COLLATION <collation name>
+        //          | CHARACTER SET <character set name>
+        //          | TRANSLATION <translation name>
+        //
+        //      Syntax for roles
+        //
+        //          GRANT roleName [ {, roleName }* ] TO grantees
+        
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        AstNode grantNode = null;
+        boolean allPrivileges = false;
 
-        tokens.consume(); // First Privilege token
+        List<AstNode> privileges = new ArrayList<AstNode>();
 
-        AstNode node = nodeFactory().node(name, parentNode, TYPE_GRANT_STATEMENT);
+        tokens.consume("GRANT");
 
-        parseUntilTerminator(tokens);
+            if( tokens.canConsume("ALL", "PRIVILEGES")) {
+                allPrivileges = true;
+            } else { 
+                parseGrantPrivileges(tokens, privileges);
+            }
+            tokens.consume("ON");
 
-        markEndOfStatement(tokens, node);
+            if( tokens.canConsume("DOMAIN") ) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_DOMAIN_STATEMENT);
+            } else if( tokens.canConsume("COLLATION")) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_COLLATION_STATEMENT);
+            } else if( tokens.canConsume("CHARACTER", "SET")) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_CHARACTER_SET_STATEMENT);
+            } else if( tokens.canConsume("TRANSLATION")) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TRANSLATION_STATEMENT);
+            } else {
+                tokens.canConsume(TABLE); // OPTIONAL
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+            }
 
-        return node;
+            
+            // Attach privileges to grant node
+            for( AstNode node : privileges ) {
+                node.setParent(grantNode);
+            }
+            if( allPrivileges ) {
+                grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+            }
+
+        
+        tokens.consume("TO");
+        
+        do {
+            String grantee = parseName(tokens);
+            nodeFactory().node(grantee, grantNode, GRANTEE);
+        } while( tokens.canConsume(COMMA));
+        
+        if( tokens.canConsume("WITH", "GRANT", "OPTION")) {
+            grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+        }
+        
+        markEndOfStatement(tokens, grantNode);
+
+        return grantNode;
     }
 
+    protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode> privileges) throws ParsingException {
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        //      privilege-list
+        //
+        //          table-privilege {, table-privilege }*
+        //
+        //      table-privilege
+        //          SELECT
+        //        | DELETE
+        //        | INSERT [ <left paren> <privilege column list> <right paren> ]
+        //        | UPDATE [ <left paren> <privilege column list> <right paren> ]
+        //        | REFERENCES [ <left paren> <privilege column list> <right paren> ]
+        //        | USAGE
+
+        do {
+            AstNode node = null;
+            
+            if( tokens.canConsume(DELETE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, DELETE);
+            } else if( tokens.canConsume(INSERT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, INSERT);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("REFERENCES")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "REFERENCES");
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume(SELECT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, SELECT);
+            } else if( tokens.canConsume("USAGE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "USAGE");
+            } else if( tokens.canConsume(UPDATE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, UPDATE);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            }
+            if( node == null) {
+                break;
+            }
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            privileges.add(node);
+            
+        } while( tokens.canConsume(COMMA));
+
+    }
     /**
      * Catch-all method to parse unknown (not registered or handled by sub-classes) statements.
      * 

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -96,7 +96,7 @@
 	    public final static Name[] VALID_SCHEMA_CHILD_STMTS = {
 	    	StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT, 
 	    	StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
-	    	StandardDdlLexicon.TYPE_GRANT_STATEMENT
+	    	StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT
 	  	};
 	}
 	interface DerbyDataTypes {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -41,50 +41,59 @@
      * 
      * SQL-92 Spec
      * 
-     * 		CREATE SCHEMA
-	 *		CREATE DOMAIN
-	 * 		CREATE [ { GLOBAL | LOCAL } TEMPORARY ] TABLE
-	 *		CREATE VIEW 		
-	 *		CREATE ASSERTION 
-	 *		CREATE CHARACTER SET 
-	 *		CREATE COLLATION 
-	 *		CREATE TRANSLATION
-	 * ===> CREATE FUNCTION
-	 * ===> CREATE INDEX
-	 * ===> CREATE PROCEDURE
-	 * ===> CREATE ROLE
-	 * ===> CREATE SYNONYM
-	 * ===> CREATE TRIGGER
-	 * 
-	 *		ALTER TABLE
-	 *
-	 * ===> GRANT
-	 * ===> LOCK TABLE
-	 * ===> RENAME TABLE
-	 * ===> RENAME INDEX
-	 * ===> SET
-	 * ===> DECLARE GLOBAL TEMPORARY TABLE
+     *      CREATE SCHEMA
+     *      CREATE DOMAIN
+     *      CREATE [ { GLOBAL | LOCAL } TEMPORARY ] TABLE
+     *      CREATE VIEW         
+     *      CREATE ASSERTION 
+     *      CREATE CHARACTER SET 
+     *      CREATE COLLATION 
+     *      CREATE TRANSLATION
+     * ===> CREATE FUNCTION
+     * ===> CREATE INDEX
+     * ===> CREATE PROCEDURE
+     * ===> CREATE ROLE
+     * ===> CREATE SYNONYM
+     * ===> CREATE TRIGGER
+     * 
+     *      ALTER TABLE
+     *
+     * ===> GRANT
+     * ===> LOCK TABLE
+     * ===> RENAME TABLE
+     * ===> RENAME INDEX
+     * ===> SET
+     * ===> DECLARE GLOBAL TEMPORARY TABLE
      */
  
-    public static final Name TYPE_CREATE_FUNCTION_STATEMENT 		= new BasicName(Namespace.URI, "createFunctionStatement");
-    public static final Name TYPE_CREATE_INDEX_STATEMENT 			= new BasicName(Namespace.URI, "createIndexStatement");
-    public static final Name TYPE_CREATE_PROCEDURE_STATEMENT 		= new BasicName(Namespace.URI, "createProcedureStatement");
-    public static final Name TYPE_CREATE_ROLE_STATEMENT 			= new BasicName(Namespace.URI, "createRoleStatement");
-    public static final Name TYPE_CREATE_SYNONYM_STATEMENT 		= new BasicName(Namespace.URI, "createSynonymStatement");
-    public static final Name TYPE_CREATE_TRIGGER_STATEMENT 		= new BasicName(Namespace.URI, "createTriggerStatement");
-    public static final Name TYPE_LOCK_TABLE_STATEMENT 			= new BasicName(Namespace.URI, "lockTableStatement");
-    public static final Name TYPE_RENAME_TABLE_STATEMENT 			= new BasicName(Namespace.URI, "renameTableStatement");
-    public static final Name TYPE_RENAME_INDEX_STATEMENT 			= new BasicName(Namespace.URI, "renameIndexStatement");
+    public static final Name TYPE_CREATE_FUNCTION_STATEMENT     = new BasicName(Namespace.URI, "createFunctionStatement");
+    public static final Name TYPE_CREATE_INDEX_STATEMENT        = new BasicName(Namespace.URI, "createIndexStatement");
+    public static final Name TYPE_CREATE_PROCEDURE_STATEMENT    = new BasicName(Namespace.URI, "createProcedureStatement");
+    public static final Name TYPE_CREATE_ROLE_STATEMENT         = new BasicName(Namespace.URI, "createRoleStatement");
+    public static final Name TYPE_CREATE_SYNONYM_STATEMENT      = new BasicName(Namespace.URI, "createSynonymStatement");
+    public static final Name TYPE_CREATE_TRIGGER_STATEMENT      = new BasicName(Namespace.URI, "createTriggerStatement");
+    public static final Name TYPE_LOCK_TABLE_STATEMENT          = new BasicName(Namespace.URI, "lockTableStatement");
+    public static final Name TYPE_RENAME_TABLE_STATEMENT        = new BasicName(Namespace.URI, "renameTableStatement");
+    public static final Name TYPE_RENAME_INDEX_STATEMENT        = new BasicName(Namespace.URI, "renameIndexStatement");
     public static final Name TYPE_DECLARE_GLOBAL_TEMPORARY_TABLE_STATEMENT = new BasicName(Namespace.URI, "declareGlobalTemporaryTableStatement");
 
-    public static final Name TYPE_DROP_FUNCTION_STATEMENT 		= new BasicName(Namespace.URI, "dropFunctionStatement");
-    public static final Name TYPE_DROP_INDEX_STATEMENT 			= new BasicName(Namespace.URI, "dropIndexStatement");
-    public static final Name TYPE_DROP_PROCEDURE_STATEMENT 		= new BasicName(Namespace.URI, "dropProcedureStatement");
-    public static final Name TYPE_DROP_ROLE_STATEMENT 			= new BasicName(Namespace.URI, "dropRoleStatement");
-    public static final Name TYPE_DROP_SYNONYM_STATEMENT 			= new BasicName(Namespace.URI, "dropSynonymStatement");
-    public static final Name TYPE_DROP_TRIGGER_STATEMENT 			= new BasicName(Namespace.URI, "dropTriggerStatement");
+    public static final Name TYPE_DROP_FUNCTION_STATEMENT       = new BasicName(Namespace.URI, "dropFunctionStatement");
+    public static final Name TYPE_DROP_INDEX_STATEMENT          = new BasicName(Namespace.URI, "dropIndexStatement");
+    public static final Name TYPE_DROP_PROCEDURE_STATEMENT      = new BasicName(Namespace.URI, "dropProcedureStatement");
+    public static final Name TYPE_DROP_ROLE_STATEMENT           = new BasicName(Namespace.URI, "dropRoleStatement");
+    public static final Name TYPE_DROP_SYNONYM_STATEMENT        = new BasicName(Namespace.URI, "dropSynonymStatement");
+    public static final Name TYPE_DROP_TRIGGER_STATEMENT        = new BasicName(Namespace.URI, "dropTriggerStatement");
     
-    public static final Name UNIQUE_INDEX 			= new BasicName(Namespace.URI, "unique");
-    public static final Name TABLE_NAME 			= new BasicName(Namespace.URI, "tableName");
-    public static final Name GENERATED_COLUMN_SPEC_CLAUSE = new BasicName(Namespace.URI, "generatedColumnSpecClause");
+    public static final Name TYPE_FUNCTION_PARAMETER            = new BasicName(Namespace.URI, "functionParameter");
+    public static final Name TYPE_INDEX_COLUMN_REFERENCE        = new BasicName(Namespace.URI, "indexColumnReference");
+    public static final Name TYPE_GRANT_ON_FUNCTION_STATEMENT   = new BasicName(Namespace.URI, "grantOnFunctionStatement");
+    public static final Name TYPE_GRANT_ON_PROCEDURE_STATEMENT  = new BasicName(Namespace.URI, "grantOnProcedureStatement");
+    public static final Name TYPE_GRANT_ROLES_STATEMENT         = new BasicName(Namespace.URI, "grantRolesStatement");
+    
+    public static final Name UNIQUE_INDEX                       = new BasicName(Namespace.URI, "unique");
+    public static final Name ORDER                              = new BasicName(Namespace.URI, "order");
+    public static final Name TABLE_NAME                         = new BasicName(Namespace.URI, "tableName");
+    public static final Name ROLE_NAME                          = new BasicName(Namespace.URI, "roleName");
+    public static final Name GENERATED_COLUMN_SPEC_CLAUSE       = new BasicName(Namespace.URI, "generatedColumnSpecClause");
+    public static final Name IS_TABLE_TYPE                      = new BasicName(Namespace.URI, "isTableType");
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,26 +1,7 @@
 package org.jboss.dna.sequencer.ddl.dialect.derby;
 
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.COLUMN_ATTRIBUTE_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROPERTY_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-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.dialect.derby.DerbyDdlLexicon.TABLE_NAME;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_PROCEDURE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_SYNONYM_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_PROCEDURE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_SYNONYM_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.UNIQUE_INDEX;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.*;
 import java.util.ArrayList;
 import java.util.List;
 import org.jboss.dna.common.text.ParsingException;
@@ -38,7 +19,9 @@
 /**
  * Derby-specific DDL Parser. Includes custom data types as well as custom DDL statements.
  */
-public class DerbyDdlParser extends StandardDdlParser implements DerbyDdlConstants {
+public class DerbyDdlParser extends StandardDdlParser 
+        implements DerbyDdlConstants,
+        DerbyDdlConstants.DerbyStatementStartPhrases {
     private final String parserId = "DERBY";
 
     static List<String[]> derbyDataTypeStrings = new ArrayList<String[]>();
@@ -69,11 +52,11 @@
     public void registerWords( DdlTokenStream tokens ) {
         tokens.registerKeyWords(CUSTOM_KEYWORDS);
 
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.ALTER_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.CREATE_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.DROP_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.SET_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.MISC_PHRASES);
+        tokens.registerStatementStartPhrase(ALTER_PHRASES);
+        tokens.registerStatementStartPhrase(CREATE_PHRASES);
+        tokens.registerStatementStartPhrase(DROP_PHRASES);
+        tokens.registerStatementStartPhrase(SET_PHRASES);
+        tokens.registerStatementStartPhrase(MISC_PHRASES);
         super.registerWords(tokens);
     }
 
@@ -94,7 +77,7 @@
      */
     @Override
     protected Name[] getValidSchemaChildTypes() {
-        return DerbyStatementStartPhrases.VALID_SCHEMA_CHILD_STMTS;
+        return VALID_SCHEMA_CHILD_STMTS;
     }
 
     /**
@@ -111,34 +94,14 @@
 
         AstNode result = super.parseCustomStatement(tokens, parentNode);
         if (result == null) {
-            if (tokens.matches(DerbyStatementStartPhrases.STMT_LOCK_TABLE)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_LOCK_TABLE);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_LOCK_TABLE),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
-            } else if (tokens.matches(DerbyStatementStartPhrases.STMT_RENAME_TABLE)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_RENAME_TABLE);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_RENAME_TABLE),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
-            } else if (tokens.matches(DerbyStatementStartPhrases.STMT_RENAME_INDEX)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_RENAME_INDEX);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_RENAME_INDEX),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
-            } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
+            if (tokens.matches(STMT_LOCK_TABLE)) {
+                result = parseLockTable(tokens, parentNode);
+            } else if (tokens.matches(STMT_RENAME_TABLE)) {
+                result = parseRenameTable(tokens, parentNode);
+            } else if (tokens.matches(STMT_RENAME_INDEX)) {
+                result = parseRenameIndex(tokens, parentNode);
+            } else if (tokens.matches(STMT_DECLARE_GLOBAL_TEMP_TABLE)) {
+                result = parseDeclareGlobalTempTable(tokens, parentNode);
             }
         }
         return result;
@@ -156,31 +119,22 @@
         assert tokens != null;
         assert parentNode != null;
 
-        if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_INDEX)
-            || tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_UNIQUE_INDEX)) {
+        if (tokens.matches(STMT_CREATE_INDEX)
+            || tokens.matches(STMT_CREATE_UNIQUE_INDEX)) {
             return parseCreateIndex(tokens, parentNode);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_FUNCTION)) {
+        } else if (tokens.matches(STMT_CREATE_FUNCTION)) {
+            return parseCreateFunction(tokens, parentNode);
+        } else if (tokens.matches(STMT_CREATE_PROCEDURE)) {
             return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_FUNCTION,
+                                  STMT_CREATE_PROCEDURE,
                                   parentNode,
-                                  TYPE_CREATE_FUNCTION_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_PROCEDURE)) {
-            return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_PROCEDURE,
-                                  parentNode,
                                   TYPE_CREATE_PROCEDURE_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_ROLE)) {
-            return parseStatement(tokens, DerbyStatementStartPhrases.STMT_CREATE_ROLE, parentNode, TYPE_CREATE_ROLE_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_SYNONYM)) {
-            return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_SYNONYM,
-                                  parentNode,
-                                  TYPE_CREATE_SYNONYM_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_TRIGGER)) {
-            return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_TRIGGER,
-                                  parentNode,
-                                  TYPE_CREATE_TRIGGER_STATEMENT);
+        } else if (tokens.matches(STMT_CREATE_ROLE)) {
+            return parseStatement(tokens, STMT_CREATE_ROLE, parentNode, TYPE_CREATE_ROLE_STATEMENT);
+        } else if (tokens.matches(STMT_CREATE_SYNONYM)) {
+            return parseCreateSynonym(tokens, parentNode);
+        } else if (tokens.matches(STMT_CREATE_TRIGGER)) {
+            return parseCreateTrigger(tokens, parentNode);
         }
 
         return super.parseCreateStatement(tokens, parentNode);
@@ -217,14 +171,190 @@
         indexNode.setProperty(UNIQUE_INDEX, isUnique);
         indexNode.setProperty(TABLE_NAME, tableName);
 
+        parseIndexTableColumns(tokens, indexNode);
+        
         parseUntilTerminator(tokens);
 
         markEndOfStatement(tokens, indexNode);
 
         return indexNode;
     }
+    
+    private void parseIndexTableColumns(DdlTokenStream tokens, AstNode indexNode) throws ParsingException {
+        assert tokens != null;
+        assert indexNode != null;
 
+        // Assume we start with open parenthesis '(', then we parse comma separated list of column names followed by optional
+        // ASC or DESC
+        
+        
+        tokens.consume(L_PAREN); // EXPECTED
+
+        while (!tokens.canConsume(R_PAREN)) {
+            String colName = parseName(tokens);
+            AstNode colRefNode = nodeFactory().node(colName, indexNode, TYPE_INDEX_COLUMN_REFERENCE);
+            if( tokens.canConsume("ASC")) {
+                colRefNode.setProperty(ORDER, "ASC");
+            } else if( tokens.canConsume("DESC")) {
+                colRefNode.setProperty(ORDER, "DESC");
+            }
+            tokens.canConsume(COMMA);
+        }
+    }
+    
     /**
+     * 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 parseCreateFunction( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        //  CREATE FUNCTION function-name ( [ FunctionParameter [, FunctionParameter] ] * ) 
+        //        RETURNS ReturnDataType [ FunctionElement ] *
+        
+        //FunctionElement
+        //        {
+        //       | LANGUAGE { JAVA }
+        //       | {DETERMINISTIC | NOT DETERMINISTIC}
+        //       | EXTERNAL NAME string
+        //       | PARAMETER STYLE {JAVA | DERBY_JDBC_RESULT_SET}
+        //       | { NO SQL | CONTAINS SQL | READS SQL DATA }
+        //       | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
+        //        }
+        tokens.consume(CREATE, "FUNCTION"); // CREATE
+
+        String functionName = parseName(tokens);
+
+        AstNode functionNode = nodeFactory().node(functionName, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+
+        parseFunctionParameters(tokens, functionNode);
+        
+        tokens.consume("RETURNS");
+
+        if( tokens.canConsume("TABLE")) {
+            AstNode tableNode = nodeFactory().node("TABLE", functionNode, TYPE_CREATE_TABLE_STATEMENT);
+            parseColumnsAndConstraints(tokens, tableNode);
+            tableNode.setProperty(IS_TABLE_TYPE, true);
+        } else {
+            // Assume DataType
+            DataType datatype = getDatatypeParser().parse(tokens);
+            if( datatype != null) {
+                getDatatypeParser().setPropertiesOnNode(functionNode, datatype);
+            } else {
+                String msg = DdlSequencerI18n.missingReturnTypeForFunction.text(functionName);
+                DdlParserProblem problem = new DdlParserProblem(Problems.WARNING, getCurrentMarkedPosition(), msg);
+                addProblem(problem, functionNode);
+            }
+        }
+        
+        while( !isTerminator(tokens)) {
+            if( tokens.matches("LANGUAGE")) {
+                AstNode optionNode = nodeFactory().node("language", functionNode, TYPE_STATEMENT_OPTION);
+                if( tokens.canConsume("LANGUAGE", "JAVA")) {
+                    optionNode.setProperty(VALUE, "LANGUAGE JAVA");
+                } else {
+                    tokens.consume("LANGUAGE");
+                    optionNode.setProperty(VALUE, "LANGUAGE");
+                }
+            } else if( tokens.canConsume("DETERMINISTIC")) {
+                AstNode optionNode = nodeFactory().node("deterministic", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "DETERMINISTIC");
+            } else if( tokens.canConsume("NOT", "DETERMINISTIC")) {
+                AstNode optionNode = nodeFactory().node("deterministic", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "NOT DETERMINISTIC");
+            } else if( tokens.canConsume("EXTERNAL", "NAME")) {
+                String extName = parseName(tokens);
+                AstNode optionNode = nodeFactory().node("externalName", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "EXTERNAL NAME" + SPACE + extName);
+            } else if( tokens.canConsume("PARAMETER", "STYLE")) {
+                AstNode optionNode = nodeFactory().node("parameterStyle", functionNode, TYPE_STATEMENT_OPTION);
+                if( tokens.canConsume("JAVA")) {
+                    optionNode.setProperty(VALUE, "PARAMETER STYLE" + SPACE + "JAVA");
+                } else {
+                    tokens.consume("DERBY_JDBC_RESULT_SET");
+                    optionNode.setProperty(VALUE, "PARAMETER STYLE" + SPACE + "DERBY_JDBC_RESULT_SET");
+                }
+            } else if( tokens.canConsume("NO", "SQL")) {
+                AstNode optionNode = nodeFactory().node("sqlStatus", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "NO SQL");
+            } else if( tokens.canConsume("CONTAINS", "SQL")) {
+                AstNode optionNode = nodeFactory().node("sqlStatus", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "CONTAINS SQL");
+            } else if( tokens.canConsume("READS", "SQL", "DATA")) {
+                AstNode optionNode = nodeFactory().node("sqlStatus", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "READS SQL DATA");
+            } else if( tokens.canConsume("RETURNS", "NULL", "ON", "NULL", "INPUT")) {
+                AstNode optionNode = nodeFactory().node("nullInput", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "RETURNS NULL ON NULL INPUT");
+            } else if( tokens.canConsume("CALLED", "ON", "NULL", "INPUT")) {
+                AstNode optionNode = nodeFactory().node("nullInput", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "CALLED ON NULL INPUT");
+            }
+        }
+
+        markEndOfStatement(tokens, functionNode);
+
+        return functionNode;
+    }
+    
+    private void parseFunctionParameters( DdlTokenStream tokens, AstNode functionNode) throws ParsingException {
+        assert tokens != null;
+        assert functionNode != null;
+
+        // 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)) {
+            DataType datatype = getDatatypeParser().parse(tokens);
+            if( datatype == null ) {
+                String paramName = parseName(tokens);
+                datatype = getDatatypeParser().parse(tokens);
+                AstNode paramNode = nodeFactory().node(paramName, functionNode, TYPE_FUNCTION_PARAMETER);
+                getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+            } else {
+                AstNode paramNode = nodeFactory().node("functionParameter", functionNode, TYPE_FUNCTION_PARAMETER);
+                getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+            }
+            tokens.canConsume(COMMA);
+        }
+    }
+
+    /**
+     * 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 parseCreateProcedure( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        tokens.consume(CREATE, "PROCEDURE"); // CREATE
+
+        String functionName = parseName(tokens);
+
+        AstNode functionNode = nodeFactory().node(functionName, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+
+        markEndOfStatement(tokens, functionNode);
+
+        return functionNode;
+    }
+    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseDropStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream,
@@ -240,53 +370,34 @@
 
         String name = null;
 
-        if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_FUNCTION)) {
+        if (tokens.matches(STMT_DROP_FUNCTION)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_FUNCTION);
+            tokens.consume(STMT_DROP_FUNCTION);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_FUNCTION_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_INDEX)) {
+        } else if (tokens.matches(STMT_DROP_INDEX)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_INDEX);
+            tokens.consume(STMT_DROP_INDEX);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_INDEX_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_PROCEDURE)) {
+        } else if (tokens.matches(STMT_DROP_PROCEDURE)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_PROCEDURE);
+            tokens.consume(STMT_DROP_PROCEDURE);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_PROCEDURE_STATEMENT);
-
-            // CREATE PROCEDURE procedure-Name ( [ ProcedureParameter [, ProcedureParameter] ] * ) [ ProcedureElement ] *
-            // ProcedureParameter:
-            // [ { IN | OUT | INOUT } ] [ parameter-Name ] DataType
-            // ProcedureElement:
-            //
-            // {
-            // | [ DYNAMIC ] RESULT SETS INTEGER
-            // | LANGUAGE { JAVA }
-            // | DeterministicCharacteristic
-            // | EXTERNAL NAME string
-            // | PARAMETER STYLE JAVA
-            // | { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA }
-            // }
-
-            // TODO: BARRY
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_ROLE)) {
+        } else if (tokens.matches(STMT_DROP_ROLE)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_ROLE);
+            tokens.consume(STMT_DROP_ROLE);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_ROLE_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_SYNONYM)) {
+        } else if (tokens.matches(STMT_DROP_SYNONYM)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_SYNONYM);
+            tokens.consume(STMT_DROP_SYNONYM);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_SYNONYM_STATEMENT);
-            // CREATE SYNONYM synonym-Name FOR { view-Name | table-Name }
-
-            // TODO: BARRY
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_TRIGGER)) {
+        } else if (tokens.matches(STMT_DROP_TRIGGER)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_TRIGGER);
+            tokens.consume(STMT_DROP_TRIGGER);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_TRIGGER_STATEMENT);
         }
@@ -317,73 +428,152 @@
                                            AstNode parentNode ) throws ParsingException {
         assert tokens != null;
         assert parentNode != null;
+        assert tokens.matches(GRANT);
+        
+        markStartOfStatement(tokens);
 
-        return super.parseGrantStatement(tokens, parentNode);
-        // Statement stmt = null;
-        //		
-        // if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "TO")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        // String privilege = consume(tokens, stmt, true);
-        // tokens.consume("TO");
-        // String toValue = consume(tokens, stmt, true);
+        //      Syntax for tables
         //
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + privilege + SPACE + "TO" + SPACE + toValue);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // } else if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "ON")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        // String privilege = consume(tokens, stmt, true);
-        // tokens.consume("ON");
-        //			
-        // tokens.canConsume("TABLE");
-        //			
-        // String onValue = tokens.consume();
-        //			
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + privilege + SPACE + "ON" + SPACE + onValue);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // } else if( tokens.matches(GRANT, "ALL", "PRIVILEGES", "ON")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        // String privilege = consume(tokens, stmt, true,"ALL", "PRIVILEGES", "ON");
-        // tokens.canConsume("TABLE");
-        //			
-        // String onValue = tokens.consume();
-        //			
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + privilege + SPACE + "ON" + SPACE + onValue);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // } else if( tokens.matches(GRANT, "SELECT") ||
-        // tokens.matches(GRANT, "UPDATE") ||
-        // tokens.matches(GRANT, "DELETE") ||
-        // tokens.matches(GRANT, "INSERT") ||
-        // tokens.matches(GRANT, "TRIGGER") ||
-        // tokens.matches(GRANT, "REFERENCES")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        //			
-        // String nextTok = consume(tokens, stmt, true) + SPACE + consume(tokens, stmt, true) + SPACE + consume(tokens, stmt,
-        // true);
+        //          GRANT privilege-type ON [TABLE] { table-Name | view-Name } TO grantees
         //
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + nextTok);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // }
-        //		
-        //		
-        // return null;
+        //      Syntax for routines
+        //
+        //          GRANT EXECUTE ON { FUNCTION | PROCEDURE } {function-name | procedure-name} TO grantees
+        //
+        //      Syntax for roles
+        //
+        //          GRANT roleName [ {, roleName }* ] TO grantees
+        
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        AstNode grantNode = null;
+        boolean allPrivileges = false;
+
+        List<AstNode> privileges = new ArrayList<AstNode>();
+
+        tokens.consume("GRANT");
+        if(tokens.canConsume("EXECUTE", "ON")) {
+            AstNode node = nodeFactory().node("privilege");
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            node.setProperty(TYPE, "EXECUTE");
+            privileges = new ArrayList<AstNode>();
+            privileges.add(node);
+            if( tokens.canConsume("FUNCTION") ) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_FUNCTION_STATEMENT);
+            } else {
+                tokens.consume("PROCEDURE");
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_PROCEDURE_STATEMENT);
+            } 
+        } else {
+
+            
+            if( tokens.canConsume("ALL", "PRIVILEGES")) {
+                allPrivileges = true;
+            } else { 
+                parseGrantPrivileges(tokens, privileges);
+                
+                if( privileges.isEmpty() ) {
+                    // ASSUME:  GRANT roleName [ {, roleName }* ] TO grantees
+                    grantNode = nodeFactory().node("grantRoles", parentNode, TYPE_GRANT_ROLES_STATEMENT);
+                    do {
+                        String roleName = parseName(tokens);
+                        nodeFactory().node(roleName, grantNode, ROLE_NAME);
+                    } while( tokens.canConsume(COMMA));
+                }
+            }
+            if( grantNode == null ) {
+                tokens.consume("ON");
+                tokens.canConsume(TABLE); // OPTIONAL
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+                // Attach privileges to grant node
+                for( AstNode node : privileges ) {
+                    node.setParent(grantNode);
+                }
+                if( allPrivileges ) {
+                    grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+                }
+            }
+            
+        }
+        
+        tokens.consume("TO");
+        
+        do {
+            String grantee = parseName(tokens);
+            nodeFactory().node(grantee, grantNode, GRANTEE);
+        } while( tokens.canConsume(COMMA));
+        
+        markEndOfStatement(tokens, grantNode);
+        
+        return grantNode;
     }
+    
+    /**
+     * 
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantPrivileges(org.jboss.dna.sequencer.ddl.DdlTokenStream, java.util.List)
+     */
+    @Override
+    protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode> privileges) throws ParsingException {
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        //      privilege-list
+        //
+        //          table-privilege {, table-privilege }*
+        //
+        //      table-privilege
+        //          DELETE |
+        //          INSERT |
+        //          REFERENCES [column list] |
+        //          SELECT [column list] |
+        //          TRIGGER |
+        //          UPDATE [column list]
+        //      column list
+        //           ( column-identifier {, column-identifier}* )
+        
+        do {
+            AstNode node = null;
+            
+            if( tokens.canConsume(DELETE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, DELETE);
+            } else if( tokens.canConsume(INSERT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, INSERT);
+            } else if( tokens.canConsume("REFERENCES")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "REFERENCES");
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume(SELECT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, SELECT);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("TRIGGER")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TRIGGER");
+            } else if( tokens.canConsume(UPDATE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, UPDATE);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            }
+            if( node == null) {
+                break;
+            }
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            privileges.add(node);
+            
+        } while( tokens.canConsume(COMMA));
 
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -668,7 +858,324 @@
 
         return false;
     }
+    
+    private AstNode parseDeclareGlobalTempTable( DdlTokenStream tokens,
+                                                 AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
 
+        markStartOfStatement(tokens);
+        
+        // DECLARE GLOBAL TEMPORARY TABLE table-Name
+        //     { column-definition [ , column-definition ] * }
+        //     [ ON COMMIT {DELETE | PRESERVE} ROWS ]  
+        //      NOT LOGGED [ON ROLLBACK DELETE ROWS]
+
+        tokens.consume(STMT_DECLARE_GLOBAL_TEMP_TABLE);
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_DECLARE_GLOBAL_TEMPORARY_TABLE_STATEMENT);
+        
+        parseColumnsAndConstraints(tokens, node);
+        
+        if( tokens.canConsume("ON", "COMMIT"))  {
+            AstNode optionNode = nodeFactory().node("onCommit", node, TYPE_STATEMENT_OPTION);
+            if( tokens.canConsume("DELETE", "ROWS")) {
+                optionNode.setProperty(VALUE, "ON COMMIT DELETE ROWS");
+            } else {
+                tokens.consume("PRESERVE", "ROWS");
+                optionNode.setProperty(VALUE, "ON COMMIT PRESERVE ROWS");
+            }
+        }
+        tokens.consume("NOT", "LOGGED");
+        
+        if( tokens.canConsume("ON", "ROLLBACK", "DELETE", "ROWS"))  {
+            AstNode optionNode = nodeFactory().node("onRollback", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "ON ROLLBACK DELETE ROWS");
+        }
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseLockTable( DdlTokenStream tokens,
+                                                 AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        // LOCK TABLE table-Name IN { SHARE | EXCLUSIVE } MODE;
+        
+        tokens.consume(STMT_LOCK_TABLE);
+        
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_LOCK_TABLE_STATEMENT);
+        
+        tokens.consume("IN");
+        
+        if( tokens.canConsume("SHARE")) {
+            AstNode propNode = nodeFactory().node("lockMode", node, TYPE_STATEMENT_OPTION);
+            propNode.setProperty(VALUE, "SHARE");
+        } else {
+            tokens.consume("EXCLUSIVE");
+            AstNode propNode = nodeFactory().node("lockMode", node, TYPE_STATEMENT_OPTION);
+            propNode.setProperty(VALUE, "EXCLUSIVE");
+        }
+        tokens.consume("MODE");
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseRenameTable( DdlTokenStream tokens,
+                                    AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
+        
+        tokens.consume(STMT_RENAME_TABLE);
+        
+        String oldName = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(oldName, parentNode, TYPE_RENAME_TABLE_STATEMENT);
+        
+        tokens.consume("TO");
+        
+        String newName = parseName(tokens);
+        
+        node.setProperty(NEW_NAME, newName);
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseRenameIndex( DdlTokenStream tokens,
+                                      AstNode parentNode ) throws ParsingException {
+          assert tokens != null;
+          assert parentNode != null;
+
+          markStartOfStatement(tokens);
+          
+          // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
+          
+          tokens.consume(STMT_RENAME_INDEX);
+          
+          String oldName = parseName(tokens);
+          
+          AstNode node = nodeFactory().node(oldName, parentNode, TYPE_RENAME_INDEX_STATEMENT);
+          
+          tokens.consume("TO");
+          
+          String newName = parseName(tokens);
+          
+          node.setProperty(NEW_NAME, newName);
+          
+          markEndOfStatement(tokens, node);
+          
+          return node;
+    }
+    
+    private AstNode parseCreateSynonym( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        //CREATE SYNONYM synonym-Name FOR { view-Name | table-Name }
+        
+        tokens.consume(STMT_CREATE_SYNONYM);
+        
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_SYNONYM_STATEMENT);
+        
+        tokens.consume("FOR");
+        
+        String tableOrViewName = parseName(tokens);
+        
+        node.setProperty(TABLE_NAME, tableOrViewName);
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseCreateTrigger( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        //      CREATE TRIGGER TriggerName
+        //      { AFTER | NO CASCADE BEFORE } 
+        //      { INSERT | DELETE | UPDATE [ OF column-Name [, column-Name]* ] }
+        //      ON table-Name
+        //      [ ReferencingClause ]
+        //      [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ] 
+        //      Triggered-SQL-statement
+        
+        //      ReferencingClause
+        //        REFERENCING
+        //        {
+        //        { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW ] [ AS ] correlation-Name ] | 
+        //        { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW TABLE } [AS] Identifier ]  |
+        //        { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE } [AS] Identifier ] 
+        //        }
+        
+        
+        // EXAMPLE:
+        //        CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
+        //        FOR EACH ROW MODE DB2SQL
+        //        values app.notifyEmail('Jerry', 'Table x is about to be updated'); 
+        
+        tokens.consume(STMT_CREATE_TRIGGER);
+        
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_TRIGGER_STATEMENT);
+        
+        String type = null;
+        
+        if( tokens.canConsume("AFTER") ) {
+            AstNode optionNode = nodeFactory().node("beforeOrAfter", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "AFTER");
+        } else {
+            tokens.consume("NO", "CASCADE", "BEFORE");
+            AstNode optionNode = nodeFactory().node("beforeOrAfter", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "NO CASCADE BEFORE");
+        }
+        
+        if( tokens.canConsume(INSERT)) {
+            AstNode optionNode = nodeFactory().node("eventType", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, INSERT);
+            type = INSERT;
+        } else if( tokens.canConsume(DELETE) ) {
+            AstNode optionNode = nodeFactory().node("eventType", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, DELETE);
+            type = DELETE;
+        } else {
+            tokens.consume(UPDATE);
+            AstNode optionNode = nodeFactory().node("eventType", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, UPDATE);
+            type = UPDATE;
+        }
+        
+        if( tokens.canConsume("OF") ) {
+            // Parse comma separated column names
+            String colName = parseName(tokens);
+            nodeFactory().node(colName, node, TYPE_COLUMN_REFERENCE);
+            
+            while( tokens.canConsume(COMMA)) {
+                colName = parseName(tokens);
+                nodeFactory().node(colName, node, TYPE_COLUMN_REFERENCE);
+            }
+        }
+        tokens.consume("ON");
+        
+        String tableName = parseName(tokens);
+        
+        node.setProperty(TABLE_NAME, tableName);
+        
+        if( tokens.canConsume("REFERENCING") ) {
+            //      ReferencingClause
+            //        REFERENCING
+            //        {
+            //        { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW ] [ AS ] correlation-Name ] | 
+            //        { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW TABLE } [AS] Identifier ]  |
+            //        { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE } [AS] Identifier ] 
+            //        }
+            
+            StringBuffer sb = new StringBuffer();
+            if( tokens.matchesAnyOf("OLD", "NEW") ) {
+                if( tokens.canConsume("OLD")) {
+                    sb.append("OLD");
+                } else {
+                    tokens.consume("NEW");
+                    sb.append("NEW");
+                }
+                if( tokens.canConsume("ROW") ) {
+                    sb.append(SPACE).append("ROW");
+                }
+                if( tokens.canConsume("AS") ) {
+                    sb.append(SPACE).append("AS");
+                }
+                if( tokens.matchesAnyOf("OLD", "NEW")) {
+                    if( tokens.canConsume("OLD")) {
+                        sb.append(SPACE).append("OLD");
+                    } else {
+                        tokens.consume("NEW");
+                        sb.append(SPACE).append("NEW");
+                    }
+                    
+                    if( tokens.canConsume("ROW") ) {
+                        sb.append(SPACE).append("ROW");
+                    }
+                    if( tokens.canConsume("AS") ) {
+                        sb.append(SPACE).append("AS");
+                    }
+                    if( ! tokens.matchesAnyOf("FOR", "MODE", type)) {
+                        String corrName = parseName(tokens);
+                        sb.append(SPACE).append(corrName);
+                    }
+                } else {
+                    String corrName = parseName(tokens);
+                    sb.append(SPACE).append(corrName);
+                    
+                    if( tokens.matchesAnyOf("OLD", "NEW") ) {
+                        if( tokens.canConsume("OLD")) {
+                            sb.append(SPACE).append("OLD");
+                        } else {
+                            tokens.consume("NEW");
+                            sb.append(SPACE).append("NEW");
+                        }
+                        
+                        if( tokens.canConsume("ROW") ) {
+                            sb.append(SPACE).append("ROW");
+                        }
+                        if( tokens.canConsume("AS") ) {
+                            sb.append(SPACE).append("AS");
+                        }
+                        if( ! tokens.matchesAnyOf("FOR", "MODE", type)) {
+                            corrName = parseName(tokens);
+                            sb.append(SPACE).append(corrName);
+                        }
+                    }
+                }
+            }
+        }            
+        //[ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ]
+        if( tokens.canConsume("FOR", "EACH")) {
+            if( tokens.canConsume("ROW")) {
+                AstNode optionNode = nodeFactory().node("forEach", node, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "FOR EACH ROW");
+            } else {
+                tokens.consume("STATEMENT");
+                AstNode optionNode = nodeFactory().node("forEach", node, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "FOR EACH STATEMENT");
+            }
+        }
+        if( tokens.canConsume("MODE")) {
+            tokens.consume("DB2SQL");
+            AstNode optionNode = nodeFactory().node("mode", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "MODE DB2SQL");
+        }
+                                                        
+        String sql = parseUntilTerminatorIgnoreEmbeddedStatements(tokens);
+        node.setProperty(SQL, sql);
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
     /**
      * {@inheritDoc}
      * 
@@ -796,23 +1303,28 @@
                 dataType.setKMGLength(isKMGLength);
                 dataType.setKMGValue(kmgValue);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_BIGINT)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_LONG_VARCHAR_FBD)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true) + SPACE + consume(tokens, dataType, true) + SPACE
                            + consume(tokens, dataType, true) + SPACE + consume(tokens, dataType, true) + SPACE
                            + consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_LONG_VARCHAR)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true) + SPACE + consume(tokens, dataType, true);
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_DOUBLE)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_XML)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             }
 
             if (dataType == null) {

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-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -422,7 +422,27 @@
         CheckArg.isNotNull(tokens, "tokens");
         CheckArg.isNotNull(parentNode, "parentNode");
 
-        // return super.parseGrantStatement(tokens, parentNode);
+        //        GRANT { grant_system_privileges | grant_object_privileges } ;
+        //
+        //            ** grant_system_privileges **
+        //        
+        //            { system_privilege | role | ALL PRIVILEGES } [, { system_privilege | role | ALL PRIVILEGES } ]...
+        //             TO grantee_clause [ WITH ADMIN OPTION ]
+        //
+        //            ** grant_object_privileges **
+        //
+        //            { object_privilege | ALL [ PRIVILEGES ] } [ (column [, column ]...) ] [, { object_privilege | ALL [ PRIVILEGES ] }  [ (column [, column ]...) ] ]...
+        //                 on_object_clause
+        //              TO grantee_clause [ WITH HIERARCHY OPTION ] [ WITH GRANT OPTION ]
+
+        //            ** on_object_clause **
+        //
+        //            { [ schema. ] object | { DIRECTORY directory_name | JAVA { SOURCE | RESOURCE } [ schema. ] object } }
+        //
+        //            ** grantee_clause **
+        //
+        //            { user [ IDENTIFIED BY password ] | role | PUBLIC } [, { user [ IDENTIFIED BY password ] | role | PUBLIC  } ]...
+
         AstNode node = null;
 
         // Original implementation does NOT parse Insert statement, but just returns a generic TypedStatement
@@ -444,8 +464,8 @@
 
         markEndOfStatement(tokens, node);
 
-        return node;
-
+        return node; 
+        
         // if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "TO")) {
         // markStartOfStatement(tokens);
         // tokens.consume(GRANT);

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -243,10 +243,12 @@
 	    public final static Name[] VALID_SCHEMA_CHILD_STMTS = {
 	    	StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT, 
 	    	StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
-	    	StandardDdlLexicon.TYPE_GRANT_STATEMENT,
+	    	StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT,
 	    	PostgresDdlLexicon.TYPE_CREATE_INDEX_STATEMENT,
 	    	PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT,
-	    	PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT
+	    	PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT,
+	    	PostgresDdlLexicon.TYPE_GRANT_ON_SEQUENCE_STATEMENT,
+	    	PostgresDdlLexicon.TYPE_GRANT_ON_SCHEMA_STATEMENT
 	  	};
 	    
 	    public final static Name[] COMPLEX_STMT_TYPES = {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -133,9 +133,23 @@
     public static final Name TYPE_UNLISTEN_STATEMENT 				= new BasicName(Namespace.URI, "unlistenStatement");
     public static final Name TYPE_VACUUM_STATEMENT 					= new BasicName(Namespace.URI, "vacuumStatement");
     
-    public static final Name TYPE_RENAME_COLUMN 					= new BasicName(Namespace.URI, "renameColumn");
+    public static final Name TYPE_GRANT_ON_SEQUENCE_STATEMENT       = new BasicName(Namespace.URI, "grantOnSequenceStatement");
+    public static final Name TYPE_GRANT_ON_DATABASE_STATEMENT       = new BasicName(Namespace.URI, "grantOnDatabaseStatement");
+    public static final Name TYPE_GRANT_ON_FOREIGN_DATA_WRAPPER_STATEMENT  = new BasicName(Namespace.URI, "grantOnForeignDataWrapperStatement");
+    public static final Name TYPE_GRANT_ON_FOREIGN_SERVER_STATEMENT = new BasicName(Namespace.URI, "grantOnForeignServerStatement");
+    public static final Name TYPE_GRANT_ON_FUNCTION_STATEMENT       = new BasicName(Namespace.URI, "grantOnFunctionStatement");
+    public static final Name TYPE_GRANT_ON_LANGUAGE_STATEMENT       = new BasicName(Namespace.URI, "grantOnLanguageStatement");
+    public static final Name TYPE_GRANT_ON_SCHEMA_STATEMENT         = new BasicName(Namespace.URI, "grantOnSchemaStatement");
+    public static final Name TYPE_GRANT_ON_TABLESPACE_STATEMENT     = new BasicName(Namespace.URI, "grantOnTablespaceStatement");
+    public static final Name TYPE_GRANT_ON_PROCEDURE_STATEMENT      = new BasicName(Namespace.URI, "grantOnProcedureStatement");
+    public static final Name TYPE_GRANT_ROLES_STATEMENT             = new BasicName(Namespace.URI, "grantRolesStatement");
     
+    public static final Name TYPE_RENAME_COLUMN 					= new BasicName(Namespace.URI, "renamedColumn");
+    
     public static final Name SCHEMA_NAME 							= new BasicName(Namespace.URI, "schemaName");
+    public static final Name FUNCTION_PARAMETER                     = new BasicName(Namespace.URI, "functionParameter");
+    public static final Name FUNCTION_PARAMETER_MODE                = new BasicName(Namespace.URI, "mode");
+    public static final Name ROLE                                   = new BasicName(Namespace.URI, "role");
     
     // PROPERTY NAMES
     public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType");

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,118 +1,11 @@
 package org.jboss.dna.sequencer.ddl.dialect.postgres;
 
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_ORIGINAL_EXPRESSION;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_CHAR_INDEX;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_COLUMN_NUMBER;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_LINE_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_PRECISION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NEW_NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_SCHEMA_STATEMENT;
-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_DROP_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_UNKNOWN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.VALUE;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.SCHEMA_NAME;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ABORT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_AGGREGATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_CONVERSION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_DATABASE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_GROUP_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_LANGUAGE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_OPERATOR_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SERVER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLESPACE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLE_STATEMENT_POSTGRES;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TEXT_SEARCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_USER_MAPPING_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_USER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ANALYZE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CLUSTER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COMMENT_ON_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COPY_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_AGGREGATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CAST_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CONSTRAINT_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CONVERSION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_DATABASE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_GROUP_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_LANGUAGE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_OPERATOR_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_RULE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SERVER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TABLESPACE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TEXT_SEARCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_USER_MAPPING_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_USER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DEALLOCATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DECLARE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_AGGREGATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CAST_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CONSTRAINT_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CONVERSION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_DATABASE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_GROUP_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_LANGUAGE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_OPERATOR_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_OWNED_BY_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_RULE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_SERVER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TABLESPACE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TEXT_SEARCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_USER_MAPPING_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_USER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_EXPLAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_FETCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LISTEN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LOAD_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LOCK_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_MOVE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_NOTIFY_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_PREPARE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_REASSIGN_OWNED_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_REINDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RELEASE_SAVEPOINT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RENAME_COLUMN;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ROLLBACK_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_SELECT_INTO_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_SHOW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_TRUNCATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_UNLISTEN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_VACUUM_STATEMENT;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.*;
 import java.util.ArrayList;
 import java.util.List;
 import org.jboss.dna.common.text.ParsingException;
@@ -1138,17 +1031,360 @@
 
         return newNode;
     }
-
+    
+    /**
+     * 
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream, org.jboss.dna.sequencer.ddl.node.AstNode)
+     */
     @Override
     protected AstNode parseGrantStatement( DdlTokenStream tokens,
                                            AstNode parentNode ) throws ParsingException {
         assert tokens != null;
         assert parentNode != null;
+        assert tokens.matches(GRANT);
+        
+        markStartOfStatement(tokens);
 
-        return super.parseGrantStatement(tokens, parentNode);
+        // NOTE: The first wack at this does not take into account the apparent potential repeating name elements after each type
+        // declaration. Example:
+        //          GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
+        //             [,...] | ALL [ PRIVILEGES ] }
+        //             ON [ TABLE ] tablename [, ...]
+        //             TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+        //
+        // the "ON [ TABLE ] tablename [, ...]" seems to indicate that you can grant privileges on multiple tables at once, which is
+        // different thatn the SQL 92 standard. So this pass ONLY allows one and an parsing error will probably occur if multiple.
+        //
+        //      Syntax for tables
+        //
+        //             GRANT <privileges> ON <object name>
+        //                      TO <grantee> [ { <comma> <grantee> }... ]
+        //                      [ WITH GRANT OPTION ]
+        //
+        //        <object name> ::=
+        //            [ TABLE ] <table name>
+        //          | SEQUENCE <sequence name>
+        //          | DATABASE <db name>
+        //          | FOREIGN DATA WRAPPER <fdw name>
+        //          | FOREIGN SERVER <server name>
+        //          | FUNCTION <function name>
+        //          | LANGUAGE <language name>
+        //          | SCHEMA <schema name>
+        //          | TABLESPACE <tablespace name>
+
+        //
+        //      Syntax for roles
+        //
+        //          GRANT roleName [ {, roleName }* ] TO grantees
+        
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        List<AstNode> grantNodes = new ArrayList<AstNode>();
+        boolean allPrivileges = false;
+
+        List<AstNode> privileges = new ArrayList<AstNode>();
+
+        tokens.consume("GRANT");
+
+        if( tokens.canConsume("ALL", "PRIVILEGES")) {
+            allPrivileges = true;
+        } else { 
+            parseGrantPrivileges(tokens, privileges);
+        }
+        
+        if( allPrivileges || !privileges.isEmpty() ) {
+            
+            tokens.consume("ON");
+            
+            if( tokens.canConsume("SCHEMA")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_SCHEMA_STATEMENT);
+            } else if( tokens.canConsume("SEQUENCE") ) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_SEQUENCE_STATEMENT);
+            } else if( tokens.canConsume("TABLESPACE") ) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_TABLESPACE_STATEMENT);
+            } else if( tokens.canConsume("DATABASE")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_DATABASE_STATEMENT);
+            } else if( tokens.canConsume("FUNCTION")) {
+                grantNodes = parseFunctionAndParameters(tokens, parentNode);
+            } else if( tokens.canConsume("LANGUAGE")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_LANGUAGE_STATEMENT);
+            } else if( tokens.canConsume("FOREIGN", "DATA", "WRAPPER")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_FOREIGN_DATA_WRAPPER_STATEMENT);
+            } else if( tokens.canConsume("FOREIGN", "SERVER")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_FOREIGN_SERVER_STATEMENT);
+            } else {
+                tokens.canConsume(TABLE); // OPTIONAL
+                String name = parseName(tokens);
+                AstNode grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+                grantNodes.add(grantNode);
+                while( tokens.canConsume(COMMA) ) {
+                    // Assume more names here
+                    name = parseName(tokens);
+                    grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+                    grantNodes.add(grantNode);
+                }
+            }
+        } else {
+            // Assume ROLES here
+            // role [, ...]
+            AstNode grantNode = nodeFactory().node("roles", parentNode, TYPE_GRANT_ROLES_STATEMENT);
+            grantNodes.add(grantNode);
+            do {
+                String role = parseName(tokens);
+                nodeFactory().node(role, grantNode, ROLE);
+            } while( tokens.canConsume(COMMA));
+        }
+        
+        tokens.consume("TO");
+        List<String> grantees = new ArrayList<String>();
+        
+        do {
+            String grantee = parseName(tokens);
+            grantees.add(grantee);
+        } while( tokens.canConsume(COMMA));
+        
+        boolean withGrantOption = false;
+        if( tokens.canConsume("WITH", "GRANT", "OPTION")) {
+            withGrantOption = true;
+        }
+        
+        // Set all properties and children on Grant Nodes
+        for( AstNode grantNode : grantNodes) {
+            List<AstNode> copyOfPrivileges = copyOfPrivileges(privileges);
+            // Attach privileges to grant node
+            for( AstNode node : copyOfPrivileges ) {
+                node.setParent(grantNode);
+            }
+            if( allPrivileges ) {
+                grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+            }
+            for( String grantee : grantees) {
+                nodeFactory().node(grantee, grantNode, GRANTEE);
+            }
+            
+            if( withGrantOption ) {
+                AstNode optionNode = nodeFactory().node("withGrant", grantNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "WITH GRANT OPTION");
+            }
+        }
+        AstNode firstGrantNode = grantNodes.get(0);
+        
+        markEndOfStatement(tokens, firstGrantNode);
+
+        // Update additional grant nodes with statement info
+        
+        for( int i=1; i<grantNodes.size(); i++) {
+            AstNode grantNode = grantNodes.get(i);
+            grantNode.setProperty(DDL_EXPRESSION, firstGrantNode.getProperty(DDL_EXPRESSION));
+            grantNode.setProperty(DDL_START_LINE_NUMBER, firstGrantNode.getProperty(DDL_START_LINE_NUMBER));
+            grantNode.setProperty(DDL_START_CHAR_INDEX, firstGrantNode.getProperty(DDL_START_CHAR_INDEX));
+            grantNode.setProperty(DDL_START_COLUMN_NUMBER, firstGrantNode.getProperty(DDL_START_COLUMN_NUMBER));
+        }
+        
+        
+        return grantNodes.get(0);
     }
 
+
+    /**
+     * 
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantPrivileges(org.jboss.dna.sequencer.ddl.DdlTokenStream, java.util.List)
+     */
     @Override
+    protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode> privileges) throws ParsingException {
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        //      privilege-list
+        //
+        //          table-privilege {, table-privilege }*
+        //
+        //      table-privilege
+        //          SELECT [ <left paren> <privilege column list> <right paren> ]
+        //        | DELETE
+        //        | INSERT [ <left paren> <privilege column list> <right paren> ]
+        //        | UPDATE [ <left paren> <privilege column list> <right paren> ]
+        //        | REFERENCES [ <left paren> <privilege column list> <right paren> ]
+        //        | USAGE
+        //        | TRIGGER
+        //        | TRUNCATE
+        //        | CREATE
+        //        | CONNECT
+        //        | TEMPORARY
+        //        | TEMP
+        //        | EXECUTE
+        
+        //  POSTGRES has the following Privileges:
+        //          GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
+        
+        do {
+            AstNode node = null;
+            
+            if( tokens.canConsume(DELETE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, DELETE);
+            } else if( tokens.canConsume(INSERT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, INSERT);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("REFERENCES")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "REFERENCES");
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume(SELECT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, SELECT);
+                // Could have columns here
+                // GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
+
+                // Let's just swallow the column data.
+                
+                consumeParenBoundedTokens(tokens, true);
+            } else if( tokens.canConsume("USAGE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "USAGE");
+            } else if( tokens.canConsume(UPDATE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, UPDATE);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("TRIGGER")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TRIGGER");
+            } else if( tokens.canConsume("TRUNCATE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TRUNCATE");
+            } else if( tokens.canConsume("CREATE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "CREATE");
+            } else if( tokens.canConsume("CONNECT")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "CONNECT");
+            } else if( tokens.canConsume("TEMPORARY")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TEMPORARY");
+            } else if( tokens.canConsume("TEMP")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TEMP");
+            } else if( tokens.canConsume("EXECUTE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "EXECUTE");
+            }
+            
+            if( node == null) {
+                break;
+            }
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            privileges.add(node);
+            
+        } while( tokens.canConsume(COMMA));
+
+    }
+    
+    private List<AstNode> parseMultipleGrantTargets(DdlTokenStream tokens,
+                                                    AstNode parentNode,
+                                                    Name nodeType) throws ParsingException {
+        List<AstNode> grantNodes = new ArrayList<AstNode>();
+        String name = parseName(tokens);
+        AstNode grantNode = nodeFactory().node(name, parentNode, nodeType);
+        grantNodes.add(grantNode);
+        while( tokens.canConsume(COMMA) ) {
+            // Assume more names here
+            name = parseName(tokens);
+            grantNode = nodeFactory().node(name, parentNode, nodeType);
+            grantNodes.add(grantNode);
+        }
+        
+        return grantNodes;
+    }
+    
+    private List<AstNode> copyOfPrivileges(List<AstNode> privileges) {
+        List<AstNode> copyOfPrivileges = new ArrayList<AstNode>();
+        for( AstNode node : privileges) {
+            copyOfPrivileges.add(node.clone());
+        }
+        
+        return copyOfPrivileges;
+    }
+    
+    private List<AstNode> parseFunctionAndParameters( DdlTokenStream tokens,
+                                                AstNode parentNode ) throws ParsingException {
+        boolean isFirstFunction = true;
+        List<AstNode> grantNodes = new ArrayList<AstNode>();
+        
+        // FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]
+
+        // argmode = [ IN, OUT, INOUT, or VARIADIC ]
+        
+        // p(a int, b TEXT), q(integer, double)
+        
+        //        [postgresddl:grantOnFunctionStatement]         > ddl:grantStatement, postgresddl:functionOperand mixin
+        //        + * (postgresddl:functionParameter) = postgresddl:functionParameter multiple
+        
+        do {
+            String name = parseName(tokens);
+            AstNode grantFunctionNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_FUNCTION_STATEMENT);
+            
+            grantNodes.add(grantFunctionNode);
+
+            // Parse Parameter Data
+            if( tokens.matches(L_PAREN)) {
+                tokens.consume(L_PAREN);
+                
+                if( !tokens.canConsume(R_PAREN)) {
+                    // check for datatype
+                    do{
+                        String mode = null;
+                        
+                        if( tokens.matchesAnyOf("IN", "OUT", "INOUT", "VARIADIC")) {
+                            mode = tokens.consume();
+                        }
+                        AstNode paramNode = null;
+                        
+                        DataType dType = getDatatypeParser().parse(tokens);
+                        if( dType != null ) {
+                            // NO Parameter Name, only DataType
+                            paramNode = nodeFactory().node("parameter", grantFunctionNode, FUNCTION_PARAMETER);
+                            if( mode != null ) {
+                                paramNode.setProperty(FUNCTION_PARAMETER_MODE, mode);
+                            }
+                            getDatatypeParser().setPropertiesOnNode(paramNode, dType);
+                        } else {
+                            String paramName = parseName(tokens);
+                            dType = getDatatypeParser().parse(tokens);
+                            assert paramName != null;
+
+                            paramNode = nodeFactory().node(paramName, grantFunctionNode, FUNCTION_PARAMETER);
+                            if( mode != null ) {
+                                paramNode.setProperty(FUNCTION_PARAMETER_MODE, mode);
+                            }
+                            if( dType != null ) {
+                                getDatatypeParser().setPropertiesOnNode(paramNode, dType);
+                            }
+                        }
+                    } while( tokens.canConsume(COMMA));
+                    
+                    tokens.consume(R_PAREN);
+                }
+            }
+            
+            // RESET first parameter flag
+            if( isFirstFunction ) {
+                isFirstFunction = false;
+            }
+        } while( tokens.canConsume(COMMA) );
+        
+        
+        return grantNodes;
+    }
+
+    @Override
     protected AstNode parseSetStatement( DdlTokenStream tokens,
                                          AstNode parentNode ) throws ParsingException {
         assert tokens != null;

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-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties	2010-01-05 13:31:47 UTC (rev 1527)
@@ -29,4 +29,5 @@
 unusedTokensParsingColumnsAndConstraints = The following unused tokens were found parsing columns and constraints for table: {0}. 
 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}.
\ No newline at end of file
+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

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,266 +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'>
-
-
-//------------------------------------------------------------------------------
-// N O D E T Y P E S
-//------------------------------------------------------------------------------
-
-[ddl:operation] mixin abstract
-[ddl:operand] mixin abstract
-  - ddl:name (STRING) mandatory
-
-// =============================================================================
-// STATEMENT
-// =============================================================================
-[ddl:statement] mixin abstract
-  - ddl:expression (string) mandatory                       // The string fragment encompassing the statement expression.
-  - ddl:originalExpression (string) mandatory               // The string fragment encompassing the original statement expression.
-  - ddl:startLineNumber (long) mandatory                    // The starting line number for the statement
-  - ddl:startColumnNumber (long) mandatory                  // The starting column number for the statement
-  - ddl:startCharIndex (long) mandatory                     // The starting content character index for the statement
-  - ddl:length (long) mandatory                             // The string length
-  + ddl:problem (ddl:ddlProblem) = ddl:ddlProblem multiple  // Problems encountered during parsing.
-
-// =============================================================================
-// CREATE, ALTER, DROP, INSERT, SET, GRANT, REVOKE
-// =============================================================================
-[ddl:creatable] > ddl:operation abstract
-[ddl:alterable] > ddl:operation abstract
-[ddl:droppable] > ddl:operation abstract
-  - ddl:dropBehavior (STRING)
-  + ddl:dropOption (ddl:statementOption) = ddl:statementOption multiple
-[ddl:insertable] > ddl:operation abstract
-[ddl:settable]  > ddl:operation abstract
-[ddl:grantable] > ddl:operation abstract
-[ddl:revokable] > ddl:operation abstract
-[ddl:renamable] > ddl:operation, ddl:operand abstract
-  - ddl:newName (STRING)
-
-// =============================================================================
-// OPERANDS:  SCHEMA, TABLE, DOMAIN, VIEW, ASSERTION, CHARACTER SET, COLLATION, TRANSLATION
-// =============================================================================
-[ddl:schemaOperand]             > ddl:operand abstract
-[ddl:tableOperand]              > ddl:operand abstract
-[ddl:domainOperand]             > ddl:operand abstract
-[ddl:viewOperand]               > ddl:operand abstract
-[ddl:assertionOperand]          > ddl:operand abstract
-[ddl:characterSetOperand]       > ddl:operand abstract
-[ddl:collationOperand]          > ddl:operand abstract
-[ddl:translationOperand]        > ddl:operand abstract
-[ddl:columnOperand]             > ddl:operand abstract
-[ddl:tableConstraintOperand]    > ddl:operand abstract
-[ddl:referenceOperand]          > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
-  - ddl:datatypeName (STRING) mandatory
-  - ddl:datatypeLength (LONG)
-  - ddl:datatypePrecision (LONG)
-  - ddl:datatypeScale (LONG)
-  - ddl:nullable (STRING)
-  - ddl:defaultOption (STRING) 
-      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
-  - ddl:defaultValue (STRING)
-  - ddl:defaultPrecision (LONG)
-  - ddl:collationName (STRING)
-  + ddl:dropBehavior (ddl:simpleProperty) = ddl:simpleProperty
-  + ddl:columnAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-
-// =============================================================================
-// TABLE CONSTRAINT
-// =============================================================================
-[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
-  - ddl:constraintType (STRING) mandatory
-      < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK'
-  - ddl:deferrable (STRING)
-      < 'DEFERRABLE', 'NOT DEFERRABLE'
-  - ddl:checkSearchCondition (STRING)
-      < 'INITIALLY DEFERRED', 'INITIALLY IMMEDIATE'
-  + * (ddl:columnReference) = ddl:columnReference multiple
-  + * (ddl:tableReference) = ddl:tableReference
-  + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-  
-// =============================================================================
-// REFERENCE
-// =============================================================================
-[ddl:columnReference]       > ddl:referenceOperand mixin
-[ddl:tableReference]        > ddl:referenceOperand mixin
-[ddl:fkColumnReference]     > ddl:referenceOperand mixin
-
-// =============================================================================
-// SIMPLE STRING PROPERTY
-// =============================================================================
-[ddl:simpleProperty] mixin
-  - ddl:propValue (STRING) mandatory
-
-// =============================================================================
-// STATEMENT OPTION
-// =============================================================================
-[ddl:statementOption] mixin
-  - ddl:value (STRING) mandatory
-  
-// =============================================================================
-// DDL PROBLEM
-// =============================================================================
-[ddl:ddlProblem] mixin
-  - ddl:problemLevel (LONG) mandatory
-  - ddl:message (STRING) mandatory
-
-// =============================================================================
-// CREATE SCHEMA
-// =============================================================================
-[ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand  mixin
-  - ddl:defaultCharacterSetName (STRING)
-  + * (ddl:statement) = ddl:statement multiple
-
-// =============================================================================
-// CREATE TABLE
-// =============================================================================
-[ddl:createTableStatement] > ddl:statement, ddl:creatable, ddl:tableOperand mixin
-  - ddl:temporary (STRING)
-    < 'GLOBAL', 'LOCAL'
-  - ddl:onCommitValue (STRING)
-    < 'DELETE ROWS', 'PRESERVE ROWS'
-  + * (ddl:columnDefinition) = ddl:columnDefinition multiple
-  + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
-  + * (ddl:statementOption) = ddl:statementOption multiple 
-
-// =============================================================================
-// CREATE VIEW
-// =============================================================================
-[ddl:createViewStatement] > ddl:statement, ddl:creatable, ddl:viewOperand mixin 
-  - ddl:sqlExpression (STRING) mandatory
-  - ddl:checkOption (STRING)
-  + * (ddl:columnReference) = ddl:columnReference multiple
-  
-// =============================================================================
-// CREATE DOMAIN
-// =============================================================================
-[ddl:createDomainStatement] > ddl:statement, ddl:creatable, ddl:domainOperand mixin 
-  - ddl:datatypeName (STRING) mandatory
-  - ddl:datatypeLength (LONG)
-  - ddl:datatypePrecision (LONG)
-  - ddl:datatypeScale (LONG)
-  - ddl:nullable (STRING)
-  - ddl:defaultOption (STRING) 
-      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
-  - ddl:defaultValue (STRING)
-  - ddl:defaultPrecision (LONG)
-  - ddl:collationName (STRING)
-  + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
-
-// =============================================================================
-// CREATE ASSERTION
-// =============================================================================
-[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand mixin
-  - ddl:constraintName (STRING) mandatory
-  - ddl:searchCondition (STRING) mandatory
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-
-// =============================================================================
-// CREATE CHARACTER SET
-// =============================================================================
-[ddl:createCharacterSetStatement] > ddl:statement, ddl:creatable, ddl:characterSetOperand mixin
-  - ddl:existingName (STRING) mandatory
-  - ddl:collateClause (STRING)                      // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  - ddl:limitedCollationDefinition (STRING)         // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  
-// =============================================================================
-// CREATE COLLATION
-// =============================================================================
-[ddl:createCollationStatement] > ddl:statement, ddl:creatable, ddl:collationOperand mixin
-  - ddl:characterSetName (STRING) mandatory
-  - ddl:collationSource (STRING)                    // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  - ddl:padAttribute (STRING)
-    < 'NO PAD', 'PAD SPACE'
-    
-// =============================================================================
-// CREATE TRANSLATION
-// =============================================================================
-[ddl:createTranslationStatement] > ddl:statement, ddl:creatable, ddl:translationOperand mixin
-  - ddl:sourceCharacterSetName (STRING) mandatory
-  - ddl:targetCharacterSetName (STRING) mandatory
-  - ddl:translationSource (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  
-// =============================================================================
-// ALTER TABLE
-// =============================================================================
-[ddl:alterTableStatement] > ddl:statement, ddl:alterable, ddl:tableOperand mixin
-  + * (ddl:addColumnDefinition)             = ddl:addColumnDefinition multiple
-  + * (ddl:dropColumnDefinition)            = ddl:dropColumnDefinition multiple
-  + * (ddl:alterColumnDefinition)           = ddl:alterColumnDefinition multiple
-  + * (ddl:addTableConstraintDefinition)    = ddl:addTableConstraintDefinition multiple
-  + * (ddl:dropTableConstraintDefinition)   = ddl:dropTableConstraintDefinition multiple
-  + * (ddl:statementOption) = ddl:statementOption multiple
-
-// =============================================================================
-// ALTER DOMAIN
-// =============================================================================
-[ddl:alterDomainStatement] > ddl:statement, ddl:alterable, ddl:domainOperand mixin
-  - ddl:alterDomainAction (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-[ddl:dropSchemaStatement]           > ddl:statement, ddl:droppable, ddl:schemaOperand mixin
-[ddl:dropTableStatement]            > ddl:statement, ddl:droppable, ddl:tableOperand mixin
-[ddl:dropViewStatement]             > ddl:statement, ddl:droppable, ddl:viewOperand mixin
-[ddl:dropDomainStatement]           > ddl:statement, ddl:droppable, ddl:domainOperand mixin
-[ddl:dropCharacterSetStatement]     > ddl:statement, ddl:droppable, ddl:characterSetOperand mixin
-[ddl:dropCollationStatement]        > ddl:statement, ddl:droppable, ddl:collationOperand mixin
-[ddl:dropTranslationStatement]      > ddl:statement, ddl:droppable, ddl:translationOperand mixin
-[ddl:dropAssertionStatement]        > ddl:statement, ddl:droppable, ddl:assertionOperand mixin
-
-[ddl:alterColumnDefinition]         > ddl:columnDefinition, ddl:alterable mixin
-[ddl:addColumnDefinition]           > ddl:columnDefinition, ddl:creatable mixin
-[ddl:dropColumnDefinition]          > ddl:columnDefinition, ddl:droppable mixin
-[ddl:addTableConstraintDefinition]  > ddl:tableConstraintDefinition, ddl:creatable mixin
-[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-[ddl:setStatement] > ddl:statement, ddl:settable mixin
-   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-   
-[ddl:insertStatement] > ddl:statement, ddl:insertable mixin
-   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-   
-[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
-   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-
-
-

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -0,0 +1,280 @@
+/*
+ * 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'>
+
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[ddl:operation] mixin abstract
+[ddl:operand] mixin abstract
+  - ddl:name (STRING) mandatory
+
+// =============================================================================
+// STATEMENT
+// =============================================================================
+[ddl:statement] mixin abstract
+  - ddl:expression (string) mandatory                       // The string fragment encompassing the statement expression.
+  - ddl:originalExpression (string) mandatory               // The string fragment encompassing the original statement expression.
+  - ddl:startLineNumber (long) mandatory                    // The starting line number for the statement
+  - ddl:startColumnNumber (long) mandatory                  // The starting column number for the statement
+  - ddl:startCharIndex (long) mandatory                     // The starting content character index for the statement
+  - ddl:length (long) mandatory                             // The string length
+  + ddl:problem (ddl:ddlProblem) = ddl:ddlProblem multiple  // Problems encountered during parsing.
+
+// =============================================================================
+// CREATE, ALTER, DROP, INSERT, SET, GRANT, REVOKE
+// =============================================================================
+[ddl:creatable] > ddl:operation abstract
+[ddl:alterable] > ddl:operation abstract
+[ddl:droppable] > ddl:operation abstract
+  - ddl:dropBehavior (STRING)
+  + ddl:dropOption (ddl:statementOption) = ddl:statementOption multiple
+[ddl:insertable] > ddl:operation abstract
+[ddl:settable]  > ddl:operation abstract
+[ddl:grantable] > ddl:operation abstract
+[ddl:revokable] > ddl:operation abstract
+[ddl:renamable] > ddl:operation abstract
+  - ddl:newName (STRING)
+
+// =============================================================================
+// OPERANDS:  SCHEMA, TABLE, DOMAIN, VIEW, ASSERTION, CHARACTER SET, COLLATION, TRANSLATION
+// =============================================================================
+[ddl:schemaOperand]             > ddl:operand abstract
+[ddl:tableOperand]              > ddl:operand abstract
+[ddl:domainOperand]             > ddl:operand abstract
+[ddl:viewOperand]               > ddl:operand abstract
+[ddl:assertionOperand]          > ddl:operand abstract
+[ddl:characterSetOperand]       > ddl:operand abstract
+[ddl:collationOperand]          > ddl:operand abstract
+[ddl:translationOperand]        > ddl:operand abstract
+[ddl:columnOperand]             > ddl:operand abstract
+[ddl:tableConstraintOperand]    > ddl:operand abstract
+[ddl:referenceOperand]          > ddl:operand abstract
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING) 
+      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
+  - ddl:defaultValue (STRING)
+  - ddl:defaultPrecision (LONG)
+  - ddl:collationName (STRING)
+  + ddl:dropBehavior (ddl:simpleProperty) = ddl:simpleProperty
+  + ddl:columnAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+
+// =============================================================================
+// TABLE CONSTRAINT
+// =============================================================================
+[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
+  - ddl:constraintType (STRING) mandatory
+      < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK'
+  - ddl:deferrable (STRING)
+      < 'DEFERRABLE', 'NOT DEFERRABLE'
+  - ddl:checkSearchCondition (STRING)
+      < 'INITIALLY DEFERRED', 'INITIALLY IMMEDIATE'
+  + * (ddl:columnReference) = ddl:columnReference multiple
+  + * (ddl:tableReference) = ddl:tableReference
+  + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
+  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+  
+// =============================================================================
+// REFERENCE
+// =============================================================================
+[ddl:columnReference]       > ddl:referenceOperand mixin
+[ddl:tableReference]        > ddl:referenceOperand mixin
+[ddl:fkColumnReference]     > ddl:referenceOperand mixin
+[ddl:grantee]               > ddl:referenceOperand mixin
+
+// =============================================================================
+// SIMPLE STRING PROPERTY
+// =============================================================================
+[ddl:simpleProperty] mixin
+  - ddl:propValue (STRING) mandatory
+
+// =============================================================================
+// STATEMENT OPTION
+// =============================================================================
+[ddl:statementOption] mixin
+  - ddl:value (STRING) mandatory
+  
+// =============================================================================
+// DDL PROBLEM
+// =============================================================================
+[ddl:ddlProblem] mixin
+  - ddl:problemLevel (LONG) mandatory
+  - ddl:message (STRING) mandatory
+
+// =============================================================================
+// CREATE SCHEMA
+// =============================================================================
+[ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand  mixin
+  - ddl:defaultCharacterSetName (STRING)
+  + * (ddl:statement) = ddl:statement multiple
+
+// =============================================================================
+// CREATE TABLE
+// =============================================================================
+[ddl:createTableStatement] > ddl:statement, ddl:creatable, ddl:tableOperand mixin
+  - ddl:temporary (STRING)
+    < 'GLOBAL', 'LOCAL'
+  - ddl:onCommitValue (STRING)
+    < 'DELETE ROWS', 'PRESERVE ROWS'
+  + * (ddl:columnDefinition) = ddl:columnDefinition multiple
+  + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple 
+
+// =============================================================================
+// CREATE VIEW
+// =============================================================================
+[ddl:createViewStatement] > ddl:statement, ddl:creatable, ddl:viewOperand mixin 
+  - ddl:sqlExpression (STRING) mandatory
+  - ddl:checkOption (STRING)
+  + * (ddl:columnReference) = ddl:columnReference multiple
+  
+// =============================================================================
+// CREATE DOMAIN
+// =============================================================================
+[ddl:createDomainStatement] > ddl:statement, ddl:creatable, ddl:domainOperand mixin 
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING) 
+      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
+  - ddl:defaultValue (STRING)
+  - ddl:defaultPrecision (LONG)
+  - ddl:collationName (STRING)
+  + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+
+// =============================================================================
+// CREATE ASSERTION
+// =============================================================================
+[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand mixin
+  - ddl:constraintName (STRING) mandatory
+  - ddl:searchCondition (STRING) mandatory
+  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+
+// =============================================================================
+// CREATE CHARACTER SET
+// =============================================================================
+[ddl:createCharacterSetStatement] > ddl:statement, ddl:creatable, ddl:characterSetOperand mixin
+  - ddl:existingName (STRING) mandatory
+  - ddl:collateClause (STRING)                      // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  - ddl:limitedCollationDefinition (STRING)         // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  
+// =============================================================================
+// CREATE COLLATION
+// =============================================================================
+[ddl:createCollationStatement] > ddl:statement, ddl:creatable, ddl:collationOperand mixin
+  - ddl:characterSetName (STRING) mandatory
+  - ddl:collationSource (STRING)                    // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  - ddl:padAttribute (STRING)
+    < 'NO PAD', 'PAD SPACE'
+    
+// =============================================================================
+// CREATE TRANSLATION
+// =============================================================================
+[ddl:createTranslationStatement] > ddl:statement, ddl:creatable, ddl:translationOperand mixin
+  - ddl:sourceCharacterSetName (STRING) mandatory
+  - ddl:targetCharacterSetName (STRING) mandatory
+  - ddl:translationSource (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  
+// =============================================================================
+// ALTER TABLE
+// =============================================================================
+[ddl:alterTableStatement] > ddl:statement, ddl:alterable, ddl:tableOperand mixin
+  + * (ddl:addColumnDefinition)             = ddl:addColumnDefinition multiple
+  + * (ddl:dropColumnDefinition)            = ddl:dropColumnDefinition multiple
+  + * (ddl:alterColumnDefinition)           = ddl:alterColumnDefinition multiple
+  + * (ddl:addTableConstraintDefinition)    = ddl:addTableConstraintDefinition multiple
+  + * (ddl:dropTableConstraintDefinition)   = ddl:dropTableConstraintDefinition multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple
+
+// =============================================================================
+// ALTER DOMAIN
+// =============================================================================
+[ddl:alterDomainStatement] > ddl:statement, ddl:alterable, ddl:domainOperand mixin
+  - ddl:alterDomainAction (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+[ddl:dropSchemaStatement]           > ddl:statement, ddl:droppable, ddl:schemaOperand mixin
+[ddl:dropTableStatement]            > ddl:statement, ddl:droppable, ddl:tableOperand mixin
+[ddl:dropViewStatement]             > ddl:statement, ddl:droppable, ddl:viewOperand mixin
+[ddl:dropDomainStatement]           > ddl:statement, ddl:droppable, ddl:domainOperand mixin
+[ddl:dropCharacterSetStatement]     > ddl:statement, ddl:droppable, ddl:characterSetOperand mixin
+[ddl:dropCollationStatement]        > ddl:statement, ddl:droppable, ddl:collationOperand mixin
+[ddl:dropTranslationStatement]      > ddl:statement, ddl:droppable, ddl:translationOperand mixin
+[ddl:dropAssertionStatement]        > ddl:statement, ddl:droppable, ddl:assertionOperand mixin
+
+[ddl:alterColumnDefinition]         > ddl:columnDefinition, ddl:alterable mixin
+[ddl:addColumnDefinition]           > ddl:columnDefinition, ddl:creatable mixin
+[ddl:dropColumnDefinition]          > ddl:columnDefinition, ddl:droppable mixin
+[ddl:addTableConstraintDefinition]  > ddl:tableConstraintDefinition, ddl:creatable mixin
+[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[ddl:setStatement] > ddl:statement, ddl:settable mixin
+   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+   
+[ddl:insertStatement] > ddl:statement, ddl:insertable mixin
+   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+
+[ddl:grantPrivilege] mixin
+  - ddl:type (STRING) mandatory
+  + * (ddl:columnReference) = ddl:columnReference multiple
+
+[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
+  - ddl:allPrivileges (boolean)
+  + * (ddl:grantPrivilege) = ddl:grantPrivilege multiple
+  + * (ddl:grantee) = ddl:grantee multiple
+
+[ddl:grantOnTableStatement]         > ddl:grantStatement, ddl:tableOperand mixin
+[ddl:grantOnDomainStatement]        > ddl:grantStatement, ddl:domainOperand mixin
+[ddl:grantOnCollationStatement]     > ddl:grantStatement, ddl:collationOperand mixin
+[ddl:grantOnCharacterSetStatement]  > ddl:grantStatement, ddl:characterSetOperand mixin
+[ddl:grantOnTranslationStatement]   > ddl:grantStatement, ddl:translationOperand mixin


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

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,72 +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'>
-<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[derbyddl:functionOperand]  > ddl:operand abstract
-[derbyddl:indexOperand]     > ddl:operand abstract
-[derbyddl:procedureOperand] > ddl:operand abstract
-[derbyddl:roleOperand]      > ddl:operand abstract
-[derbyddl:synonymOperand]   > ddl:operand abstract
-[derbyddl:triggerOperand]   > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[derbyddl:columnDefinition] > ddl:columnDefinition mixin
-  - derbyddl:dropDefault (boolean)
-  
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-[derbyddl:createFunctionStatement]     > ddl:creatable, ddl:statement, derbyddl:functionOperand mixin
-[derbyddl:createIndex]                 > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
-  - derbyddl:tableName (string) mandatory
-  - derbyddl:unique (boolean)
-  + * (ddl:columnReference) = ddl:columnReference multiple
-[derbyddl:createProcedureStatement]    > ddl:creatable, ddl:statement, derbyddl:procedureOperand mixin
-[derbyddl:createRoleStatement]         > ddl:creatable, ddl:statement, derbyddl:roleOperand mixin
-[derbyddl:createSynonymStatement]      > ddl:creatable, ddl:statement, derbyddl:synonymOperand mixin
-[derbyddl:createTriggerStatement]      > ddl:creatable, ddl:statement, derbyddl:triggerOperand mixin
-
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-[derbyddl:dropFunctionStatement]    > ddl:droppable, derbyddl:functionOperand mixin
-[derbyddl:dropIndexStatement]       > ddl:droppable, derbyddl:indexOperand mixin
-[derbyddl:dropProcedureStatement]   > ddl:droppable, derbyddl:procedureOperand mixin
-[derbyddl:dropRoleStatement]        > ddl:droppable, derbyddl:roleOperand mixin
-[derbyddl:dropSynonymStatement]     > ddl:droppable, derbyddl:synonymOperand mixin
-[derbyddl:dropTriggerStatement]     > ddl:droppable, derbyddl:triggerOperand mixin

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -0,0 +1,102 @@
+/*
+ * 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'>
+<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[derbyddl:functionOperand]  > ddl:operand abstract
+[derbyddl:indexOperand]     > ddl:operand abstract
+[derbyddl:procedureOperand] > ddl:operand abstract
+[derbyddl:roleOperand]      > ddl:operand abstract
+[derbyddl:synonymOperand]   > ddl:operand abstract
+[derbyddl:triggerOperand]   > ddl:operand abstract
+
+[derbyddl:roleName]         > derbyddl:roleOperand mixin
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[derbyddl:columnDefinition] > ddl:columnDefinition mixin
+  - derbyddl:dropDefault (boolean)
+  
+[derbyddl:functionParameter] > ddl:columnDefinition mixin
+
+[derbyddl:indexColumnReference] > ddl:columnReference mixin
+  - derbyddl:order (STRING)
+  
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+[derbyddl:createFunctionStatement]     > ddl:creatable, ddl:statement, derbyddl:functionOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:isTableType (boolean)
+  + * (derbyddl:functionParameter) = derbyddl:functionParameter multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple
+[derbyddl:createIndexStatement]        > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
+  - derbyddl:tableName (string) mandatory
+  - derbyddl:unique (boolean)
+  + * (derbyddl:indexColumnReference) = derbyddl:indexColumnReference multiple
+[derbyddl:createProcedureStatement]    > ddl:creatable, ddl:statement, derbyddl:procedureOperand mixin
+[derbyddl:createRoleStatement]         > ddl:creatable, ddl:statement, derbyddl:roleOperand mixin
+[derbyddl:createSynonymStatement]      > ddl:creatable, ddl:statement, derbyddl:synonymOperand mixin
+  - derbyddl:tableName (string) mandatory
+[derbyddl:createTriggerStatement]      > ddl:creatable, ddl:statement, derbyddl:triggerOperand mixin
+  - derbyddl:tableName (string) mandatory
+  - ddl:sql (string) mandatory
+  + * (ddl:columnReference) = ddl:columnreference multiple
+[derbyddl:declareGlobalTemporaryTableStatement] > ddl:createTableStatement mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+[derbyddl:dropFunctionStatement]    > ddl:droppable, derbyddl:functionOperand mixin
+[derbyddl:dropIndexStatement]       > ddl:droppable, derbyddl:indexOperand mixin
+[derbyddl:dropProcedureStatement]   > ddl:droppable, derbyddl:procedureOperand mixin
+[derbyddl:dropRoleStatement]        > ddl:droppable, derbyddl:roleOperand mixin
+[derbyddl:dropSynonymStatement]     > ddl:droppable, derbyddl:synonymOperand mixin
+[derbyddl:dropTriggerStatement]     > ddl:droppable, derbyddl:triggerOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[derbyddl:lockTableStatement]       > ddl:statement, ddl:tableOperand mixin
+[derbyddl:renameTableStatement]     > ddl:statement, ddl:renamable, ddl:tableOperand mixin
+
+[derbyddl:grantOnFunctionStatement]     > ddl:grantStatement, derbyddl:functionOperand mixin
+[derbyddl:grantOnProcedureStatement]    > ddl:grantStatement, derbyddl:procedureOperand mixin
+
+[derbyddl:grantRolesStatement]          > ddl:grantStatement mixin
+  + ddl:name (derbyddl:roleName) = derbyddl:roleName multiple
\ No newline at end of file


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

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,178 +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'>
-<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[postgresddl:aggregateOperand]      > ddl:operand abstract
-[postgresddl:castOperand]           > ddl:operand abstract
-[postgresddl:commentOperand]      > ddl:operand abstract
-[postgresddl:constraintTriggerOperand] > ddl:operand abstract
-[postgresddl:conversionOperand]     > ddl:operand abstract
-[postgresddl:databaseOperand]       > ddl:operand abstract
-[postgresddl:foreignDataOperand]    > ddl:operand abstract
-[postgresddl:groupOperand]          > ddl:operand abstract
-[postgresddl:functionOperand]       > ddl:operand abstractmandatory
-[postgresddl:indexOperand]          > ddl:operand abstract
-[postgresddl:languageOperand]       > ddl:operand abstract
-[postgresddl:operatorOperand]       > ddl:operand abstract
-[postgresddl:ownedByOperand]        > ddl:operand abstract
-[postgresddl:roleOperand]           > ddl:operand abstract
-[postgresddl:ruleOperand]           > ddl:operand abstract
-[postgresddl:sequenceOperand]       > ddl:operand abstract
-[postgresddl:serverOperand]         > ddl:operand abstract
-[postgresddl:tablespaceOperand]     > ddl:operand abstract
-[postgresddl:textSearchOperand]     > ddl:operand abstract
-[postgresddl:triggerOperand]        > ddl:operand abstract
-[postgresddl:typeOperand]           > ddl:operand abstract
-[postgresddl:userOperand]           > ddl:operand abstract
-[postgresddl:userMappingOperand]    > ddl:operand abstract
-
-
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
-[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
-[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
-
-[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
-  - postgresddl:newTableName (STRING)
-  - postgresddl:schemaName (STRING)
-  + postgresddl:renameColumn (ddl:renamable) = ddl:renamable multiple
-
-  
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
-[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[postgresddl:abortStatement]            > ddl:statement mixin
-[postgresddl:analyzeStatement]          > ddl:statement mixin
-[postgresddl:clusterStatement]          > ddl:statement mixin
-[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
-  - postgresddl:targetObjectType (STRING) mandatory
-  - postgresddl:targetObjectName (STRING)
-  - postgresddl:comment (STRING) mandatory
-[postgresddl:copyStatement]             > ddl:statement mixin
-[postgresddl:deallocateStatement]       > ddl:statement mixin
-[postgresddl:declareStatement]          > ddl:statement mixin
-[postgresddl:discardStatement]          > ddl:statement mixin
-[postgresddl:explainStatement]          > ddl:statement mixin
-[postgresddl:fetchStatement]            > ddl:statement mixin
-[postgresddl:listenStatement]           > ddl:statement mixin
-[postgresddl:loadStatement]             > ddl:statement mixin
-[postgresddl:lockTableStatement]        > ddl:statement mixin
-[postgresddl:moveStatement]             > ddl:statement mixin
-[postgresddl:notifyStatement]           > ddl:statement mixin
-[postgresddl:prepareStatement]          > ddl:statement mixin
-[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
-[postgresddl:reindexStatement]          > ddl:statement mixin
-[postgresddl:releaseSavepointStatement] > ddl:statement mixin
-[postgresddl:rollbackStatement]         > ddl:statement mixin
-[postgresddl:selectIntoStatement]       > ddl:statement mixin
-[postgresddl:showStatement]             > ddl:statement mixin
-[postgresddl:truncateStatement]         > ddl:statement mixin
-[postgresddl:unlistenStatement]         > ddl:statement mixin
-[postgresddl:vacuumStatement]           > ddl:statement mixin
-
-

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -0,0 +1,205 @@
+/*
+ * 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'>
+<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[postgresddl:aggregateOperand]      > ddl:operand abstract
+[postgresddl:castOperand]           > ddl:operand abstract
+[postgresddl:commentOperand]      > ddl:operand abstract
+[postgresddl:constraintTriggerOperand] > ddl:operand abstract
+[postgresddl:conversionOperand]     > ddl:operand abstract
+[postgresddl:databaseOperand]       > ddl:operand abstract
+[postgresddl:foreignDataOperand]    > ddl:operand abstract
+[postgresddl:groupOperand]          > ddl:operand abstract
+[postgresddl:functionOperand]       > ddl:operand abstract
+[postgresddl:indexOperand]          > ddl:operand abstract
+[postgresddl:languageOperand]       > ddl:operand abstract
+[postgresddl:operatorOperand]       > ddl:operand abstract
+[postgresddl:ownedByOperand]        > ddl:operand abstract
+[postgresddl:roleOperand]           > ddl:operand abstract
+[postgresddl:ruleOperand]           > ddl:operand abstract
+[postgresddl:sequenceOperand]       > ddl:operand abstract
+[postgresddl:serverOperand]         > ddl:operand abstract
+[postgresddl:tablespaceOperand]     > ddl:operand abstract
+[postgresddl:textSearchOperand]     > ddl:operand abstract
+[postgresddl:triggerOperand]        > ddl:operand abstract
+[postgresddl:typeOperand]           > ddl:operand abstract
+[postgresddl:userOperand]           > ddl:operand abstract
+[postgresddl:userMappingOperand]    > ddl:operand abstract
+[postgresddl:parameterOperand]      > ddl:operand abstract
+
+[postgresddl:functionParameter]     > postgresddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING)
+  - postgresddl:mode (STRING)
+
+[postgresddl:role]                  > postgresddl:roleOperand mixin
+
+[postgresddl:renamedColumn]         > ddl:renamable mixin
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
+[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
+[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
+
+[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
+  - postgresddl:newTableName (STRING)
+  - postgresddl:schemaName (STRING)
+  + postgresddl:renameColumn (postgresddl:renamedColumn) = postgresddl:renamedColumn multiple
+
+  
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
+[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[postgresddl:abortStatement]            > ddl:statement mixin
+[postgresddl:analyzeStatement]          > ddl:statement mixin
+[postgresddl:clusterStatement]          > ddl:statement mixin
+[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
+  - postgresddl:targetObjectType (STRING) mandatory
+  - postgresddl:targetObjectName (STRING)
+  - postgresddl:comment (STRING) mandatory
+[postgresddl:copyStatement]             > ddl:statement mixin
+[postgresddl:deallocateStatement]       > ddl:statement mixin
+[postgresddl:declareStatement]          > ddl:statement mixin
+[postgresddl:discardStatement]          > ddl:statement mixin
+[postgresddl:explainStatement]          > ddl:statement mixin
+[postgresddl:fetchStatement]            > ddl:statement mixin
+[postgresddl:listenStatement]           > ddl:statement mixin
+[postgresddl:loadStatement]             > ddl:statement mixin
+[postgresddl:lockTableStatement]        > ddl:statement mixin
+[postgresddl:moveStatement]             > ddl:statement mixin
+[postgresddl:notifyStatement]           > ddl:statement mixin
+[postgresddl:prepareStatement]          > ddl:statement mixin
+[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
+[postgresddl:reindexStatement]          > ddl:statement mixin
+[postgresddl:releaseSavepointStatement] > ddl:statement mixin
+[postgresddl:rollbackStatement]         > ddl:statement mixin
+[postgresddl:selectIntoStatement]       > ddl:statement mixin
+[postgresddl:showStatement]             > ddl:statement mixin
+[postgresddl:truncateStatement]         > ddl:statement mixin
+[postgresddl:unlistenStatement]         > ddl:statement mixin
+[postgresddl:vacuumStatement]           > ddl:statement mixin
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+[postgresddl:grantOnTableStatement]            > ddl:grantStatement, ddl:tableOperand mixin
+[postgresddl:grantOnSequenceStatement]         > ddl:grantStatement, postgresddl:sequenceOperand mixin
+[postgresddl:grantOnDatabaseStatement]         > ddl:grantStatement, postgresddl:databaseOperand mixin
+[postgresddl:grantOnForeignDataWrapperStatement] > ddl:grantStatement, postgresddl:foreignDataOperand mixin
+[postgresddl:grantOnForeignServerStatement]    > ddl:grantStatement, postgresddl:serverOperand mixin
+[postgresddl:grantOnFunctionStatement]         > ddl:grantStatement, postgresddl:functionOperand mixin
+  + postgresddl:parameter (postgresddl:functionParameter) = postgresddl:functionParameter multiple
+[postgresddl:grantOnLanguageStatement]         > ddl:grantStatement, postgresddl:languageOperand mixin
+[postgresddl:grantOnSchemaStatement]           > ddl:grantStatement, ddl:schemaOperand mixin
+[postgresddl:grantOnTablespaceStatement]       > ddl:grantStatement, postgresddl:tablespaceOperand mixin
+[postgresddl:grantRolesStatement]              > ddl:grantStatement mixin
+  + postgresddl:grantRole (postgresddl:role) = postgresddl:role multiple


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

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -39,7 +39,7 @@
  */
 public class DdlParserTestHelper implements DdlConstants {
 	private boolean printToConsole = false;
-	
+	public final static String NEWLINE = "\n";
 
 	/**
 	 * 

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -47,6 +47,7 @@
 import org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -488,6 +489,7 @@
         assertThat(verifyMixinType(node_2, "ddl:columnDefinition"), is(true));
     }
     
+    @Ignore
     @Test
     public void shouldSequenceDerbyDdl() throws IOException {
         URL url = this.getClass().getClassLoader().getResource("ddl/dialect/derby/derby_test_statements.ddl");

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -790,7 +790,7 @@
         boolean success = parser.parse(content, rootNode);
 
         assertThat(success, is(true));
-        assertThat(rootNode.getChildCount(), is(7));
+        assertThat(rootNode.getChildCount(), is(11));
 
         // List<AstNode> theNodes = parser.nodeFactory().getChildrenForType(rootNode, TYPE_MISSING_TERMINATOR);
         // assertThat(theNodes.size(), is(3));
@@ -834,4 +834,17 @@
         assertThat(rootNode.getChildCount(), is(3));
 
     }
+    
+    @Test
+    public void shouldParseGrantStatements() {
+        printTest("shouldParseGrantStatements()");
+        String content = "GRANT SELECT ON TABLE purchaseOrders TO maria,harry;" + NEWLINE
+            + "GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;" + NEWLINE
+            + "GRANT SELECT ON TABLE orders.bills to PUBLIC;" + NEWLINE
+            + "GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(4));
+    }
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -4,17 +4,14 @@
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
-
 import java.util.List;
-
 import org.jboss.dna.sequencer.ddl.DdlParserTestHelper;
-import org.jboss.dna.sequencer.ddl.StandardDdlParser;
 import org.jboss.dna.sequencer.ddl.node.AstNode;
 import org.junit.Before;
 import org.junit.Test;
 
-public class DerbyDdlParserTest extends DdlParserTestHelper{
-	private StandardDdlParser parser;
+public class DerbyDdlParserTest extends DdlParserTestHelper {
+	private DerbyDdlParser parser;
 	private AstNode rootNode;
 	
 	public static final String DDL_FILE_PATH = "src/test/resources/ddl/dialect/derby/";
@@ -29,27 +26,69 @@
     	rootNode = parser.nodeFactory().node("ddlRootNode");
 	}
     
-//	@Test
-//	public void shouldParseDerbyDDL() {
-//	  	String content = getFileContent(DDL_FILE_PATH + "derby_test_create.ddl");
-//	  
-//	  	List<Statement> stmts = parser.parse(content);
-//	  	
-//	  	assertEquals(744, stmts.size());
-//
-//	  	System.out.println("  END PARSING.  # Statements = " + stmts.size());
-//	  
-//	}
+	@Test
+    public void shouldParseCreateFunctionWithDataTypeReturn() {
+	    //setPrintToConsole(true);
+	    //parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateFunctionWithDataTypeReturn()");
+        String content = "CREATE FUNCTION TO_DEGREES" + NEWLINE
+            + "( RADIANS DOUBLE )" + NEWLINE
+            + "RETURNS DOUBLE" + NEWLINE
+            + "PARAMETER STYLE JAVA" + NEWLINE
+            + "NO SQL LANGUAGE JAVA" + NEWLINE
+            + "EXTERNAL NAME 'java.lang.Math.toDegrees';";
+        
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+
+    }
 	
+   @Test
+    public void shouldParseCreateFunctionWithTableTypeReturn() {
+        //setPrintToConsole(true);
+        //parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateFunctionWithTableTypeReturn()");
+        String content = "CREATE FUNCTION PROPERTY_FILE_READER" + NEWLINE
+            + "( FILENAME VARCHAR( 32672 ), FILESIZE INTEGER )" + NEWLINE
+            + "RETURNS TABLE (KEY_COL VARCHAR( 10 ), VALUE_COL VARCHAR( 1000 ))" + NEWLINE
+            + "LANGUAGE JAVA" + NEWLINE
+            + "PARAMETER STYLE DERBY_JDBC_RESULT_SET" + NEWLINE
+            + "NO SQL" + NEWLINE
+            + "EXTERNAL NAME 'vtis.example.PropertyFileVTI.propertyFileVTI';";
+        
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+    }
+	
     @Test
     public void shouldParseDropSchemaRestrict() {
-    	printTest("shouldParseDeclareGlobaTemporaryTable()");
+    	printTest("shouldParseDropSchemaRestrict()");
     	String content = "DROP SCHEMA SAMP RESTRICT;";
 
     	boolean success = parser.parse(content, rootNode);
     	assertThat(true, is(success));
+    	assertThat(rootNode.getChildCount(), is(1));
     }
     
+    @Test
+    public void shouldParseCreateIndex() {
+        printTest("shouldParseCreateIndex()");
+        String content = "CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY DESC, UNIT);";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseLockTable() {
+        printTest("shouldParseLockTable()");
+        String content = "LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
 	
     @Test
     public void shouldParseDeclareGlobaTemporaryTable() {
@@ -59,8 +98,69 @@
     	boolean success = parser.parse(content, rootNode);
     	assertThat(true, is(success));
     }
-	
+    
     @Test
+    public void shouldParseRenameTable() {
+        printTest("shouldParseRenameTable()");
+        String content = "RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseCreateSynonym() {
+        printTest("shouldParseCreateSynonym()");
+        String content = "CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseCreateTrigger() {
+        printTest("shouldParseCreateTrigger()");
+        String content = "CREATE TRIGGER FLIGHTSDELETE3" + NEWLINE
+           + "AFTER DELETE ON FLIGHTS" + NEWLINE
+           + "REFERENCING OLD AS OLD" + NEWLINE
+           + "FOR EACH ROW" + NEWLINE
+           + "DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseCreateTrigger_2() {
+        printTest("shouldParseCreateTrigger_2()");
+        String content = "CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x" + NEWLINE
+        + "FOR EACH ROW MODE DB2SQL" + NEWLINE
+        + "values app.notifyEmail('Jerry', 'Table x is about to be updated');";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseGrantStatements() {
+        printTest("shouldParseGrantStatements()");
+        String content = "GRANT SELECT ON TABLE purchaseOrders TO maria,harry;" + NEWLINE
+            + "GRANT UPDATE, TRIGGER ON TABLE purchaseOrders TO anita,zhi;" + NEWLINE
+            + "GRANT SELECT ON TABLE orders.bills to PUBLIC;" + NEWLINE
+            + "GRANT EXECUTE ON PROCEDURE updatePurchases TO george;" + NEWLINE
+            + "GRANT purchases_reader_role TO george,maria;" + NEWLINE
+            + "GRANT SELECT ON TABLE purchaseOrders TO purchases_reader_role;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(6));
+    }
+    
+    @Test
     public void shouldParseAlterTableAlterColumnDefaultRealNumber() {
     	printTest("shouldParseAlterTableAlterColumnDefaultRealNumber()");
     	String content = "ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0;";
@@ -82,6 +182,8 @@
 	
 	@Test
 	public void shouldParseDerbyStatements() {
+	    //setPrintToConsole(true);
+        //parser.setTestMode(isPrintToConsole());
 		printTest("shouldParseDerbyStatements()");
 	  	String content = getFileContent(DDL_FILE_PATH + "derby_test_statements.ddl");
 
@@ -91,6 +193,5 @@
 		List<AstNode> problems = parser.nodeFactory().getChildrenForType(rootNode, TYPE_PROBLEM);
 		int nStatements = rootNode.getChildCount() - problems.size();
 		assertEquals(64, nStatements);
-		
 	}
 }
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -23,16 +23,8 @@
  */
 package org.jboss.dna.sequencer.ddl.dialect.postgres;
 
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLE_STATEMENT_POSTGRES;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COMMENT_ON_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_RULE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LISTEN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RENAME_COLUMN;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import org.jboss.dna.graph.JcrLexicon;
@@ -422,8 +414,59 @@
         assertEquals(true, success);
         assertEquals(2, rootNode.getChildCount());
     }
+    
+    @Test
+    public void shouldParseGrantOnTable() {
+        printTest("shouldParseGrantOnTable()");
+        String content = "GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi;";
 
+        boolean success = parser.parse(content, rootNode);
+
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+    }
+    
     @Test
+    public void shouldParseGrantOnMultipleTables() {
+        printTest("shouldParseGrantOnMultipleTables()");
+        String content = "GRANT UPDATE, TRIGGER ON TABLE t1, t2, t3 TO anita,zhi;";
+
+        boolean success = parser.parse(content, rootNode);
+
+        assertEquals(true, success);
+        assertEquals(3, rootNode.getChildCount());
+    }
+    
+    @Test
+    public void shouldParseGrantExecuteOnFunction() {
+        printTest("shouldParseGrantExecuteOnFunction()");
+        String content = "GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;";
+
+        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_GRANT_ON_FUNCTION_STATEMENT));
+    }
+    
+    @Test
+    public void shouldParseGrantExecuteAndUpdateOnMultipleFunctions() {
+        printTest("shouldParseGrantExecuteOnMultipleFunctions()");
+        String content = "GRANT EXECUTE, UPDATE ON FUNCTION cos(), sin(b double precision) TO peter;";
+
+        boolean success = parser.parse(content, rootNode);
+
+        assertEquals(true, success);
+        assertEquals(2, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChild(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_GRANT_ON_FUNCTION_STATEMENT));
+        assertEquals(3, childNode.getChildCount());
+        childNode = rootNode.getChild(1);
+        assertEquals(4, childNode.getChildCount());
+    }
+    
+    @Test
     public void shouldParsePostgresStatements_1() {
         printTest("shouldParsePostgresStatements_1()");
         String content = getFileContent(DDL_FILE_PATH + "postgres_test_statements_1.ddl");

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl	2010-01-05 13:31:47 UTC (rev 1527)
@@ -43,7 +43,7 @@
 
 GRANT SELECT ON TABLE s.v to PUBLIC;
 
-GRANT EXECUTE ON PROCEDURE p TO george;
+GRANT EXECUTE ON FUNCTION p(a int, b TEXT) TO george;
 -- 10 STATEMENTS *******************************************************
 GRANT purchases_reader_role TO george,maria;
 

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl	2010-01-05 13:31:47 UTC (rev 1527)
@@ -37,4 +37,13 @@
      (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
     ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
 
+GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
 
+GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;
+
+GRANT SELECT ON TABLE orders.bills to PUBLIC;
+
+GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;
+
+
+



More information about the dna-commits mailing list