[dna-commits] DNA SVN: r1394 - in trunk/extensions/dna-sequencer-ddl: src/main/java/org/jboss/dna/sequencer/ddl and 8 other directories.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Thu Dec 3 17:16:51 EST 2009


Author: blafond
Date: 2009-12-03 17:16:50 -0500 (Thu, 03 Dec 2009)
New Revision: 1394

Added:
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl
Modified:
   trunk/extensions/dna-sequencer-ddl/
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.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/DerbyDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.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/PostgresDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.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/resources/ddl/createTables.ddl
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl
Log:
DNA-49 Fleshed out the DdlSequencerTest to include asserting graph results for node and properties. Includes tests for specific dialects. Also includes various fixes for miscues uncovered after finally being able to go end-to-end with the sequencer. Subsequent bugs for this sequencer and parsing framework will logged and fixed as separate JIRA's.


Property changes on: trunk/extensions/dna-sequencer-ddl
___________________________________________________________________
Name: svn:ignore
   + target

.settings


Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -52,6 +52,7 @@
         parsers.add(new OracleDdlParser());
         parsers.add(new DerbyDdlParser());
         parsers.add(new PostgresDdlParser());
+        //parsers.add(new MySqlDdlParser());
     }
 
     /**
@@ -87,6 +88,8 @@
 
         DdlTokenStream tokens = null;
         DdlParser validParser = null;
+        DdlTokenStream validTokens = null;
+        
 
         // FIRST token should be DIALECT
         // for (DdlParser parser : library.getInstances()) {
@@ -111,15 +114,16 @@
                 if (numKeywords > keywordCount) {
                     keywordCount = numKeywords;
                     validParser = parser;
+                    validTokens = tokens;
                 }
             }
-            if (tokens != null) {
-                tokens.rewind();
+            if (validTokens != null) {
+                validTokens.rewind();
             }
         } else {
-            tokens = new DdlTokenStream(ddl, DdlTokenStream.ddlTokenizer(false), false);
-            validParser.registerWords(tokens);
-            tokens.start(); // COMPLETE TOKENIZATION
+            validTokens = new DdlTokenStream(ddl, DdlTokenStream.ddlTokenizer(false), false);
+            validParser.registerWords(validTokens);
+            validTokens.start(); // COMPLETE TOKENIZATION
         }
 
         if (validParser == null) {
@@ -130,7 +134,7 @@
         // tokens = new DdlTokenStream(ddl, DdlTokenStream.ddlTokenizer(false), false);
         // validParser.registerWords(tokens);
         // tokens.start();
-        boolean success = validParser.parse(tokens, rootNode);
+        boolean success = validParser.parse(validTokens, rootNode);
         rootNode.setProperty(StandardDdlLexicon.PARSER_ID, validParser.getId());
 
         return success;

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.java	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -68,7 +68,8 @@
             rootNode = parsers.parse(IoUtil.read(stream));
 
             Path nodePath = pathFactory.create(rootNode.getPath(context));
-            destination.create(nodePath, rootNode.getProperties());
+            List<Property> properties = rootNode.getProperties();
+            destination.create(nodePath, properties);
 
             convertAstNodesToGraphNodes(rootNode);
 
@@ -88,7 +89,8 @@
 
         for (AstNode child : children) {
             Path nodePath = pathFactory.create(child.getPath(context));
-            destination.create(nodePath, child.getProperties());
+            List<Property> properties = child.getProperties();
+            destination.create(nodePath, properties);
             convertAstNodesToGraphNodes(child);
         }
     }

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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -628,7 +628,7 @@
 
         } else if (tokens.canConsume("DROP")) {
             if (tokens.canConsume("CONSTRAINT")) {
-                String constraintName = tokens.consume(); // constraint name
+                String constraintName = parseName(tokens); // constraint name
 
                 AstNode constraintNode = nodeFactory().node(constraintName, alterTableNode, TYPE_DROP_TABLE_CONSTRAINT_DEFINITION);
 
@@ -1287,7 +1287,7 @@
             // EXAMPLE:
             // COLUMN_NAME DATATYPE NOT NULL DEFAULT (0) FOREIGN KEY MY_FK_NAME REFERENCES SOME_TABLE_NAME (SOME_COLUMN_NAME, ...)
 
-            String constraintName = tokens.consume();
+            String constraintName = parseName(tokens);
 
             AstNode constraintNode = nodeFactory().node(constraintName, columnNode.getParent(), mixinType);
 
@@ -1445,7 +1445,7 @@
         } else if (tokens.matches("CONSTRAINT", DdlTokenStream.ANY_VALUE, "UNIQUE")) {
             // CONSTRAINT P_KEY_2a UNIQUE (PERMISSIONUID)
             tokens.consume(); // CONSTRAINT
-            String uc_name = tokens.consume(); // UNIQUE CONSTRAINT NAME
+            String uc_name = parseName(tokens); // UNIQUE CONSTRAINT NAME
             tokens.consume("UNIQUE"); // UNIQUE
 
             AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
@@ -1460,7 +1460,7 @@
         } else if (tokens.matches("CONSTRAINT", DdlTokenStream.ANY_VALUE, "PRIMARY", "KEY")) {
             // CONSTRAINT U_KEY_2a PRIMARY KEY (PERMISSIONUID)
             tokens.consume("CONSTRAINT"); // CONSTRAINT
-            String pk_name = tokens.consume(); // PRIMARY KEY NAME
+            String pk_name = parseName(tokens); // PRIMARY KEY NAME
             tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
 
             AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
@@ -1476,7 +1476,7 @@
         } else if (tokens.matches("CONSTRAINT", DdlTokenStream.ANY_VALUE, "FOREIGN", "KEY")) {
             // CONSTRAINT F_KEY_2a FOREIGN KEY (PERMISSIONUID)
             tokens.consume("CONSTRAINT"); // CONSTRAINT
-            String fk_name = tokens.consume(); // FOREIGN KEY NAME
+            String fk_name = parseName(tokens); // FOREIGN KEY NAME
             tokens.consume("FOREIGN", "KEY"); // FOREIGN KEY
 
             AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
@@ -1653,6 +1653,8 @@
         // CONSUME COLUMNS
         parseColumnNameList(tokens, createViewNode, TYPE_COLUMN_REFERENCE);
 
+        tokens.consume("AS");
+        
         String queryExpression = parseUntilTerminator(tokens);
 
         createViewNode.setProperty(CREATE_VIEW_QUERY_EXPRESSION, queryExpression);
@@ -1689,9 +1691,9 @@
         if (tokens.canConsume("AUTHORIZATION")) {
             authorizationIdentifier = tokens.consume();
         } else {
-            schemaName = tokens.consume();
+            schemaName = parseName(tokens);
             if (tokens.canConsume("AUTHORIZATION")) {
-                authorizationIdentifier = tokens.consume();
+                authorizationIdentifier = parseName(tokens);
             }
         }
         // Must have one or the other or both

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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -77,12 +77,12 @@
     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, "dropFunctionStatementStatement");
-    public static final Name TYPE_DROP_INDEX_STATEMENT 			= new BasicName(Namespace.URI, "dropIndexStatementStatement");
-    public static final Name TYPE_DROP_PROCEDURE_STATEMENT 		= new BasicName(Namespace.URI, "dropProcedureStatementStatement");
-    public static final Name TYPE_DROP_ROLE_STATEMENT 			= new BasicName(Namespace.URI, "dropRoleStatementStatement");
-    public static final Name TYPE_DROP_SYNONYM_STATEMENT 			= new BasicName(Namespace.URI, "dropSynonymStatementStatement");
-    public static final Name TYPE_DROP_TRIGGER_STATEMENT 			= new BasicName(Namespace.URI, "dropTriggerStatementStatement");
+    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"); //$NON-NLS-1$
     public static final Name TABLE_NAME 			= new BasicName(Namespace.URI, "tableName"); //$NON-NLS-1$

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.java	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -423,10 +423,10 @@
 
             // RENAME DATABASE db_name TO new_db_name;
             tokens.consume(STMT_RENAME_DATABASE);
-            String oldName = tokens.consume();
+            String oldName = parseName(tokens);
             tokens.consume("TO");
             AstNode node = nodeFactory().node(oldName, parentNode, TYPE_RENAME_DATABASE_STATEMENT);
-            String newName = tokens.consume();
+            String newName = parseName(tokens);
             node.setProperty(NEW_NAME, newName);
 
             markEndOfStatement(tokens, node);
@@ -436,10 +436,10 @@
 
             // RENAME SCHEMA schema_name TO new_schema_name;
             tokens.consume(STMT_RENAME_SCHEMA);
-            String oldName = tokens.consume();
+            String oldName = parseName(tokens);
             tokens.consume("TO");
             AstNode node = nodeFactory().node(oldName, parentNode, TYPE_RENAME_SCHEMA_STATEMENT);
-            String newName = tokens.consume();
+            String newName = parseName(tokens);
             node.setProperty(NEW_NAME, newName);
 
             markEndOfStatement(tokens, node);

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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -23,6 +23,9 @@
  */
 package org.jboss.dna.sequencer.ddl.dialect.oracle;
 
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CREATE_VIEW_QUERY_EXPRESSION;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_OPTION_TYPE;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NEW_NAME;
@@ -594,7 +597,7 @@
             tokens.consume(DROP);
 
             if (tokens.canConsume("CONSTRAINT")) {
-                String constraintName = tokens.consume(); // constraint name
+                String constraintName = parseName(tokens); // constraint name
 
                 AstNode constraintNode = nodeFactory().node(constraintName, alterTableNode, TYPE_DROP_TABLE_CONSTRAINT_DEFINITION);
 
@@ -759,8 +762,101 @@
 
         return super.parseAlterStatement(tokens, parentNode);
     }
