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