Author: blafond
Date: 2010-01-05 08:31:47 -0500 (Tue, 05 Jan 2010)
New Revision: 1527
Added:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
Removed:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl
Log:
DNA-49 Adding additional parsing and tests. Includes parsing for Grant statements in
Standard, Derby & Postgres
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -40,6 +40,9 @@
public static final String GRANT = "GRANT";
public static final String INDEX = "INDEX";
public static final String INSERT = "INSERT";
+ public static final String UPDATE = "UPDATE";
+ public static final String DELETE = "DELETE";
+ public static final String SELECT = "SELECT";
public static final String KEY = "KEY";
public static final String OFF = "OFF";
public static final String ON = "ON";
@@ -125,7 +128,9 @@
// | <translation definition>
// | <assertion definition>
public final static Name[] VALID_SCHEMA_CHILD_TYPES =
{StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT,
- StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
StandardDdlLexicon.TYPE_GRANT_STATEMENT,
+ StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT,
+ StandardDdlLexicon.TYPE_GRANT_ON_DOMAIN_STATEMENT,
StandardDdlLexicon.TYPE_GRANT_ON_TRANSLATION_STATEMENT,
+ StandardDdlLexicon.TYPE_GRANT_ON_COLLATION_STATEMENT,
StandardDdlLexicon.TYPE_GRANT_ON_CHARACTER_SET_STATEMENT,
StandardDdlLexicon.TYPE_CREATE_DOMAIN_STATEMENT,
StandardDdlLexicon.TYPE_CREATE_CHARACTER_SET_STATEMENT,
StandardDdlLexicon.TYPE_CREATE_COLLATION_STATEMENT,
StandardDdlLexicon.TYPE_CREATE_TRANSLATION_STATEMENT,
StandardDdlLexicon.TYPE_CREATE_ASSERTION_STATEMENT};
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -42,11 +42,11 @@
public static I18n unusedTokensParsingColumnDefinition;
public static I18n alterTableOptionNotFound;
public static I18n unusedTokensParsingCreateIndex;
+ public static I18n missingReturnTypeForFunction;
// public static I18n
// public static I18n
// public static I18n
// public static I18n
-// public static I18n
static {
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -95,6 +95,11 @@
public static final Name TYPE_ALTER_TABLE_STATEMENT = new BasicName(Namespace.URI,
"alterTableStatement");
public static final Name TYPE_ALTER_DOMAIN_STATEMENT = new BasicName(Namespace.URI,
"alterDomainStatement");
public static final Name TYPE_GRANT_STATEMENT = new BasicName(Namespace.URI,
"grantStatement");
+ public static final Name TYPE_GRANT_ON_TABLE_STATEMENT = new BasicName(Namespace.URI,
"grantOnTableStatement");
+ public static final Name TYPE_GRANT_ON_DOMAIN_STATEMENT = new
BasicName(Namespace.URI, "grantOnDomainStatement");
+ public static final Name TYPE_GRANT_ON_COLLATION_STATEMENT = new
BasicName(Namespace.URI, "grantOnCollationStatement");
+ public static final Name TYPE_GRANT_ON_CHARACTER_SET_STATEMENT = new
BasicName(Namespace.URI, "grantOnCharacterSetStatement");
+ public static final Name TYPE_GRANT_ON_TRANSLATION_STATEMENT = new
BasicName(Namespace.URI, "grantOnTranslationStatement");
public static final Name TYPE_SET_STATEMENT = new BasicName(Namespace.URI,
"setStatement");
public static final Name TYPE_INSERT_STATEMENT = new BasicName(Namespace.URI,
"insertStatement");
@@ -122,18 +127,21 @@
public static final Name TYPE_FK_COLUMN_REFERENCE = new BasicName(Namespace.URI,
"fkColumnReference");
public static final Name TYPE_CLAUSE = new BasicName(Namespace.URI,
"clause");
- public static final Name DDL_EXPRESSION = new BasicName(Namespace.URI,
"expression");
- public static final Name DDL_ORIGINAL_EXPRESSION = new BasicName(Namespace.URI,
"originalExpression");
- public static final Name DDL_START_LINE_NUMBER = new BasicName(Namespace.URI,
"startLineNumber");
- public static final Name DDL_START_COLUMN_NUMBER = new BasicName(Namespace.URI,
"startColumnNumber");
- public static final Name DDL_START_CHAR_INDEX = new BasicName(Namespace.URI,
"startCharIndex");
+ public static final Name DDL_EXPRESSION = new
BasicName(Namespace.URI, "expression");
+ public static final Name DDL_ORIGINAL_EXPRESSION = new
BasicName(Namespace.URI, "originalExpression");
+ public static final Name DDL_START_LINE_NUMBER = new
BasicName(Namespace.URI, "startLineNumber");
+ public static final Name DDL_START_COLUMN_NUMBER = new
BasicName(Namespace.URI, "startColumnNumber");
+ public static final Name DDL_START_CHAR_INDEX = new
BasicName(Namespace.URI, "startCharIndex");
// public static final Name DDL_LENGTH = new BasicName(Namespace.URI,
"length");
/*
* node property names
*/
public static final Name NAME = new BasicName(Namespace.URI, "name");
+ public static final Name OPTION = new BasicName(Namespace.URI, "option");
+ public static final Name TYPE = new BasicName(Namespace.URI, "type");
public static final Name NEW_NAME = new BasicName(Namespace.URI,
"newName");
+ public static final Name SQL = new BasicName(Namespace.URI, "sql");
public static final Name TEMPORARY = new BasicName(Namespace.URI,
"temporary");
public static final Name ON_COMMIT_VALUE = new BasicName(Namespace.URI,
"onCommitValue");
public static final Name COLUMN_DEFINITIONS = new BasicName(Namespace.URI,
"datatypeScale");
@@ -153,6 +161,10 @@
public static final Name DROP_BEHAVIOR = new BasicName(Namespace.URI,
"dropBehavior");
public static final Name PROPERTY_VALUE = new BasicName(Namespace.URI,
"propValue");
public static final Name PROBLEM_LEVEL = new BasicName(Namespace.URI,
"problemLevel");
+ public static final Name GRANT_PRIVILEGE = new BasicName(Namespace.URI,
"grantPrivilege");
+ public static final Name ALL_PRIVILEGES = new BasicName(Namespace.URI,
"allPrivileges");
+ public static final Name WITH_GRANT_OPTION = new BasicName(Namespace.URI,
"withGrantOption");
+ public static final Name GRANTEE = new BasicName(Namespace.URI,
"grantee");
public static final Name CREATE_VIEW_QUERY_EXPRESSION = new BasicName(Namespace.URI,
"queryExpression");
public static final Name CREATE_VIEW_OPTION_CLAUSE = new BasicName(Namespace.URI,
"createViewOption");
@@ -163,15 +175,7 @@
* node child types
*/
- // public static final Name COLUMN_REFERENCE_TYPE = new BasicName(Namespace.URI,
"columnReference");
- // public static final Name TABLE_CONSTRAINT_TYPE = new BasicName(Namespace.URI,
"tableConstraint");
- // public static final Name STATEMENT_OPTION_TYPE = new BasicName(Namespace.URI,
"statementOption");
public static final Name DROP_OPTION_TYPE = new BasicName(Namespace.URI,
"dropOption");
- // public static final Name DROP_COLUMN_DEFINITION_TYPE = new
BasicName(Namespace.URI, "dropColumnDefinition");
- // public static final Name DROP_TABLE_CONSTRAINT_TYPE = new BasicName(Namespace.URI,
"dropTableConstraint");
- // public static final Name ALTER_COLUMN_DEFINITION_TYPE = new
BasicName(Namespace.URI, "alterColumnDefinition");
- // public static final Name TABLE_REFERENCE_TYPE = new BasicName(Namespace.URI,
"tableReference ");
- // public static final Name FK_COLUMN_REFERENCE_TYPE = new BasicName(Namespace.URI,
"fkColumnReference ");
public static final Name COLUMN_ATTRIBUTE_TYPE = new BasicName(Namespace.URI,
"columnAttribute");
public static final Name CONSTRAINT_ATTRIBUTE_TYPE = new BasicName(Namespace.URI,
"constraintAttribute ");
}
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -29,60 +29,7 @@
*/
package org.jboss.dna.sequencer.ddl;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CHECK_SEARCH_CONDITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.COLLATION_NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CONSTRAINT_ATTRIBUTE_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CONSTRAINT_TYPE;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CREATE_VIEW_QUERY_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_CHAR_INDEX;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_COLUMN_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_LINE_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_PRECISION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.MESSAGE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NULLABLE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROBLEM_LEVEL;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROPERTY_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TEMPORARY;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_ASSERTION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_CHARACTER_SET_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_COLLATION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_DOMAIN_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_SCHEMA_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TRANSLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_ASSERTION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_CHARACTER_SET_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLLATION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_SCHEMA_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TRANSLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_FK_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_GRANT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_INSERT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_SET_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_TABLE_CONSTRAINT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_TABLE_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.VALUE;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
@@ -828,24 +775,140 @@
AstNode parentNode ) throws ParsingException
{
assert tokens != null;
assert parentNode != null;
-
- // Original implementation does NOT parse Insert statement, but just returns a
generic TypedStatement
+ assert tokens.matches(GRANT);
+
markStartOfStatement(tokens);
- tokens.consume(GRANT);
- String name = GRANT;
+ // Syntax for tables
+ //
+ // GRANT <privileges> ON <object name>
+ // TO <grantee> [ { <comma> <grantee> }...
]
+ // [ WITH GRANT OPTION ]
+ //
+ // <object name> ::=
+ // [ TABLE ] <table name>
+ // | DOMAIN <domain name>
+ // | COLLATION <collation name>
+ // | CHARACTER SET <character set name>
+ // | TRANSLATION <translation name>
+ //
+ // Syntax for roles
+ //
+ // GRANT roleName [ {, roleName }* ] TO grantees
+
+ // privilege-types
+ //
+ // ALL PRIVILEGES | privilege-list
+ //
+ AstNode grantNode = null;
+ boolean allPrivileges = false;
- tokens.consume(); // First Privilege token
+ List<AstNode> privileges = new ArrayList<AstNode>();
- AstNode node = nodeFactory().node(name, parentNode, TYPE_GRANT_STATEMENT);
+ tokens.consume("GRANT");
- parseUntilTerminator(tokens);
+ if( tokens.canConsume("ALL", "PRIVILEGES")) {
+ allPrivileges = true;
+ } else {
+ parseGrantPrivileges(tokens, privileges);
+ }
+ tokens.consume("ON");
- markEndOfStatement(tokens, node);
+ if( tokens.canConsume("DOMAIN") ) {
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_DOMAIN_STATEMENT);
+ } else if( tokens.canConsume("COLLATION")) {
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_COLLATION_STATEMENT);
+ } else if( tokens.canConsume("CHARACTER", "SET")) {
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_CHARACTER_SET_STATEMENT);
+ } else if( tokens.canConsume("TRANSLATION")) {
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_TRANSLATION_STATEMENT);
+ } else {
+ tokens.canConsume(TABLE); // OPTIONAL
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_TABLE_STATEMENT);
+ }
- return node;
+
+ // Attach privileges to grant node
+ for( AstNode node : privileges ) {
+ node.setParent(grantNode);
+ }
+ if( allPrivileges ) {
+ grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+ }
+
+
+ tokens.consume("TO");
+
+ do {
+ String grantee = parseName(tokens);
+ nodeFactory().node(grantee, grantNode, GRANTEE);
+ } while( tokens.canConsume(COMMA));
+
+ if( tokens.canConsume("WITH", "GRANT", "OPTION"))
{
+ grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+ }
+
+ markEndOfStatement(tokens, grantNode);
+
+ return grantNode;
}
+ protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode>
privileges) throws ParsingException {
+ // privilege-types
+ //
+ // ALL PRIVILEGES | privilege-list
+ //
+ // privilege-list
+ //
+ // table-privilege {, table-privilege }*
+ //
+ // table-privilege
+ // SELECT
+ // | DELETE
+ // | INSERT [ <left paren> <privilege column list> <right
paren> ]
+ // | UPDATE [ <left paren> <privilege column list> <right
paren> ]
+ // | REFERENCES [ <left paren> <privilege column list>
<right paren> ]
+ // | USAGE
+
+ do {
+ AstNode node = null;
+
+ if( tokens.canConsume(DELETE)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, DELETE);
+ } else if( tokens.canConsume(INSERT)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, INSERT);
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ } else if( tokens.canConsume("REFERENCES")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "REFERENCES");
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ } else if( tokens.canConsume(SELECT)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, SELECT);
+ } else if( tokens.canConsume("USAGE")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "USAGE");
+ } else if( tokens.canConsume(UPDATE)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, UPDATE);
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ }
+ if( node == null) {
+ break;
+ }
+ nodeFactory().setType(node, GRANT_PRIVILEGE);
+ privileges.add(node);
+
+ } while( tokens.canConsume(COMMA));
+
+ }
/**
* Catch-all method to parse unknown (not registered or handled by sub-classes)
statements.
*
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -96,7 +96,7 @@
public final static Name[] VALID_SCHEMA_CHILD_STMTS = {
StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT,
StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
- StandardDdlLexicon.TYPE_GRANT_STATEMENT
+ StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT
};
}
interface DerbyDataTypes {
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -41,50 +41,59 @@
*
* SQL-92 Spec
*
- * CREATE SCHEMA
- * CREATE DOMAIN
- * CREATE [ { GLOBAL | LOCAL } TEMPORARY ] TABLE
- * CREATE VIEW
- * CREATE ASSERTION
- * CREATE CHARACTER SET
- * CREATE COLLATION
- * CREATE TRANSLATION
- * ===> CREATE FUNCTION
- * ===> CREATE INDEX
- * ===> CREATE PROCEDURE
- * ===> CREATE ROLE
- * ===> CREATE SYNONYM
- * ===> CREATE TRIGGER
- *
- * ALTER TABLE
- *
- * ===> GRANT
- * ===> LOCK TABLE
- * ===> RENAME TABLE
- * ===> RENAME INDEX
- * ===> SET
- * ===> DECLARE GLOBAL TEMPORARY TABLE
+ * CREATE SCHEMA
+ * CREATE DOMAIN
+ * CREATE [ { GLOBAL | LOCAL } TEMPORARY ] TABLE
+ * CREATE VIEW
+ * CREATE ASSERTION
+ * CREATE CHARACTER SET
+ * CREATE COLLATION
+ * CREATE TRANSLATION
+ * ===> CREATE FUNCTION
+ * ===> CREATE INDEX
+ * ===> CREATE PROCEDURE
+ * ===> CREATE ROLE
+ * ===> CREATE SYNONYM
+ * ===> CREATE TRIGGER
+ *
+ * ALTER TABLE
+ *
+ * ===> GRANT
+ * ===> LOCK TABLE
+ * ===> RENAME TABLE
+ * ===> RENAME INDEX
+ * ===> SET
+ * ===> DECLARE GLOBAL TEMPORARY TABLE
*/
- public static final Name TYPE_CREATE_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "createFunctionStatement");
- public static final Name TYPE_CREATE_INDEX_STATEMENT = new
BasicName(Namespace.URI, "createIndexStatement");
- public static final Name TYPE_CREATE_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "createProcedureStatement");
- public static final Name TYPE_CREATE_ROLE_STATEMENT = new BasicName(Namespace.URI,
"createRoleStatement");
- public static final Name TYPE_CREATE_SYNONYM_STATEMENT = new
BasicName(Namespace.URI, "createSynonymStatement");
- public static final Name TYPE_CREATE_TRIGGER_STATEMENT = new
BasicName(Namespace.URI, "createTriggerStatement");
- public static final Name TYPE_LOCK_TABLE_STATEMENT = new BasicName(Namespace.URI,
"lockTableStatement");
- public static final Name TYPE_RENAME_TABLE_STATEMENT = new
BasicName(Namespace.URI, "renameTableStatement");
- public static final Name TYPE_RENAME_INDEX_STATEMENT = new
BasicName(Namespace.URI, "renameIndexStatement");
+ public static final Name TYPE_CREATE_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "createFunctionStatement");
+ public static final Name TYPE_CREATE_INDEX_STATEMENT = new
BasicName(Namespace.URI, "createIndexStatement");
+ public static final Name TYPE_CREATE_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "createProcedureStatement");
+ public static final Name TYPE_CREATE_ROLE_STATEMENT = new
BasicName(Namespace.URI, "createRoleStatement");
+ public static final Name TYPE_CREATE_SYNONYM_STATEMENT = new
BasicName(Namespace.URI, "createSynonymStatement");
+ public static final Name TYPE_CREATE_TRIGGER_STATEMENT = new
BasicName(Namespace.URI, "createTriggerStatement");
+ public static final Name TYPE_LOCK_TABLE_STATEMENT = new
BasicName(Namespace.URI, "lockTableStatement");
+ public static final Name TYPE_RENAME_TABLE_STATEMENT = new
BasicName(Namespace.URI, "renameTableStatement");
+ public static final Name TYPE_RENAME_INDEX_STATEMENT = new
BasicName(Namespace.URI, "renameIndexStatement");
public static final Name TYPE_DECLARE_GLOBAL_TEMPORARY_TABLE_STATEMENT = new
BasicName(Namespace.URI, "declareGlobalTemporaryTableStatement");
- public static final Name TYPE_DROP_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "dropFunctionStatement");
- public static final Name TYPE_DROP_INDEX_STATEMENT = new BasicName(Namespace.URI,
"dropIndexStatement");
- public static final Name TYPE_DROP_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "dropProcedureStatement");
- public static final Name TYPE_DROP_ROLE_STATEMENT = new BasicName(Namespace.URI,
"dropRoleStatement");
- public static final Name TYPE_DROP_SYNONYM_STATEMENT = new
BasicName(Namespace.URI, "dropSynonymStatement");
- public static final Name TYPE_DROP_TRIGGER_STATEMENT = new
BasicName(Namespace.URI, "dropTriggerStatement");
+ public static final Name TYPE_DROP_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "dropFunctionStatement");
+ public static final Name TYPE_DROP_INDEX_STATEMENT = new
BasicName(Namespace.URI, "dropIndexStatement");
+ public static final Name TYPE_DROP_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "dropProcedureStatement");
+ public static final Name TYPE_DROP_ROLE_STATEMENT = new
BasicName(Namespace.URI, "dropRoleStatement");
+ public static final Name TYPE_DROP_SYNONYM_STATEMENT = new
BasicName(Namespace.URI, "dropSynonymStatement");
+ public static final Name TYPE_DROP_TRIGGER_STATEMENT = new
BasicName(Namespace.URI, "dropTriggerStatement");
- public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI,
"unique");
- public static final Name TABLE_NAME = new BasicName(Namespace.URI,
"tableName");
- public static final Name GENERATED_COLUMN_SPEC_CLAUSE = new BasicName(Namespace.URI,
"generatedColumnSpecClause");
+ public static final Name TYPE_FUNCTION_PARAMETER = new
BasicName(Namespace.URI, "functionParameter");
+ public static final Name TYPE_INDEX_COLUMN_REFERENCE = new
BasicName(Namespace.URI, "indexColumnReference");
+ public static final Name TYPE_GRANT_ON_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "grantOnFunctionStatement");
+ public static final Name TYPE_GRANT_ON_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "grantOnProcedureStatement");
+ public static final Name TYPE_GRANT_ROLES_STATEMENT = new
BasicName(Namespace.URI, "grantRolesStatement");
+
+ public static final Name UNIQUE_INDEX = new
BasicName(Namespace.URI, "unique");
+ public static final Name ORDER = new
BasicName(Namespace.URI, "order");
+ public static final Name TABLE_NAME = new
BasicName(Namespace.URI, "tableName");
+ public static final Name ROLE_NAME = new
BasicName(Namespace.URI, "roleName");
+ public static final Name GENERATED_COLUMN_SPEC_CLAUSE = new
BasicName(Namespace.URI, "generatedColumnSpecClause");
+ public static final Name IS_TABLE_TYPE = new
BasicName(Namespace.URI, "isTableType");
}
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -1,26 +1,7 @@
package org.jboss.dna.sequencer.ddl.dialect.derby;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.COLUMN_ATTRIBUTE_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROPERTY_VALUE;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TABLE_NAME;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_FUNCTION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_INDEX_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_PROCEDURE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_ROLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_SYNONYM_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_FUNCTION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_INDEX_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_PROCEDURE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_ROLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_SYNONYM_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.UNIQUE_INDEX;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.*;
import java.util.ArrayList;
import java.util.List;
import org.jboss.dna.common.text.ParsingException;
@@ -38,7 +19,9 @@
/**
* Derby-specific DDL Parser. Includes custom data types as well as custom DDL
statements.
*/
-public class DerbyDdlParser extends StandardDdlParser implements DerbyDdlConstants {
+public class DerbyDdlParser extends StandardDdlParser
+ implements DerbyDdlConstants,
+ DerbyDdlConstants.DerbyStatementStartPhrases {
private final String parserId = "DERBY";
static List<String[]> derbyDataTypeStrings = new ArrayList<String[]>();
@@ -69,11 +52,11 @@
public void registerWords( DdlTokenStream tokens ) {
tokens.registerKeyWords(CUSTOM_KEYWORDS);
- tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.ALTER_PHRASES);
- tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.CREATE_PHRASES);
- tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.DROP_PHRASES);
- tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.SET_PHRASES);
- tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.MISC_PHRASES);
+ tokens.registerStatementStartPhrase(ALTER_PHRASES);
+ tokens.registerStatementStartPhrase(CREATE_PHRASES);
+ tokens.registerStatementStartPhrase(DROP_PHRASES);
+ tokens.registerStatementStartPhrase(SET_PHRASES);
+ tokens.registerStatementStartPhrase(MISC_PHRASES);
super.registerWords(tokens);
}
@@ -94,7 +77,7 @@
*/
@Override
protected Name[] getValidSchemaChildTypes() {
- return DerbyStatementStartPhrases.VALID_SCHEMA_CHILD_STMTS;
+ return VALID_SCHEMA_CHILD_STMTS;
}
/**
@@ -111,34 +94,14 @@
AstNode result = super.parseCustomStatement(tokens, parentNode);
if (result == null) {
- if (tokens.matches(DerbyStatementStartPhrases.STMT_LOCK_TABLE)) {
- markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_LOCK_TABLE);
- result = parseIgnorableStatement(tokens,
-
getStatementTypeName(DerbyStatementStartPhrases.STMT_LOCK_TABLE),
- parentNode);
- markEndOfStatement(tokens, result);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_RENAME_TABLE)) {
- markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_RENAME_TABLE);
- result = parseIgnorableStatement(tokens,
-
getStatementTypeName(DerbyStatementStartPhrases.STMT_RENAME_TABLE),
- parentNode);
- markEndOfStatement(tokens, result);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_RENAME_INDEX)) {
- markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_RENAME_INDEX);
- result = parseIgnorableStatement(tokens,
-
getStatementTypeName(DerbyStatementStartPhrases.STMT_RENAME_INDEX),
- parentNode);
- markEndOfStatement(tokens, result);
- } else if
(tokens.matches(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE)) {
- markStartOfStatement(tokens);
-
tokens.consume(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE);
- result = parseIgnorableStatement(tokens,
-
getStatementTypeName(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE),
- parentNode);
- markEndOfStatement(tokens, result);
+ if (tokens.matches(STMT_LOCK_TABLE)) {
+ result = parseLockTable(tokens, parentNode);
+ } else if (tokens.matches(STMT_RENAME_TABLE)) {
+ result = parseRenameTable(tokens, parentNode);
+ } else if (tokens.matches(STMT_RENAME_INDEX)) {
+ result = parseRenameIndex(tokens, parentNode);
+ } else if (tokens.matches(STMT_DECLARE_GLOBAL_TEMP_TABLE)) {
+ result = parseDeclareGlobalTempTable(tokens, parentNode);
}
}
return result;
@@ -156,31 +119,22 @@
assert tokens != null;
assert parentNode != null;
- if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_INDEX)
- || tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_UNIQUE_INDEX)) {
+ if (tokens.matches(STMT_CREATE_INDEX)
+ || tokens.matches(STMT_CREATE_UNIQUE_INDEX)) {
return parseCreateIndex(tokens, parentNode);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_FUNCTION)) {
+ } else if (tokens.matches(STMT_CREATE_FUNCTION)) {
+ return parseCreateFunction(tokens, parentNode);
+ } else if (tokens.matches(STMT_CREATE_PROCEDURE)) {
return parseStatement(tokens,
- DerbyStatementStartPhrases.STMT_CREATE_FUNCTION,
+ STMT_CREATE_PROCEDURE,
parentNode,
- TYPE_CREATE_FUNCTION_STATEMENT);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_PROCEDURE)) {
- return parseStatement(tokens,
- DerbyStatementStartPhrases.STMT_CREATE_PROCEDURE,
- parentNode,
TYPE_CREATE_PROCEDURE_STATEMENT);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_ROLE)) {
- return parseStatement(tokens, DerbyStatementStartPhrases.STMT_CREATE_ROLE,
parentNode, TYPE_CREATE_ROLE_STATEMENT);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_SYNONYM)) {
- return parseStatement(tokens,
- DerbyStatementStartPhrases.STMT_CREATE_SYNONYM,
- parentNode,
- TYPE_CREATE_SYNONYM_STATEMENT);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_TRIGGER)) {
- return parseStatement(tokens,
- DerbyStatementStartPhrases.STMT_CREATE_TRIGGER,
- parentNode,
- TYPE_CREATE_TRIGGER_STATEMENT);
+ } else if (tokens.matches(STMT_CREATE_ROLE)) {
+ return parseStatement(tokens, STMT_CREATE_ROLE, parentNode,
TYPE_CREATE_ROLE_STATEMENT);
+ } else if (tokens.matches(STMT_CREATE_SYNONYM)) {
+ return parseCreateSynonym(tokens, parentNode);
+ } else if (tokens.matches(STMT_CREATE_TRIGGER)) {
+ return parseCreateTrigger(tokens, parentNode);
}
return super.parseCreateStatement(tokens, parentNode);
@@ -217,14 +171,190 @@
indexNode.setProperty(UNIQUE_INDEX, isUnique);
indexNode.setProperty(TABLE_NAME, tableName);
+ parseIndexTableColumns(tokens, indexNode);
+
parseUntilTerminator(tokens);
markEndOfStatement(tokens, indexNode);
return indexNode;
}
+
+ private void parseIndexTableColumns(DdlTokenStream tokens, AstNode indexNode) throws
ParsingException {
+ assert tokens != null;
+ assert indexNode != null;
+ // Assume we start with open parenthesis '(', then we parse comma
separated list of column names followed by optional
+ // ASC or DESC
+
+
+ tokens.consume(L_PAREN); // EXPECTED
+
+ while (!tokens.canConsume(R_PAREN)) {
+ String colName = parseName(tokens);
+ AstNode colRefNode = nodeFactory().node(colName, indexNode,
TYPE_INDEX_COLUMN_REFERENCE);
+ if( tokens.canConsume("ASC")) {
+ colRefNode.setProperty(ORDER, "ASC");
+ } else if( tokens.canConsume("DESC")) {
+ colRefNode.setProperty(ORDER, "DESC");
+ }
+ tokens.canConsume(COMMA);
+ }
+ }
+
/**
+ * Parses DDL CREATE FUNCTION statement
+ *
+ * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may
not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed CREATE FUNCTION statement node
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateFunction( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+ // CREATE FUNCTION function-name ( [ FunctionParameter [, FunctionParameter] ] *
)
+ // RETURNS ReturnDataType [ FunctionElement ] *
+
+ //FunctionElement
+ // {
+ // | LANGUAGE { JAVA }
+ // | {DETERMINISTIC | NOT DETERMINISTIC}
+ // | EXTERNAL NAME string
+ // | PARAMETER STYLE {JAVA | DERBY_JDBC_RESULT_SET}
+ // | { NO SQL | CONTAINS SQL | READS SQL DATA }
+ // | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
+ // }
+ tokens.consume(CREATE, "FUNCTION"); // CREATE
+
+ String functionName = parseName(tokens);
+
+ AstNode functionNode = nodeFactory().node(functionName, parentNode,
TYPE_CREATE_FUNCTION_STATEMENT);
+
+ parseFunctionParameters(tokens, functionNode);
+
+ tokens.consume("RETURNS");
+
+ if( tokens.canConsume("TABLE")) {
+ AstNode tableNode = nodeFactory().node("TABLE", functionNode,
TYPE_CREATE_TABLE_STATEMENT);
+ parseColumnsAndConstraints(tokens, tableNode);
+ tableNode.setProperty(IS_TABLE_TYPE, true);
+ } else {
+ // Assume DataType
+ DataType datatype = getDatatypeParser().parse(tokens);
+ if( datatype != null) {
+ getDatatypeParser().setPropertiesOnNode(functionNode, datatype);
+ } else {
+ String msg =
DdlSequencerI18n.missingReturnTypeForFunction.text(functionName);
+ DdlParserProblem problem = new DdlParserProblem(Problems.WARNING,
getCurrentMarkedPosition(), msg);
+ addProblem(problem, functionNode);
+ }
+ }
+
+ while( !isTerminator(tokens)) {
+ if( tokens.matches("LANGUAGE")) {
+ AstNode optionNode = nodeFactory().node("language",
functionNode, TYPE_STATEMENT_OPTION);
+ if( tokens.canConsume("LANGUAGE", "JAVA")) {
+ optionNode.setProperty(VALUE, "LANGUAGE JAVA");
+ } else {
+ tokens.consume("LANGUAGE");
+ optionNode.setProperty(VALUE, "LANGUAGE");
+ }
+ } else if( tokens.canConsume("DETERMINISTIC")) {
+ AstNode optionNode = nodeFactory().node("deterministic",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "DETERMINISTIC");
+ } else if( tokens.canConsume("NOT", "DETERMINISTIC")) {
+ AstNode optionNode = nodeFactory().node("deterministic",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "NOT DETERMINISTIC");
+ } else if( tokens.canConsume("EXTERNAL", "NAME")) {
+ String extName = parseName(tokens);
+ AstNode optionNode = nodeFactory().node("externalName",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "EXTERNAL NAME" + SPACE +
extName);
+ } else if( tokens.canConsume("PARAMETER", "STYLE")) {
+ AstNode optionNode = nodeFactory().node("parameterStyle",
functionNode, TYPE_STATEMENT_OPTION);
+ if( tokens.canConsume("JAVA")) {
+ optionNode.setProperty(VALUE, "PARAMETER STYLE" + SPACE +
"JAVA");
+ } else {
+ tokens.consume("DERBY_JDBC_RESULT_SET");
+ optionNode.setProperty(VALUE, "PARAMETER STYLE" + SPACE +
"DERBY_JDBC_RESULT_SET");
+ }
+ } else if( tokens.canConsume("NO", "SQL")) {
+ AstNode optionNode = nodeFactory().node("sqlStatus",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "NO SQL");
+ } else if( tokens.canConsume("CONTAINS", "SQL")) {
+ AstNode optionNode = nodeFactory().node("sqlStatus",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "CONTAINS SQL");
+ } else if( tokens.canConsume("READS", "SQL",
"DATA")) {
+ AstNode optionNode = nodeFactory().node("sqlStatus",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "READS SQL DATA");
+ } else if( tokens.canConsume("RETURNS", "NULL",
"ON", "NULL", "INPUT")) {
+ AstNode optionNode = nodeFactory().node("nullInput",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "RETURNS NULL ON NULL INPUT");
+ } else if( tokens.canConsume("CALLED", "ON",
"NULL", "INPUT")) {
+ AstNode optionNode = nodeFactory().node("nullInput",
functionNode, TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "CALLED ON NULL INPUT");
+ }
+ }
+
+ markEndOfStatement(tokens, functionNode);
+
+ return functionNode;
+ }
+
+ private void parseFunctionParameters( DdlTokenStream tokens, AstNode functionNode)
throws ParsingException {
+ assert tokens != null;
+ assert functionNode != null;
+
+ // Assume we start with open parenthesis '(', then we parse comma
separated list of function parameters
+ // which have the form: [ parameter-Name ] DataType
+ // So, try getting datatype, if datatype == NULL, then parseName() & parse
datatype, then repeat as long as next token is ","
+
+ tokens.consume(L_PAREN); // EXPECTED
+
+ while (!tokens.canConsume(R_PAREN)) {
+ DataType datatype = getDatatypeParser().parse(tokens);
+ if( datatype == null ) {
+ String paramName = parseName(tokens);
+ datatype = getDatatypeParser().parse(tokens);
+ AstNode paramNode = nodeFactory().node(paramName, functionNode,
TYPE_FUNCTION_PARAMETER);
+ getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+ } else {
+ AstNode paramNode = nodeFactory().node("functionParameter",
functionNode, TYPE_FUNCTION_PARAMETER);
+ getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+ }
+ tokens.canConsume(COMMA);
+ }
+ }
+
+ /**
+ * Parses DDL CREATE FUNCTION statement
+ *
+ * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may
not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed CREATE FUNCTION statement node
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateProcedure( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ tokens.consume(CREATE, "PROCEDURE"); // CREATE
+
+ String functionName = parseName(tokens);
+
+ AstNode functionNode = nodeFactory().node(functionName, parentNode,
TYPE_CREATE_FUNCTION_STATEMENT);
+
+ markEndOfStatement(tokens, functionNode);
+
+ return functionNode;
+ }
+ /**
* {@inheritDoc}
*
* @see
org.jboss.dna.sequencer.ddl.StandardDdlParser#parseDropStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream,
@@ -240,53 +370,34 @@
String name = null;
- if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_FUNCTION)) {
+ if (tokens.matches(STMT_DROP_FUNCTION)) {
markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_DROP_FUNCTION);
+ tokens.consume(STMT_DROP_FUNCTION);
name = parseName(tokens);
dropNode = nodeFactory().node(name, parentNode,
TYPE_DROP_FUNCTION_STATEMENT);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_INDEX)) {
+ } else if (tokens.matches(STMT_DROP_INDEX)) {
markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_DROP_INDEX);
+ tokens.consume(STMT_DROP_INDEX);
name = parseName(tokens);
dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_INDEX_STATEMENT);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_PROCEDURE)) {
+ } else if (tokens.matches(STMT_DROP_PROCEDURE)) {
markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_DROP_PROCEDURE);
+ tokens.consume(STMT_DROP_PROCEDURE);
name = parseName(tokens);
dropNode = nodeFactory().node(name, parentNode,
TYPE_DROP_PROCEDURE_STATEMENT);
-
- // CREATE PROCEDURE procedure-Name ( [ ProcedureParameter [,
ProcedureParameter] ] * ) [ ProcedureElement ] *
- // ProcedureParameter:
- // [ { IN | OUT | INOUT } ] [ parameter-Name ] DataType
- // ProcedureElement:
- //
- // {
- // | [ DYNAMIC ] RESULT SETS INTEGER
- // | LANGUAGE { JAVA }
- // | DeterministicCharacteristic
- // | EXTERNAL NAME string
- // | PARAMETER STYLE JAVA
- // | { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA }
- // }
-
- // TODO: BARRY
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_ROLE)) {
+ } else if (tokens.matches(STMT_DROP_ROLE)) {
markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_DROP_ROLE);
+ tokens.consume(STMT_DROP_ROLE);
name = parseName(tokens);
dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_ROLE_STATEMENT);
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_SYNONYM)) {
+ } else if (tokens.matches(STMT_DROP_SYNONYM)) {
markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_DROP_SYNONYM);
+ tokens.consume(STMT_DROP_SYNONYM);
name = parseName(tokens);
dropNode = nodeFactory().node(name, parentNode,
TYPE_DROP_SYNONYM_STATEMENT);
- // CREATE SYNONYM synonym-Name FOR { view-Name | table-Name }
-
- // TODO: BARRY
- } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_TRIGGER)) {
+ } else if (tokens.matches(STMT_DROP_TRIGGER)) {
markStartOfStatement(tokens);
- tokens.consume(DerbyStatementStartPhrases.STMT_DROP_TRIGGER);
+ tokens.consume(STMT_DROP_TRIGGER);
name = parseName(tokens);
dropNode = nodeFactory().node(name, parentNode,
TYPE_DROP_TRIGGER_STATEMENT);
}
@@ -317,73 +428,152 @@
AstNode parentNode ) throws ParsingException
{
assert tokens != null;
assert parentNode != null;
+ assert tokens.matches(GRANT);
+
+ markStartOfStatement(tokens);
- return super.parseGrantStatement(tokens, parentNode);
- // Statement stmt = null;
- //
- // if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "TO")) {
- // stmt = new TypedStatement();
- // consume(tokens, stmt, false, GRANT);
- // String privilege = consume(tokens, stmt, true);
- // tokens.consume("TO");
- // String toValue = consume(tokens, stmt, true);
+ // Syntax for tables
//
- // String value = parseUntilTerminator(tokens);
- // stmt.appendSource(true, value);
- // stmt.setType("GRANT" + SPACE + privilege + SPACE + "TO" +
SPACE + toValue);
- // consumeTerminator(tokens);
- // return stmt;
- // } else if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "ON")) {
- // stmt = new TypedStatement();
- // consume(tokens, stmt, false, GRANT);
- // String privilege = consume(tokens, stmt, true);
- // tokens.consume("ON");
- //
- // tokens.canConsume("TABLE");
- //
- // String onValue = tokens.consume();
- //
- // String value = parseUntilTerminator(tokens);
- // stmt.appendSource(true, value);
- // stmt.setType("GRANT" + SPACE + privilege + SPACE + "ON" +
SPACE + onValue);
- // consumeTerminator(tokens);
- // return stmt;
- // } else if( tokens.matches(GRANT, "ALL", "PRIVILEGES",
"ON")) {
- // stmt = new TypedStatement();
- // consume(tokens, stmt, false, GRANT);
- // String privilege = consume(tokens, stmt, true,"ALL",
"PRIVILEGES", "ON");
- // tokens.canConsume("TABLE");
- //
- // String onValue = tokens.consume();
- //
- // String value = parseUntilTerminator(tokens);
- // stmt.appendSource(true, value);
- // stmt.setType("GRANT" + SPACE + privilege + SPACE + "ON" +
SPACE + onValue);
- // consumeTerminator(tokens);
- // return stmt;
- // } else if( tokens.matches(GRANT, "SELECT") ||
- // tokens.matches(GRANT, "UPDATE") ||
- // tokens.matches(GRANT, "DELETE") ||
- // tokens.matches(GRANT, "INSERT") ||
- // tokens.matches(GRANT, "TRIGGER") ||
- // tokens.matches(GRANT, "REFERENCES")) {
- // stmt = new TypedStatement();
- // consume(tokens, stmt, false, GRANT);
- //
- // String nextTok = consume(tokens, stmt, true) + SPACE + consume(tokens, stmt,
true) + SPACE + consume(tokens, stmt,
- // true);
+ // GRANT privilege-type ON [TABLE] { table-Name | view-Name } TO
grantees
//
- // String value = parseUntilTerminator(tokens);
- // stmt.appendSource(true, value);
- // stmt.setType("GRANT" + SPACE + nextTok);
- // consumeTerminator(tokens);
- // return stmt;
- // }
- //
- //
- // return null;
+ // Syntax for routines
+ //
+ // GRANT EXECUTE ON { FUNCTION | PROCEDURE } {function-name |
procedure-name} TO grantees
+ //
+ // Syntax for roles
+ //
+ // GRANT roleName [ {, roleName }* ] TO grantees
+
+ // privilege-types
+ //
+ // ALL PRIVILEGES | privilege-list
+ //
+ AstNode grantNode = null;
+ boolean allPrivileges = false;
+
+ List<AstNode> privileges = new ArrayList<AstNode>();
+
+ tokens.consume("GRANT");
+ if(tokens.canConsume("EXECUTE", "ON")) {
+ AstNode node = nodeFactory().node("privilege");
+ nodeFactory().setType(node, GRANT_PRIVILEGE);
+ node.setProperty(TYPE, "EXECUTE");
+ privileges = new ArrayList<AstNode>();
+ privileges.add(node);
+ if( tokens.canConsume("FUNCTION") ) {
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_FUNCTION_STATEMENT);
+ } else {
+ tokens.consume("PROCEDURE");
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_PROCEDURE_STATEMENT);
+ }
+ } else {
+
+
+ if( tokens.canConsume("ALL", "PRIVILEGES")) {
+ allPrivileges = true;
+ } else {
+ parseGrantPrivileges(tokens, privileges);
+
+ if( privileges.isEmpty() ) {
+ // ASSUME: GRANT roleName [ {, roleName }* ] TO grantees
+ grantNode = nodeFactory().node("grantRoles", parentNode,
TYPE_GRANT_ROLES_STATEMENT);
+ do {
+ String roleName = parseName(tokens);
+ nodeFactory().node(roleName, grantNode, ROLE_NAME);
+ } while( tokens.canConsume(COMMA));
+ }
+ }
+ if( grantNode == null ) {
+ tokens.consume("ON");
+ tokens.canConsume(TABLE); // OPTIONAL
+ String name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_TABLE_STATEMENT);
+ // Attach privileges to grant node
+ for( AstNode node : privileges ) {
+ node.setParent(grantNode);
+ }
+ if( allPrivileges ) {
+ grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+ }
+ }
+
+ }
+
+ tokens.consume("TO");
+
+ do {
+ String grantee = parseName(tokens);
+ nodeFactory().node(grantee, grantNode, GRANTEE);
+ } while( tokens.canConsume(COMMA));
+
+ markEndOfStatement(tokens, grantNode);
+
+ return grantNode;
}
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see
org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantPrivileges(org.jboss.dna.sequencer.ddl.DdlTokenStream,
java.util.List)
+ */
+ @Override
+ protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode>
privileges) throws ParsingException {
+ // privilege-types
+ //
+ // ALL PRIVILEGES | privilege-list
+ //
+ // privilege-list
+ //
+ // table-privilege {, table-privilege }*
+ //
+ // table-privilege
+ // DELETE |
+ // INSERT |
+ // REFERENCES [column list] |
+ // SELECT [column list] |
+ // TRIGGER |
+ // UPDATE [column list]
+ // column list
+ // ( column-identifier {, column-identifier}* )
+
+ do {
+ AstNode node = null;
+
+ if( tokens.canConsume(DELETE)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, DELETE);
+ } else if( tokens.canConsume(INSERT)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, INSERT);
+ } else if( tokens.canConsume("REFERENCES")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "REFERENCES");
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ } else if( tokens.canConsume(SELECT)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, SELECT);
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ } else if( tokens.canConsume("TRIGGER")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "TRIGGER");
+ } else if( tokens.canConsume(UPDATE)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, UPDATE);
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ }
+ if( node == null) {
+ break;
+ }
+ nodeFactory().setType(node, GRANT_PRIVILEGE);
+ privileges.add(node);
+
+ } while( tokens.canConsume(COMMA));
+ }
+
/**
* {@inheritDoc}
*
@@ -668,7 +858,324 @@
return false;
}
+
+ private AstNode parseDeclareGlobalTempTable( DdlTokenStream tokens,
+ AstNode parentNode ) throws
ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+ markStartOfStatement(tokens);
+
+ // DECLARE GLOBAL TEMPORARY TABLE table-Name
+ // { column-definition [ , column-definition ] * }
+ // [ ON COMMIT {DELETE | PRESERVE} ROWS ]
+ // NOT LOGGED [ON ROLLBACK DELETE ROWS]
+
+ tokens.consume(STMT_DECLARE_GLOBAL_TEMP_TABLE);
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode,
TYPE_DECLARE_GLOBAL_TEMPORARY_TABLE_STATEMENT);
+
+ parseColumnsAndConstraints(tokens, node);
+
+ if( tokens.canConsume("ON", "COMMIT")) {
+ AstNode optionNode = nodeFactory().node("onCommit", node,
TYPE_STATEMENT_OPTION);
+ if( tokens.canConsume("DELETE", "ROWS")) {
+ optionNode.setProperty(VALUE, "ON COMMIT DELETE ROWS");
+ } else {
+ tokens.consume("PRESERVE", "ROWS");
+ optionNode.setProperty(VALUE, "ON COMMIT PRESERVE ROWS");
+ }
+ }
+ tokens.consume("NOT", "LOGGED");
+
+ if( tokens.canConsume("ON", "ROLLBACK", "DELETE",
"ROWS")) {
+ AstNode optionNode = nodeFactory().node("onRollback", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "ON ROLLBACK DELETE ROWS");
+ }
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ private AstNode parseLockTable( DdlTokenStream tokens,
+ AstNode parentNode ) throws
ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ // LOCK TABLE table-Name IN { SHARE | EXCLUSIVE } MODE;
+
+ tokens.consume(STMT_LOCK_TABLE);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode, TYPE_LOCK_TABLE_STATEMENT);
+
+ tokens.consume("IN");
+
+ if( tokens.canConsume("SHARE")) {
+ AstNode propNode = nodeFactory().node("lockMode", node,
TYPE_STATEMENT_OPTION);
+ propNode.setProperty(VALUE, "SHARE");
+ } else {
+ tokens.consume("EXCLUSIVE");
+ AstNode propNode = nodeFactory().node("lockMode", node,
TYPE_STATEMENT_OPTION);
+ propNode.setProperty(VALUE, "EXCLUSIVE");
+ }
+ tokens.consume("MODE");
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ private AstNode parseRenameTable( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
+
+ tokens.consume(STMT_RENAME_TABLE);
+
+ String oldName = parseName(tokens);
+
+ AstNode node = nodeFactory().node(oldName, parentNode,
TYPE_RENAME_TABLE_STATEMENT);
+
+ tokens.consume("TO");
+
+ String newName = parseName(tokens);
+
+ node.setProperty(NEW_NAME, newName);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ private AstNode parseRenameIndex( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
+
+ tokens.consume(STMT_RENAME_INDEX);
+
+ String oldName = parseName(tokens);
+
+ AstNode node = nodeFactory().node(oldName, parentNode,
TYPE_RENAME_INDEX_STATEMENT);
+
+ tokens.consume("TO");
+
+ String newName = parseName(tokens);
+
+ node.setProperty(NEW_NAME, newName);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ private AstNode parseCreateSynonym( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+ //CREATE SYNONYM synonym-Name FOR { view-Name | table-Name }
+
+ tokens.consume(STMT_CREATE_SYNONYM);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode,
TYPE_CREATE_SYNONYM_STATEMENT);
+
+ tokens.consume("FOR");
+
+ String tableOrViewName = parseName(tokens);
+
+ node.setProperty(TABLE_NAME, tableOrViewName);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ private AstNode parseCreateTrigger( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+ // CREATE TRIGGER TriggerName
+ // { AFTER | NO CASCADE BEFORE }
+ // { INSERT | DELETE | UPDATE [ OF column-Name [, column-Name]* ] }
+ // ON table-Name
+ // [ ReferencingClause ]
+ // [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ]
+ // Triggered-SQL-statement
+
+ // ReferencingClause
+ // REFERENCING
+ // {
+ // { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW ] [
AS ] correlation-Name ] |
+ // { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW TABLE }
[AS] Identifier ] |
+ // { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE }
[AS] Identifier ]
+ // }
+
+
+ // EXAMPLE:
+ // CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
+ // FOR EACH ROW MODE DB2SQL
+ // values app.notifyEmail('Jerry', 'Table x is about to be
updated');
+
+ tokens.consume(STMT_CREATE_TRIGGER);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode,
TYPE_CREATE_TRIGGER_STATEMENT);
+
+ String type = null;
+
+ if( tokens.canConsume("AFTER") ) {
+ AstNode optionNode = nodeFactory().node("beforeOrAfter", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "AFTER");
+ } else {
+ tokens.consume("NO", "CASCADE", "BEFORE");
+ AstNode optionNode = nodeFactory().node("beforeOrAfter", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "NO CASCADE BEFORE");
+ }
+
+ if( tokens.canConsume(INSERT)) {
+ AstNode optionNode = nodeFactory().node("eventType", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, INSERT);
+ type = INSERT;
+ } else if( tokens.canConsume(DELETE) ) {
+ AstNode optionNode = nodeFactory().node("eventType", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, DELETE);
+ type = DELETE;
+ } else {
+ tokens.consume(UPDATE);
+ AstNode optionNode = nodeFactory().node("eventType", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, UPDATE);
+ type = UPDATE;
+ }
+
+ if( tokens.canConsume("OF") ) {
+ // Parse comma separated column names
+ String colName = parseName(tokens);
+ nodeFactory().node(colName, node, TYPE_COLUMN_REFERENCE);
+
+ while( tokens.canConsume(COMMA)) {
+ colName = parseName(tokens);
+ nodeFactory().node(colName, node, TYPE_COLUMN_REFERENCE);
+ }
+ }
+ tokens.consume("ON");
+
+ String tableName = parseName(tokens);
+
+ node.setProperty(TABLE_NAME, tableName);
+
+ if( tokens.canConsume("REFERENCING") ) {
+ // ReferencingClause
+ // REFERENCING
+ // {
+ // { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW
] [ AS ] correlation-Name ] |
+ // { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW
TABLE } [AS] Identifier ] |
+ // { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE |
NEW_TABLE } [AS] Identifier ]
+ // }
+
+ StringBuffer sb = new StringBuffer();
+ if( tokens.matchesAnyOf("OLD", "NEW") ) {
+ if( tokens.canConsume("OLD")) {
+ sb.append("OLD");
+ } else {
+ tokens.consume("NEW");
+ sb.append("NEW");
+ }
+ if( tokens.canConsume("ROW") ) {
+ sb.append(SPACE).append("ROW");
+ }
+ if( tokens.canConsume("AS") ) {
+ sb.append(SPACE).append("AS");
+ }
+ if( tokens.matchesAnyOf("OLD", "NEW")) {
+ if( tokens.canConsume("OLD")) {
+ sb.append(SPACE).append("OLD");
+ } else {
+ tokens.consume("NEW");
+ sb.append(SPACE).append("NEW");
+ }
+
+ if( tokens.canConsume("ROW") ) {
+ sb.append(SPACE).append("ROW");
+ }
+ if( tokens.canConsume("AS") ) {
+ sb.append(SPACE).append("AS");
+ }
+ if( ! tokens.matchesAnyOf("FOR", "MODE", type))
{
+ String corrName = parseName(tokens);
+ sb.append(SPACE).append(corrName);
+ }
+ } else {
+ String corrName = parseName(tokens);
+ sb.append(SPACE).append(corrName);
+
+ if( tokens.matchesAnyOf("OLD", "NEW") ) {
+ if( tokens.canConsume("OLD")) {
+ sb.append(SPACE).append("OLD");
+ } else {
+ tokens.consume("NEW");
+ sb.append(SPACE).append("NEW");
+ }
+
+ if( tokens.canConsume("ROW") ) {
+ sb.append(SPACE).append("ROW");
+ }
+ if( tokens.canConsume("AS") ) {
+ sb.append(SPACE).append("AS");
+ }
+ if( ! tokens.matchesAnyOf("FOR", "MODE",
type)) {
+ corrName = parseName(tokens);
+ sb.append(SPACE).append(corrName);
+ }
+ }
+ }
+ }
+ }
+ //[ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ]
+ if( tokens.canConsume("FOR", "EACH")) {
+ if( tokens.canConsume("ROW")) {
+ AstNode optionNode = nodeFactory().node("forEach", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "FOR EACH ROW");
+ } else {
+ tokens.consume("STATEMENT");
+ AstNode optionNode = nodeFactory().node("forEach", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "FOR EACH STATEMENT");
+ }
+ }
+ if( tokens.canConsume("MODE")) {
+ tokens.consume("DB2SQL");
+ AstNode optionNode = nodeFactory().node("mode", node,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "MODE DB2SQL");
+ }
+
+ String sql = parseUntilTerminatorIgnoreEmbeddedStatements(tokens);
+ node.setProperty(SQL, sql);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
/**
* {@inheritDoc}
*
@@ -796,23 +1303,28 @@
dataType.setKMGLength(isKMGLength);
dataType.setKMGValue(kmgValue);
} else if (tokens.matches(DerbyDataTypes.DTYPE_BIGINT)) {
+ dataType = new DataType();
typeName = consume(tokens, dataType, true);
- dataType = new DataType(typeName);
+ dataType.setName(typeName);
} else if (tokens.matches(DerbyDataTypes.DTYPE_LONG_VARCHAR_FBD)) {
+ dataType = new DataType();
typeName = consume(tokens, dataType, true) + SPACE + consume(tokens,
dataType, true) + SPACE
+ consume(tokens, dataType, true) + SPACE + consume(tokens,
dataType, true) + SPACE
+ consume(tokens, dataType, true);
- dataType = new DataType(typeName);
+ dataType.setName(typeName);
} else if (tokens.matches(DerbyDataTypes.DTYPE_LONG_VARCHAR)) {
+ dataType = new DataType();
typeName = consume(tokens, dataType, true) + SPACE + consume(tokens,
dataType, true);
typeName = consume(tokens, dataType, true);
- dataType = new DataType(typeName);
+ dataType.setName(typeName);
} else if (tokens.matches(DerbyDataTypes.DTYPE_DOUBLE)) {
+ dataType = new DataType();
typeName = consume(tokens, dataType, true);
- dataType = new DataType(typeName);
+ dataType.setName(typeName);
} else if (tokens.matches(DerbyDataTypes.DTYPE_XML)) {
+ dataType = new DataType();
typeName = consume(tokens, dataType, true);
- dataType = new DataType(typeName);
+ dataType.setName(typeName);
}
if (dataType == null) {
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -422,7 +422,27 @@
CheckArg.isNotNull(tokens, "tokens");
CheckArg.isNotNull(parentNode, "parentNode");
- // return super.parseGrantStatement(tokens, parentNode);
+ // GRANT { grant_system_privileges | grant_object_privileges } ;
+ //
+ // ** grant_system_privileges **
+ //
+ // { system_privilege | role | ALL PRIVILEGES } [, { system_privilege
| role | ALL PRIVILEGES } ]...
+ // TO grantee_clause [ WITH ADMIN OPTION ]
+ //
+ // ** grant_object_privileges **
+ //
+ // { object_privilege | ALL [ PRIVILEGES ] } [ (column [, column ]...)
] [, { object_privilege | ALL [ PRIVILEGES ] } [ (column [, column ]...) ] ]...
+ // on_object_clause
+ // TO grantee_clause [ WITH HIERARCHY OPTION ] [ WITH GRANT OPTION
]
+
+ // ** on_object_clause **
+ //
+ // { [ schema. ] object | { DIRECTORY directory_name | JAVA { SOURCE |
RESOURCE } [ schema. ] object } }
+ //
+ // ** grantee_clause **
+ //
+ // { user [ IDENTIFIED BY password ] | role | PUBLIC } [, { user [
IDENTIFIED BY password ] | role | PUBLIC } ]...
+
AstNode node = null;
// Original implementation does NOT parse Insert statement, but just returns a
generic TypedStatement
@@ -444,8 +464,8 @@
markEndOfStatement(tokens, node);
- return node;
-
+ return node;
+
// if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "TO")) {
// markStartOfStatement(tokens);
// tokens.consume(GRANT);
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -243,10 +243,12 @@
public final static Name[] VALID_SCHEMA_CHILD_STMTS = {
StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT,
StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
- StandardDdlLexicon.TYPE_GRANT_STATEMENT,
+ StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT,
PostgresDdlLexicon.TYPE_CREATE_INDEX_STATEMENT,
PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT,
- PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT
+ PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT,
+ PostgresDdlLexicon.TYPE_GRANT_ON_SEQUENCE_STATEMENT,
+ PostgresDdlLexicon.TYPE_GRANT_ON_SCHEMA_STATEMENT
};
public final static Name[] COMPLEX_STMT_TYPES = {
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -133,9 +133,23 @@
public static final Name TYPE_UNLISTEN_STATEMENT = new BasicName(Namespace.URI,
"unlistenStatement");
public static final Name TYPE_VACUUM_STATEMENT = new BasicName(Namespace.URI,
"vacuumStatement");
- public static final Name TYPE_RENAME_COLUMN = new BasicName(Namespace.URI,
"renameColumn");
+ public static final Name TYPE_GRANT_ON_SEQUENCE_STATEMENT = new
BasicName(Namespace.URI, "grantOnSequenceStatement");
+ public static final Name TYPE_GRANT_ON_DATABASE_STATEMENT = new
BasicName(Namespace.URI, "grantOnDatabaseStatement");
+ public static final Name TYPE_GRANT_ON_FOREIGN_DATA_WRAPPER_STATEMENT = new
BasicName(Namespace.URI, "grantOnForeignDataWrapperStatement");
+ public static final Name TYPE_GRANT_ON_FOREIGN_SERVER_STATEMENT = new
BasicName(Namespace.URI, "grantOnForeignServerStatement");
+ public static final Name TYPE_GRANT_ON_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "grantOnFunctionStatement");
+ public static final Name TYPE_GRANT_ON_LANGUAGE_STATEMENT = new
BasicName(Namespace.URI, "grantOnLanguageStatement");
+ public static final Name TYPE_GRANT_ON_SCHEMA_STATEMENT = new
BasicName(Namespace.URI, "grantOnSchemaStatement");
+ public static final Name TYPE_GRANT_ON_TABLESPACE_STATEMENT = new
BasicName(Namespace.URI, "grantOnTablespaceStatement");
+ public static final Name TYPE_GRANT_ON_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "grantOnProcedureStatement");
+ public static final Name TYPE_GRANT_ROLES_STATEMENT = new
BasicName(Namespace.URI, "grantRolesStatement");
+ public static final Name TYPE_RENAME_COLUMN = new BasicName(Namespace.URI,
"renamedColumn");
+
public static final Name SCHEMA_NAME = new BasicName(Namespace.URI,
"schemaName");
+ public static final Name FUNCTION_PARAMETER = new
BasicName(Namespace.URI, "functionParameter");
+ public static final Name FUNCTION_PARAMETER_MODE = new
BasicName(Namespace.URI, "mode");
+ public static final Name ROLE = new
BasicName(Namespace.URI, "role");
// PROPERTY NAMES
public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI,
"targetObjectType");
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -1,118 +1,11 @@
package org.jboss.dna.sequencer.ddl.dialect.postgres;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_ORIGINAL_EXPRESSION;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_CHAR_INDEX;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_COLUMN_NUMBER;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_LINE_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_PRECISION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NEW_NAME;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_SCHEMA_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_UNKNOWN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.VALUE;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.SCHEMA_NAME;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ABORT_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_AGGREGATE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_CONVERSION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_DATABASE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FUNCTION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_GROUP_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_INDEX_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_LANGUAGE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_OPERATOR_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_ROLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SCHEMA_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SEQUENCE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SERVER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLESPACE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLE_STATEMENT_POSTGRES;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TEXT_SEARCH_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TRIGGER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TYPE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_USER_MAPPING_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_USER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_VIEW_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ANALYZE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CLUSTER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COMMENT_ON_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COPY_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_AGGREGATE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CAST_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CONSTRAINT_TRIGGER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CONVERSION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_DATABASE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_FUNCTION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_GROUP_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_INDEX_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_LANGUAGE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_OPERATOR_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_ROLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_RULE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SERVER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TABLESPACE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TEXT_SEARCH_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TYPE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_USER_MAPPING_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_USER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DEALLOCATE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DECLARE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_AGGREGATE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CAST_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CONSTRAINT_TRIGGER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CONVERSION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_DATABASE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_FUNCTION_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_GROUP_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_INDEX_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_LANGUAGE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_OPERATOR_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_OWNED_BY_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_ROLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_RULE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_SEQUENCE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_SERVER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TABLESPACE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TEXT_SEARCH_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TRIGGER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TYPE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_USER_MAPPING_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_USER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_EXPLAIN_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_FETCH_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LISTEN_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LOAD_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LOCK_TABLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_MOVE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_NOTIFY_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_PREPARE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_REASSIGN_OWNED_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_REINDEX_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RELEASE_SAVEPOINT_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RENAME_COLUMN;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ROLLBACK_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_SELECT_INTO_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_SHOW_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_TRUNCATE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_UNLISTEN_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_VACUUM_STATEMENT;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.*;
import java.util.ArrayList;
import java.util.List;
import org.jboss.dna.common.text.ParsingException;
@@ -1138,17 +1031,360 @@
return newNode;
}
-
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see
org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream,
org.jboss.dna.sequencer.ddl.node.AstNode)
+ */
@Override
protected AstNode parseGrantStatement( DdlTokenStream tokens,
AstNode parentNode ) throws ParsingException
{
assert tokens != null;
assert parentNode != null;
+ assert tokens.matches(GRANT);
+
+ markStartOfStatement(tokens);
- return super.parseGrantStatement(tokens, parentNode);
+ // NOTE: The first wack at this does not take into account the apparent potential
repeating name elements after each type
+ // declaration. Example:
+ // GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES |
TRIGGER }
+ // [,...] | ALL [ PRIVILEGES ] }
+ // ON [ TABLE ] tablename [, ...]
+ // TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+ //
+ // the "ON [ TABLE ] tablename [, ...]" seems to indicate that you can
grant privileges on multiple tables at once, which is
+ // different thatn the SQL 92 standard. So this pass ONLY allows one and an
parsing error will probably occur if multiple.
+ //
+ // Syntax for tables
+ //
+ // GRANT <privileges> ON <object name>
+ // TO <grantee> [ { <comma> <grantee> }...
]
+ // [ WITH GRANT OPTION ]
+ //
+ // <object name> ::=
+ // [ TABLE ] <table name>
+ // | SEQUENCE <sequence name>
+ // | DATABASE <db name>
+ // | FOREIGN DATA WRAPPER <fdw name>
+ // | FOREIGN SERVER <server name>
+ // | FUNCTION <function name>
+ // | LANGUAGE <language name>
+ // | SCHEMA <schema name>
+ // | TABLESPACE <tablespace name>
+
+ //
+ // Syntax for roles
+ //
+ // GRANT roleName [ {, roleName }* ] TO grantees
+
+ // privilege-types
+ //
+ // ALL PRIVILEGES | privilege-list
+ //
+ List<AstNode> grantNodes = new ArrayList<AstNode>();
+ boolean allPrivileges = false;
+
+ List<AstNode> privileges = new ArrayList<AstNode>();
+
+ tokens.consume("GRANT");
+
+ if( tokens.canConsume("ALL", "PRIVILEGES")) {
+ allPrivileges = true;
+ } else {
+ parseGrantPrivileges(tokens, privileges);
+ }
+
+ if( allPrivileges || !privileges.isEmpty() ) {
+
+ tokens.consume("ON");
+
+ if( tokens.canConsume("SCHEMA")) {
+ grantNodes = parseMultipleGrantTargets(tokens, parentNode,
TYPE_GRANT_ON_SCHEMA_STATEMENT);
+ } else if( tokens.canConsume("SEQUENCE") ) {
+ grantNodes = parseMultipleGrantTargets(tokens, parentNode,
TYPE_GRANT_ON_SEQUENCE_STATEMENT);
+ } else if( tokens.canConsume("TABLESPACE") ) {
+ grantNodes = parseMultipleGrantTargets(tokens, parentNode,
TYPE_GRANT_ON_TABLESPACE_STATEMENT);
+ } else if( tokens.canConsume("DATABASE")) {
+ grantNodes = parseMultipleGrantTargets(tokens, parentNode,
TYPE_GRANT_ON_DATABASE_STATEMENT);
+ } else if( tokens.canConsume("FUNCTION")) {
+ grantNodes = parseFunctionAndParameters(tokens, parentNode);
+ } else if( tokens.canConsume("LANGUAGE")) {
+ grantNodes = parseMultipleGrantTargets(tokens, parentNode,
TYPE_GRANT_ON_LANGUAGE_STATEMENT);
+ } else if( tokens.canConsume("FOREIGN", "DATA",
"WRAPPER")) {
+ grantNodes = parseMultipleGrantTargets(tokens, parentNode,
TYPE_GRANT_ON_FOREIGN_DATA_WRAPPER_STATEMENT);
+ } else if( tokens.canConsume("FOREIGN", "SERVER")) {
+ grantNodes = parseMultipleGrantTargets(tokens, parentNode,
TYPE_GRANT_ON_FOREIGN_SERVER_STATEMENT);
+ } else {
+ tokens.canConsume(TABLE); // OPTIONAL
+ String name = parseName(tokens);
+ AstNode grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_TABLE_STATEMENT);
+ grantNodes.add(grantNode);
+ while( tokens.canConsume(COMMA) ) {
+ // Assume more names here
+ name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_TABLE_STATEMENT);
+ grantNodes.add(grantNode);
+ }
+ }
+ } else {
+ // Assume ROLES here
+ // role [, ...]
+ AstNode grantNode = nodeFactory().node("roles", parentNode,
TYPE_GRANT_ROLES_STATEMENT);
+ grantNodes.add(grantNode);
+ do {
+ String role = parseName(tokens);
+ nodeFactory().node(role, grantNode, ROLE);
+ } while( tokens.canConsume(COMMA));
+ }
+
+ tokens.consume("TO");
+ List<String> grantees = new ArrayList<String>();
+
+ do {
+ String grantee = parseName(tokens);
+ grantees.add(grantee);
+ } while( tokens.canConsume(COMMA));
+
+ boolean withGrantOption = false;
+ if( tokens.canConsume("WITH", "GRANT", "OPTION"))
{
+ withGrantOption = true;
+ }
+
+ // Set all properties and children on Grant Nodes
+ for( AstNode grantNode : grantNodes) {
+ List<AstNode> copyOfPrivileges = copyOfPrivileges(privileges);
+ // Attach privileges to grant node
+ for( AstNode node : copyOfPrivileges ) {
+ node.setParent(grantNode);
+ }
+ if( allPrivileges ) {
+ grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+ }
+ for( String grantee : grantees) {
+ nodeFactory().node(grantee, grantNode, GRANTEE);
+ }
+
+ if( withGrantOption ) {
+ AstNode optionNode = nodeFactory().node("withGrant", grantNode,
TYPE_STATEMENT_OPTION);
+ optionNode.setProperty(VALUE, "WITH GRANT OPTION");
+ }
+ }
+ AstNode firstGrantNode = grantNodes.get(0);
+
+ markEndOfStatement(tokens, firstGrantNode);
+
+ // Update additional grant nodes with statement info
+
+ for( int i=1; i<grantNodes.size(); i++) {
+ AstNode grantNode = grantNodes.get(i);
+ grantNode.setProperty(DDL_EXPRESSION,
firstGrantNode.getProperty(DDL_EXPRESSION));
+ grantNode.setProperty(DDL_START_LINE_NUMBER,
firstGrantNode.getProperty(DDL_START_LINE_NUMBER));
+ grantNode.setProperty(DDL_START_CHAR_INDEX,
firstGrantNode.getProperty(DDL_START_CHAR_INDEX));
+ grantNode.setProperty(DDL_START_COLUMN_NUMBER,
firstGrantNode.getProperty(DDL_START_COLUMN_NUMBER));
+ }
+
+
+ return grantNodes.get(0);
}
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see
org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantPrivileges(org.jboss.dna.sequencer.ddl.DdlTokenStream,
java.util.List)
+ */
@Override
+ protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode>
privileges) throws ParsingException {
+ // privilege-types
+ //
+ // ALL PRIVILEGES | privilege-list
+ //
+ // privilege-list
+ //
+ // table-privilege {, table-privilege }*
+ //
+ // table-privilege
+ // SELECT [ <left paren> <privilege column list> <right
paren> ]
+ // | DELETE
+ // | INSERT [ <left paren> <privilege column list> <right
paren> ]
+ // | UPDATE [ <left paren> <privilege column list> <right
paren> ]
+ // | REFERENCES [ <left paren> <privilege column list>
<right paren> ]
+ // | USAGE
+ // | TRIGGER
+ // | TRUNCATE
+ // | CREATE
+ // | CONNECT
+ // | TEMPORARY
+ // | TEMP
+ // | EXECUTE
+
+ // POSTGRES has the following Privileges:
+ // GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES |
TRIGGER }
+
+ do {
+ AstNode node = null;
+
+ if( tokens.canConsume(DELETE)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, DELETE);
+ } else if( tokens.canConsume(INSERT)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, INSERT);
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ } else if( tokens.canConsume("REFERENCES")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "REFERENCES");
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ } else if( tokens.canConsume(SELECT)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, SELECT);
+ // Could have columns here
+ // GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
+
+ // Let's just swallow the column data.
+
+ consumeParenBoundedTokens(tokens, true);
+ } else if( tokens.canConsume("USAGE")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "USAGE");
+ } else if( tokens.canConsume(UPDATE)) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, UPDATE);
+ parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+ } else if( tokens.canConsume("TRIGGER")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "TRIGGER");
+ } else if( tokens.canConsume("TRUNCATE")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "TRUNCATE");
+ } else if( tokens.canConsume("CREATE")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "CREATE");
+ } else if( tokens.canConsume("CONNECT")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "CONNECT");
+ } else if( tokens.canConsume("TEMPORARY")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "TEMPORARY");
+ } else if( tokens.canConsume("TEMP")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "TEMP");
+ } else if( tokens.canConsume("EXECUTE")) {
+ node = nodeFactory().node("privilege");
+ node.setProperty(TYPE, "EXECUTE");
+ }
+
+ if( node == null) {
+ break;
+ }
+ nodeFactory().setType(node, GRANT_PRIVILEGE);
+ privileges.add(node);
+
+ } while( tokens.canConsume(COMMA));
+
+ }
+
+ private List<AstNode> parseMultipleGrantTargets(DdlTokenStream tokens,
+ AstNode parentNode,
+ Name nodeType) throws
ParsingException {
+ List<AstNode> grantNodes = new ArrayList<AstNode>();
+ String name = parseName(tokens);
+ AstNode grantNode = nodeFactory().node(name, parentNode, nodeType);
+ grantNodes.add(grantNode);
+ while( tokens.canConsume(COMMA) ) {
+ // Assume more names here
+ name = parseName(tokens);
+ grantNode = nodeFactory().node(name, parentNode, nodeType);
+ grantNodes.add(grantNode);
+ }
+
+ return grantNodes;
+ }
+
+ private List<AstNode> copyOfPrivileges(List<AstNode> privileges) {
+ List<AstNode> copyOfPrivileges = new ArrayList<AstNode>();
+ for( AstNode node : privileges) {
+ copyOfPrivileges.add(node.clone());
+ }
+
+ return copyOfPrivileges;
+ }
+
+ private List<AstNode> parseFunctionAndParameters( DdlTokenStream tokens,
+ AstNode parentNode ) throws
ParsingException {
+ boolean isFirstFunction = true;
+ List<AstNode> grantNodes = new ArrayList<AstNode>();
+
+ // FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]
+
+ // argmode = [ IN, OUT, INOUT, or VARIADIC ]
+
+ // p(a int, b TEXT), q(integer, double)
+
+ // [postgresddl:grantOnFunctionStatement] > ddl:grantStatement,
postgresddl:functionOperand mixin
+ // + * (postgresddl:functionParameter) = postgresddl:functionParameter
multiple
+
+ do {
+ String name = parseName(tokens);
+ AstNode grantFunctionNode = nodeFactory().node(name, parentNode,
TYPE_GRANT_ON_FUNCTION_STATEMENT);
+
+ grantNodes.add(grantFunctionNode);
+
+ // Parse Parameter Data
+ if( tokens.matches(L_PAREN)) {
+ tokens.consume(L_PAREN);
+
+ if( !tokens.canConsume(R_PAREN)) {
+ // check for datatype
+ do{
+ String mode = null;
+
+ if( tokens.matchesAnyOf("IN", "OUT",
"INOUT", "VARIADIC")) {
+ mode = tokens.consume();
+ }
+ AstNode paramNode = null;
+
+ DataType dType = getDatatypeParser().parse(tokens);
+ if( dType != null ) {
+ // NO Parameter Name, only DataType
+ paramNode = nodeFactory().node("parameter",
grantFunctionNode, FUNCTION_PARAMETER);
+ if( mode != null ) {
+ paramNode.setProperty(FUNCTION_PARAMETER_MODE, mode);
+ }
+ getDatatypeParser().setPropertiesOnNode(paramNode, dType);
+ } else {
+ String paramName = parseName(tokens);
+ dType = getDatatypeParser().parse(tokens);
+ assert paramName != null;
+
+ paramNode = nodeFactory().node(paramName, grantFunctionNode,
FUNCTION_PARAMETER);
+ if( mode != null ) {
+ paramNode.setProperty(FUNCTION_PARAMETER_MODE, mode);
+ }
+ if( dType != null ) {
+ getDatatypeParser().setPropertiesOnNode(paramNode,
dType);
+ }
+ }
+ } while( tokens.canConsume(COMMA));
+
+ tokens.consume(R_PAREN);
+ }
+ }
+
+ // RESET first parameter flag
+ if( isFirstFunction ) {
+ isFirstFunction = false;
+ }
+ } while( tokens.canConsume(COMMA) );
+
+
+ return grantNodes;
+ }
+
+ @Override
protected AstNode parseSetStatement( DdlTokenStream tokens,
AstNode parentNode ) throws ParsingException {
assert tokens != null;
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties 2010-01-05
13:31:47 UTC (rev 1527)
@@ -29,4 +29,5 @@
unusedTokensParsingColumnsAndConstraints = The following unused tokens were found parsing
columns and constraints for table: {0}.
unusedTokensParsingColumnDefinition = The following unused tokens were found parsing a
column definition for table: {0}.
alterTableOptionNotFound = ALTER TABLE Option not found. Check your DDL for incomplete
statement near line {0}, column {1}
-unusedTokensParsingCreateIndex = The following unused tokens were found parsing a create
index statement: {0}.
\ No newline at end of file
+unusedTokensParsingCreateIndex = The following unused tokens were found parsing a create
index statement: {0}.
+missingReturnTypeForFunction = The function {0} is missing a return data type.
\ No newline at end of file
Deleted:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd 2010-01-05
13:31:47 UTC (rev 1527)
@@ -1,266 +0,0 @@
-/*
- * JBoss DNA (
http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of
- * individual contributors.
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-
-
-//------------------------------------------------------------------------------
-// N O D E T Y P E S
-//------------------------------------------------------------------------------
-
-[ddl:operation] mixin abstract
-[ddl:operand] mixin abstract
- - ddl:name (STRING) mandatory
-
-// =============================================================================
-// STATEMENT
-// =============================================================================
-[ddl:statement] mixin abstract
- - ddl:expression (string) mandatory // The string fragment
encompassing the statement expression.
- - ddl:originalExpression (string) mandatory // The string fragment
encompassing the original statement expression.
- - ddl:startLineNumber (long) mandatory // The starting line number
for the statement
- - ddl:startColumnNumber (long) mandatory // The starting column number
for the statement
- - ddl:startCharIndex (long) mandatory // The starting content
character index for the statement
- - ddl:length (long) mandatory // The string length
- + ddl:problem (ddl:ddlProblem) = ddl:ddlProblem multiple // Problems encountered
during parsing.
-
-// =============================================================================
-// CREATE, ALTER, DROP, INSERT, SET, GRANT, REVOKE
-// =============================================================================
-[ddl:creatable] > ddl:operation abstract
-[ddl:alterable] > ddl:operation abstract
-[ddl:droppable] > ddl:operation abstract
- - ddl:dropBehavior (STRING)
- + ddl:dropOption (ddl:statementOption) = ddl:statementOption multiple
-[ddl:insertable] > ddl:operation abstract
-[ddl:settable] > ddl:operation abstract
-[ddl:grantable] > ddl:operation abstract
-[ddl:revokable] > ddl:operation abstract
-[ddl:renamable] > ddl:operation, ddl:operand abstract
- - ddl:newName (STRING)
-
-// =============================================================================
-// OPERANDS: SCHEMA, TABLE, DOMAIN, VIEW, ASSERTION, CHARACTER SET, COLLATION,
TRANSLATION
-// =============================================================================
-[ddl:schemaOperand] > ddl:operand abstract
-[ddl:tableOperand] > ddl:operand abstract
-[ddl:domainOperand] > ddl:operand abstract
-[ddl:viewOperand] > ddl:operand abstract
-[ddl:assertionOperand] > ddl:operand abstract
-[ddl:characterSetOperand] > ddl:operand abstract
-[ddl:collationOperand] > ddl:operand abstract
-[ddl:translationOperand] > ddl:operand abstract
-[ddl:columnOperand] > ddl:operand abstract
-[ddl:tableConstraintOperand] > ddl:operand abstract
-[ddl:referenceOperand] > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
- - ddl:datatypeName (STRING) mandatory
- - ddl:datatypeLength (LONG)
- - ddl:datatypePrecision (LONG)
- - ddl:datatypeScale (LONG)
- - ddl:nullable (STRING)
- - ddl:defaultOption (STRING)
- < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER',
'SESSION_USER', 'SYSTEM_USER', 'NULL'
- - ddl:defaultValue (STRING)
- - ddl:defaultPrecision (LONG)
- - ddl:collationName (STRING)
- + ddl:dropBehavior (ddl:simpleProperty) = ddl:simpleProperty
- + ddl:columnAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-
-// =============================================================================
-// TABLE CONSTRAINT
-// =============================================================================
-[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
- - ddl:constraintType (STRING) mandatory
- < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY',
'CHECK'
- - ddl:deferrable (STRING)
- < 'DEFERRABLE', 'NOT DEFERRABLE'
- - ddl:checkSearchCondition (STRING)
- < 'INITIALLY DEFERRED', 'INITIALLY IMMEDIATE'
- + * (ddl:columnReference) = ddl:columnReference multiple
- + * (ddl:tableReference) = ddl:tableReference
- + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
- + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-
-// =============================================================================
-// REFERENCE
-// =============================================================================
-[ddl:columnReference] > ddl:referenceOperand mixin
-[ddl:tableReference] > ddl:referenceOperand mixin
-[ddl:fkColumnReference] > ddl:referenceOperand mixin
-
-// =============================================================================
-// SIMPLE STRING PROPERTY
-// =============================================================================
-[ddl:simpleProperty] mixin
- - ddl:propValue (STRING) mandatory
-
-// =============================================================================
-// STATEMENT OPTION
-// =============================================================================
-[ddl:statementOption] mixin
- - ddl:value (STRING) mandatory
-
-// =============================================================================
-// DDL PROBLEM
-// =============================================================================
-[ddl:ddlProblem] mixin
- - ddl:problemLevel (LONG) mandatory
- - ddl:message (STRING) mandatory
-
-// =============================================================================
-// CREATE SCHEMA
-// =============================================================================
-[ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand mixin
- - ddl:defaultCharacterSetName (STRING)
- + * (ddl:statement) = ddl:statement multiple
-
-// =============================================================================
-// CREATE TABLE
-// =============================================================================
-[ddl:createTableStatement] > ddl:statement, ddl:creatable, ddl:tableOperand mixin
- - ddl:temporary (STRING)
- < 'GLOBAL', 'LOCAL'
- - ddl:onCommitValue (STRING)
- < 'DELETE ROWS', 'PRESERVE ROWS'
- + * (ddl:columnDefinition) = ddl:columnDefinition multiple
- + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
- + * (ddl:statementOption) = ddl:statementOption multiple
-
-// =============================================================================
-// CREATE VIEW
-// =============================================================================
-[ddl:createViewStatement] > ddl:statement, ddl:creatable, ddl:viewOperand mixin
- - ddl:sqlExpression (STRING) mandatory
- - ddl:checkOption (STRING)
- + * (ddl:columnReference) = ddl:columnReference multiple
-
-// =============================================================================
-// CREATE DOMAIN
-// =============================================================================
-[ddl:createDomainStatement] > ddl:statement, ddl:creatable, ddl:domainOperand mixin
- - ddl:datatypeName (STRING) mandatory
- - ddl:datatypeLength (LONG)
- - ddl:datatypePrecision (LONG)
- - ddl:datatypeScale (LONG)
- - ddl:nullable (STRING)
- - ddl:defaultOption (STRING)
- < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER',
'SESSION_USER', 'SYSTEM_USER', 'NULL'
- - ddl:defaultValue (STRING)
- - ddl:defaultPrecision (LONG)
- - ddl:collationName (STRING)
- + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) =
ddl:tableConstraintDefinition multiple
-
-// =============================================================================
-// CREATE ASSERTION
-// =============================================================================
-[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand
mixin
- - ddl:constraintName (STRING) mandatory
- - ddl:searchCondition (STRING) mandatory
- + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-
-// =============================================================================
-// CREATE CHARACTER SET
-// =============================================================================
-[ddl:createCharacterSetStatement] > ddl:statement, ddl:creatable,
ddl:characterSetOperand mixin
- - ddl:existingName (STRING) mandatory
- - ddl:collateClause (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
- - ddl:limitedCollationDefinition (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
-
-// =============================================================================
-// CREATE COLLATION
-// =============================================================================
-[ddl:createCollationStatement] > ddl:statement, ddl:creatable, ddl:collationOperand
mixin
- - ddl:characterSetName (STRING) mandatory
- - ddl:collationSource (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
- - ddl:padAttribute (STRING)
- < 'NO PAD', 'PAD SPACE'
-
-// =============================================================================
-// CREATE TRANSLATION
-// =============================================================================
-[ddl:createTranslationStatement] > ddl:statement, ddl:creatable,
ddl:translationOperand mixin
- - ddl:sourceCharacterSetName (STRING) mandatory
- - ddl:targetCharacterSetName (STRING) mandatory
- - ddl:translationSource (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
-
-// =============================================================================
-// ALTER TABLE
-// =============================================================================
-[ddl:alterTableStatement] > ddl:statement, ddl:alterable, ddl:tableOperand mixin
- + * (ddl:addColumnDefinition) = ddl:addColumnDefinition multiple
- + * (ddl:dropColumnDefinition) = ddl:dropColumnDefinition multiple
- + * (ddl:alterColumnDefinition) = ddl:alterColumnDefinition multiple
- + * (ddl:addTableConstraintDefinition) = ddl:addTableConstraintDefinition multiple
- + * (ddl:dropTableConstraintDefinition) = ddl:dropTableConstraintDefinition multiple
- + * (ddl:statementOption) = ddl:statementOption multiple
-
-// =============================================================================
-// ALTER DOMAIN
-// =============================================================================
-[ddl:alterDomainStatement] > ddl:statement, ddl:alterable, ddl:domainOperand mixin
- - ddl:alterDomainAction (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-[ddl:dropSchemaStatement] > ddl:statement, ddl:droppable, ddl:schemaOperand
mixin
-[ddl:dropTableStatement] > ddl:statement, ddl:droppable, ddl:tableOperand
mixin
-[ddl:dropViewStatement] > ddl:statement, ddl:droppable, ddl:viewOperand
mixin
-[ddl:dropDomainStatement] > ddl:statement, ddl:droppable, ddl:domainOperand
mixin
-[ddl:dropCharacterSetStatement] > ddl:statement, ddl:droppable,
ddl:characterSetOperand mixin
-[ddl:dropCollationStatement] > ddl:statement, ddl:droppable,
ddl:collationOperand mixin
-[ddl:dropTranslationStatement] > ddl:statement, ddl:droppable,
ddl:translationOperand mixin
-[ddl:dropAssertionStatement] > ddl:statement, ddl:droppable,
ddl:assertionOperand mixin
-
-[ddl:alterColumnDefinition] > ddl:columnDefinition, ddl:alterable mixin
-[ddl:addColumnDefinition] > ddl:columnDefinition, ddl:creatable mixin
-[ddl:dropColumnDefinition] > ddl:columnDefinition, ddl:droppable mixin
-[ddl:addTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:creatable
mixin
-[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable
mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-[ddl:setStatement] > ddl:statement, ddl:settable mixin
- // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-
-[ddl:insertStatement] > ddl:statement, ddl:insertable mixin
- // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-
-[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
- // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-
-
-
Added:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
(rev 0)
+++
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd 2010-01-05
13:31:47 UTC (rev 1527)
@@ -0,0 +1,280 @@
+/*
+ * JBoss DNA (
http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[ddl:operation] mixin abstract
+[ddl:operand] mixin abstract
+ - ddl:name (STRING) mandatory
+
+// =============================================================================
+// STATEMENT
+// =============================================================================
+[ddl:statement] mixin abstract
+ - ddl:expression (string) mandatory // The string fragment
encompassing the statement expression.
+ - ddl:originalExpression (string) mandatory // The string fragment
encompassing the original statement expression.
+ - ddl:startLineNumber (long) mandatory // The starting line number
for the statement
+ - ddl:startColumnNumber (long) mandatory // The starting column number
for the statement
+ - ddl:startCharIndex (long) mandatory // The starting content
character index for the statement
+ - ddl:length (long) mandatory // The string length
+ + ddl:problem (ddl:ddlProblem) = ddl:ddlProblem multiple // Problems encountered
during parsing.
+
+// =============================================================================
+// CREATE, ALTER, DROP, INSERT, SET, GRANT, REVOKE
+// =============================================================================
+[ddl:creatable] > ddl:operation abstract
+[ddl:alterable] > ddl:operation abstract
+[ddl:droppable] > ddl:operation abstract
+ - ddl:dropBehavior (STRING)
+ + ddl:dropOption (ddl:statementOption) = ddl:statementOption multiple
+[ddl:insertable] > ddl:operation abstract
+[ddl:settable] > ddl:operation abstract
+[ddl:grantable] > ddl:operation abstract
+[ddl:revokable] > ddl:operation abstract
+[ddl:renamable] > ddl:operation abstract
+ - ddl:newName (STRING)
+
+// =============================================================================
+// OPERANDS: SCHEMA, TABLE, DOMAIN, VIEW, ASSERTION, CHARACTER SET, COLLATION,
TRANSLATION
+// =============================================================================
+[ddl:schemaOperand] > ddl:operand abstract
+[ddl:tableOperand] > ddl:operand abstract
+[ddl:domainOperand] > ddl:operand abstract
+[ddl:viewOperand] > ddl:operand abstract
+[ddl:assertionOperand] > ddl:operand abstract
+[ddl:characterSetOperand] > ddl:operand abstract
+[ddl:collationOperand] > ddl:operand abstract
+[ddl:translationOperand] > ddl:operand abstract
+[ddl:columnOperand] > ddl:operand abstract
+[ddl:tableConstraintOperand] > ddl:operand abstract
+[ddl:referenceOperand] > ddl:operand abstract
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ - ddl:nullable (STRING)
+ - ddl:defaultOption (STRING)
+ < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER',
'SESSION_USER', 'SYSTEM_USER', 'NULL'
+ - ddl:defaultValue (STRING)
+ - ddl:defaultPrecision (LONG)
+ - ddl:collationName (STRING)
+ + ddl:dropBehavior (ddl:simpleProperty) = ddl:simpleProperty
+ + ddl:columnAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+
+// =============================================================================
+// TABLE CONSTRAINT
+// =============================================================================
+[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
+ - ddl:constraintType (STRING) mandatory
+ < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY',
'CHECK'
+ - ddl:deferrable (STRING)
+ < 'DEFERRABLE', 'NOT DEFERRABLE'
+ - ddl:checkSearchCondition (STRING)
+ < 'INITIALLY DEFERRED', 'INITIALLY IMMEDIATE'
+ + * (ddl:columnReference) = ddl:columnReference multiple
+ + * (ddl:tableReference) = ddl:tableReference
+ + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
+ + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+
+// =============================================================================
+// REFERENCE
+// =============================================================================
+[ddl:columnReference] > ddl:referenceOperand mixin
+[ddl:tableReference] > ddl:referenceOperand mixin
+[ddl:fkColumnReference] > ddl:referenceOperand mixin
+[ddl:grantee] > ddl:referenceOperand mixin
+
+// =============================================================================
+// SIMPLE STRING PROPERTY
+// =============================================================================
+[ddl:simpleProperty] mixin
+ - ddl:propValue (STRING) mandatory
+
+// =============================================================================
+// STATEMENT OPTION
+// =============================================================================
+[ddl:statementOption] mixin
+ - ddl:value (STRING) mandatory
+
+// =============================================================================
+// DDL PROBLEM
+// =============================================================================
+[ddl:ddlProblem] mixin
+ - ddl:problemLevel (LONG) mandatory
+ - ddl:message (STRING) mandatory
+
+// =============================================================================
+// CREATE SCHEMA
+// =============================================================================
+[ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand mixin
+ - ddl:defaultCharacterSetName (STRING)
+ + * (ddl:statement) = ddl:statement multiple
+
+// =============================================================================
+// CREATE TABLE
+// =============================================================================
+[ddl:createTableStatement] > ddl:statement, ddl:creatable, ddl:tableOperand mixin
+ - ddl:temporary (STRING)
+ < 'GLOBAL', 'LOCAL'
+ - ddl:onCommitValue (STRING)
+ < 'DELETE ROWS', 'PRESERVE ROWS'
+ + * (ddl:columnDefinition) = ddl:columnDefinition multiple
+ + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+ + * (ddl:statementOption) = ddl:statementOption multiple
+
+// =============================================================================
+// CREATE VIEW
+// =============================================================================
+[ddl:createViewStatement] > ddl:statement, ddl:creatable, ddl:viewOperand mixin
+ - ddl:sqlExpression (STRING) mandatory
+ - ddl:checkOption (STRING)
+ + * (ddl:columnReference) = ddl:columnReference multiple
+
+// =============================================================================
+// CREATE DOMAIN
+// =============================================================================
+[ddl:createDomainStatement] > ddl:statement, ddl:creatable, ddl:domainOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ - ddl:nullable (STRING)
+ - ddl:defaultOption (STRING)
+ < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER',
'SESSION_USER', 'SYSTEM_USER', 'NULL'
+ - ddl:defaultValue (STRING)
+ - ddl:defaultPrecision (LONG)
+ - ddl:collationName (STRING)
+ + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) =
ddl:tableConstraintDefinition multiple
+
+// =============================================================================
+// CREATE ASSERTION
+// =============================================================================
+[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand
mixin
+ - ddl:constraintName (STRING) mandatory
+ - ddl:searchCondition (STRING) mandatory
+ + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+
+// =============================================================================
+// CREATE CHARACTER SET
+// =============================================================================
+[ddl:createCharacterSetStatement] > ddl:statement, ddl:creatable,
ddl:characterSetOperand mixin
+ - ddl:existingName (STRING) mandatory
+ - ddl:collateClause (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
+ - ddl:limitedCollationDefinition (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
+
+// =============================================================================
+// CREATE COLLATION
+// =============================================================================
+[ddl:createCollationStatement] > ddl:statement, ddl:creatable, ddl:collationOperand
mixin
+ - ddl:characterSetName (STRING) mandatory
+ - ddl:collationSource (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
+ - ddl:padAttribute (STRING)
+ < 'NO PAD', 'PAD SPACE'
+
+// =============================================================================
+// CREATE TRANSLATION
+// =============================================================================
+[ddl:createTranslationStatement] > ddl:statement, ddl:creatable,
ddl:translationOperand mixin
+ - ddl:sourceCharacterSetName (STRING) mandatory
+ - ddl:targetCharacterSetName (STRING) mandatory
+ - ddl:translationSource (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
+
+// =============================================================================
+// ALTER TABLE
+// =============================================================================
+[ddl:alterTableStatement] > ddl:statement, ddl:alterable, ddl:tableOperand mixin
+ + * (ddl:addColumnDefinition) = ddl:addColumnDefinition multiple
+ + * (ddl:dropColumnDefinition) = ddl:dropColumnDefinition multiple
+ + * (ddl:alterColumnDefinition) = ddl:alterColumnDefinition multiple
+ + * (ddl:addTableConstraintDefinition) = ddl:addTableConstraintDefinition multiple
+ + * (ddl:dropTableConstraintDefinition) = ddl:dropTableConstraintDefinition multiple
+ + * (ddl:statementOption) = ddl:statementOption multiple
+
+// =============================================================================
+// ALTER DOMAIN
+// =============================================================================
+[ddl:alterDomainStatement] > ddl:statement, ddl:alterable, ddl:domainOperand mixin
+ - ddl:alterDomainAction (STRING) // TODO: THIS IS COMPLEX, NEED TO
BREAK DOWN
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+[ddl:dropSchemaStatement] > ddl:statement, ddl:droppable, ddl:schemaOperand
mixin
+[ddl:dropTableStatement] > ddl:statement, ddl:droppable, ddl:tableOperand
mixin
+[ddl:dropViewStatement] > ddl:statement, ddl:droppable, ddl:viewOperand
mixin
+[ddl:dropDomainStatement] > ddl:statement, ddl:droppable, ddl:domainOperand
mixin
+[ddl:dropCharacterSetStatement] > ddl:statement, ddl:droppable,
ddl:characterSetOperand mixin
+[ddl:dropCollationStatement] > ddl:statement, ddl:droppable,
ddl:collationOperand mixin
+[ddl:dropTranslationStatement] > ddl:statement, ddl:droppable,
ddl:translationOperand mixin
+[ddl:dropAssertionStatement] > ddl:statement, ddl:droppable,
ddl:assertionOperand mixin
+
+[ddl:alterColumnDefinition] > ddl:columnDefinition, ddl:alterable mixin
+[ddl:addColumnDefinition] > ddl:columnDefinition, ddl:creatable mixin
+[ddl:dropColumnDefinition] > ddl:columnDefinition, ddl:droppable mixin
+[ddl:addTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:creatable
mixin
+[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable
mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[ddl:setStatement] > ddl:statement, ddl:settable mixin
+ // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+
+[ddl:insertStatement] > ddl:statement, ddl:insertable mixin
+ // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+
+[ddl:grantPrivilege] mixin
+ - ddl:type (STRING) mandatory
+ + * (ddl:columnReference) = ddl:columnReference multiple
+
+[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
+ - ddl:allPrivileges (boolean)
+ + * (ddl:grantPrivilege) = ddl:grantPrivilege multiple
+ + * (ddl:grantee) = ddl:grantee multiple
+
+[ddl:grantOnTableStatement] > ddl:grantStatement, ddl:tableOperand mixin
+[ddl:grantOnDomainStatement] > ddl:grantStatement, ddl:domainOperand mixin
+[ddl:grantOnCollationStatement] > ddl:grantStatement, ddl:collationOperand mixin
+[ddl:grantOnCharacterSetStatement] > ddl:grantStatement, ddl:characterSetOperand
mixin
+[ddl:grantOnTranslationStatement] > ddl:grantStatement, ddl:translationOperand
mixin
Property changes on:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
___________________________________________________________________
Name: svn:executable
+ *
Deleted:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd 2010-01-05
13:31:47 UTC (rev 1527)
@@ -1,72 +0,0 @@
-/*
- * JBoss DNA (
http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of
- * individual contributors.
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[derbyddl:functionOperand] > ddl:operand abstract
-[derbyddl:indexOperand] > ddl:operand abstract
-[derbyddl:procedureOperand] > ddl:operand abstract
-[derbyddl:roleOperand] > ddl:operand abstract
-[derbyddl:synonymOperand] > ddl:operand abstract
-[derbyddl:triggerOperand] > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[derbyddl:columnDefinition] > ddl:columnDefinition mixin
- - derbyddl:dropDefault (boolean)
-
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-[derbyddl:createFunctionStatement] > ddl:creatable, ddl:statement,
derbyddl:functionOperand mixin
-[derbyddl:createIndex] > ddl:statement, ddl:creatable,
derbyddl:indexOperand mixin
- - derbyddl:tableName (string) mandatory
- - derbyddl:unique (boolean)
- + * (ddl:columnReference) = ddl:columnReference multiple
-[derbyddl:createProcedureStatement] > ddl:creatable, ddl:statement,
derbyddl:procedureOperand mixin
-[derbyddl:createRoleStatement] > ddl:creatable, ddl:statement,
derbyddl:roleOperand mixin
-[derbyddl:createSynonymStatement] > ddl:creatable, ddl:statement,
derbyddl:synonymOperand mixin
-[derbyddl:createTriggerStatement] > ddl:creatable, ddl:statement,
derbyddl:triggerOperand mixin
-
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-[derbyddl:dropFunctionStatement] > ddl:droppable, derbyddl:functionOperand mixin
-[derbyddl:dropIndexStatement] > ddl:droppable, derbyddl:indexOperand mixin
-[derbyddl:dropProcedureStatement] > ddl:droppable, derbyddl:procedureOperand mixin
-[derbyddl:dropRoleStatement] > ddl:droppable, derbyddl:roleOperand mixin
-[derbyddl:dropSynonymStatement] > ddl:droppable, derbyddl:synonymOperand mixin
-[derbyddl:dropTriggerStatement] > ddl:droppable, derbyddl:triggerOperand mixin
Added:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
(rev 0)
+++
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd 2010-01-05
13:31:47 UTC (rev 1527)
@@ -0,0 +1,102 @@
+/*
+ * JBoss DNA (
http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[derbyddl:functionOperand] > ddl:operand abstract
+[derbyddl:indexOperand] > ddl:operand abstract
+[derbyddl:procedureOperand] > ddl:operand abstract
+[derbyddl:roleOperand] > ddl:operand abstract
+[derbyddl:synonymOperand] > ddl:operand abstract
+[derbyddl:triggerOperand] > ddl:operand abstract
+
+[derbyddl:roleName] > derbyddl:roleOperand mixin
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[derbyddl:columnDefinition] > ddl:columnDefinition mixin
+ - derbyddl:dropDefault (boolean)
+
+[derbyddl:functionParameter] > ddl:columnDefinition mixin
+
+[derbyddl:indexColumnReference] > ddl:columnReference mixin
+ - derbyddl:order (STRING)
+
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+[derbyddl:createFunctionStatement] > ddl:creatable, ddl:statement,
derbyddl:functionOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ - ddl:isTableType (boolean)
+ + * (derbyddl:functionParameter) = derbyddl:functionParameter multiple
+ + * (ddl:statementOption) = ddl:statementOption multiple
+[derbyddl:createIndexStatement] > ddl:statement, ddl:creatable,
derbyddl:indexOperand mixin
+ - derbyddl:tableName (string) mandatory
+ - derbyddl:unique (boolean)
+ + * (derbyddl:indexColumnReference) = derbyddl:indexColumnReference multiple
+[derbyddl:createProcedureStatement] > ddl:creatable, ddl:statement,
derbyddl:procedureOperand mixin
+[derbyddl:createRoleStatement] > ddl:creatable, ddl:statement,
derbyddl:roleOperand mixin
+[derbyddl:createSynonymStatement] > ddl:creatable, ddl:statement,
derbyddl:synonymOperand mixin
+ - derbyddl:tableName (string) mandatory
+[derbyddl:createTriggerStatement] > ddl:creatable, ddl:statement,
derbyddl:triggerOperand mixin
+ - derbyddl:tableName (string) mandatory
+ - ddl:sql (string) mandatory
+ + * (ddl:columnReference) = ddl:columnreference multiple
+[derbyddl:declareGlobalTemporaryTableStatement] > ddl:createTableStatement mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+[derbyddl:dropFunctionStatement] > ddl:droppable, derbyddl:functionOperand mixin
+[derbyddl:dropIndexStatement] > ddl:droppable, derbyddl:indexOperand mixin
+[derbyddl:dropProcedureStatement] > ddl:droppable, derbyddl:procedureOperand mixin
+[derbyddl:dropRoleStatement] > ddl:droppable, derbyddl:roleOperand mixin
+[derbyddl:dropSynonymStatement] > ddl:droppable, derbyddl:synonymOperand mixin
+[derbyddl:dropTriggerStatement] > ddl:droppable, derbyddl:triggerOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[derbyddl:lockTableStatement] > ddl:statement, ddl:tableOperand mixin
+[derbyddl:renameTableStatement] > ddl:statement, ddl:renamable, ddl:tableOperand
mixin
+
+[derbyddl:grantOnFunctionStatement] > ddl:grantStatement, derbyddl:functionOperand
mixin
+[derbyddl:grantOnProcedureStatement] > ddl:grantStatement,
derbyddl:procedureOperand mixin
+
+[derbyddl:grantRolesStatement] > ddl:grantStatement mixin
+ + ddl:name (derbyddl:roleName) = derbyddl:roleName multiple
\ No newline at end of file
Property changes on:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
___________________________________________________________________
Name: svn:executable
+ *
Deleted:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd 2010-01-05
13:31:47 UTC (rev 1527)
@@ -1,178 +0,0 @@
-/*
- * JBoss DNA (
http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of
- * individual contributors.
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[postgresddl:aggregateOperand] > ddl:operand abstract
-[postgresddl:castOperand] > ddl:operand abstract
-[postgresddl:commentOperand] > ddl:operand abstract
-[postgresddl:constraintTriggerOperand] > ddl:operand abstract
-[postgresddl:conversionOperand] > ddl:operand abstract
-[postgresddl:databaseOperand] > ddl:operand abstract
-[postgresddl:foreignDataOperand] > ddl:operand abstract
-[postgresddl:groupOperand] > ddl:operand abstract
-[postgresddl:functionOperand] > ddl:operand abstractmandatory
-[postgresddl:indexOperand] > ddl:operand abstract
-[postgresddl:languageOperand] > ddl:operand abstract
-[postgresddl:operatorOperand] > ddl:operand abstract
-[postgresddl:ownedByOperand] > ddl:operand abstract
-[postgresddl:roleOperand] > ddl:operand abstract
-[postgresddl:ruleOperand] > ddl:operand abstract
-[postgresddl:sequenceOperand] > ddl:operand abstract
-[postgresddl:serverOperand] > ddl:operand abstract
-[postgresddl:tablespaceOperand] > ddl:operand abstract
-[postgresddl:textSearchOperand] > ddl:operand abstract
-[postgresddl:triggerOperand] > ddl:operand abstract
-[postgresddl:typeOperand] > ddl:operand abstract
-[postgresddl:userOperand] > ddl:operand abstract
-[postgresddl:userMappingOperand] > ddl:operand abstract
-
-
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[postgresddl:alterAggregateStatement] > ddl:alterable, ddl:statement,
postgresddl:aggregateOperand mixin
-[postgresddl:alterConversionStatement] > ddl:alterable, ddl:statement,
postgresddl:conversionOperand mixin
-[postgresddl:alterDatabaseStatement] > ddl:alterable, ddl:statement,
postgresddl:databaseOperand mixin
-[postgresddl:alterForeignDataWrapperStatement] > ddl:alterable, ddl:statement,
postgresddl:foreignDataOperand mixin
-[postgresddl:alterFunctionStatement] > ddl:alterable, ddl:statement,
postgresddl:functionOperand mixin
-[postgresddl:alterGroupStatement] > ddl:alterable, ddl:statement,
postgresddl:groupOperand mixin
-[postgresddl:alterIndexStatement] > ddl:alterable, ddl:statement,
postgresddl:indexOperand mixin
-[postgresddl:alterLanguageStatement] > ddl:alterable, ddl:statement,
postgresddl:languageOperand mixin
-[postgresddl:alterOperatorStatement] > ddl:alterable, ddl:statement,
postgresddl:operatorOperand mixin
-[postgresddl:alterRoleStatement] > ddl:alterable, ddl:statement,
postgresddl:roleOperand mixin
-[postgresddl:alterSchemaStatement] > ddl:alterable, ddl:statement,
ddl:schemaOperand mixin
-[postgresddl:alterSequenceStatement] > ddl:alterable, ddl:statement,
postgresddl:sequenceOperand mixin
-[postgresddl:alterServerStatement] > ddl:alterable, ddl:statement,
postgresddl:serverOperand mixin
-[postgresddl:alterTablespaceStatement] > ddl:alterable, ddl:statement,
postgresddl:tablespaceOperand mixin
-[postgresddl:alterTextSearchStatement] > ddl:alterable, ddl:statement,
postgresddl:textSearchOperand mixin
-[postgresddl:alterTriggerStatement] > ddl:alterable, ddl:statement,
postgresddl:triggerOperand mixin
-[postgresddl:alterTypeStatement] > ddl:alterable, ddl:statement,
postgresddl:typeOperand mixin
-[postgresddl:alterUserStatement] > ddl:alterable, ddl:statement,
postgresddl:userOperand mixin
-[postgresddl:alterUserMappingStatement] > ddl:alterable, ddl:statement,
postgresddl:userMappingOperand mixin
-[postgresddl:alterViewStatement] > ddl:alterable, ddl:statement,
ddl:viewOperand mixin
-
-[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
- - postgresddl:newTableName (STRING)
- - postgresddl:schemaName (STRING)
- + postgresddl:renameColumn (ddl:renamable) = ddl:renamable multiple
-
-
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[postgresddl:createAggregateStatement] > ddl:creatable, ddl:statement,
postgresddl:aggregateOperand mixin
-[postgresddl:createCastStatement] > ddl:creatable, ddl:statement,
postgresddl:castOperand mixin
-[postgresddl:createConstraintTriggerStatement] > ddl:creatable, ddl:statement,
postgresddl:constraintTriggerOperand mixin
-[postgresddl:createConversionStatement] > ddl:creatable, ddl:statement,
postgresddl:conversionOperand mixin
-[postgresddl:createDatabaseStatement] > ddl:creatable, ddl:statement,
postgresddl:databaseOperand mixin
-[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement,
postgresddl:foreignDataOperand mixin
-[postgresddl:createFunctionStatement] > ddl:creatable, ddl:statement,
postgresddl:functionOperand mixin
-[postgresddl:createGroupStatement] > ddl:creatable, ddl:statement,
postgresddl:groupOperand mixin
-[postgresddl:createIndexStatement] > ddl:creatable, ddl:statement,
postgresddl:indexOperand mixin
-[postgresddl:createLanguageStatement] > ddl:creatable, ddl:statement,
postgresddl:languageOperand mixin
-[postgresddl:createOperatorStatement] > ddl:creatable, ddl:statement,
postgresddl:operatorOperand mixin
-[postgresddl:createRoleStatement] > ddl:creatable, ddl:statement,
postgresddl:roleOperand mixin
-[postgresddl:createRuleStatement] > ddl:creatable, ddl:statement,
postgresddl:ruleOperand mixin
-[postgresddl:createSequenceStatement] > ddl:creatable, ddl:statement,
postgresddl:sequenceOperand mixin
-[postgresddl:createServerStatement] > ddl:creatable, ddl:statement,
postgresddl:serverOperand mixin
-[postgresddl:createTablespaceStatement] > ddl:creatable, ddl:statement,
postgresddl:tablespaceOperand mixin
-[postgresddl:createTextSearchStatement] > ddl:creatable, ddl:statement,
postgresddl:textSearchOperand mixin
-[postgresddl:createTriggerStatement] > ddl:creatable, ddl:statement,
postgresddl:triggerOperand mixin
-[postgresddl:createTypeStatement] > ddl:creatable, ddl:statement,
postgresddl:typeOperand mixin
-[postgresddl:createUserStatement] > ddl:creatable, ddl:statement,
postgresddl:userOperand mixin
-[postgresddl:createUserMappingStatement] > ddl:creatable, ddl:statement,
postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[postgresddl:dropAggregateStatement] > ddl:droppable, ddl:statement,
postgresddl:aggregateOperand mixin
-[postgresddl:dropCastStatement] > ddl:droppable, ddl:statement,
postgresddl:castOperand mixin
-[postgresddl:dropConstraintTriggerStatement] > ddl:droppable, ddl:statement,
postgresddl:constraintTriggerOperand mixin
-[postgresddl:dropConversionStatement] > ddl:droppable, ddl:statement,
postgresddl:conversionOperand mixin
-[postgresddl:dropDatabaseStatement] > ddl:droppable, ddl:statement,
postgresddl:databaseOperand mixin
-[postgresddl:dropForeignDataWrapperStatement] > ddl:droppable, ddl:statement,
postgresddl:foreignDataOperand mixin
-[postgresddl:dropFunctionStatement] > ddl:droppable, ddl:statement,
postgresddl:functionOperand mixin
-[postgresddl:dropGroupStatement] > ddl:droppable, ddl:statement,
postgresddl:groupOperand mixin
-[postgresddl:dropIndexStatement] > ddl:droppable, ddl:statement,
postgresddl:indexOperand mixin
-[postgresddl:dropLanguageStatement] > ddl:droppable, ddl:statement,
postgresddl:languageOperand mixin
-[postgresddl:dropOperatorStatement] > ddl:droppable, ddl:statement,
postgresddl:operatorOperand mixin
-[postgresddl:dropOwnedByStatement] > ddl:droppable, ddl:statement,
postgresddl:ownedByOperand mixin
-[postgresddl:dropRoleStatement] > ddl:droppable, ddl:statement,
postgresddl:roleOperand mixin
-[postgresddl:dropRuleStatement] > ddl:droppable, ddl:statement,
postgresddl:ruleOperand mixin
-[postgresddl:dropSequenceStatement] > ddl:droppable, ddl:statement,
postgresddl:sequenceOperand mixin
-[postgresddl:dropServerStatement] > ddl:droppable, ddl:statement,
postgresddl:serverOperand mixin
-[postgresddl:dropTablespaceStatement] > ddl:droppable, ddl:statement,
postgresddl:tablespaceOperand mixin
-[postgresddl:dropTextSearchStatement] > ddl:droppable, ddl:statement,
postgresddl:textSearchOperand mixin
-[postgresddl:dropTriggerStatement] > ddl:droppable, ddl:statement,
postgresddl:triggerOperand mixin
-[postgresddl:dropTypeStatement] > ddl:droppable, ddl:statement,
postgresddl:typeOperand mixin
-[postgresddl:dropUserStatement] > ddl:droppable, ddl:statement,
postgresddl:userOperand mixin
-[postgresddl:dropUserMappingStatement] > ddl:droppable, ddl:statement,
postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[postgresddl:abortStatement] > ddl:statement mixin
-[postgresddl:analyzeStatement] > ddl:statement mixin
-[postgresddl:clusterStatement] > ddl:statement mixin
-[postgresddl:commentOnStatement] > ddl:statement, postgresddl:commentOperand
mixin
- - postgresddl:targetObjectType (STRING) mandatory
- - postgresddl:targetObjectName (STRING)
- - postgresddl:comment (STRING) mandatory
-[postgresddl:copyStatement] > ddl:statement mixin
-[postgresddl:deallocateStatement] > ddl:statement mixin
-[postgresddl:declareStatement] > ddl:statement mixin
-[postgresddl:discardStatement] > ddl:statement mixin
-[postgresddl:explainStatement] > ddl:statement mixin
-[postgresddl:fetchStatement] > ddl:statement mixin
-[postgresddl:listenStatement] > ddl:statement mixin
-[postgresddl:loadStatement] > ddl:statement mixin
-[postgresddl:lockTableStatement] > ddl:statement mixin
-[postgresddl:moveStatement] > ddl:statement mixin
-[postgresddl:notifyStatement] > ddl:statement mixin
-[postgresddl:prepareStatement] > ddl:statement mixin
-[postgresddl:reassignOwnedStatement] > ddl:statement mixin
-[postgresddl:reindexStatement] > ddl:statement mixin
-[postgresddl:releaseSavepointStatement] > ddl:statement mixin
-[postgresddl:rollbackStatement] > ddl:statement mixin
-[postgresddl:selectIntoStatement] > ddl:statement mixin
-[postgresddl:showStatement] > ddl:statement mixin
-[postgresddl:truncateStatement] > ddl:statement mixin
-[postgresddl:unlistenStatement] > ddl:statement mixin
-[postgresddl:vacuumStatement] > ddl:statement mixin
-
-
Added:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
(rev 0)
+++
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd 2010-01-05
13:31:47 UTC (rev 1527)
@@ -0,0 +1,205 @@
+/*
+ * JBoss DNA (
http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[postgresddl:aggregateOperand] > ddl:operand abstract
+[postgresddl:castOperand] > ddl:operand abstract
+[postgresddl:commentOperand] > ddl:operand abstract
+[postgresddl:constraintTriggerOperand] > ddl:operand abstract
+[postgresddl:conversionOperand] > ddl:operand abstract
+[postgresddl:databaseOperand] > ddl:operand abstract
+[postgresddl:foreignDataOperand] > ddl:operand abstract
+[postgresddl:groupOperand] > ddl:operand abstract
+[postgresddl:functionOperand] > ddl:operand abstract
+[postgresddl:indexOperand] > ddl:operand abstract
+[postgresddl:languageOperand] > ddl:operand abstract
+[postgresddl:operatorOperand] > ddl:operand abstract
+[postgresddl:ownedByOperand] > ddl:operand abstract
+[postgresddl:roleOperand] > ddl:operand abstract
+[postgresddl:ruleOperand] > ddl:operand abstract
+[postgresddl:sequenceOperand] > ddl:operand abstract
+[postgresddl:serverOperand] > ddl:operand abstract
+[postgresddl:tablespaceOperand] > ddl:operand abstract
+[postgresddl:textSearchOperand] > ddl:operand abstract
+[postgresddl:triggerOperand] > ddl:operand abstract
+[postgresddl:typeOperand] > ddl:operand abstract
+[postgresddl:userOperand] > ddl:operand abstract
+[postgresddl:userMappingOperand] > ddl:operand abstract
+[postgresddl:parameterOperand] > ddl:operand abstract
+
+[postgresddl:functionParameter] > postgresddl:parameterOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ - ddl:nullable (STRING)
+ - ddl:defaultOption (STRING)
+ - postgresddl:mode (STRING)
+
+[postgresddl:role] > postgresddl:roleOperand mixin
+
+[postgresddl:renamedColumn] > ddl:renamable mixin
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[postgresddl:alterAggregateStatement] > ddl:alterable, ddl:statement,
postgresddl:aggregateOperand mixin
+[postgresddl:alterConversionStatement] > ddl:alterable, ddl:statement,
postgresddl:conversionOperand mixin
+[postgresddl:alterDatabaseStatement] > ddl:alterable, ddl:statement,
postgresddl:databaseOperand mixin
+[postgresddl:alterForeignDataWrapperStatement] > ddl:alterable, ddl:statement,
postgresddl:foreignDataOperand mixin
+[postgresddl:alterFunctionStatement] > ddl:alterable, ddl:statement,
postgresddl:functionOperand mixin
+[postgresddl:alterGroupStatement] > ddl:alterable, ddl:statement,
postgresddl:groupOperand mixin
+[postgresddl:alterIndexStatement] > ddl:alterable, ddl:statement,
postgresddl:indexOperand mixin
+[postgresddl:alterLanguageStatement] > ddl:alterable, ddl:statement,
postgresddl:languageOperand mixin
+[postgresddl:alterOperatorStatement] > ddl:alterable, ddl:statement,
postgresddl:operatorOperand mixin
+[postgresddl:alterRoleStatement] > ddl:alterable, ddl:statement,
postgresddl:roleOperand mixin
+[postgresddl:alterSchemaStatement] > ddl:alterable, ddl:statement,
ddl:schemaOperand mixin
+[postgresddl:alterSequenceStatement] > ddl:alterable, ddl:statement,
postgresddl:sequenceOperand mixin
+[postgresddl:alterServerStatement] > ddl:alterable, ddl:statement,
postgresddl:serverOperand mixin
+[postgresddl:alterTablespaceStatement] > ddl:alterable, ddl:statement,
postgresddl:tablespaceOperand mixin
+[postgresddl:alterTextSearchStatement] > ddl:alterable, ddl:statement,
postgresddl:textSearchOperand mixin
+[postgresddl:alterTriggerStatement] > ddl:alterable, ddl:statement,
postgresddl:triggerOperand mixin
+[postgresddl:alterTypeStatement] > ddl:alterable, ddl:statement,
postgresddl:typeOperand mixin
+[postgresddl:alterUserStatement] > ddl:alterable, ddl:statement,
postgresddl:userOperand mixin
+[postgresddl:alterUserMappingStatement] > ddl:alterable, ddl:statement,
postgresddl:userMappingOperand mixin
+[postgresddl:alterViewStatement] > ddl:alterable, ddl:statement,
ddl:viewOperand mixin
+
+[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
+ - postgresddl:newTableName (STRING)
+ - postgresddl:schemaName (STRING)
+ + postgresddl:renameColumn (postgresddl:renamedColumn) = postgresddl:renamedColumn
multiple
+
+
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[postgresddl:createAggregateStatement] > ddl:creatable, ddl:statement,
postgresddl:aggregateOperand mixin
+[postgresddl:createCastStatement] > ddl:creatable, ddl:statement,
postgresddl:castOperand mixin
+[postgresddl:createConstraintTriggerStatement] > ddl:creatable, ddl:statement,
postgresddl:constraintTriggerOperand mixin
+[postgresddl:createConversionStatement] > ddl:creatable, ddl:statement,
postgresddl:conversionOperand mixin
+[postgresddl:createDatabaseStatement] > ddl:creatable, ddl:statement,
postgresddl:databaseOperand mixin
+[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement,
postgresddl:foreignDataOperand mixin
+[postgresddl:createFunctionStatement] > ddl:creatable, ddl:statement,
postgresddl:functionOperand mixin
+[postgresddl:createGroupStatement] > ddl:creatable, ddl:statement,
postgresddl:groupOperand mixin
+[postgresddl:createIndexStatement] > ddl:creatable, ddl:statement,
postgresddl:indexOperand mixin
+[postgresddl:createLanguageStatement] > ddl:creatable, ddl:statement,
postgresddl:languageOperand mixin
+[postgresddl:createOperatorStatement] > ddl:creatable, ddl:statement,
postgresddl:operatorOperand mixin
+[postgresddl:createRoleStatement] > ddl:creatable, ddl:statement,
postgresddl:roleOperand mixin
+[postgresddl:createRuleStatement] > ddl:creatable, ddl:statement,
postgresddl:ruleOperand mixin
+[postgresddl:createSequenceStatement] > ddl:creatable, ddl:statement,
postgresddl:sequenceOperand mixin
+[postgresddl:createServerStatement] > ddl:creatable, ddl:statement,
postgresddl:serverOperand mixin
+[postgresddl:createTablespaceStatement] > ddl:creatable, ddl:statement,
postgresddl:tablespaceOperand mixin
+[postgresddl:createTextSearchStatement] > ddl:creatable, ddl:statement,
postgresddl:textSearchOperand mixin
+[postgresddl:createTriggerStatement] > ddl:creatable, ddl:statement,
postgresddl:triggerOperand mixin
+[postgresddl:createTypeStatement] > ddl:creatable, ddl:statement,
postgresddl:typeOperand mixin
+[postgresddl:createUserStatement] > ddl:creatable, ddl:statement,
postgresddl:userOperand mixin
+[postgresddl:createUserMappingStatement] > ddl:creatable, ddl:statement,
postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[postgresddl:dropAggregateStatement] > ddl:droppable, ddl:statement,
postgresddl:aggregateOperand mixin
+[postgresddl:dropCastStatement] > ddl:droppable, ddl:statement,
postgresddl:castOperand mixin
+[postgresddl:dropConstraintTriggerStatement] > ddl:droppable, ddl:statement,
postgresddl:constraintTriggerOperand mixin
+[postgresddl:dropConversionStatement] > ddl:droppable, ddl:statement,
postgresddl:conversionOperand mixin
+[postgresddl:dropDatabaseStatement] > ddl:droppable, ddl:statement,
postgresddl:databaseOperand mixin
+[postgresddl:dropForeignDataWrapperStatement] > ddl:droppable, ddl:statement,
postgresddl:foreignDataOperand mixin
+[postgresddl:dropFunctionStatement] > ddl:droppable, ddl:statement,
postgresddl:functionOperand mixin
+[postgresddl:dropGroupStatement] > ddl:droppable, ddl:statement,
postgresddl:groupOperand mixin
+[postgresddl:dropIndexStatement] > ddl:droppable, ddl:statement,
postgresddl:indexOperand mixin
+[postgresddl:dropLanguageStatement] > ddl:droppable, ddl:statement,
postgresddl:languageOperand mixin
+[postgresddl:dropOperatorStatement] > ddl:droppable, ddl:statement,
postgresddl:operatorOperand mixin
+[postgresddl:dropOwnedByStatement] > ddl:droppable, ddl:statement,
postgresddl:ownedByOperand mixin
+[postgresddl:dropRoleStatement] > ddl:droppable, ddl:statement,
postgresddl:roleOperand mixin
+[postgresddl:dropRuleStatement] > ddl:droppable, ddl:statement,
postgresddl:ruleOperand mixin
+[postgresddl:dropSequenceStatement] > ddl:droppable, ddl:statement,
postgresddl:sequenceOperand mixin
+[postgresddl:dropServerStatement] > ddl:droppable, ddl:statement,
postgresddl:serverOperand mixin
+[postgresddl:dropTablespaceStatement] > ddl:droppable, ddl:statement,
postgresddl:tablespaceOperand mixin
+[postgresddl:dropTextSearchStatement] > ddl:droppable, ddl:statement,
postgresddl:textSearchOperand mixin
+[postgresddl:dropTriggerStatement] > ddl:droppable, ddl:statement,
postgresddl:triggerOperand mixin
+[postgresddl:dropTypeStatement] > ddl:droppable, ddl:statement,
postgresddl:typeOperand mixin
+[postgresddl:dropUserStatement] > ddl:droppable, ddl:statement,
postgresddl:userOperand mixin
+[postgresddl:dropUserMappingStatement] > ddl:droppable, ddl:statement,
postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[postgresddl:abortStatement] > ddl:statement mixin
+[postgresddl:analyzeStatement] > ddl:statement mixin
+[postgresddl:clusterStatement] > ddl:statement mixin
+[postgresddl:commentOnStatement] > ddl:statement, postgresddl:commentOperand
mixin
+ - postgresddl:targetObjectType (STRING) mandatory
+ - postgresddl:targetObjectName (STRING)
+ - postgresddl:comment (STRING) mandatory
+[postgresddl:copyStatement] > ddl:statement mixin
+[postgresddl:deallocateStatement] > ddl:statement mixin
+[postgresddl:declareStatement] > ddl:statement mixin
+[postgresddl:discardStatement] > ddl:statement mixin
+[postgresddl:explainStatement] > ddl:statement mixin
+[postgresddl:fetchStatement] > ddl:statement mixin
+[postgresddl:listenStatement] > ddl:statement mixin
+[postgresddl:loadStatement] > ddl:statement mixin
+[postgresddl:lockTableStatement] > ddl:statement mixin
+[postgresddl:moveStatement] > ddl:statement mixin
+[postgresddl:notifyStatement] > ddl:statement mixin
+[postgresddl:prepareStatement] > ddl:statement mixin
+[postgresddl:reassignOwnedStatement] > ddl:statement mixin
+[postgresddl:reindexStatement] > ddl:statement mixin
+[postgresddl:releaseSavepointStatement] > ddl:statement mixin
+[postgresddl:rollbackStatement] > ddl:statement mixin
+[postgresddl:selectIntoStatement] > ddl:statement mixin
+[postgresddl:showStatement] > ddl:statement mixin
+[postgresddl:truncateStatement] > ddl:statement mixin
+[postgresddl:unlistenStatement] > ddl:statement mixin
+[postgresddl:vacuumStatement] > ddl:statement mixin
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+[postgresddl:grantOnTableStatement] > ddl:grantStatement, ddl:tableOperand
mixin
+[postgresddl:grantOnSequenceStatement] > ddl:grantStatement,
postgresddl:sequenceOperand mixin
+[postgresddl:grantOnDatabaseStatement] > ddl:grantStatement,
postgresddl:databaseOperand mixin
+[postgresddl:grantOnForeignDataWrapperStatement] > ddl:grantStatement,
postgresddl:foreignDataOperand mixin
+[postgresddl:grantOnForeignServerStatement] > ddl:grantStatement,
postgresddl:serverOperand mixin
+[postgresddl:grantOnFunctionStatement] > ddl:grantStatement,
postgresddl:functionOperand mixin
+ + postgresddl:parameter (postgresddl:functionParameter) = postgresddl:functionParameter
multiple
+[postgresddl:grantOnLanguageStatement] > ddl:grantStatement,
postgresddl:languageOperand mixin
+[postgresddl:grantOnSchemaStatement] > ddl:grantStatement, ddl:schemaOperand
mixin
+[postgresddl:grantOnTablespaceStatement] > ddl:grantStatement,
postgresddl:tablespaceOperand mixin
+[postgresddl:grantRolesStatement] > ddl:grantStatement mixin
+ + postgresddl:grantRole (postgresddl:role) = postgresddl:role multiple
Property changes on:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
___________________________________________________________________
Name: svn:executable
+ *
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -39,7 +39,7 @@
*/
public class DdlParserTestHelper implements DdlConstants {
private boolean printToConsole = false;
-
+ public final static String NEWLINE = "\n";
/**
*
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -47,6 +47,7 @@
import org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon;
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
/**
@@ -488,6 +489,7 @@
assertThat(verifyMixinType(node_2, "ddl:columnDefinition"), is(true));
}
+ @Ignore
@Test
public void shouldSequenceDerbyDdl() throws IOException {
URL url =
this.getClass().getClassLoader().getResource("ddl/dialect/derby/derby_test_statements.ddl");
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -790,7 +790,7 @@
boolean success = parser.parse(content, rootNode);
assertThat(success, is(true));
- assertThat(rootNode.getChildCount(), is(7));
+ assertThat(rootNode.getChildCount(), is(11));
// List<AstNode> theNodes =
parser.nodeFactory().getChildrenForType(rootNode, TYPE_MISSING_TERMINATOR);
// assertThat(theNodes.size(), is(3));
@@ -834,4 +834,17 @@
assertThat(rootNode.getChildCount(), is(3));
}
+
+ @Test
+ public void shouldParseGrantStatements() {
+ printTest("shouldParseGrantStatements()");
+ String content = "GRANT SELECT ON TABLE purchaseOrders TO maria,harry;"
+ NEWLINE
+ + "GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;" +
NEWLINE
+ + "GRANT SELECT ON TABLE orders.bills to PUBLIC;" + NEWLINE
+ + "GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO
purchases_reader_role;";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(4));
+ }
}
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -4,17 +4,14 @@
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
-
import java.util.List;
-
import org.jboss.dna.sequencer.ddl.DdlParserTestHelper;
-import org.jboss.dna.sequencer.ddl.StandardDdlParser;
import org.jboss.dna.sequencer.ddl.node.AstNode;
import org.junit.Before;
import org.junit.Test;
-public class DerbyDdlParserTest extends DdlParserTestHelper{
- private StandardDdlParser parser;
+public class DerbyDdlParserTest extends DdlParserTestHelper {
+ private DerbyDdlParser parser;
private AstNode rootNode;
public static final String DDL_FILE_PATH =
"src/test/resources/ddl/dialect/derby/";
@@ -29,27 +26,69 @@
rootNode = parser.nodeFactory().node("ddlRootNode");
}
-// @Test
-// public void shouldParseDerbyDDL() {
-// String content = getFileContent(DDL_FILE_PATH +
"derby_test_create.ddl");
-//
-// List<Statement> stmts = parser.parse(content);
-//
-// assertEquals(744, stmts.size());
-//
-// System.out.println(" END PARSING. # Statements = " + stmts.size());
-//
-// }
+ @Test
+ public void shouldParseCreateFunctionWithDataTypeReturn() {
+ //setPrintToConsole(true);
+ //parser.setTestMode(isPrintToConsole());
+ printTest("shouldParseCreateFunctionWithDataTypeReturn()");
+ String content = "CREATE FUNCTION TO_DEGREES" + NEWLINE
+ + "( RADIANS DOUBLE )" + NEWLINE
+ + "RETURNS DOUBLE" + NEWLINE
+ + "PARAMETER STYLE JAVA" + NEWLINE
+ + "NO SQL LANGUAGE JAVA" + NEWLINE
+ + "EXTERNAL NAME 'java.lang.Math.toDegrees';";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+
+ }
+ @Test
+ public void shouldParseCreateFunctionWithTableTypeReturn() {
+ //setPrintToConsole(true);
+ //parser.setTestMode(isPrintToConsole());
+ printTest("shouldParseCreateFunctionWithTableTypeReturn()");
+ String content = "CREATE FUNCTION PROPERTY_FILE_READER" + NEWLINE
+ + "( FILENAME VARCHAR( 32672 ), FILESIZE INTEGER )" + NEWLINE
+ + "RETURNS TABLE (KEY_COL VARCHAR( 10 ), VALUE_COL VARCHAR( 1000
))" + NEWLINE
+ + "LANGUAGE JAVA" + NEWLINE
+ + "PARAMETER STYLE DERBY_JDBC_RESULT_SET" + NEWLINE
+ + "NO SQL" + NEWLINE
+ + "EXTERNAL NAME
'vtis.example.PropertyFileVTI.propertyFileVTI';";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ }
+
@Test
public void shouldParseDropSchemaRestrict() {
- printTest("shouldParseDeclareGlobaTemporaryTable()");
+ printTest("shouldParseDropSchemaRestrict()");
String content = "DROP SCHEMA SAMP RESTRICT;";
boolean success = parser.parse(content, rootNode);
assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
}
+ @Test
+ public void shouldParseCreateIndex() {
+ printTest("shouldParseCreateIndex()");
+ String content = "CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY DESC,
UNIT);";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
+ }
+
+ @Test
+ public void shouldParseLockTable() {
+ printTest("shouldParseLockTable()");
+ String content = "LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
+ }
@Test
public void shouldParseDeclareGlobaTemporaryTable() {
@@ -59,8 +98,69 @@
boolean success = parser.parse(content, rootNode);
assertThat(true, is(success));
}
-
+
@Test
+ public void shouldParseRenameTable() {
+ printTest("shouldParseRenameTable()");
+ String content = "RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
+ }
+
+ @Test
+ public void shouldParseCreateSynonym() {
+ printTest("shouldParseCreateSynonym()");
+ String content = "CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
+ }
+
+ @Test
+ public void shouldParseCreateTrigger() {
+ printTest("shouldParseCreateTrigger()");
+ String content = "CREATE TRIGGER FLIGHTSDELETE3" + NEWLINE
+ + "AFTER DELETE ON FLIGHTS" + NEWLINE
+ + "REFERENCING OLD AS OLD" + NEWLINE
+ + "FOR EACH ROW" + NEWLINE
+ + "DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID =
OLD.FLIGHT_ID;";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
+ }
+
+ @Test
+ public void shouldParseCreateTrigger_2() {
+ printTest("shouldParseCreateTrigger_2()");
+ String content = "CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x" +
NEWLINE
+ + "FOR EACH ROW MODE DB2SQL" + NEWLINE
+ + "values app.notifyEmail('Jerry', 'Table x is about to be
updated');";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
+ }
+
+ @Test
+ public void shouldParseGrantStatements() {
+ printTest("shouldParseGrantStatements()");
+ String content = "GRANT SELECT ON TABLE purchaseOrders TO maria,harry;"
+ NEWLINE
+ + "GRANT UPDATE, TRIGGER ON TABLE purchaseOrders TO anita,zhi;" +
NEWLINE
+ + "GRANT SELECT ON TABLE orders.bills to PUBLIC;" + NEWLINE
+ + "GRANT EXECUTE ON PROCEDURE updatePurchases TO george;" +
NEWLINE
+ + "GRANT purchases_reader_role TO george,maria;" + NEWLINE
+ + "GRANT SELECT ON TABLE purchaseOrders TO
purchases_reader_role;";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(6));
+ }
+
+ @Test
public void shouldParseAlterTableAlterColumnDefaultRealNumber() {
printTest("shouldParseAlterTableAlterColumnDefaultRealNumber()");
String content = "ALTER TABLE Employees ALTER COLUMN Salary DEFAULT
1000.0;";
@@ -82,6 +182,8 @@
@Test
public void shouldParseDerbyStatements() {
+ //setPrintToConsole(true);
+ //parser.setTestMode(isPrintToConsole());
printTest("shouldParseDerbyStatements()");
String content = getFileContent(DDL_FILE_PATH +
"derby_test_statements.ddl");
@@ -91,6 +193,5 @@
List<AstNode> problems = parser.nodeFactory().getChildrenForType(rootNode,
TYPE_PROBLEM);
int nStatements = rootNode.getChildCount() - problems.size();
assertEquals(64, nStatements);
-
}
}
\ No newline at end of file
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java 2010-01-05
13:31:47 UTC (rev 1527)
@@ -23,16 +23,8 @@
*/
package org.jboss.dna.sequencer.ddl.dialect.postgres;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_SCHEMA_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLE_STATEMENT_POSTGRES;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COMMENT_ON_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_RULE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LISTEN_STATEMENT;
-import static
org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RENAME_COLUMN;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.jboss.dna.graph.JcrLexicon;
@@ -422,8 +414,59 @@
assertEquals(true, success);
assertEquals(2, rootNode.getChildCount());
}
+
+ @Test
+ public void shouldParseGrantOnTable() {
+ printTest("shouldParseGrantOnTable()");
+ String content = "GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi;";
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(1, rootNode.getChildCount());
+ }
+
@Test
+ public void shouldParseGrantOnMultipleTables() {
+ printTest("shouldParseGrantOnMultipleTables()");
+ String content = "GRANT UPDATE, TRIGGER ON TABLE t1, t2, t3 TO
anita,zhi;";
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(3, rootNode.getChildCount());
+ }
+
+ @Test
+ public void shouldParseGrantExecuteOnFunction() {
+ printTest("shouldParseGrantExecuteOnFunction()");
+ String content = "GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN
demoninator int) TO george;";
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(1, rootNode.getChildCount());
+ AstNode childNode = rootNode.getChildren().get(0);
+ assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES),
TYPE_GRANT_ON_FUNCTION_STATEMENT));
+ }
+
+ @Test
+ public void shouldParseGrantExecuteAndUpdateOnMultipleFunctions() {
+ printTest("shouldParseGrantExecuteOnMultipleFunctions()");
+ String content = "GRANT EXECUTE, UPDATE ON FUNCTION cos(), sin(b double
precision) TO peter;";
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(2, rootNode.getChildCount());
+ AstNode childNode = rootNode.getChild(0);
+ assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES),
TYPE_GRANT_ON_FUNCTION_STATEMENT));
+ assertEquals(3, childNode.getChildCount());
+ childNode = rootNode.getChild(1);
+ assertEquals(4, childNode.getChildCount());
+ }
+
+ @Test
public void shouldParsePostgresStatements_1() {
printTest("shouldParsePostgresStatements_1()");
String content = getFileContent(DDL_FILE_PATH +
"postgres_test_statements_1.ddl");
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl 2010-01-05
13:31:47 UTC (rev 1527)
@@ -43,7 +43,7 @@
GRANT SELECT ON TABLE s.v to PUBLIC;
-GRANT EXECUTE ON PROCEDURE p TO george;
+GRANT EXECUTE ON FUNCTION p(a int, b TEXT) TO george;
-- 10 STATEMENTS *******************************************************
GRANT purchases_reader_role TO george,maria;
Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl 2010-01-05
13:24:33 UTC (rev 1526)
+++
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl 2010-01-05
13:31:47 UTC (rev 1527)
@@ -37,4 +37,13 @@
(HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
+GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
+GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;
+
+GRANT SELECT ON TABLE orders.bills to PUBLIC;
+
+GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;
+
+
+