+    
+    
 
     /**
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseCreateViewStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream, org.jboss.dna.sequencer.ddl.node.AstNode)
+     */
+    @Override
+    protected AstNode parseCreateViewStatement( DdlTokenStream tokens,
+                                                AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        //CREATE [OR REPLACE]
+        //        [[NO] FORCE] VIEW [schema.] view
+        //         [ ( { alias [ inline_constraint... ]
+        //             | out_of_line_constraint
+        //             }
+        //               [, { alias [ inline_constraint...]
+        //                  | out_of_line_constraint
+        //                  }
+        //               ]
+        //           )
+        //         | object_view_clause
+        //         | XMLType_view_clause
+        //         ]
+        //         AS subquery [ subquery_restriction_clause ] ;
+
+
+        // NOTE: the query expression along with the CHECK OPTION clause require no SQL statement terminator.
+        // So the CHECK OPTION clause will NOT
+
+        String stmtType = "CREATE";
+        tokens.consume("CREATE");
+        if (tokens.canConsume("OR", "REPLACE")) {
+            stmtType = stmtType + SPACE + "OR REPLACE";
+        } else if( tokens.canConsume("NO", "FORCE")) {
+            stmtType = stmtType + SPACE + "NO FORCE";
+        } else if( tokens.canConsume("FORCE")) {
+            stmtType = stmtType + SPACE + "FORCE";
+        }
+        
+        tokens.consume("VIEW");
+        stmtType = stmtType + SPACE + "VIEW";
+
+        String name = parseName(tokens);
+
+        AstNode createViewNode = nodeFactory().node(name, parentNode, TYPE_CREATE_VIEW_STATEMENT);
+
+        // CONSUME COLUMNS
+        parseColumnNameList(tokens, createViewNode, TYPE_COLUMN_REFERENCE);
+
+        // (object_view_clause)
+        //
+        //    OF [ schema. ] type_name
+        //    { WITH OBJECT IDENTIFIER
+        //      { DEFAULT | ( attribute [, attribute ]... ) }
+        //    | UNDER [ schema. ] superview
+        //    }
+        //    ( { out_of_line_constraint
+        //      | attribute { inline_constraint }...
+        //      }  [, { out_of_line_constraint
+        //            | attribute { inline_constraint }...
+        //            }
+        //         ]...
+        //    )
+
+        // (XMLType_view_clause)
+        //
+        //    OF XMLTYPE [ XMLSchema_spec ]
+        //                 WITH OBJECT IDENTIFIER
+        //                   { DEFAULT | ( expr [, expr ]...) }
+
+        // Basically, if next token matches "OF", then parse until token matches "AS"
+        
+        if( tokens.matches("OF") ) {
+            do {
+                tokens.consume();
+            } while( !tokens.matches("AS"));
+        }
+        
+        tokens.consume("AS");
+        
+        String queryExpression = parseUntilTerminator(tokens);
+
+        createViewNode.setProperty(CREATE_VIEW_QUERY_EXPRESSION, queryExpression);
+
+        markEndOfStatement(tokens, createViewNode);
+
+        return createViewNode;
+    }
+
+    /**
      * Parses DDL CREATE INDEX
      * 
      * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null

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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -37,7 +37,13 @@
 public interface PostgresDdlConstants extends DdlConstants {
 	public static final String[] CUSTOM_KEYWORDS = {
 		"SHOW", "LISTEN", "UNLISTEN", "REINDEX", "MOVE", "ABORT", "ANALYZE", "TRUNCATE", "REASSIGN", "RELEASE",
-		"RESET", "REVOKE", "ROLLBACK", "FETCH", "EXPLAIN", "DISCARD", "COPY", "CLUSTER", "NOTIFY", "LOAD", "COMMENT", "LOCK"
+		"RESET", "REVOKE", "ROLLBACK", "FETCH", "EXPLAIN", "DISCARD", "COPY", "CLUSTER", "NOTIFY", "LOAD", "COMMENT", "LOCK",
+		"SERVER", "SEARCH", "PARSER", "DICTIONARY", "WRAPPER", "PROCEDURAL", "CONVERSION", "AGGREGATE", "TEMPLATE", 
+		"MAPPING", "TRUSTED", "TRIGGER", "VACUUM", "FAMILTY",
+		"BIGSERIAL", "BOX", "BOOLEAN", "BOX", "BYTEA", "CIDR", "CIRCLE", "FLOAT4", "FLOAT8", "INET", "INT2", "INT4", "INT8",
+        "LINE", "LSEG", "MACADDR", "MONEY", "PATH", "POINT", "POLYGON",
+        "SERIAL", "SERIAL4", "SERIAL8", "TEXT", "TIMESTAMPZ", "TSQUERY",
+        "TSVECTOR", "TXID_SNAPSHOT", "UUID", "XML"
 	};
 
 	interface PostgresStatementStartPhrases {
@@ -290,37 +296,37 @@
 		//      interval hour to minute
 	
 	interface PostgresDataTypes {
-		static final String[] DTYPE_BIGSERIAL = {"BIGSERIAL"}; //
-		static final String[] DTYPE_BOX = {"BOX"}; // 
-		static final String[] DTYPE_BYTEA = {"BYTEA"}; //
-		static final String[] DTYPE_CIDR = {"CIDR"}; // 
-		static final String[] DTYPE_CIRCLE = {"CIRCLE"}; // 
-		static final String[] DTYPE_INET = {"INET"}; // 
-		static final String[] DTYPE_LINE = {"LINE"}; // 
-		static final String[] DTYPE_LSEG = {"LSEG"}; // 
-		static final String[] DTYPE_MACADDR = {"MACADDR"}; // 
-		static final String[] DTYPE_MONEY = {"MONEY"}; // 
-		static final String[] DTYPE_PATH = {"PATH"}; // 
-		static final String[] DTYPE_POINT = {"POINT"}; // 
-		static final String[] DTYPE_POLYGON = {"POLYGON"}; // 
-		static final String[] DTYPE_SERIAL = {"SERIAL"}; // 
-		static final String[] DTYPE_TEXT = {"TEXT"}; // 
-		static final String[] DTYPE_TSQUERY = {"TSQUERY"}; // 
-		static final String[] DTYPE_TSVECTOR = {"TSVECTOR"}; // 
-		static final String[] DTYPE_TXID_SNAPSHOT = {"TXID_SNAPSHOT"}; // 
-		static final String[] DTYPE_UUID = {"UUID"}; // 
-		static final String[] DTYPE_XML = {"XML"}; // 
-		static final String[] DTYPE_BOOLEAN = {"BOOLEAN"}; // 
-		static final String[] DTYPE_BOOL = {"BOOL"}; // 
-		static final String[] DTYPE_FLOAT4 = {"FLOAT4"}; // 
-		static final String[] DTYPE_FLOAT8 = {"FLOAT8"}; // 
-		static final String[] DTYPE_INT2 = {"INT2"}; // 
-		static final String[] DTYPE_INT4 = {"INT4"}; // 
-		static final String[] DTYPE_INT8 = {"INT8"}; // 
-		static final String[] DTYPE_SERIAL4 = {"SERIAL4"}; //
-		static final String[] DTYPE_SERIAL8 = {"SERIAL8"}; // 
-		static final String[] DTYPE_TIMESTAMPZ = {"TIMESTAMPZ"}; // 
-		static final String[] DTYPE_VARBIT = {"VARBIT"}; // 
+		static final String[] DTYPE_BIGSERIAL = {"BIGSERIAL"};
+		static final String[] DTYPE_BOX = {"BOX"};
+		static final String[] DTYPE_BYTEA = {"BYTEA"};
+		static final String[] DTYPE_CIDR = {"CIDR"}; 
+		static final String[] DTYPE_CIRCLE = {"CIRCLE"}; 
+		static final String[] DTYPE_INET = {"INET"}; 
+		static final String[] DTYPE_LINE = {"LINE"}; 
+		static final String[] DTYPE_LSEG = {"LSEG"}; 
+		static final String[] DTYPE_MACADDR = {"MACADDR"}; 
+		static final String[] DTYPE_MONEY = {"MONEY"}; 
+		static final String[] DTYPE_PATH = {"PATH"}; 
+		static final String[] DTYPE_POINT = {"POINT"}; 
+		static final String[] DTYPE_POLYGON = {"POLYGON"}; 
+		static final String[] DTYPE_SERIAL = {"SERIAL"}; 
+		static final String[] DTYPE_TEXT = {"TEXT"}; 
+		static final String[] DTYPE_TSQUERY = {"TSQUERY"}; 
+		static final String[] DTYPE_TSVECTOR = {"TSVECTOR"}; 
+		static final String[] DTYPE_TXID_SNAPSHOT = {"TXID_SNAPSHOT"}; 
+		static final String[] DTYPE_UUID = {"UUID"}; 
+		static final String[] DTYPE_XML = {"XML"}; 
+		static final String[] DTYPE_BOOLEAN = {"BOOLEAN"}; 
+		static final String[] DTYPE_BOOL = {"BOOL"}; 
+		static final String[] DTYPE_FLOAT4 = {"FLOAT4"}; 
+		static final String[] DTYPE_FLOAT8 = {"FLOAT8"}; 
+		static final String[] DTYPE_INT2 = {"INT2"}; 
+		static final String[] DTYPE_INT4 = {"INT4"}; 
+		static final String[] DTYPE_INT8 = {"INT8"}; 
+		static final String[] DTYPE_SERIAL4 = {"SERIAL4"};
+		static final String[] DTYPE_SERIAL8 = {"SERIAL8"}; 
+		static final String[] DTYPE_TIMESTAMPZ = {"TIMESTAMPZ"}; 
+		static final String[] DTYPE_VARBIT = {"VARBIT"}; 
 
 		
 		static final List<String[]> CUSTOM_DATATYPE_START_PHRASES = 

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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -389,7 +389,7 @@
 
         } else if (tokens.canConsume("DROP")) { // DROP CONSTRAINT & DROP COLUMN
             if (tokens.canConsume("CONSTRAINT")) {
-                String constraintName = tokens.consume(); // constraint name
+                String constraintName = parseName(tokens); // constraint name
 
                 AstNode constraintNode = nodeFactory().node(constraintName, alterTableNode, TYPE_DROP_TABLE_CONSTRAINT_DEFINITION);
 
@@ -1389,7 +1389,7 @@
         boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_RULE);
         tokens.canConsume(STMT_CREATE_RULE);
 
-        String name = tokens.consume();
+        String name = parseName(tokens);
 
         AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_RULE_STATEMENT);
         if (isReplace) {
@@ -1413,7 +1413,7 @@
 
         tokens.canConsume(STMT_CREATE_FUNCTION);
 
-        String name = tokens.consume();
+        String name = parseName(tokens);
 
         AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
 

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -98,7 +98,7 @@
         if (this.parent == null) return snsIndex;
         // Go through all the children ...
         for (AstNode sibling : this.parent.getChildren()) {
-            if (sibling == this) continue;
+            if (sibling == this) break;
             if (sibling.getName().equals(this.name)) ++snsIndex;
         }
         return snsIndex;

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.java	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -212,7 +212,7 @@
 	  	assertThat(alterNodes.size(), is(120));
 	  	List<AstNode> dropSchemaNodes = nodeFactory.getChildrenForType(rootNode, TYPE_DROP_SCHEMA_STATEMENT);
 	  	assertThat(dropSchemaNodes.size(), is(1));
-	  	List<AstNode> unknownNodes = nodeFactory.getChildrenForType(rootNode, TYPE_STATEMENT);
+	  	List<AstNode> unknownNodes = nodeFactory.getChildrenForType(rootNode, TYPE_UNKNOWN_STATEMENT);
 	  	assertThat(unknownNodes.size(), is(1));
 	  	
     }

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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -25,12 +25,11 @@
 
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
-import java.util.Iterator;
-import java.util.Map;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.SubgraphNode;
@@ -42,6 +41,10 @@
 import org.jboss.dna.graph.property.ValueFormatException;
 import org.jboss.dna.graph.sequencer.MockSequencerContext;
 import org.jboss.dna.graph.sequencer.StreamSequencerContext;
+import org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.mysql.MySqlDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.oracle.OracleDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -65,18 +68,15 @@
         context.getNamespaceRegistry().register("jcr", "http://www.jcp.org/jcr/1.0");
         context.getNamespaceRegistry().register("nt", "http://www.jcp.org/jcr/nt/1.0");
         context.getNamespaceRegistry().register("mix", "http://www.jcp.org/jcr/mix/1.0");
-        context.getNamespaceRegistry().register("ddl", "http://jboss.org/dna/ddl/1.0");
-        context.getNamespaceRegistry().register("derbyddl", "http://jboss.org/dna/ddl/derby/1.0");
-        context.getNamespaceRegistry().register("oracleddl", "http://jboss.org/dna/ddl/oracle/1.0");
-        context.getNamespaceRegistry().register("postgresddl", "http://jboss.org/dna/ddl/postgres/1.0");
-        context.getNamespaceRegistry().register("mysqlddl", "http://jboss.org/dna/ddl/mysql/1.0");
+        context.getNamespaceRegistry().register(StandardDdlLexicon.Namespace.PREFIX, StandardDdlLexicon.Namespace.URI);
+        context.getNamespaceRegistry().register(DerbyDdlLexicon.Namespace.PREFIX, DerbyDdlLexicon.Namespace.URI);
+        context.getNamespaceRegistry().register(OracleDdlLexicon.Namespace.PREFIX, OracleDdlLexicon.Namespace.URI);
+        context.getNamespaceRegistry().register(PostgresDdlLexicon.Namespace.PREFIX, PostgresDdlLexicon.Namespace.URI);
+        context.getNamespaceRegistry().register(MySqlDdlLexicon.Namespace.PREFIX, MySqlDdlLexicon.Namespace.URI);
 
         InMemoryRepositorySource source = new InMemoryRepositorySource();
         source.setName("actual");
         graph = Graph.create(source, context);
-        // InMemoryRepositorySource expectedSource = new InMemoryRepositorySource();
-        // expectedSource.setName("expected");
-        // expectedGraph = Graph.create(expectedSource, context);
 
         output = new GraphSequencerOutput(graph);
     }
@@ -124,16 +124,146 @@
     protected Path path( String path ) {
         return context.getValueFactories().getPathFactory().create(path);
     }
+    
+    /**
+     * Utility to create a string value from an {@link Object}
+     * 
+     * @param value the value object
+     * @return the string value of the object
+     * @throws ValueFormatException if a path could not be created from the supplied string
+     */
+    protected String value( Object value ) {
+        return context.getValueFactories().getStringFactory().create(value);
+    }
+    
+    private boolean verifyProperty(SubgraphNode node, String propNameStr, String expectedValue) {
+        Name propName = name(propNameStr);
+        for( Property prop : node.getProperties()) {
+            if (prop.getName().equals(propName) ) {
+                for (Object nextVal : prop.getValuesAsArray()) {
+                    String valueStr = value(nextVal);
+                    if( valueStr.equals(expectedValue)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+    
+    private boolean verifyHasProperty(SubgraphNode node, String propNameStr) {
+        Name propName = name(propNameStr);
+        for( Property prop : node.getProperties()) {
+            if (prop.getName().equals(propName) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    private boolean verifyPrimaryType(SubgraphNode node, String expectedValue) {
+        return verifyProperty(node, "jcr:primaryType", expectedValue);
+    }
+    
+    private boolean verifyMixinType(SubgraphNode node, String expectedValue) {
+        return verifyProperty(node, "jcr:mixinTypes", expectedValue);
+    }
+    
+    private boolean verifyExpression(SubgraphNode node, String expectedValue) {
+        return verifyProperty(node, "ddl:expression", expectedValue);
+    }
+    
+    private void verifyBaseProperties(SubgraphNode node, String primaryType, String lineNum, String colNum, String charIndex, int numChildren) {
+        assertThat(verifyPrimaryType(node, primaryType), is(true));
+        assertThat(verifyProperty(node, "ddl:startLineNumber", lineNum), is(true));
+        assertThat(verifyProperty(node, "ddl:startColumnNumber", colNum), is(true));
+        assertThat(verifyProperty(node, "ddl:startCharIndex", charIndex), is(true));
+        assertThat(node.getChildren().size(), is(numChildren));
+    }
+    
+    @Test
+    public void shouldSequenceCreateSchema() throws IOException {
+        // CREATE SCHEMA hollywood
+        // CREATE TABLE films (title varchar(255), release date, producerName varchar(255))
+        // CREATE VIEW winners AS
+        // SELECT title, release FROM films WHERE producerName IS NOT NULL;
+        
+        //        Subgraph 
+        //        <name = "/" uuid = "0a3501e8-a6ec-4a0e-89b7-9cf64476b18b">
+        //          <name = "statements" primaryType = "nt:unstructured" uuid = "56f305d6-aa76-4b1a-8e06-bd0c2981c2ff" parserId = "POSTGRES">
+        //            <name = "hollywood" startLineNumber = "1" primaryType = "nt:unstructured" uuid = "88d2901d-eeaa-4bd6-80c4-243ea56f7c20" startColumnNumber = "1" mixinTypes = "ddl:createSchemaStatement" expression = "CREATE SCHEMA hollywood" startCharIndex = "0">
+        //              <name = "films" startLineNumber = "2" primaryType = "nt:unstructured" uuid = "8ff9e0a1-ad32-48b0-8a76-011fd6a35142" startColumnNumber = "5" mixinTypes = "ddl:createTableStatement" expression = "CREATE TABLE films (title varchar(255), release date, producerName varchar(255))" startCharIndex = "28">
+        //                <name = "title" datatypeName = "VARCHAR" datatypeLength = "255" primaryType = "nt:unstructured" uuid = "c1a65f89-2ed4-4a39-858d-b4fd06c60879" mixinTypes = "ddl:columnDefinition">
+        //                <name = "release" datatypeName = "DATE" primaryType = "nt:unstructured" uuid = "67b8ee6d-341e-4e7e-bb79-bdec0caa6865" mixinTypes = "ddl:columnDefinition">
+        //                <name = "producerName" datatypeName = "VARCHAR" datatypeLength = "255" primaryType = "nt:unstructured" uuid = "83deb1a7-8ccb-479c-ab38-acc64be99251" mixinTypes = "ddl:columnDefinition">
+        //              <name = "winners" startLineNumber = "3" primaryType = "nt:unstructured" uuid = "c8610a1c-be27-4b16-9b0b-fc631dbfd00b" startColumnNumber = "5" mixinTypes = "ddl:createViewStatement" expression = "CREATE VIEW winners AS SELECT title, release FROM films WHERE producerName IS NOT NULL;" queryExpression = " SELECT title, release FROM films WHERE producerName IS NOT NULL" startCharIndex = "113">
 
-    @Test
-    public void shouldGenerateNodeTypesForCreateTables() throws IOException {
-        URL url = this.getClass().getClassLoader().getResource("ddl/createTables.ddl");
+
+        URL url = this.getClass().getClassLoader().getResource("ddl/create_schema.ddl");
         assertThat(url, is(notNullValue()));
         content = url.openStream();
         assertThat(content, is(notNullValue()));
         sequencer.sequence(content, output, context);
+
+        output.close();
+
+        // File expectedFile = new File("src/test/resources/");
+        // if ( expectedFile.exists() ) {
+        // expectedGraph.importXmlFrom(expectedFile).into("/");    
+        
+        Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+        assertThat(subgraph, is(notNullValue()));
+        String value = subgraph.toString();
+        System.out.println(value);
+        
+        SubgraphNode rootNode = subgraph.getNode(".");
+        assertThat(rootNode.getChildren().size(), is(1));
+        
+        SubgraphNode statementsNode = rootNode.getNode(path("ddl:statements"));
+        assertNotNull(statementsNode);
+        assertThat(statementsNode.getChildren().size(), is(1));
+        
+        assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(statementsNode, "ddl:parserId", "POSTGRES"), is(true));
+
+        SubgraphNode schemaNode = statementsNode.getNode(path("hollywood"));
+        assertNotNull(schemaNode);
+        verifyBaseProperties(schemaNode, "nt:unstructured", "1", "1", "0", 2);
+        assertThat(verifyMixinType(schemaNode, "ddl:createSchemaStatement"), is(true));
+        assertThat(verifyExpression(schemaNode, "CREATE SCHEMA hollywood"), is(true));
+        
+        SubgraphNode filmsNode = schemaNode.getNode(path("films"));
+        assertNotNull(filmsNode);
+        verifyBaseProperties(filmsNode, "nt:unstructured", "2", "5", "28", 3);
+        assertThat(verifyMixinType(filmsNode, "ddl:createTableStatement"), is(true));
+        assertThat(verifyExpression(filmsNode, "CREATE TABLE films (title varchar(255), release date, producerName varchar(255))"), is(true));
+        
+        SubgraphNode winnersNode = schemaNode.getNode(path("winners"));
+        assertNotNull(winnersNode);
+        verifyBaseProperties(winnersNode, "nt:unstructured", "3", "5", "113", 0);
+        assertThat(verifyMixinType(winnersNode, "ddl:createViewStatement"), is(true));
+        assertThat(verifyExpression(winnersNode, "CREATE VIEW winners AS SELECT title, release FROM films WHERE producerName IS NOT NULL;"), is(true));
+        
+        // Check Column Properties
+        SubgraphNode titleNode = filmsNode.getNode(path("title"));
+        assertNotNull(titleNode);
+        assertThat(verifyPrimaryType(titleNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(titleNode, "ddl:datatypeName", "VARCHAR"), is(true));
+        assertThat(verifyProperty(titleNode, "ddl:datatypeLength", "255"), is(true));
+        assertThat(verifyMixinType(titleNode, "ddl:columnDefinition"), is(true));
+        
+        SubgraphNode releaseNode = filmsNode.getNode(path("release"));
+        assertNotNull(releaseNode);
+        assertThat(verifyPrimaryType(releaseNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(releaseNode, "ddl:datatypeName", "DATE"), is(true));
+        assertThat(verifyHasProperty(releaseNode, "ddl:datatypeLength"), is(false));
+        assertThat(verifyMixinType(titleNode, "ddl:columnDefinition"), is(true));
+
+
+
+        // Map<Property> props = output.getProperties(nodePath)
     }
-
+    
     @Test
     public void shouldSequenceCreateTable() throws IOException {
         // CREATE TABLE IDTABLE
@@ -141,91 +271,374 @@
         // IDCONTEXT VARCHAR(20) NOT NULL PRIMARY KEY,
         // NEXTID NUMERIC
         // );
+        
+        //      Subgraph
+        //        <name = "/" uuid = "8325c96e-e81c-4f16-9c08-33b408e4f7cf">
+        //        <name = "statements" primaryType = "nt:unstructured" uuid = "ac307790-7378-44fe-8a06-e4292574e2f1" parserId = "SQL92">
+        //          <name = "IDTABLE" startLineNumber = "1" primaryType = "nt:unstructured" uuid = "cb0e1c03-0815-4b3b-92a0-b95a5980be53" startColumnNumber = "1" mixinTypes = "ddl:createTableStatement" expression = "CREATE TABLE IDTABLE
+        //      (
+        //        IDCONTEXT  VARCHAR(20) NOT NULL PRIMARY KEY,
+        //        NEXTID     NUMERIC
+        //      );" startCharIndex = "0">
+        //            <name = "IDCONTEXT" datatypeName = "VARCHAR" datatypeLength = "20" primaryType = "nt:unstructured" uuid = "ab269004-852a-4731-9886-9ec8dff230b9" nullable = "NOT NULL" mixinTypes = "ddl:columnDefinition">
+        //            <name = "PK_1" primaryType = "nt:unstructured" uuid = "7395e24e-db3d-412d-91fe-d479258b8641" mixinTypes = "ddl:tableConstraint" constraintType = "2">
+        //              <name = "IDCONTEXT" primaryType = "nt:unstructured" uuid = "43f052c7-fbf9-4243-a995-86092c367177" mixinTypes = "ddl:columnReference">
+        //            <name = "NEXTID" datatypeName = "NUMERIC" primaryType = "nt:unstructured" uuid = "91dc78bc-0c43-4f80-9579-4010e31a7ae3" datatypePrecision = "0" mixinTypes = "ddl:columnDefinition" datatypeScale = "0">
+
+        String targetExpression = "CREATE TABLE IDTABLE\n"
++ "(\n"
++ "  IDCONTEXT  VARCHAR(20) NOT NULL PRIMARY KEY,\n"
++ "  NEXTID     NUMERIC\n"
++ ");";
+        
         URL url = this.getClass().getClassLoader().getResource("ddl/create_table.ddl");
         assertThat(url, is(notNullValue()));
         content = url.openStream();
         assertThat(content, is(notNullValue()));
         sequencer.sequence(content, output, context);
+        
+        output.close();
 
-        // Map<Name, Property> props = output.getProperties("xxxxxx");
+        Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+        assertThat(subgraph, is(notNullValue()));
+        String value = subgraph.toString();
+        System.out.println(value);
+        
+        SubgraphNode rootNode = subgraph.getNode(".");
+        assertThat(rootNode.getChildren().size(), is(1));
+        
+        SubgraphNode statementsNode = rootNode.getNode(path("ddl:statements"));
+        assertNotNull(statementsNode);
+        assertThat(statementsNode.getChildren().size(), is(1));
+        assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(statementsNode, "ddl:parserId", "SQL92"), is(true));
+        
+        SubgraphNode tableNode = statementsNode.getNode(path("IDTABLE"));
+        assertNotNull(tableNode);
+        verifyBaseProperties(tableNode, "nt:unstructured", "1", "1", "0", 3);
+        assertThat(verifyMixinType(tableNode, "ddl:createTableStatement"), is(true));
+        assertThat(verifyExpression(tableNode, targetExpression), is(true));
+        
+        // Check Column Properties
+        SubgraphNode idcontextNode = tableNode.getNode(path("IDCONTEXT"));
+        assertNotNull(idcontextNode);
+        assertThat(verifyPrimaryType(idcontextNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(idcontextNode, "ddl:datatypeName", "VARCHAR"), is(true));
+        assertThat(verifyProperty(idcontextNode, "ddl:datatypeLength", "20"), is(true));
+        assertThat(verifyMixinType(idcontextNode, "ddl:columnDefinition"), is(true));
+        
+        SubgraphNode nextidNode = tableNode.getNode(path("NEXTID"));
+        assertNotNull(nextidNode);
+        assertThat(verifyPrimaryType(nextidNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(nextidNode, "ddl:datatypeName", "NUMERIC"), is(true));
+        assertThat(verifyProperty(nextidNode, "ddl:datatypePrecision", "0"), is(true));
+        assertThat(verifyProperty(nextidNode, "ddl:datatypeScale", "0"), is(true));
+        assertThat(verifyHasProperty(nextidNode, "ddl:datatypeLength"), is(false));
+        assertThat(verifyMixinType(nextidNode, "ddl:columnDefinition"), is(true));
+        
+        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(verifyMixinType(pk_1_Node, "ddl:tableConstraint"), is(true));
+        
+        // One column reference
+        assertThat(pk_1_Node.getChildren().size(), is(1));
+        SubgraphNode idcontectRefNode = pk_1_Node.getNode(path("IDCONTEXT"));
+        assertNotNull(idcontectRefNode);
+        assertThat(verifyPrimaryType(idcontectRefNode, "nt:unstructured"), is(true));
+        assertThat(verifyMixinType(idcontectRefNode, "ddl:columnReference"), is(true));
     }
+    
+    @Test
+    public void shouldSequenceStatementsWithDoubleQuotes() throws IOException {
+        //ALTER JAVA CLASS "Agent"
+        //    RESOLVER (("/home/java.101/bin/*" pm)(* public))
+        //    RESOLVE;
+        //    
+        // CREATE SERVER foo FOREIGN DATA WRAPPER "default";
+        //
+        // CREATE RULE "_RETURN" AS
+        //     ON SELECT TO t1
+        //     DO INSTEAD
+        //         SELECT * FROM t2;
+        
+        //        Subgraph 
+        //        <name = "/" uuid = "233d07e5-8431-4844-856b-ac80d0129c01">
+        //          <name = "statements" primaryType = "nt:unstructured" uuid = "dbd23d78-8005-4b7b-aa61-eac98726b8d4" parserId = "POSTGRES">
+        //            <name = "unknownStatement" startLineNumber = "1" primaryType = "nt:unstructured" uuid = "b3fb1e1f-284b-46bd-9a06-86d1b85dd5b3" startColumnNumber = "1" mixinTypes = "ddl:unknownStatement" expression = "ALTER JAVA CLASS "Agent"
+        //           RESOLVER (("/home/java.101/bin/*" pm)(* public))
+        //           RESOLVE;" startCharIndex = "0">
+        //            <name = "CREATE SERVER" startLineNumber = "5" primaryType = "nt:unstructured" uuid = "10217bab-877f-4b45-b169-2f81bb31f620" startColumnNumber = "1" mixinTypes = "postgresddl:createServerStatement" expression = "CREATE SERVER foo FOREIGN DATA WRAPPER "default";" startCharIndex = "93">
+        //            <name = "_RETURN" startLineNumber = "7" primaryType = "nt:unstructured" uuid = "2b655039-f239-4930-8c1b-a3b9a8e7c949" startColumnNumber = "1" mixinTypes = "postgresddl:createRuleStatement" expression = "CREATE RULE "_RETURN" AS
+        //            ON SELECT TO t1
+        //            DO INSTEAD
+        //                SELECT * FROM t2;" startCharIndex = "144">
+        
+        URL url = this.getClass().getClassLoader().getResource("ddl/d_quoted_statements.ddl");
+        assertThat(url, is(notNullValue()));
+        content = url.openStream();
+        assertThat(content, is(notNullValue()));
+        sequencer.sequence(content, output, context);
+        
+        output.close();
 
+        Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+        assertThat(subgraph, is(notNullValue()));
+        String value = subgraph.toString();
+        System.out.println(value);
+        
+        SubgraphNode rootNode = subgraph.getNode(".");
+        assertThat(rootNode.getChildren().size(), is(1));
+        
+        SubgraphNode statementsNode = rootNode.getNode(path("ddl:statements"));
+        assertNotNull(statementsNode);
+        assertThat(statementsNode.getChildren().size(), is(3));
+        assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(statementsNode, "ddl:parserId", "POSTGRES"), is(true));
+        
+        SubgraphNode firstNode = statementsNode.getNode(path("unknownStatement"));
+        assertNotNull(firstNode);
+        verifyBaseProperties(firstNode, "nt:unstructured", "1", "1", "0", 0);
+        assertThat(verifyMixinType(firstNode, "ddl:unknownStatement"), is(true));
+
+        SubgraphNode serverNode = statementsNode.getNode(path("CREATE SERVER"));
+        assertNotNull(serverNode);
+        verifyBaseProperties(serverNode, "nt:unstructured", "5", "1", "93", 0);
+        assertThat(verifyMixinType(serverNode, "postgresddl:createServerStatement"), is(true));
+        
+        SubgraphNode ruleNode = statementsNode.getNode(path("_RETURN"));
+        assertNotNull(ruleNode);
+        verifyBaseProperties(ruleNode, "nt:unstructured", "7", "1", "144", 0);
+        assertThat(verifyMixinType(ruleNode, "postgresddl:createRuleStatement"), is(true));
+        
+    }
+    
     @Test
-    public void shouldSequenceCreateSchema() throws IOException {
-        // CREATE SCHEMA hollywood
-        // CREATE TABLE films (title varchar(255), release date, producerName varchar(255))
-        // CREATE VIEW winners AS
-        // SELECT title, release FROM films WHERE producerName IS NOT NULL;
-        URL url = this.getClass().getClassLoader().getResource("ddl/create_schema.ddl");
+    public void shouldGenerateNodeTypesForCreateTables() throws IOException {
+        URL url = this.getClass().getClassLoader().getResource("ddl/createTables.ddl");
         assertThat(url, is(notNullValue()));
         content = url.openStream();
         assertThat(content, is(notNullValue()));
         sequencer.sequence(content, output, context);
-
+        
         output.close();
 
-        // File expectedFile = new File("src/test/resources/");
-        // if ( expectedFile.exists() ) {
-        // expectedGraph.importXmlFrom(expectedFile).into("/");
+        Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+        assertThat(subgraph, is(notNullValue()));
+        String value = subgraph.toString();
+        System.out.println(value);
+        
+        SubgraphNode rootNode = subgraph.getNode(".");
+        assertThat(rootNode.getChildren().size(), is(1));
+        
+        SubgraphNode statementsNode = rootNode.getNode(path("ddl:statements"));
+        assertNotNull(statementsNode);
+        assertThat(statementsNode.getChildren().size(), is(20));
+        assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(statementsNode, "ddl:parserId", "SQL92"), is(true));
+        
+        // Check one table
+        //CREATE TABLE RT_MDLS
+        //(
+        //   MDL_UID              NUMERIC(20)            NOT NULL,
+        //   MDL_UUID             VARCHAR(64)            NOT NULL,
+        //   MDL_NM               VARCHAR(255)           NOT NULL,
+        //   MDL_VERSION          VARCHAR(50),
+        //   DESCRIPTION          VARCHAR(255),
+        //   MDL_URI              VARCHAR(255),
+        //   MDL_TYPE             NUMERIC(3),
+        //   IS_PHYSICAL          CHAR(1)                NOT NULL,
+        //   MULTI_SOURCED        CHAR(1)                DEFAULT '0',  
+        //   VISIBILITY           NUMERIC(3) 
+        //   
+        //);
+        //<name = "RT_MDLS" startLineNumber = "80" primaryType = "nt:unstructured" uuid = "a11e48d5-0908-467b-ba79-a497df87a576" startColumnNumber = "1" mixinTypes = "ddl:createTableStatement" expression = "CREATE TABLE RT_MDLS...." startCharIndex = "2258">
+        //    <name = "MDL_UID" datatypeName = "NUMERIC" primaryType = "nt:unstructured" uuid = "85b9c2b3-cadc-425c-a736-656be1475780" datatypePrecision = "20" nullable = "NOT NULL" mixinTypes = "ddl:columnDefinition" datatypeScale = "0">
+        //    <name = "MDL_UUID" datatypeName = "VARCHAR" datatypeLength = "64" primaryType = "nt:unstructured" uuid = "88766ab0-32e6-44f6-9244-78d48b2242d4" nullable = "NOT NULL" mixinTypes = "ddl:columnDefinition">
+        //    <name = "MDL_NM" datatypeName = "VARCHAR" datatypeLength = "255" primaryType = "nt:unstructured" uuid = "cb29fa8e-03f0-4e82-8040-5d853aa8a1f9" nullable = "NOT NULL" mixinTypes = "ddl:columnDefinition">
+        //    <name = "MDL_VERSION" datatypeName = "VARCHAR" datatypeLength = "50" primaryType = "nt:unstructured" uuid = "169a4e2f-79a4-47a4-8e23-4fa1ea09c876" mixinTypes = "ddl:columnDefinition">
+        //    <name = "DESCRIPTION" datatypeName = "VARCHAR" datatypeLength = "255" primaryType = "nt:unstructured" uuid = "00682ead-5bb0-4c0d-b243-6edbf56dcb4a" mixinTypes = "ddl:columnDefinition">
+        //    <name = "MDL_URI" datatypeName = "VARCHAR" datatypeLength = "255" primaryType = "nt:unstructured" uuid = "851f94e1-5d43-4a58-be6c-720a6c3bec7f" mixinTypes = "ddl:columnDefinition">
+        //    <name = "MDL_TYPE" datatypeName = "NUMERIC" primaryType = "nt:unstructured" uuid = "a7b74a6f-872d-4e8b-a2da-4ebf6ef38ed4" datatypePrecision = "3" mixinTypes = "ddl:columnDefinition" datatypeScale = "0">
+        //    <name = "IS_PHYSICAL" datatypeName = "CHAR" datatypeLength = "1" primaryType = "nt:unstructured" uuid = "b96aeaaa-4bd8-4154-9daf-50aac2fd9529" nullable = "NOT NULL" mixinTypes = "ddl:columnDefinition">
+        //    <name = "MULTI_SOURCED" datatypeName = "CHAR" defaultValue = "'0'" datatypeLength = "1" defaultOption = "0" primaryType = "nt:unstructured" uuid = "75c48a37-f65c-4854-bca4-8d504cf8b658" mixinTypes = "ddl:columnDefinition">
+        //    <name = "VISIBILITY" datatypeName = "NUMERIC" primaryType = "nt:unstructured" uuid = "345ac63b-a343-408d-9262-6e009ad3e0c2" datatypePrecision = "3" mixinTypes = "ddl:columnDefinition" datatypeScale = "0">
 
-        //assertThat(graph.getChildren().of("/statements"), hasChildren(segment("hollywood")));
+        SubgraphNode tableNode = statementsNode.getNode(path("RT_MDLS"));
+        assertNotNull(tableNode);
+        verifyBaseProperties(tableNode, "nt:unstructured", "80", "1", "2258", 10);
+        assertThat(verifyMixinType(tableNode, "ddl:createTableStatement"), is(true));
 
+        // Check Column Properties
+        SubgraphNode node_1 = tableNode.getNode(path("MDL_UUID"));
+        assertNotNull(node_1);
+        assertThat(verifyPrimaryType(node_1, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(node_1, "ddl:datatypeName", "VARCHAR"), is(true));
+        assertThat(verifyProperty(node_1, "ddl:datatypeLength", "64"), is(true));
+        assertThat(verifyMixinType(node_1, "ddl:columnDefinition"), is(true));
         
+        SubgraphNode node_2 = tableNode.getNode(path("MDL_TYPE"));
+        assertNotNull(node_2);
+        assertThat(verifyPrimaryType(node_2, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(node_2, "ddl:datatypeName", "NUMERIC"), is(true));
+        assertThat(verifyProperty(node_2, "ddl:datatypePrecision", "3"), is(true));
+        assertThat(verifyProperty(node_2, "ddl:datatypeScale", "0"), is(true));
+        assertThat(verifyHasProperty(node_2, "ddl:datatypeLength"), is(false));
+        assertThat(verifyMixinType(node_2, "ddl:columnDefinition"), is(true));
+    }
+    
+    @Test
+    public void shouldSequenceDerbyDdl() throws IOException {
+        URL url = this.getClass().getClassLoader().getResource("ddl/dialect/derby/derby_test_statements.ddl");
+        assertThat(url, is(notNullValue()));
+        content = url.openStream();
+        assertThat(content, is(notNullValue()));
+        sequencer.sequence(content, output, context);
         
+        output.close();
+
         Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
         assertThat(subgraph, is(notNullValue()));
-        //assertThat(subgraph.getNode("/statements"), is(notNullValue()));
-        //assertThat(subgraph.getNode(".").getChildren(), hasChildren(segment("statements")));
-        //Iterator<SubgraphNode> actualIter = actual.iterator();
+        String value = subgraph.toString();
+        System.out.println(value);
         
         SubgraphNode rootNode = subgraph.getNode(".");
         assertThat(rootNode.getChildren().size(), is(1));
         
-        Iterator<SubgraphNode> expected = subgraph.iterator();
-        while ( expected.hasNext() ) {
-            SubgraphNode nextNode = expected.next();
-            System.out.println("\n   NODE = " + nextNode);
-            System.out.println("       PATH = " + nextNode.getLocation().getPath());
-            Map<Name,Property> actualProperties = nextNode.getPropertiesByName();
-            for(Name nextKey: actualProperties.keySet()) {
-                Property nextValue = actualProperties.get(nextKey);
-                System.out.println("             KEY = " + nextKey + "  VALUE = " + nextValue.getFirstValue());
-            }
-        }
-        //SubgraphNode schemaNode = rootNode.getNode(path("ddl:statements"));
-        //assertThat(schemaNode.getChildren().size(), is(2));
+        SubgraphNode statementsNode = rootNode.getNode(path("ddl:statements"));
+        assertNotNull(statementsNode);
+        assertThat(statementsNode.getChildren().size(), is(64));
+        assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(statementsNode, "ddl:parserId", "DERBY"), is(true));
         
+        // CREATE INDEX IXSALE ON SAMP.SALES (SALES);
+        //     <name = "IXSALE" startLineNumber = "87" primaryType = "nt:unstructured" uuid = "85740506-ac6e-46f3-8118-be0c9eb1bc57" startColumnNumber = "1" mixinTypes = "derbyddl:createIndexStatement" tableName = "SAMP.SALES" expression = "CREATE INDEX IXSALE ON SAMP.SALES (SALES);" unique = "false" startCharIndex = "2886">
 
-        // Subgraph expected = expectedGraph.getSubgraphOfDepth(10).at("/");
-        // // compare subgraphs ...
-        // Iterator<SubgraphNode> actualIter = actual.iterator();
-        // Iterator<SubgraphNode> expectedIter = expected.iterator();
-        // while ( actualIter.hasNext() && expectedIter.hasNext() ) {
-        // SubgraphNode actualNode = actualIter.next();
-        // SubgraphNode expectedNode = expectedIter.next();
-        // // Get properties
-        // Map<Name,Property> actualProperties = actualNode.getPropertiesByName();
-        // Map<Name,Property> expectedProperties = expectedNode.getPropertiesByName();
-        // // The property names should be the same ...
-        // Set<Name> actualPropertyNames = actualProperties.keySet();
-        // Set<Name> expectedPropertyNames = expectedProperties.keySet();
-        // assertThat(actualPropertyNames,is(expectedPropertyNames));
-        // // compare the properties ...
-        // for ( Name name : actualPropertyNames ) {
-        // Property actualProp = actualProperties.get(name);
-        // Property expectedProp = expectedProperties.get(name);
-        // // etc.
-        // }
-        // }
-        // assertThat(actualIter.hasNext(), is(false));
-        // assertThat(expectedIter.hasNext(), is(false));
+        SubgraphNode indexNode = statementsNode.getNode(path("IXSALE"));
+        assertNotNull(indexNode);
+        verifyBaseProperties(indexNode, "nt:unstructured", "87", "1", "2886", 0);
+        assertThat(verifyMixinType(indexNode, "derbyddl:createIndexStatement"), is(true));
+        
+        // CREATE SCHEMA FLIGHTS AUTHORIZATION anita;
+        //     <name = "FLIGHTS" startLineNumber = "98" primaryType = "nt:unstructured" uuid = "e1c8227d-c663-4d4b-8506-b1e41aa1f7f6" startColumnNumber = "1" mixinTypes = "ddl:createSchemaStatement" expression = "CREATE SCHEMA FLIGHTS AUTHORIZATION anita;" startCharIndex = "3218">
+        SubgraphNode schemaNode = statementsNode.getNode(path("FLIGHTS"));
+        assertNotNull(schemaNode);
+        verifyBaseProperties(schemaNode, "nt:unstructured", "98", "1", "3218", 0);
+        assertThat(verifyMixinType(schemaNode, "ddl:createSchemaStatement"), is(true));
+        assertThat(verifyExpression(schemaNode, "CREATE SCHEMA FLIGHTS AUTHORIZATION anita;"), is(true));
+        
+        // DROP PROCEDURE some_procedure_name;
+        //     <name = "unknownStatement[3]" startLineNumber = "172" primaryType = "nt:unstructured" uuid = "1f57c0ec-4361-4f64-963d-dcb919c27656" startColumnNumber = "1" mixinTypes = "ddl:unknownStatement" expression = "DROP PROCEDURE some_procedure_name;" startCharIndex = "5438">
+        SubgraphNode unknownNode_1 = statementsNode.getNode(path("some_procedure_name"));
+        assertNotNull(unknownNode_1);
+        verifyBaseProperties(unknownNode_1, "nt:unstructured", "172", "1", "5438", 0);
+        assertThat(verifyMixinType(unknownNode_1, "derbyddl:dropProcedureStatement"), is(true));
+        assertThat(verifyExpression(unknownNode_1, "DROP PROCEDURE some_procedure_name;"), is(true));
+        
+        //ALTER TABLE SAMP.DEPARTMENT
+        //    ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO);
+        
+        //<name = "SAMP.DEPARTMENT" startLineNumber = "16" primaryType = "nt:unstructured" uuid = "b3c54a3c-4779-48a0-a2f3-80e5079bb62c" startColumnNumber = "1" mixinTypes = "ddl:alterTableStatement" expression = "ALTER TABLE SAMP.DEPARTMENT
+        //    ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO);
         //
-        // } else {
-        // // write out the actual graph to the expected file
-        // }
-        //System.out.println(subgraph);
+        //-- add a new foreign key constraint to the
+        //-- Cities table. Each row in Cities is checked
+        //-- to make sure it satisfied the constraints.
+        //-- if any rows don't satisfy the constraint, the
+        //-- constraint is not added" startCharIndex = "478">
+        //      <name = "NEW_UNIQUE" primaryType = "nt:unstructured" uuid = "c678bb9d-a0ac-4f69-b8a0-ec890557bc20" mixinTypes = "ddl:addTableConstraintDefinition" constraintType = "0">
+        //        <name = "DEPTNO" primaryType = "nt:unstructured" uuid = "0f019782-e72d-485a-8f8c-e62954fd6ae6" mixinTypes = "ddl:columnReference">
+        SubgraphNode alterTableNode = statementsNode.getNode(path("SAMP.DEPARTMENT"));
+        assertNotNull(alterTableNode);
+        verifyBaseProperties(alterTableNode, "nt:unstructured", "16", "1", "478", 1);
+        assertThat(verifyMixinType(alterTableNode, "ddl:alterTableStatement"), is(true));
+        
+        SubgraphNode uniqueNode = alterTableNode.getNode(path("NEW_UNIQUE"));
+        assertNotNull(uniqueNode);
+        assertThat(verifyPrimaryType(uniqueNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(uniqueNode, "ddl:constraintType", "0"), is(true));
+        assertThat(verifyMixinType(uniqueNode, "ddl:addTableConstraintDefinition"), is(true));
+        
+        // One column reference
+        assertThat(uniqueNode.getChildren().size(), is(1));
+        SubgraphNode colRefNode = uniqueNode.getNode(path("DEPTNO"));
+        assertNotNull(colRefNode);
+        assertThat(verifyPrimaryType(colRefNode, "nt:unstructured"), is(true));
+        assertThat(verifyMixinType(colRefNode, "ddl:columnReference"), is(true));
+    }
 
-        // Map<Property> props = output.getProperties(nodePath)
+    @Test
+    public void shouldSequenceOracleDdl() throws IOException {
+        URL url = this.getClass().getClassLoader().getResource("ddl/dialect/oracle/oracle_test_statements_2.ddl");
+        assertThat(url, is(notNullValue()));
+        content = url.openStream();
+        assertThat(content, is(notNullValue()));
+        sequencer.sequence(content, output, context);
+        
+        output.close();
+
+        Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+        assertThat(subgraph, is(notNullValue()));
+        String value = subgraph.toString();
+        System.out.println(value);
+        
+        SubgraphNode rootNode = subgraph.getNode(".");
+        assertThat(rootNode.getChildren().size(), is(1));
+        
+        SubgraphNode statementsNode = rootNode.getNode(path("ddl:statements"));
+        assertNotNull(statementsNode);
+        assertThat(statementsNode.getChildren().size(), is(50));
+        assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(statementsNode, "ddl:parserId", "ORACLE"), is(true));
+        
+        // <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);
+        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 
+        //     ADD (duty_pct     NUMBER(2,2)  CHECK (duty_pct < 10.5),
+        //          visa_needed  VARCHAR2(3));" startCharIndex = "89">
+        //        <name = "duty_pct" datatypeName = "NUMBER" primaryType = "nt:unstructured" uuid = "20079cae-5de1-425c-925e-df230410ea69" datatypePrecision = "2" mixinTypes = "ddl:columnDefinition" datatypeScale = "2">
+        //        <name = "CHECK_1" primaryType = "nt:unstructured" name = "CHECK_1" uuid = "210039d7-ebe7-47a8-94be-c3adb70b2885" mixinTypes = "ddl:addTableConstraintDefinition" constraintType = "3" searchCondition = "( duty_pct < 10 . 5 )">
+        //        <name = "visa_needed" datatypeName = "VARCHAR2" datatypeLength = "3" primaryType = "nt:unstructured" uuid = "b7b6bf1d-6a2b-411a-aa63-974d13ba20e8" mixinTypes = "ddl:columnDefinition">
+        SubgraphNode countriesNode = statementsNode.getNode(path("countries"));
+        assertNotNull(countriesNode);
+        verifyBaseProperties(countriesNode, "nt:unstructured", "9", "1", "89", 3);
+        assertThat(verifyMixinType(countriesNode, "ddl:alterTableStatement"), is(true));
+        
+        SubgraphNode duty_pct_node = countriesNode.getNode(path("duty_pct"));
+        assertNotNull(duty_pct_node);
+        assertThat(verifyPrimaryType(duty_pct_node, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(duty_pct_node, "ddl:datatypeName", "NUMBER"), is(true));
+        assertThat(verifyProperty(duty_pct_node, "ddl:datatypePrecision", "2"), is(true));
+        assertThat(verifyProperty(duty_pct_node, "ddl:datatypeScale", "2"), is(true));
+        assertThat(verifyHasProperty(duty_pct_node, "ddl:datatypeLength"), is(false));
+        assertThat(verifyMixinType(duty_pct_node, "ddl:columnDefinition"), is(true));
+        
+        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(verifyMixinType(check_1_node, "ddl:addTableConstraintDefinition"), is(true));
+        assertThat(verifyProperty(check_1_node, "ddl:searchCondition", "( duty_pct < 10 . 5 )"), is(true));
+        
+        SubgraphNode visa_needed_node = countriesNode.getNode(path("visa_needed"));
+        assertNotNull(visa_needed_node);
+        assertThat(verifyPrimaryType(visa_needed_node, "nt:unstructured"), is(true));
+        assertThat(verifyProperty(visa_needed_node, "ddl:datatypeName", "VARCHAR2"), is(true));
+        assertThat(verifyProperty(visa_needed_node, "ddl:datatypeLength", "3"), is(true));
+        assertThat(verifyMixinType(visa_needed_node, "ddl:columnDefinition"), is(true));
+        
+        // <name = "app_user1" startLineNumber = "33" primaryType = "nt:unstructured" uuid = "8c660ae8-2078-4263-a0e7-8f517cefd3a0" startColumnNumber = "1" mixinTypes = "oracleddl:alterUserStatement" expression = "ALTER USER app_user1 
+        //    GRANT CONNECT THROUGH sh
+        //    WITH ROLE warehouse_user;" startCharIndex = "624">
+        
+        SubgraphNode app_user1Node = statementsNode.getNode(path("app_user1"));
+        assertNotNull(app_user1Node);
+        verifyBaseProperties(app_user1Node, "nt:unstructured", "33", "1", "624", 0);
+        assertThat(verifyMixinType(app_user1Node, "oracleddl:alterUserStatement"), 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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -131,6 +131,12 @@
         tokens = getTokens(content);
         result = parser.parseName(tokens);
         assertEquals(targetName, result);
+        
+        content = "\"_RETURN\"";
+        targetName = "_RETURN";
+        tokens = getTokens(content);
+        result = parser.parseName(tokens);
+        assertEquals(targetName, result);
     }
 
     @Test
@@ -674,7 +680,7 @@
         String content = getFileContent(DDL_FILE_PATH + "createTables.ddl");
         boolean success = parser.parse(content, rootNode);
 
-        assertThat(rootNode.getChildCount(), is(22));
+        assertThat(rootNode.getChildCount(), is(20));
         assertThat(success, is(true));
         List<AstNode> theNodes = parser.nodeFactory().getChildrenForType(rootNode, TYPE_CREATE_TABLE_STATEMENT);
 
@@ -810,5 +816,22 @@
         assertThat(schemaNodes.get(0).getName().getString(), is("GLOBALFORCEMGMT"));
 
     }
+    
+    @Test
+    public void shouldParseStatementsWithDoubleQuotes() {
+        printTest("shouldParseUnterminatedOracleFile()");
+        String content = "ALTER JAVA CLASS \"Agent\""
+    + "RESOLVER ((\"/home/java.101/bin/*\" pm)(* public)) RESOLVE;"
+    + "CREATE SERVER foo FOREIGN DATA WRAPPER \"default\";"
+    + "CREATE RULE \"_RETURN\" AS ON SELECT TO t1 DO INSTEAD SELECT * FROM t2;";
 
+        // parser.setTestMode(true);
+
+        boolean success = parser.parse(content, rootNode);
+
+        assertThat(success, is(true));
+
+        assertThat(rootNode.getChildCount(), is(3));
+
+    }
 }

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	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java	2009-12-03 22:16:50 UTC (rev 1394)
@@ -69,6 +69,15 @@
     	assertThat(true, is(success));
     }
     
+    // DROP PROCEDURE some_procedure_name;
+    @Test
+    public void shouldParseDropProcedure() {
+        printTest("shouldParseDropProcedure()");
+        String content = "DROP PROCEDURE some_procedure_name";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+    }
 	
 	
 	@Test

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/createTables.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/createTables.ddl	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/createTables.ddl	2009-12-03 22:16:50 UTC (rev 1394)
@@ -24,8 +24,8 @@
   ENGINE_IND_CODE   CHAR(3)
 );
 
-SET DEFINE OFF;
-SET DEFINE ON;
+-- SET DEFINE OFF;
+-- SET DEFINE ON;
 
 
 ALTER TABLE ACFT_TYPE

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl	2009-12-03 22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl	2009-12-03 22:16:50 UTC (rev 1394)
@@ -1,4 +1,3 @@
 CREATE SCHEMA hollywood
     CREATE TABLE films (title varchar(255), release date, producerName varchar(255))
-    CREATE VIEW winners AS
-        SELECT title, release FROM films WHERE producerName IS NOT NULL;
\ No newline at end of file
+    CREATE VIEW winners AS SELECT title, release FROM films WHERE producerName IS NOT NULL;
\ No newline at end of file

Added: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl	2009-12-03 22:16:50 UTC (rev 1394)
@@ -0,0 +1,10 @@
+ALTER JAVA CLASS "Agent"
+   RESOLVER (("/home/java.101/bin/*" pm)(* public))
+   RESOLVE;
+   
+CREATE SERVER foo FOREIGN DATA WRAPPER "default";
+
+CREATE RULE "_RETURN" AS
+    ON SELECT TO t1
+    DO INSTEAD
+        SELECT * FROM t2;
\ No newline at end of file



More information about the dna-commits mailing list