[dna-commits] DNA SVN: r1554 - in trunk: dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby and 7 other directories.

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


Author: blafond
Date: 2010-01-07 14:12:33 -0500 (Thu, 07 Jan 2010)
New Revision: 1554

Added:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
   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/datatype/DataTypeParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.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/resources/ddl/schema_definition.ddl
Log:
DNA-49 Beefed up integration tests.  Added parsing methods for Domain, Collation, etc.. Misc. fixes/tweaks.

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.test.integration.sequencer.ddl;
 
+import static org.junit.Assert.assertNotNull;
 import java.io.IOException;
 import java.net.URL;
 import java.util.Calendar;
@@ -53,7 +54,17 @@
     public JcrTools tools;
     public static final String ddlTestResourceRootFolder = "org/jboss/dna/test/integration/sequencer/ddl/";
     
+    protected URL getUrl(String urlStr) {
+        return this.getClass().getClassLoader().getResource(urlStr);
+    }
     
+    public void uploadFile(String folder, String fileName, String testMethod) throws RepositoryException, IOException {
+        printStart(fileName, testMethod);
+
+        URL url = getUrl(folder + fileName);
+        uploadFile(url);
+    }
+    
     public void uploadFile(URL url) throws RepositoryException, IOException {
         // Grab the last segment of the URL path, using it as the filename
         String filename = url.getPath().replaceAll("([^/]*/)*", "");
@@ -316,6 +327,29 @@
         return null;
     }
     
+    public Node assertNode(Node node, String name, String type) throws Exception {
+        Node existingNode = findNode(node, name, type);
+        assertNotNull(node);
+        
+        return existingNode;
+    }
+    
+    public void printPropertiesRecursive( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
+        printProperties(node);
+        
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            printPropertiesRecursive(iter.nextNode());
+        }
+        
+    }
+    
+    public void printChildProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            printProperties(iter.nextNode());
+        }
+        
+    }
+    
     public void printProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
         
         System.out.println("\n >>>  NODE PATH: " + node.getPath() );
@@ -345,4 +379,12 @@
             //props.put(name, stringValue);
         }
     }
+    
+    public void printStart(String fileName, String testMethod) {
+        System.out.println("STARTED:  " + testMethod + "(" + fileName +")");
+    }
+    
+    public void printEnd(String fileName, String testMethod) {
+        System.out.println("ENDED:    " + testMethod + "(" + fileName +")");
+    }
 }

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -24,8 +24,6 @@
 package org.jboss.dna.test.integration.sequencer.ddl;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -85,9 +83,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
 
     @After
     public void afterEach() throws Exception {
@@ -101,9 +96,8 @@
     
     @Test
     public void shouldSequenceCreateSchemaDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceCreateSchemaDdlFile(create_schema.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "create_schema.ddl");
-        uploadFile(url);
+
+        uploadFile(ddlTestResourceRootFolder, "create_schema.ddl", "shouldSequenceCreateSchemaDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -126,15 +120,12 @@
             }
         }
         
-        System.out.println("FINISHED:  shouldSequenceCreateSchemaDdlFile(create_schema.ddl)");
     }
     
     @Test
     public void shouldSequenceStandardDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "standard_test_statements.ddl");
-        uploadFile(url);
-        
+        uploadFile(ddlTestResourceRootFolder, "standard_test_statements.ddl", "shouldSequenceStandardDdlFile");
+
         waitUntilSequencedNodesIs(1);
         
         // Find the node ...
@@ -147,22 +138,70 @@
                 for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
                     Node ddlNode = iter.nextNode();
 
-                    //printNodeProperties(ddlNode);
+                    //printPropertiesRecursive(ddlNode);
                     
+                   // printChildProperties(ddlNode.getNodes().nextNode());
+                    
                     long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
-                    assertEquals(numStatements, 7);
+                    assertEquals(44, numStatements);
+
+                    
+                  // assertNotNull <ns001:startLineNumber = 40, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createAssertionStatement, ns001:expression = CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE, ns001:startCharIndex = 1400, ns001:searchCondition =  value ! = null>
+                  //       CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = NOT DEFERRABLE>
+                  // assertIsZero <ns001:startLineNumber = 42, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createAssertionStatement, ns001:expression = CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED, ns001:startCharIndex = 1469, ns001:searchCondition =  value ! = null and value = = 0>
+                  //       CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = INITIALLY DEFERRED>
+                    Node stmtNode = assertNode(ddlNode, "assertNotNull", "ddl:createAssertionStatement");
+                    Node constraintAttribute = assertNode(stmtNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+                    verifySingleValueProperty(constraintAttribute, "ddl:propValue", "NOT DEFERRABLE");
+                    
+                    stmtNode = assertNode(ddlNode, "assertIsZero", "ddl:createAssertionStatement");
+                    constraintAttribute = assertNode(stmtNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+                    verifySingleValueProperty(constraintAttribute, "ddl:propValue", "INITIALLY DEFERRED");
+                    //          employee <ns001:startLineNumber = 40, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createTableStatement, ns001:expression = CREATE TABLE employee (
+                    //                 empno NUMBER(4) NOT NULL, 
+                    //                 empname CHAR(10), 
+                    //                 job CHAR(9), 
+                    //                 deptno NUMBER(2) NOT NULL,
+                    //                 CONSTRAINT emp_fk1 FOREIGN KEY (deptno) REFERENCES dept (deptno) INITIALLY IMMEDIATE, 
+                    //                 CONSTRAINT emp_pk PRIMARY KEY (empno));, ns001:startCharIndex = 1404>
+                    //             empno <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 4, ns001:nullable = NOT NULL, jcr:mixinTypes = ns001:columnDefinition, ns001:datatypeScale = 0>
+                    //             empname <ns001:datatypeName = CHAR, ns001:datatypeLength = 10, jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnDefinition>
+                    //             job <ns001:datatypeName = CHAR, ns001:datatypeLength = 9, jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnDefinition>
+                    //             deptno <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 2, ns001:nullable = NOT NULL, jcr:mixinTypes = ns001:columnDefinition, ns001:datatypeScale = 0>
+                    //             emp_fk1 <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableConstraint, ns001:constraintType = 1>
+                    //                 deptno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnReference>
+                    //                 dept <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableReference>
+                    //                 deptno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:fkColumnReference>
+                    //                 CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = INITIALLY IMMEDIATE>
+                    //             emp_pk <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableConstraint, ns001:constraintType = 2>
+                    //                 empno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnReference>
+
+                    Node tbleNode   = assertNode(ddlNode, "employee", "ddl:createTableStatement");
+                    Node columnNode = assertNode(ddlNode, "empname", "ddl:columnDefinition");
+                    verifySingleValueProperty(columnNode, "ddl:datatypeName", "CHAR");
+                    verifySingleValueProperty(columnNode, "ddl:datatypeLength", 10);
+                    Node constraintNode = assertNode(tbleNode, "emp_fk1", "ddl:tableConstraint");
+                    constraintAttribute  = assertNode(constraintNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+                    verifySingleValueProperty(constraintAttribute, "ddl:propValue", "INITIALLY IMMEDIATE");
+                    assertNode(constraintNode, "deptno", "ddl:columnReference");
+                    assertNode(constraintNode, "dept", "ddl:tableReference");
+                    assertNode(constraintNode, "deptno", "ddl:fkColumnReference");
+                    
+                    Node viewNode = assertNode(ddlNode, "view_1", "ddl:createViewStatement");
+                    assertNode(viewNode, "col1", "ddl:columnReference");
+                    
+                    Node tableNode = assertNode(ddlNode, "table_5", "ddl:createTableStatement");
+                    printChildProperties(tableNode);
+                    assertEquals(18, tableNode.getNodes().getSize());
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
     }
     
     @Test
     public void shouldSequenceStandardDdlGrantStatements() throws Exception {
-        System.out.println("STARTED:  shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "grant_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(ddlTestResourceRootFolder, "grant_test_statements.ddl", "shouldSequenceStandardDdlGrantStatements");
         
         waitUntilSequencedNodesIs(1);
         
@@ -182,35 +221,27 @@
                     assertEquals(numStatements, 4);
                     
                     //GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
-                    Node grantNode = findNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
-                    assertNotNull(grantNode);
-                    Node granteeNode = findNode(grantNode, "maria", "ddl:grantee");
-                    assertNotNull(granteeNode);
-                    Node privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    Node grantNode = assertNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
+                    assertNode(grantNode, "maria", "ddl:grantee");
+                    Node privNode = assertNode(grantNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "SELECT");
                     
                     //GRANT UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi;
-                    grantNode = findNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
-                    assertNotNull(grantNode);
-                    privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    grantNode = assertNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
+                    privNode = assertNode(grantNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
-                    granteeNode = findNode(grantNode, "anita", "ddl:grantee");
-                    assertNotNull(granteeNode);
+                    assertNode(grantNode, "anita", "ddl:grantee");
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
+
     }
     
     @Test
     public void shouldSequenceStandardDdlRevokeStatements() throws Exception {
-        System.out.println("STARTED:  shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "revoke_test_statements.ddl");
-        uploadFile(url);
         
+        uploadFile(ddlTestResourceRootFolder, "revoke_test_statements.ddl", "shouldSequenceStandardDdlRevokeStatements");
+        
         waitUntilSequencedNodesIs(1);
         
         // Find the node ...
@@ -229,27 +260,86 @@
                     assertEquals(numStatements, 4);
                     
                     //REVOKE SELECT ON TABLE purchaseOrders FROM maria,harry;
-                    Node revokeNode = findNode(ddlNode, "purchaseOrders", "ddl:revokeOnTableStatement");
-                    assertNotNull(revokeNode);
-                    Node granteeNode = findNode(revokeNode, "maria", "ddl:grantee");
-                    assertNotNull(granteeNode);
-                    Node privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    Node revokeNode = assertNode(ddlNode, "purchaseOrders", "ddl:revokeOnTableStatement");
+                    assertNode(revokeNode, "maria", "ddl:grantee");
+                    Node privNode = assertNode(revokeNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "SELECT");
                     
                     //REVOKE UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi CASCADE;
-                    revokeNode = findNode(ddlNode, "orderDetails", "ddl:revokeOnTableStatement");
-                    assertNotNull(revokeNode);
-                    privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    revokeNode = assertNode(ddlNode, "orderDetails", "ddl:revokeOnTableStatement");
+                    privNode = assertNode(revokeNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
-                    granteeNode = findNode(revokeNode, "anita", "ddl:grantee");
-                    assertNotNull(granteeNode);
+                    assertNode(revokeNode, "anita", "ddl:grantee");
                 }
             }
         }
+    }
+    
+    @Test
+    public void shouldSequenceStandardAlterTableStatements() throws Exception {
+
+        uploadFile(ddlTestResourceRootFolder, "alter_table_statements.ddl", "shouldSequenceStandardAlterTableStatements");
         
-        System.out.println("FINISHED:  shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+
+                    //printNodeProperties(ddlNode);
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(numStatements, 14);
+                    
+                    // ALTER TABLE table_name_1 ADD COLUMN column_name VARCHAR(25) NOT NULL;
+                    Node alterNode = assertNode(ddlNode, "table_name_1", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node addColumnNode = assertNode(alterNode, "column_name", "ddl:columnDefinition");
+                    verifySingleValueProperty(addColumnNode, "ddl:datatypeName", "VARCHAR");
+                    verifySingleValueProperty(addColumnNode, "ddl:datatypeLength", 25);
+                    verifySingleValueProperty(addColumnNode, "ddl:nullable", "NOT NULL");
+                    
+                    // ALTER TABLE schema_2.table_name_2 ADD schema_2.table_name_2.column_name INTEGER NOT NULL DEFAULT (25);
+                    alterNode = assertNode(ddlNode, "schema_2.table_name_2", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    addColumnNode = assertNode(alterNode, "schema_2.table_name_2.column_name", "ddl:columnDefinition");
+                    verifySingleValueProperty(addColumnNode, "ddl:datatypeName", "INTEGER");
+                    verifySingleValueProperty(addColumnNode, "ddl:nullable", "NOT NULL");
+                    verifySingleValueProperty(addColumnNode, "ddl:defaultValue", "25");
+                    
+                    // ALTER TABLE table_name_4 ALTER COLUMN column_name SET DEFAULT (0);
+                    alterNode = assertNode(ddlNode, "table_name_4", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    addColumnNode = assertNode(alterNode, "column_name", "ddl:alterColumnDefinition");
+                    verifySingleValueProperty(addColumnNode, "ddl:defaultValue", "0");
+                    
+                    // ALTER TABLE table_name_7 DROP COLUMN column_name RESTRICT;
+                    alterNode = assertNode(ddlNode, "table_name_7", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node dropColumnNode = assertNode(alterNode, "column_name", "ddl:dropColumnDefinition");
+                    verifySingleValueProperty(dropColumnNode, "ddl:dropBehavior", "RESTRICT");
+                    
+                    // ALTER TABLE table_name_10 ADD CONSTRAINT pk_name PRIMARY KEY (column_name);
+                    alterNode = assertNode(ddlNode, "table_name_10", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node constraintNode = assertNode(alterNode, "pk_name", "ddl:addTableConstraintDefinition");
+                    verifySingleValueProperty(constraintNode, "ddl:constraintType", "PRIMARY KEY");
+                    assertNode(constraintNode, "column_name", "ddl:columnReference");
+                    
+                    // ALTER TABLE table_name_14 DROP CONSTRAINT fk_name RESTRICT;
+                    alterNode = assertNode(ddlNode, "table_name_14", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node dropConstraintNode = assertNode(alterNode, "fk_name", "ddl:dropTableConstraintDefinition");
+                    verifySingleValueProperty(dropConstraintNode, "ddl:dropBehavior", "RESTRICT");
+                }
+            }
+        }
     }
 
 }

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,7 +25,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -87,10 +86,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
-
     @After
     public void afterEach() throws Exception {
         if (this.session != null) {
@@ -103,9 +98,8 @@
     
     @Test
     public void shouldSequenceDerbyDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
-        URL url = getUrl(resourceFolder + "derby_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(resourceFolder, "derby_test_statements.ddl", "shouldSequenceDerbyDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -214,7 +208,5 @@
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
     }
 }

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,7 +25,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -86,10 +85,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
-
     @After
     public void afterEach() throws Exception {
         if (this.session != null) {
@@ -102,9 +97,8 @@
     
     @Test
     public void shouldSequencePostgresDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
-        URL url = getUrl(resourceFolder + "postgres_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(resourceFolder, "postgres_test_statements.ddl", "shouldSequencePostgresDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -155,7 +149,5 @@
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
     }
 }

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-07 19:12:33 UTC (rev 1554)
@@ -81,7 +81,29 @@
 [ddl:tableConstraintOperand]    > ddl:operand abstract
 [ddl:referenceOperand]          > ddl:operand abstract
 
+
 // =============================================================================
+// SIMPLE STRING PROPERTY
+// =============================================================================
+[ddl:simpleProperty] mixin
+  - ddl:propValue (STRING) mandatory
+
+[ddl:constraintAttribute]       > ddl:simpleProperty mixin
+
+// =============================================================================
+// STATEMENT OPTION
+// =============================================================================
+[ddl:statementOption] mixin
+  - ddl:value (STRING) mandatory
+  
+// =============================================================================
+// DDL PROBLEM
+// =============================================================================
+[ddl:ddlProblem] mixin
+  - ddl:problemLevel (LONG) mandatory
+  - ddl:message (STRING) mandatory
+
+// =============================================================================
 // COLUMN
 // =============================================================================
 [ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
@@ -101,7 +123,7 @@
 // =============================================================================
 // TABLE CONSTRAINT
 // =============================================================================
-[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
+[ddl:tableConstraint] > ddl:creatable, ddl:tableConstraintOperand mixin
   - ddl:constraintType (STRING) mandatory
       < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK'
   - ddl:deferrable (STRING)
@@ -111,7 +133,7 @@
   + * (ddl:columnReference) = ddl:columnReference multiple
   + * (ddl:tableReference) = ddl:tableReference
   + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+  + ddl:constAttribute (ddl:constraintAttribute) = ddl:constraintAttribute multiple
   
 // =============================================================================
 // REFERENCE
@@ -122,25 +144,6 @@
 [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
@@ -156,7 +159,7 @@
   - ddl:onCommitValue (STRING)
     < 'DELETE ROWS', 'PRESERVE ROWS'
   + * (ddl:columnDefinition) = ddl:columnDefinition multiple
-  + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+  + * (ddl:tableConstraint) = ddl:tableConstraint multiple
   + * (ddl:statementOption) = ddl:statementOption multiple 
 
 // =============================================================================
@@ -181,15 +184,14 @@
   - ddl:defaultValue (STRING)
   - ddl:defaultPrecision (LONG)
   - ddl:collationName (STRING)
-  + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+  + ddl:domainConstraintDefinition (ddl:tableConstraint) = ddl:tableConstraint multiple
 
 // =============================================================================
 // CREATE ASSERTION
 // =============================================================================
-[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand mixin
-  - ddl:constraintName (STRING) mandatory
+[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:tableConstraintOperand mixin
   - ddl:searchCondition (STRING) mandatory
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+  + ddl:constAttribute (ddl:constraintAttribute) = ddl:constraintAttribute multiple
 
 // =============================================================================
 // CREATE CHARACTER SET
@@ -248,8 +250,8 @@
 [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
+[ddl:addTableConstraintDefinition]  > ddl:tableConstraint, ddl:creatable mixin
+[ddl:dropTableConstraintDefinition] > ddl:tableConstraint, ddl:droppable mixin
 
 // =============================================================================
 // MISC STATEMENTS

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl	2010-01-07 19:12:33 UTC (rev 1554)
@@ -0,0 +1,74 @@
+-- ==================================================================
+--      ALTER TABLE Statement
+-- ==================================================================
+--<alter table statement> ::=
+--    ALTER TABLE <table name> <alter table action>
+--
+--<alter table action> ::=
+--      <add column definition>
+--    | <alter column definition>
+--    | <drop column definition>
+--    | <add table constraint definition>
+--    | <drop table constraint definition>
+--
+--<add column definition> ::=
+--    ADD [ COLUMN ] <column definition>
+--
+--<column definition> ::=
+--    <column name> { <data type> | <domain name> }
+--    [ <default clause> ]
+--    [ <column constraint definition>... ]
+--    [ <collate clause> ]
+
+ALTER TABLE table_name_1 ADD COLUMN column_name VARCHAR(25) NOT NULL;
+
+ALTER TABLE schema_2.table_name_2 ADD schema_2.table_name_2.column_name INTEGER NOT NULL DEFAULT (25);
+
+--<alter column definition> ::=
+--    ALTER [ COLUMN ] <column name> <alter column action>
+--
+--<alter column action> ::=
+--      <set column default clause>
+--    | <drop column default clause>
+--
+--<set column default clause> ::=
+--    SET <default clause>
+--
+--<drop column default clause> ::=
+--    DROP DEFAULT
+--
+
+ALTER TABLE table_name_3 ALTER column_name SET DEFAULT (0);
+
+ALTER TABLE table_name_4 ALTER COLUMN column_name SET DEFAULT (0);
+
+ALTER TABLE table_name_5 ALTER column_name DROP DEFAULT;
+
+--<drop column definition> ::=
+--    DROP [ COLUMN ] <column name> <drop behavior>
+--
+ALTER TABLE table_name_6 DROP COLUMN column_name CASCADE;
+
+ALTER TABLE table_name_7 DROP COLUMN column_name RESTRICT;
+
+ALTER TABLE table_name_8 DROP column_name CASCADE;
+
+ALTER TABLE table_name_9 DROP column_name RESTRICT;
+
+--<add table constraint definition> ::=
+--    ADD <table constraint definition>
+--
+
+ALTER TABLE table_name_10 ADD CONSTRAINT pk_name PRIMARY KEY (column_name);
+
+ALTER TABLE table_name_11 ADD CONSTRAINT pk_name PRIMARY KEY (column1_name, schema_name_11.table_name_11.column2_name);
+
+ALTER TABLE table_name_12 ADD CONSTRAINT fk_name FOREIGN KEY (ref_col_name) REFERENCES ref_table_name(ref_table_column_name);
+
+--<drop table constraint definition> ::=
+--    DROP CONSTRAINT <constraint name> <drop behavior>
+--
+
+ALTER TABLE table_name_13 DROP CONSTRAINT fk_name CASCADE;
+
+ALTER TABLE table_name_14 DROP CONSTRAINT fk_name RESTRICT;
\ No newline at end of file

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	2010-01-07 19:12:33 UTC (rev 1554)
@@ -1,28 +1,28 @@
-CREATE TABLE MORE_ACTIVITIES (CITY_ID INT NOT NULL,
-    SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL);
-
 CREATE SCHEMA AUTHORIZATION oe
    CREATE TABLE new_product 
       (color VARCHAR(10)  PRIMARY KEY, quantity NUMERIC) 
    CREATE VIEW new_product_view 
       AS SELECT color, quantity FROM new_product WHERE color = 'RED' 
    GRANT select ON new_product_view TO hr;
-    
+
+CREATE SCHEMA schema_name_1
+    CREATE TABLE table_name_15 (
+        column_name_1 VARCHAR(255) 
+            REFERENCES ref_table_name (ref_column_name_1) 
+            ON UPDATE NO ACTION )
+    CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
+        AS SELECT COMM + BONUS, COMM - BONUS
+           FROM SAMP.EMPLOYEE
+    CREATE TABLE table_name26 (
+        column_name_1 VARCHAR(255),
+        UNIQUE (ref_column_name_1));
+   
+CREATE TABLE MORE_ACTIVITIES (CITY_ID INT NOT NULL,
+    SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL);
+
 CREATE TABLE PEOPLE
     (PERSON_ID INT NOT NULL CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
-
-CREATE SCHEMA schema_name_1
-	CREATE TABLE table_name_15 (
-	    column_name_1 VARCHAR(255) 
-	        REFERENCES ref_table_name (ref_column_name_1) 
-	        ON UPDATE NO ACTION )
-	CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
-	    AS SELECT COMM + BONUS, COMM - BONUS
-	       FROM SAMP.EMPLOYEE
-	CREATE TABLE table_name26 (
-	    column_name_1 VARCHAR(255),
-	    UNIQUE (ref_column_name_1));
-      
+ 
 CREATE TABLE table_name29 (
     column_name_1 VARCHAR(255),
     CONSTRAINT fk_name FOREIGN KEY (ref_column_name_1, ref_column_name_2)
@@ -36,3 +36,68 @@
 CREATE TABLE HOTELAVAILABILITY
      (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
     ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
+    
+CREATE TABLE employee (
+    empno NUMBER(4) NOT NULL, 
+    empname CHAR(10), 
+    job CHAR(9), 
+    deptno NUMBER(2) NOT NULL,
+    CONSTRAINT emp_fk1 FOREIGN KEY (deptno) REFERENCES dept (deptno) INITIALLY IMMEDIATE, 
+    CONSTRAINT emp_pk PRIMARY KEY (empno));
+
+CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE;
+
+CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED;
+
+CREATE ASSERTION Avgs CHECK( 3.0 < (SELECT avg(GPA) FROM Student) AND 1000 > (SELECT avg(sizeHS) FROM Student));
+
+CREATE DOMAIN full_domain CHAR DEFAULT null;
+
+CREATE DOMAIN partial_domain AS INTEGER DEFAULT (25);
+
+create domain mydecimal decimal(10) default 1 check (mydecimal>=0) initially immediate not deferrable;
+create domain myinteger as integer constraint myintegconstr1 check(myinteger is not null);
+create domain mynchar as nchar(100) collate schema1.collation2;
+create character set cs1 get WIN1250 collation from desc(collation1);
+create character set cs2 as get unicode collate collation2;
+create character set cs3 as get WIN1250;
+create character set cs4 get WIN1250 collation from external('externcollat2');
+create character set cs5 get WIN1250 collation from translation tn1 then collation collation1;
+create collation collation1 for cs1 from default no pad;
+create collation collation2 for cs2 from translation tn1 then collation collation1;
+create collation collation3 for cs3 from external('externcollat2') pad space;
+create translation tn1 for cs1 to cs2 from external('externtransl2');
+create translation tn2 for cs2 to cs3 from identity;
+create translation tn3 for cs3 to cs4 from tn2;
+create assertion assertconstr1 check(1=(select count(*) from a)) initially immediate not deferrable;
+create assertion assertconstr2 check((select max(b) from c)>0);
+
+create schema schema_1 authorization ADM default character set UNICODE 
+    create table table_1 (col1 varchar(20) not null, col2 nchar default current_user)
+    create view view_1 (col1, col2) as select*from a with check option
+;
+create schema schema_2;
+create global temporary table table_3 (col1 dec(10,2) default 0) on commit delete rows;
+create local temporary table table_4 (col1 dec default null primary key) on commit preserve rows;
+create table table_5 (
+    col1 integer unique, col2 smallint unique,
+    col3 numeric(5,0) references table_3(col1) match full on delete cascade,
+    col4 numeric(5,0) references table_4(col1) match partial on delete set default on update set null,
+    col5 numeric(5,0) references table_1(col1) on update no action on delete cascade check (col5<col4),
+    col6 date not null check (col5<col4 and col6<=date'2003-12-31') unique,
+    unique (col1,col4) initially immediate not deferrable,
+    constraint pk5 primary key (col1) initially deferred,
+    foreign key (col4,col5) references table_7(col2,col3) not deferrable initially immediate,
+    constraint ck2 check (col5 is not null)
+);
+create view view_1 (col1,col2) as values (1,2);
+create view view_1 (col1,col2) as values (1,2) with check option;
+create view view_1 (col1,col2) as select a,b from c with local check option;
+create view view_1 (col1,col2) as table c with cascaded check option;
+grant all privileges on table_1 to public with grant option;
+grant delete,insert(col1,col2),update, references on table table_1 to user1, user1;
+grant usage on domain dom1 to user3;
+grant usage on collation col1 to user4, user5;
+grant usage on character set cs1 to user6;
+grant usage on translation tn1 to user7;
+

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-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,6 +25,9 @@
     public static final int CONSTRAINT_FK = 1;
     public static final int CONSTRAINT_PK = 2;
     public static final int CONSTRAINT_C = 3;
+    
+    public static final String PRIMARY_KEY = "PRIMARY KEY";
+    public static final String FOREIGN_KEY = "FOREIGN KEY";
 
     /*
      * Common DDL Keywords

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-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -43,10 +43,10 @@
     public static I18n alterTableOptionNotFound;
     public static I18n unusedTokensParsingCreateIndex;
     public static I18n missingReturnTypeForFunction;
+    public static I18n unsupportedProcedureParameterDeclaration;
 //    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-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -150,7 +150,6 @@
     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");
     public static final Name NULLABLE = new BasicName(Namespace.URI, "nullable");
     public static final Name DEFAULT_OPTION = new BasicName(Namespace.URI, "defaultOption");
     public static final Name COLLATION_NAME = new BasicName(Namespace.URI, "collationName");

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-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -482,15 +482,15 @@
         } else if (tokens.matches(STMT_CREATE_VIEW) || tokens.matches(STMT_CREATE_OR_REPLACE_VIEW)) {
             stmtNode = parseCreateViewStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_ASSERTION)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_ASSERTION, parentNode, TYPE_CREATE_ASSERTION_STATEMENT);
+            stmtNode = parseCreateAssertionStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_CHARACTER_SET)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_CHARACTER_SET, parentNode, TYPE_CREATE_CHARACTER_SET_STATEMENT);
+            stmtNode = parseCreateCharacterSetStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_COLLATION)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_COLLATION, parentNode, TYPE_CREATE_COLLATION_STATEMENT);
+            stmtNode = parseCreateCollationStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_TRANSLATION)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_TRANSLATION, parentNode, TYPE_CREATE_TRANSLATION_STATEMENT);
+            stmtNode = parseCreateTranslationStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_DOMAIN)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_DOMAIN, parentNode, TYPE_CREATE_DOMAIN_STATEMENT);
+            stmtNode = parseCreateDomainStatement(tokens, parentNode);
         } else {
             markStartOfStatement(tokens);
 
@@ -766,7 +766,7 @@
     }
 
     /**
-     * Parses DDL INSERT {@link AstNode} based on SQL 92 specifications.
+     * Parses DDL GRANT statement {@link AstNode} based on SQL 92 specifications.
      * 
      * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
      * @param parentNode the parent {@link AstNode} node; may not be null
@@ -997,7 +997,127 @@
         return revokeNode;
     }
     
+    
     /**
+     * Parses DDL CREATE DOMAIN {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateDomainStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        //<domain definition> ::=
+        //    CREATE DOMAIN <domain name>
+        //        [ AS ] <data type>
+        //      [ <default clause> ]
+        //      [ <domain constraint>... ]
+        //      [ <collate clause> ]
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_DOMAIN);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_DOMAIN_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE COLLATION {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateCollationStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_COLLATION);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_COLLATION_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE TRANSLATION {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateTranslationStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_TRANSLATION);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_TRANSLATION_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE CHARACTER SET {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateCharacterSetStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_CHARACTER_SET);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_CHARACTER_SET_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
      * Catch-all method to parse unknown (not registered or handled by sub-classes) statements.
      * 
      * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
@@ -1377,7 +1497,7 @@
                 // CONSTRAINT P_KEY_2a UNIQUE (PERMISSIONUID)
                 tokens.consume("UNIQUE"); // UNIQUE
 
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+                constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1388,7 +1508,7 @@
                 tokens.consume("PRIMARY"); // PRIMARY
                 tokens.consume("KEY"); // KEY
 
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1400,7 +1520,7 @@
                 // COLUMN_NAME DATATYPE NOT NULL DEFAULT (0) CONSTRAINT SOME_FK_NAME REFERENCES SOME_TABLE_NAME (SOME_COLUMN_NAME,
                 // ...)
 
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
                 nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1416,7 +1536,7 @@
 
             AstNode constraintNode = nodeFactory().node(uc_name, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+            constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1428,7 +1548,7 @@
 
             AstNode constraintNode = nodeFactory().node(pk_name, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1444,7 +1564,7 @@
 
             AstNode constraintNode = nodeFactory().node(constraintName, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1461,7 +1581,7 @@
 
             AstNode constraintNode = nodeFactory().node(constraintName, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1475,7 +1595,7 @@
 
             AstNode constraintNode = nodeFactory().node(ck_name, columnNode.getParent(), mixinType);
             constraintNode.setProperty(NAME, ck_name);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_C);
+            constraintNode.setProperty(CONSTRAINT_TYPE, CHECK);
 
             String clause = consumeParenBoundedTokens(tokens, true);
             constraintNode.setProperty(CHECK_SEARCH_CONDITION, clause);
@@ -1552,7 +1672,7 @@
                 tokens.consume(); // UNIQUE
 
                 AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+                constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1565,7 +1685,7 @@
                 tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
 
                 AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1583,7 +1703,7 @@
                 }
 
                 AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1602,7 +1722,7 @@
             tokens.consume("UNIQUE"); // UNIQUE
 
             AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+            constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
             // CONSUME COLUMNS
             parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1617,7 +1737,7 @@
             tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
 
             AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
             // CONSUME COLUMNS
             parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1634,7 +1754,7 @@
 
             AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
             // CONSUME COLUMNS
             parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1653,7 +1773,7 @@
             tokens.consume("CHECK"); // CHECK
 
             AstNode constraintNode = nodeFactory().node(ck_name, tableNode, mixinType);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_C);
+            constraintNode.setProperty(CONSTRAINT_TYPE, CHECK);
 
             String clause = consumeParenBoundedTokens(tokens, true);
             constraintNode.setProperty(CHECK_SEARCH_CONDITION, clause);
@@ -1867,7 +1987,45 @@
 
         return schemaNode;
     }
+    /**
+     * Parses DDL CREATE ASSERTION {@link AstNode} based on SQL 92 specifications. Initial implementation here does not parse the
+     * statement's search condition in detail.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed schema node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateAssertionStatement( DdlTokenStream tokens,
+                                                  AstNode parentNode ) throws ParsingException {
+        markStartOfStatement(tokens);
 
+        //      <assertion definition> ::=
+        //      CREATE ASSERTION <constraint name> CHECK <left paren> <search condition> <right paren>  [ <constraint attributes> ]         
+        
+        AstNode node = null;
+
+        tokens.consume("CREATE", "ASSERTION");
+
+        String name = parseName(tokens);
+                
+        // Must have one or the other or both
+
+        node = nodeFactory().node(name, parentNode, TYPE_CREATE_ASSERTION_STATEMENT);
+        
+        tokens.consume("CHECK");
+        
+        String searchCondition = consumeParenBoundedTokens(tokens, false);
+        
+        node.setProperty(CHECK_SEARCH_CONDITION, searchCondition);
+
+        parseConstraintAttributes(tokens, node);
+
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+
     // ===========================================================================================================================
     // PARSING CREATE XXXXX (Typed Statements)
     // ===========================================================================================================================

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -64,6 +64,7 @@
     	basicCharStringTypes.add(DataTypes.DTYPE_CHAR_VARYING);
     	basicCharStringTypes.add(DataTypes.DTYPE_VARCHAR);
     	
+    	basicNationalCharStringTypes.add(DataTypes.DTYPE_NCHAR);
     	basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHARACTER);
     	basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHARACTER_VARYING);
     	basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHAR);

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-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -228,7 +228,7 @@
         //       | { NO SQL | CONTAINS SQL | READS SQL DATA }
         //       | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
         //        }
-        tokens.consume(CREATE, "FUNCTION"); // CREATE
+        tokens.consume(CREATE, "FUNCTION");
 
         String functionName = parseName(tokens);
 
@@ -330,11 +330,11 @@
     }
 
     /**
-     * Parses DDL CREATE FUNCTION statement
+     * Parses DDL CREATE PROCEDURE statement
      * 
      * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
      * @param parentNode the parent {@link AstNode} node; may not be null
-     * @return the parsed CREATE FUNCTION statement node
+     * @return the parsed CREATE PROCEDURE statement node
      * @throws ParsingException
      */
     protected AstNode parseCreateProcedure( DdlTokenStream tokens,
@@ -344,7 +344,7 @@
 
         markStartOfStatement(tokens);
         
-        tokens.consume(CREATE, "PROCEDURE"); // CREATE
+        tokens.consume(CREATE, "PROCEDURE");
 
         String functionName = parseName(tokens);
 

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-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -340,7 +340,7 @@
         SubgraphNode pk_1_Node = tableNode.getNode(path("PK_1"));
         assertNotNull(pk_1_Node);
         assertThat(verifyPrimaryType(pk_1_Node, "nt:unstructured"), is(true));
-        assertThat(verifyProperty(pk_1_Node, "ddl:constraintType", "2"), is(true));
+        assertThat(verifyProperty(pk_1_Node, "ddl:constraintType", "PRIMARY KEY"), is(true));
         assertThat(verifyMixinType(pk_1_Node, "ddl:tableConstraint"), is(true));
         
         // One column reference
@@ -597,7 +597,7 @@
         // <name = "CREATE OR REPLACE DIRECTORY" startLineNumber = "164" primaryType = "nt:unstructured" uuid = "c45eb2bb-1b85-469d-9dfc-0012fdfd8ac4" startColumnNumber = "1" mixinTypes = "oracleddl:createDirectoryStatement" expression = "CREATE OR REPLACE DIRECTORY bfile_dir AS '/private1/LOB/files';" startCharIndex = "3887">
         SubgraphNode createOrReplDirNode = statementsNode.getNode(path("CREATE OR REPLACE DIRECTORY"));
         assertNotNull(createOrReplDirNode);
-        verifyBaseProperties(createOrReplDirNode, "nt:unstructured", "164", "1", "3887", 0);
+        verifyBaseProperties(createOrReplDirNode, "nt:unstructured", "164", "1", "3886", 0);
         assertThat(verifyMixinType(createOrReplDirNode, "oracleddl:createDirectoryStatement"), is(true));
         
         // <name = "countries" startLineNumber = "9" primaryType = "nt:unstructured" uuid = "70f45acc-57b0-41c9-b166-bcba4f8c75b8" startColumnNumber = "1" mixinTypes = "ddl:alterTableStatement" expression = "ALTER TABLE countries 
@@ -623,7 +623,7 @@
         SubgraphNode check_1_node = countriesNode.getNode(path("CHECK_1"));
         assertNotNull(check_1_node);
         assertThat(verifyPrimaryType(check_1_node, "nt:unstructured"), is(true));
-        assertThat(verifyProperty(check_1_node, "ddl:constraintType", "3"), is(true));
+        assertThat(verifyProperty(check_1_node, "ddl:constraintType", "CHECK"), is(true));
         assertThat(verifyMixinType(check_1_node, "ddl:addTableConstraintDefinition"), is(true));
         assertThat(verifyProperty(check_1_node, "ddl:searchCondition", "( duty_pct < 10 . 5 )"), is(true));
         

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-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -256,7 +256,7 @@
         assertEquals(1, alterTableNode.getChildCount());
         AstNode constraintNode = alterTableNode.getChild(0); // / FOREIGN KEY
         assertEquals("fk_name", constraintNode.getName().getString());
-        assertEquals(DdlConstants.CONSTRAINT_FK, constraintNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
+        assertEquals(DdlConstants.FOREIGN_KEY, constraintNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
         assertTrue(hasMixinType(constraintNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_ADD_TABLE_CONSTRAINT_DEFINITION));
 
         // Expect 3 references: COLUMN REFERENCE for this table, External Table reference and column reference in external table
@@ -298,7 +298,7 @@
         String content = getFileContent(DDL_FILE_PATH + "schema_definition.ddl");
         parser.parse(content, rootNode);
 
-        assertEquals(11, rootNode.getChildCount());
+        assertEquals(13, rootNode.getChildCount());
 
         List<AstNode> schemaNodes = parser.nodeFactory().getChildrenForType(rootNode, TYPE_CREATE_SCHEMA_STATEMENT);
 
@@ -600,7 +600,7 @@
 
         AstNode foreignKeyNode = parser.nodeFactory().getChildforNameAndType(tableNode, "FK_SUPPLIER", TYPE_TABLE_CONSTRAINT);
 
-        assertEquals(DdlConstants.CONSTRAINT_FK, foreignKeyNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
+        assertEquals(DdlConstants.FOREIGN_KEY, foreignKeyNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
         assertEquals(3, foreignKeyNode.getChildCount()); // 2 COLUMN REFERENCES + 1 TABLE REFERENCE
     }
 
@@ -860,4 +860,18 @@
         assertThat(true, is(success));
         assertThat(rootNode.getChildCount(), is(4));
     }
+    
+    @Test
+    public void shouldParseSchemaWithTableAndView() {
+        printTest("shouldParseSchemaWithTableAndView()");
+        String content = 
+              "create schema schema_1 authorization ADM default character set UNICODE" + NEWLINE
+            + "     create table table_1 (col1 varchar(20) not null, col2 nchar default current_user)" + NEWLINE
+            + "     create view view_1 (col1, col2) as select*from a with check option" + NEWLINE
+            + ";";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl	2010-01-07 19:12:33 UTC (rev 1554)
@@ -105,8 +105,17 @@
 	);
 
 -- ==================================================================
---      DOMAIN DEFINITION
+--      ASSERTION DEFINITION
 -- ==================================================================
 
+--<assertion definition> ::=
+--    CREATE ASSERTION <constraint name> <assertion check>
+--      [ <constraint attributes> ]
+--
+--<assertion check> ::=
+--    CHECK
+--        <left paren> <search condition> <right paren>
 
+CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE
 
+CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED



More information about the dna-commits mailing list