Author: shawkins
Date: 2012-01-13 14:26:57 -0500 (Fri, 13 Jan 2012)
New Revision: 3793
Modified:
trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
Log:
TEIID-1819 adding the ability to select parent values
Modified: trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-01-12 18:43:23 UTC
(rev 3792)
+++ trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-01-13 19:26:57 UTC
(rev 3793)
@@ -34,7 +34,8 @@
<LI>return ReusableExecution instances for processing nodes that issue
multiple queries.
<LI>translators may indicate support for dependent join handling
</UL>
- <LI><B>Continuous Asynch Queries</B> to process plans in a streamed
window fashion the TeiidStatement/TeiidPreparedStatement methods now take a RequestOptions
object to specify continuous mode. See the Client and Developers Guides for more.
+ <LI><B>Continuous Asynch Queries</B> to process plans in a streamed
window fashion the TeiidStatement/TeiidPreparedStatement methods now take a RequestOptions
object to specify continuous mode. See the Client and Developers Guides for more.
+ <LI><B>Texttable selectors</B> - can be used to selectively parse
only record lines matching a given selector string. Selectors may also be used for column
values to join data from other records positionally.
</UL>
<h2><a name="Compatibility">Compatibility
Issues</a></h2>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2012-01-12
18:43:23 UTC (rev 3792)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2012-01-13
19:26:57 UTC (rev 3793)
@@ -24,8 +24,14 @@
</para></entry></row>
<row><entry><para>
+<IN_MULTI_LINE_COMMENT> MORE : {
+"/*" : {
+}
+
+</para></entry></row>
+<row><entry><para>
<IN_MULTI_LINE_COMMENT> SPECIAL : {
-<MULTI_LINE_COMMENT: "*/"> : DEFAULT
+"*/" : {
}
</para></entry></row>
@@ -354,7 +360,8 @@
| <BOOLEANTYPE: "{" "b">
| <POS_REF: ["$"] (<DIGIT>)+>
| <INTEGERVAL: (<MINUS>)? (<DIGIT>)+>
-| <FLOATVAL: (<MINUS>)? (<DIGIT>)*
<PERIOD> (<DIGIT>)+ (["e","E"]
(["+","-"])? (<DIGIT>)+)?>
+| <DECIMALVAL: (<MINUS>)? (<DIGIT>)*
<PERIOD> (<DIGIT>)+>
+| <FLOATVAL: (<MINUS>)? <DIGIT> <PERIOD>
(<DIGIT>)+ ["e","E"] (["+","-"])?
(<DIGIT>)+>
| <STRINGVAL: ("N" | "E")? "\'"
("\'\'" | ~["\'"])* "\'">
| <#LETTER: ["a"-"z","A"-"Z"] |
["\u0153"-"\ufffd"]>
| <#DIGIT: ["0"-"9"]>
@@ -412,7 +419,7 @@
<row>
<entry align="right" valign="top"><para><anchor
id="prod3" xreflabel="command"/>command</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod4">createUpdateProcedure</link> | <link
linkend="prod5">userCommand</link> | <link
linkend="prod6">callableStatement</link> ) ( <SEMICOLON>
)? <EOF></para></entry></row>
+( <link linkend="prod4">createProcedure</link> | <link
linkend="prod5">userCommand</link> | <link
linkend="prod6">callableStatement</link> ) ( <SEMICOLON>
)? <EOF></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod7"
xreflabel="designerCommand"/>designerCommand</para></entry>
<entry align="left" valign="top"><para>::=
@@ -420,7 +427,7 @@
<row>
<entry align="right" valign="top"><para><anchor
id="prod8"
xreflabel="updateProcedure"/>updateProcedure</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod4">createUpdateProcedure</link> | <link
linkend="prod9">forEachRowTriggerAction</link> )
<EOF></para></entry></row>
+( <link linkend="prod4">createProcedure</link> | <link
linkend="prod9">forEachRowTriggerAction</link> )
<EOF></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod10"
xreflabel="createTrigger"/>createTrigger</para></entry>
<entry align="left" valign="top"><para>::=
@@ -482,175 +489,163 @@
<entry align="left" valign="top"><para>::=
<IF> <LPAREN> <link
linkend="prod34">criteria</link> <RPAREN> <link
linkend="prod14">statement</link> ( <ELSE> <link
linkend="prod14">statement</link>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod35"
xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
-<entry align="left" valign="top"><para>::=
-( ( <EQ> | <NE> | <NE2> | <LE> |
<GE> | <LT> | <GT> | <IN> |
<LIKE> | ( <IS> <NULL> ) |
<BETWEEN> ) )? <CRITERIA> ( <ON>
<LPAREN> <link linkend="prod2">id</link> (
<COMMA> <link linkend="prod2">id</link> )*
<RPAREN> )?</para></entry></row>
-<row>
-<entry align="right" valign="top"><para><anchor
id="prod36"
xreflabel="hasCriteria"/>hasCriteria</para></entry>
-<entry align="left" valign="top"><para>::=
-<HAS> <link
linkend="prod35">criteriaSelector</link></para></entry></row>
-<row>
<entry align="right" valign="top"><para><anchor
id="prod32"
xreflabel="declareStatement"/>declareStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<DECLARE> <link linkend="prod37">dataType</link>
<link linkend="prod2">id</link> ( ( <link
linkend="prod11">nonReserved</link> | <EQ> ) <link
linkend="prod38">assignStatementOperand</link>
)?</para></entry></row>
+<DECLARE> <link linkend="prod35">dataType</link>
<link linkend="prod2">id</link> ( ( <link
linkend="prod11">nonReserved</link> | <EQ> ) <link
linkend="prod36">assignStatementOperand</link>
)?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod30"
xreflabel="assignStatement"/>assignStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> ( <link
linkend="prod11">nonReserved</link> | <EQ> ) <link
linkend="prod38">assignStatementOperand</link></para></entry></row>
+<link linkend="prod2">id</link> ( <link
linkend="prod11">nonReserved</link> | <EQ> ) <link
linkend="prod36">assignStatementOperand</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod38"
xreflabel="assignStatementOperand"/>assignStatementOperand</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod36"
xreflabel="assignStatementOperand"/>assignStatementOperand</para></entry>
<entry align="left" valign="top"><para>::=
( ( <link linkend="prod16">insert</link> ) | <link
linkend="prod17">update</link> | <link
linkend="prod18">delete</link> | ( <link
linkend="prod24">expression</link> ) | <link
linkend="prod13">queryExpression</link>
)</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod31"
xreflabel="sqlStatement"/>sqlStatement</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <link linkend="prod5">userCommand</link> ) | <link
linkend="prod39">dynamicCommand</link> | ( <link
linkend="prod2">id</link> ( <link
linkend="prod11">nonReserved</link> | <EQ> ) <link
linkend="prod15">storedProcedure</link> )
)</para></entry></row>
+( ( <link linkend="prod5">userCommand</link> ) | <link
linkend="prod37">dynamicCommand</link> | ( <link
linkend="prod2">id</link> ( <link
linkend="prod11">nonReserved</link> | <EQ> ) <link
linkend="prod15">storedProcedure</link> )
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod40"
xreflabel="translateCriteria"/>translateCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod4"
xreflabel="createProcedure"/>createProcedure</para></entry>
<entry align="left" valign="top"><para>::=
-<TRANSLATE> <link
linkend="prod35">criteriaSelector</link> ( <WITH>
<LPAREN> <link linkend="prod2">id</link>
<EQ> <link linkend="prod24">expression</link> (
<COMMA> <link linkend="prod2">id</link>
<EQ> <link linkend="prod24">expression</link> )*
<RPAREN> )?</para></entry></row>
+<CREATE> ( <VIRTUAL> )? <PROCEDURE> <link
linkend="prod14">statement</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod4"
xreflabel="createUpdateProcedure"/>createUpdateProcedure</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod37"
xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
<entry align="left" valign="top"><para>::=
-<CREATE> ( <VIRTUAL> )? ( <UPDATE> )?
<PROCEDURE> <link
linkend="prod14">statement</link></para></entry></row>
+( <EXECUTE> | <EXEC> ) ( ( <STRING> |
<IMMEDIATE> ) )? <link
linkend="prod24">expression</link> ( <AS> <link
linkend="prod38">createElementsWithTypes</link> ( <INTO>
<link linkend="prod2">id</link> )? )? ( <USING>
<link linkend="prod39">setClauseList</link> )? (
<UPDATE> ( ( <INTEGERVAL> ) | ( <STAR> ) )
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod39"
xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod39"
xreflabel="setClauseList"/>setClauseList</para></entry>
<entry align="left" valign="top"><para>::=
-( <EXECUTE> | <EXEC> ) ( ( <STRING> |
<IMMEDIATE> ) )? <link
linkend="prod24">expression</link> ( <AS> <link
linkend="prod41">createElementsWithTypes</link> ( <INTO>
<link linkend="prod2">id</link> )? )? ( <USING>
<link linkend="prod42">setClauseList</link> )? (
<UPDATE> ( ( <INTEGERVAL> ) | ( <STAR> ) )
)?</para></entry></row>
-<row>
-<entry align="right" valign="top"><para><anchor
id="prod42"
xreflabel="setClauseList"/>setClauseList</para></entry>
-<entry align="left" valign="top"><para>::=
<link linkend="prod2">id</link> <EQ> (
<COMMA> <link linkend="prod2">id</link>
<EQ> )*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod41"
xreflabel="createElementsWithTypes"/>createElementsWithTypes</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod38"
xreflabel="createElementsWithTypes"/>createElementsWithTypes</para></entry>
<entry align="left" valign="top"><para>::=
<link linkend="prod2">id</link> <link
linkend="prod22">dataTypeString</link> ( <COMMA> <link
linkend="prod2">id</link> <link
linkend="prod22">dataTypeString</link>
)*</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod6"
xreflabel="callableStatement"/>callableStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<LBRACE> ( <QMARK> <EQ> )? <CALL>
<link linkend="prod2">id</link> ( <LPAREN> ( <link
linkend="prod43">executeUnnamedParams</link> ) <RPAREN>
)? <RBRACE> ( <link linkend="prod44">option</link>
)?</para></entry></row>
+<LBRACE> ( <QMARK> <EQ> )? <CALL>
<link linkend="prod2">id</link> ( <LPAREN> ( <link
linkend="prod40">executeUnnamedParams</link> ) <RPAREN>
)? <RBRACE> ( <link linkend="prod41">option</link>
)?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod15"
xreflabel="storedProcedure"/>storedProcedure</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <EXEC> | <EXECUTE> | <CALL> ) <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod45">executeNamedParams</link> | <link
linkend="prod43">executeUnnamedParams</link> ) <RPAREN> )
( <link linkend="prod44">option</link>
)?</para></entry></row>
+( ( <EXEC> | <EXECUTE> | <CALL> ) <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod42">executeNamedParams</link> | <link
linkend="prod40">executeUnnamedParams</link> ) <RPAREN> )
( <link linkend="prod41">option</link>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod43"
xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod40"
xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod24">expression</link> ( <COMMA>
<link linkend="prod24">expression</link> )*
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod45"
xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod42"
xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod2">id</link> <EQ> (
<GT> )? <link linkend="prod24">expression</link> (
<COMMA> <link linkend="prod2">id</link>
<EQ> ( <GT> )? <link
linkend="prod24">expression</link> )*
)</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod16" xreflabel="insert"/>insert</para></entry>
<entry align="left" valign="top"><para>::=
-<INSERT> <INTO> <link
linkend="prod2">id</link> ( <link
linkend="prod46">columnList</link> )? ( ( <VALUES>
<LPAREN> <link linkend="prod47">expressionList</link>
<RPAREN> ) | ( <link
linkend="prod13">queryExpression</link> ) ) ( <link
linkend="prod44">option</link>
)?</para></entry></row>
+<INSERT> <INTO> <link
linkend="prod2">id</link> ( <link
linkend="prod43">columnList</link> )? ( ( <VALUES>
<LPAREN> <link linkend="prod44">expressionList</link>
<RPAREN> ) | ( <link
linkend="prod13">queryExpression</link> ) ) ( <link
linkend="prod41">option</link>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod46"
xreflabel="columnList"/>columnList</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod43"
xreflabel="columnList"/>columnList</para></entry>
<entry align="left" valign="top"><para>::=
<LPAREN> <link linkend="prod2">id</link> (
<COMMA> <link linkend="prod2">id</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod47"
xreflabel="expressionList"/>expressionList</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod44"
xreflabel="expressionList"/>expressionList</para></entry>
<entry align="left" valign="top"><para>::=
<link linkend="prod24">expression</link> ( <COMMA>
<link linkend="prod24">expression</link>
)*</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod17" xreflabel="update"/>update</para></entry>
<entry align="left" valign="top"><para>::=
-<UPDATE> <link linkend="prod2">id</link>
<SET> <link linkend="prod42">setClauseList</link> (
<link linkend="prod48">where</link> )? ( <link
linkend="prod44">option</link>
)?</para></entry></row>
+<UPDATE> <link linkend="prod2">id</link>
<SET> <link linkend="prod39">setClauseList</link> (
<link linkend="prod45">where</link> )? ( <link
linkend="prod41">option</link>
)?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod18" xreflabel="delete"/>delete</para></entry>
<entry align="left" valign="top"><para>::=
-<DELETE> <FROM> <link
linkend="prod2">id</link> ( <link
linkend="prod48">where</link> )? ( <link
linkend="prod44">option</link>
)?</para></entry></row>
+<DELETE> <FROM> <link
linkend="prod2">id</link> ( <link
linkend="prod45">where</link> )? ( <link
linkend="prod41">option</link>
)?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod13"
xreflabel="queryExpression"/>queryExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <WITH> <link
linkend="prod49">withListElement</link> ( <COMMA>
<link linkend="prod49">withListElement</link> )* )? <link
linkend="prod50">queryExpressionBody</link></para></entry></row>
+( <WITH> <link
linkend="prod46">withListElement</link> ( <COMMA>
<link linkend="prod46">withListElement</link> )* )? <link
linkend="prod47">queryExpressionBody</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod49"
xreflabel="withListElement"/>withListElement</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod46"
xreflabel="withListElement"/>withListElement</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> ( <link
linkend="prod46">columnList</link> )? <AS>
<LPAREN> <link linkend="prod13">queryExpression</link>
<RPAREN></para></entry></row>
+<link linkend="prod2">id</link> ( <link
linkend="prod43">columnList</link> )? <AS>
<LPAREN> <link linkend="prod13">queryExpression</link>
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod50"
xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod47"
xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod51">queryTerm</link> ( ( <UNION> |
<EXCEPT> ) ( <ALL> | <DISTINCT> )? <link
linkend="prod51">queryTerm</link> )* ( <link
linkend="prod52">orderby</link> )? ( <link
linkend="prod53">limit</link> )? ( <link
linkend="prod44">option</link>
)?</para></entry></row>
+<link linkend="prod48">queryTerm</link> ( ( <UNION> |
<EXCEPT> ) ( <ALL> | <DISTINCT> )? <link
linkend="prod48">queryTerm</link> )* ( <link
linkend="prod49">orderby</link> )? ( <link
linkend="prod50">limit</link> )? ( <link
linkend="prod41">option</link>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod51"
xreflabel="queryTerm"/>queryTerm</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod48"
xreflabel="queryTerm"/>queryTerm</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod54">queryPrimary</link> (
<INTERSECT> ( <ALL> | <DISTINCT> )? <link
linkend="prod54">queryPrimary</link>
)*</para></entry></row>
+<link linkend="prod51">queryPrimary</link> (
<INTERSECT> ( <ALL> | <DISTINCT> )? <link
linkend="prod51">queryPrimary</link>
)*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod54"
xreflabel="queryPrimary"/>queryPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod51"
xreflabel="queryPrimary"/>queryPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod55">query</link> | ( <TABLE>
<link linkend="prod2">id</link> ) | ( <LPAREN>
<link linkend="prod50">queryExpressionBody</link>
<RPAREN> ) )</para></entry></row>
+( <link linkend="prod52">query</link> | ( <TABLE>
<link linkend="prod2">id</link> ) | ( <LPAREN>
<link linkend="prod47">queryExpressionBody</link>
<RPAREN> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod55" xreflabel="query"/>query</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod52" xreflabel="query"/>query</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod56">select</link> ( <link
linkend="prod57">into</link> )? ( <link
linkend="prod58">from</link> ( <link
linkend="prod48">where</link> )? ( <link
linkend="prod59">groupBy</link> )? ( <link
linkend="prod60">having</link> )?
)?</para></entry></row>
+<link linkend="prod53">select</link> ( <link
linkend="prod54">into</link> )? ( <link
linkend="prod55">from</link> ( <link
linkend="prod45">where</link> )? ( <link
linkend="prod56">groupBy</link> )? ( <link
linkend="prod57">having</link> )?
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod57" xreflabel="into"/>into</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod54" xreflabel="into"/>into</para></entry>
<entry align="left" valign="top"><para>::=
<INTO> ( <link linkend="prod2">id</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod56" xreflabel="select"/>select</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod53" xreflabel="select"/>select</para></entry>
<entry align="left" valign="top"><para>::=
-<SELECT> ( <ALL> | ( <DISTINCT> ) )? (
<STAR> | ( <link linkend="prod61">selectSymbol</link>
( <COMMA> <link linkend="prod61">selectSymbol</link>
)* ) )</para></entry></row>
+<SELECT> ( <ALL> | ( <DISTINCT> ) )? (
<STAR> | ( <link linkend="prod58">selectSymbol</link>
( <COMMA> <link linkend="prod58">selectSymbol</link>
)* ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod61"
xreflabel="selectSymbol"/>selectSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod58"
xreflabel="selectSymbol"/>selectSymbol</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod62">selectExpression</link> | <link
linkend="prod63">allInGroupSymbol</link>
)</para></entry></row>
+( <link linkend="prod59">selectExpression</link> | <link
linkend="prod60">allInGroupSymbol</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod62"
xreflabel="selectExpression"/>selectExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod59"
xreflabel="selectExpression"/>selectExpression</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod24">expression</link> ( ( <AS>
)? <link linkend="prod2">id</link> )?
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod64"
xreflabel="derivedColumn"/>derivedColumn</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod61"
xreflabel="derivedColumn"/>derivedColumn</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod24">expression</link> ( <AS>
<link linkend="prod2">id</link> )?
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod63"
xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod60"
xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
<entry align="left" valign="top"><para>::=
<ALL_IN_GROUP></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod65"
xreflabel="orderedAgg"/>orderedAgg</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod62"
xreflabel="orderedAgg"/>orderedAgg</para></entry>
<entry align="left" valign="top"><para>::=
-( <XMLAGG> | <ARRAY_AGG> ) <LPAREN> <link
linkend="prod24">expression</link> ( <link
linkend="prod52">orderby</link> )? <RPAREN> <link
linkend="prod66">filterClause</link></para></entry></row>
+( <XMLAGG> | <ARRAY_AGG> ) <LPAREN> <link
linkend="prod24">expression</link> ( <link
linkend="prod49">orderby</link> )? <RPAREN> <link
linkend="prod63">filterClause</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod67"
xreflabel="textAgg"/>textAgg</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod64"
xreflabel="textAgg"/>textAgg</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod11">nonReserved</link> <LPAREN>
<FOR> <link linkend="prod64">derivedColumn</link> (
<COMMA> <link linkend="prod64">derivedColumn</link> )*
( <ID> <link linkend="prod68">charVal</link> )? ( (
<ID> <link linkend="prod68">charVal</link> ) )? (
<ID> )? ( ( <ID> <link
linkend="prod2">id</link> ) )? ( <link
linkend="prod52">orderby</link> )? <RPAREN> <link
linkend="prod66">filterClause</link></para></entry></row>
+<link linkend="prod11">nonReserved</link> <LPAREN>
<FOR> <link linkend="prod61">derivedColumn</link> (
<COMMA> <link linkend="prod61">derivedColumn</link> )*
( <ID> <link linkend="prod65">charVal</link> )? ( (
<ID> <link linkend="prod65">charVal</link> ) )? (
<ID> )? ( ( <ID> <link
linkend="prod2">id</link> ) )? ( <link
linkend="prod49">orderby</link> )? <RPAREN> <link
linkend="prod63">filterClause</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod69"
xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod66"
xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
<entry align="left" valign="top"><para>::=
-( ( ( <link linkend="prod11">nonReserved</link>
<LPAREN> <STAR> <RPAREN> ) | ( <link
linkend="prod11">nonReserved</link> <LPAREN>
<RPAREN> ) | ( ( <link
linkend="prod11">nonReserved</link> | <ANY> |
<SOME> ) <LPAREN> ( <DISTINCT> |
<ALL> )? <link linkend="prod24">expression</link>
<RPAREN> ) ) <link
linkend="prod66">filterClause</link>
)</para></entry></row>
+( ( ( <link linkend="prod11">nonReserved</link>
<LPAREN> <STAR> <RPAREN> ) | ( <link
linkend="prod11">nonReserved</link> <LPAREN>
<RPAREN> ) | ( ( <link
linkend="prod11">nonReserved</link> | <ANY> |
<SOME> ) <LPAREN> ( <DISTINCT> |
<ALL> )? <link linkend="prod24">expression</link>
<RPAREN> ) ) <link
linkend="prod63">filterClause</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod66"
xreflabel="filterClause"/>filterClause</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod63"
xreflabel="filterClause"/>filterClause</para></entry>
<entry align="left" valign="top"><para>::=
-( <FILTER> <LPAREN> <WHERE> <link
linkend="prod70">booleanPrimary</link> <RPAREN>
)?</para></entry></row>
+( <FILTER> <LPAREN> <WHERE> <link
linkend="prod67">booleanPrimary</link> <RPAREN>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod58" xreflabel="from"/>from</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod55" xreflabel="from"/>from</para></entry>
<entry align="left" valign="top"><para>::=
-<FROM> ( <link linkend="prod71">tableReference</link>
( <COMMA> <link linkend="prod71">tableReference</link>
)* )</para></entry></row>
+<FROM> ( <link linkend="prod68">tableReference</link>
( <COMMA> <link linkend="prod68">tableReference</link>
)* )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod71"
xreflabel="tableReference"/>tableReference</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod68"
xreflabel="tableReference"/>tableReference</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <LBRACE> <link
linkend="prod11">nonReserved</link> <link
linkend="prod72">joinedTable</link> <RBRACE> ) | <link
linkend="prod72">joinedTable</link>
)</para></entry></row>
+( ( <LBRACE> <link
linkend="prod11">nonReserved</link> <link
linkend="prod69">joinedTable</link> <RBRACE> ) | <link
linkend="prod69">joinedTable</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod72"
xreflabel="joinedTable"/>joinedTable</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod69"
xreflabel="joinedTable"/>joinedTable</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod73">tablePrimary</link> ( ( <link
linkend="prod74">crossJoin</link> | <link
linkend="prod75">qualifiedJoin</link> )
)*</para></entry></row>
+<link linkend="prod70">tablePrimary</link> ( ( <link
linkend="prod71">crossJoin</link> | <link
linkend="prod72">qualifiedJoin</link> )
)*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod74"
xreflabel="crossJoin"/>crossJoin</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod71"
xreflabel="crossJoin"/>crossJoin</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <CROSS> | <UNION> ) <JOIN> <link
linkend="prod73">tablePrimary</link>
)</para></entry></row>
+( ( <CROSS> | <UNION> ) <JOIN> <link
linkend="prod70">tablePrimary</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod75"
xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod72"
xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
<entry align="left" valign="top"><para>::=
-( ( ( <RIGHT> ( <OUTER> )? ) | ( <LEFT> (
<OUTER> )? ) | ( <FULL> ( <OUTER> )? ) |
<INNER> )? <JOIN> <link
linkend="prod71">tableReference</link> <ON> <link
linkend="prod34">criteria</link>
)</para></entry></row>
+( ( ( <RIGHT> ( <OUTER> )? ) | ( <LEFT> (
<OUTER> )? ) | ( <FULL> ( <OUTER> )? ) |
<INNER> )? <JOIN> <link
linkend="prod68">tableReference</link> <ON> <link
linkend="prod34">criteria</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod73"
xreflabel="tablePrimary"/>tablePrimary</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod70"
xreflabel="tablePrimary"/>tablePrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod76">textTable</link> | <link
linkend="prod77">arrayTable</link> | <link
linkend="prod78">xmlTable</link> | <link
linkend="prod79">unaryFromClause</link> | <link
linkend="prod80">subqueryFromClause</link> | ( <LPAREN>
<link linkend="prod72">joinedTable</link> <RPAREN> ) )
( ( <MAKEDEP> ) | ( <MAKENOTDEP> )
)?</para></entry></row>
+( <link linkend="prod73">textTable</link> | <link
linkend="prod74">arrayTable</link> | <link
linkend="prod75">xmlTable</link> | <link
linkend="prod76">unaryFromClause</link> | <link
linkend="prod77">subqueryFromClause</link> | ( <LPAREN>
<link linkend="prod69">joinedTable</link> <RPAREN> ) )
( ( <MAKEDEP> ) | ( <MAKENOTDEP> )
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod81"
xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod78"
xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
<entry align="left" valign="top"><para>::=
<XMLSERIALIZE> <LPAREN> ( <link
linkend="prod11">nonReserved</link> )? <link
linkend="prod24">expression</link> ( <AS> (
<STRING> | <VARCHAR> | <CLOB> ) )?
<RPAREN></para></entry></row>
<row>
@@ -658,147 +653,147 @@
<entry align="left" valign="top"><para>::=
<ID></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod77"
xreflabel="arrayTable"/>arrayTable</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod74"
xreflabel="arrayTable"/>arrayTable</para></entry>
<entry align="left" valign="top"><para>::=
-<ID> <LPAREN> <link
linkend="prod24">expression</link> <link
linkend="prod11">nonReserved</link> <link
linkend="prod41">createElementsWithTypes</link> <RPAREN>
( <AS> )? <link
linkend="prod2">id</link></para></entry></row>
+<ID> <LPAREN> <link
linkend="prod24">expression</link> <link
linkend="prod11">nonReserved</link> <link
linkend="prod38">createElementsWithTypes</link> <RPAREN>
( <AS> )? <link
linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod76"
xreflabel="textTable"/>textTable</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod73"
xreflabel="textTable"/>textTable</para></entry>
<entry align="left" valign="top"><para>::=
-<ID> <LPAREN> <link
linkend="prod24">expression</link> <link
linkend="prod11">nonReserved</link> <link
linkend="prod82">textColumn</link> ( <COMMA> <link
linkend="prod82">textColumn</link> )* ( <NO>
<ROW> <link linkend="prod11">nonReserved</link> )? (
<ID> <link linkend="prod68">charVal</link> )? ( (
<ESCAPE> <link linkend="prod68">charVal</link> ) | (
<ID> <link linkend="prod68">charVal</link> ) )? (
<ID> ( <link linkend="prod83">intVal</link> )? )? (
<ID> <link linkend="prod83">intVal</link> )?
<RPAREN> ( <AS> )? <link
linkend="prod2">id</link></para></entry></row>
+<ID> <LPAREN> <link
linkend="prod24">expression</link> ( <ID> <link
linkend="prod1">stringVal</link> )? <link
linkend="prod11">nonReserved</link> <link
linkend="prod79">textColumn</link> ( <COMMA> <link
linkend="prod79">textColumn</link> )* ( <NO>
<ROW> <link linkend="prod11">nonReserved</link> )? (
<ID> <link linkend="prod65">charVal</link> )? ( (
<ESCAPE> <link linkend="prod65">charVal</link> ) | (
<ID> <link linkend="prod65">charVal</link> ) )? (
<ID> ( <link linkend="prod80">intVal</link> )? )? (
<ID> <link linkend="prod80">intVal</link> )?
<RPAREN> ( <AS> )? <link
linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod82"
xreflabel="textColumn"/>textColumn</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod79"
xreflabel="textColumn"/>textColumn</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> <link
linkend="prod37">dataType</link> ( <ID> <link
linkend="prod83">intVal</link> ( <NO> <link
linkend="prod11">nonReserved</link> )?
)?</para></entry></row>
+<link linkend="prod2">id</link> <link
linkend="prod35">dataType</link> ( <ID> <link
linkend="prod80">intVal</link> ( <NO> <link
linkend="prod11">nonReserved</link> )? )? ( <ID> <link
linkend="prod1">stringVal</link> <link
linkend="prod80">intVal</link>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod84"
xreflabel="xmlQuery"/>xmlQuery</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod81"
xreflabel="xmlQuery"/>xmlQuery</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLQUERY> <LPAREN> ( <link
linkend="prod85">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod64">derivedColumn</link> ( <COMMA> <link
linkend="prod64">derivedColumn</link> )* )? ( ( <NULL> |
<link linkend="prod11">nonReserved</link> ) <ON>
<link linkend="prod11">nonReserved</link> )?
<RPAREN></para></entry></row>
+<XMLQUERY> <LPAREN> ( <link
linkend="prod82">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod61">derivedColumn</link> ( <COMMA> <link
linkend="prod61">derivedColumn</link> )* )? ( ( <NULL> |
<link linkend="prod11">nonReserved</link> ) <ON>
<link linkend="prod11">nonReserved</link> )?
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod78"
xreflabel="xmlTable"/>xmlTable</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod75"
xreflabel="xmlTable"/>xmlTable</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLTABLE> <LPAREN> ( <link
linkend="prod85">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod64">derivedColumn</link> ( <COMMA> <link
linkend="prod64">derivedColumn</link> )* )? ( <ID>
<link linkend="prod86">xmlColumn</link> ( <COMMA>
<link linkend="prod86">xmlColumn</link> )* )? <RPAREN>
( <AS> )? <link
linkend="prod2">id</link></para></entry></row>
+<XMLTABLE> <LPAREN> ( <link
linkend="prod82">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod61">derivedColumn</link> ( <COMMA> <link
linkend="prod61">derivedColumn</link> )* )? ( <ID>
<link linkend="prod83">xmlColumn</link> ( <COMMA>
<link linkend="prod83">xmlColumn</link> )* )? <RPAREN>
( <AS> )? <link
linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod86"
xreflabel="xmlColumn"/>xmlColumn</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod83"
xreflabel="xmlColumn"/>xmlColumn</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> ( ( <FOR> <link
linkend="prod11">nonReserved</link> ) | ( <link
linkend="prod37">dataType</link> ( <DEFAULT_KEYWORD>
<link linkend="prod24">expression</link> )? ( <link
linkend="prod11">nonReserved</link> <link
linkend="prod1">stringVal</link> )? )
)</para></entry></row>
+<link linkend="prod2">id</link> ( ( <FOR> <link
linkend="prod11">nonReserved</link> ) | ( <link
linkend="prod35">dataType</link> ( <DEFAULT_KEYWORD>
<link linkend="prod24">expression</link> )? ( <link
linkend="prod11">nonReserved</link> <link
linkend="prod1">stringVal</link> )? )
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod83" xreflabel="intVal"/>intVal</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod80" xreflabel="intVal"/>intVal</para></entry>
<entry align="left" valign="top"><para>::=
<INTEGERVAL></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod80"
xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod77"
xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
<entry align="left" valign="top"><para>::=
( <TABLE> )? <LPAREN> ( <link
linkend="prod13">queryExpression</link> | <link
linkend="prod15">storedProcedure</link> ) <RPAREN> (
<AS> )? <link
linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod79"
xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod76"
xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
<entry align="left" valign="top"><para>::=
( <ID> ( ( <AS> )? <link
linkend="prod2">id</link> )? )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod48" xreflabel="where"/>where</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod45" xreflabel="where"/>where</para></entry>
<entry align="left" valign="top"><para>::=
<WHERE> <link
linkend="prod34">criteria</link></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod34"
xreflabel="criteria"/>criteria</para></entry>
<entry align="left" valign="top"><para>::=
-<link
linkend="prod87">compoundCritOr</link></para></entry></row>
+<link
linkend="prod84">compoundCritOr</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod87"
xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod84"
xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod88">compoundCritAnd</link> ( <OR>
<link linkend="prod88">compoundCritAnd</link>
)*</para></entry></row>
+<link linkend="prod85">compoundCritAnd</link> ( <OR>
<link linkend="prod85">compoundCritAnd</link>
)*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod88"
xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod85"
xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod89">notCrit</link> ( <AND>
<link linkend="prod89">notCrit</link>
)*</para></entry></row>
+<link linkend="prod86">notCrit</link> ( <AND>
<link linkend="prod86">notCrit</link>
)*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod89"
xreflabel="notCrit"/>notCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod86"
xreflabel="notCrit"/>notCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <link
linkend="prod70">booleanPrimary</link></para></entry></row>
+( <NOT> )? <link
linkend="prod67">booleanPrimary</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod70"
xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod67"
xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod40">translateCriteria</link> | ( <link
linkend="prod90">commonValueExpression</link> ( ( <link
linkend="prod91">betweenCrit</link> | <link
linkend="prod92">matchCrit</link> | <link
linkend="prod93">regexMatchCrit</link> | <link
linkend="prod94">setCrit</link> | <link
linkend="prod95">isNullCrit</link> | <link
linkend="prod96">subqueryCompareCriteria</link> | <link
linkend="prod97">compareCrit</link> ) )? ) | <link
linkend="prod98">existsCriteria</link> | <link
linkend="prod36">hasCriteria</link>
)</para></entry></row>
+( ( <link linkend="prod87">commonValueExpression</link> ( (
<link linkend="prod88">betweenCrit</link> | <link
linkend="prod89">matchCrit</link> | <link
linkend="prod90">regexMatchCrit</link> | <link
linkend="prod91">setCrit</link> | <link
linkend="prod92">isNullCrit</link> | <link
linkend="prod93">subqueryCompareCriteria</link> | <link
linkend="prod94">compareCrit</link> ) )? ) | <link
linkend="prod95">existsCriteria</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod99"
xreflabel="operator"/>operator</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod96"
xreflabel="operator"/>operator</para></entry>
<entry align="left" valign="top"><para>::=
( <EQ> | <NE> | <NE2> | <LT> |
<LE> | <GT> | <GE>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod97"
xreflabel="compareCrit"/>compareCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod94"
xreflabel="compareCrit"/>compareCrit</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod99">operator</link> <link
linkend="prod90">commonValueExpression</link></para></entry></row>
+<link linkend="prod96">operator</link> <link
linkend="prod87">commonValueExpression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod100"
xreflabel="subquery"/>subquery</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod97"
xreflabel="subquery"/>subquery</para></entry>
<entry align="left" valign="top"><para>::=
<LPAREN> ( <link
linkend="prod13">queryExpression</link> | ( <link
linkend="prod15">storedProcedure</link> ) )
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod101"
xreflabel="subqueryAndHint"/>subqueryAndHint</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod98"
xreflabel="subqueryAndHint"/>subqueryAndHint</para></entry>
<entry align="left" valign="top"><para>::=
-<link
linkend="prod100">subquery</link></para></entry></row>
+<link
linkend="prod97">subquery</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod96"
xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod93"
xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod99">operator</link> ( <ANY> |
<SOME> | <ALL> ) <link
linkend="prod100">subquery</link></para></entry></row>
+<link linkend="prod96">operator</link> ( <ANY> |
<SOME> | <ALL> ) <link
linkend="prod97">subquery</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod92"
xreflabel="matchCrit"/>matchCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod89"
xreflabel="matchCrit"/>matchCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? ( <LIKE> | ( <SIMILAR>
<TO> ) ) <link
linkend="prod90">commonValueExpression</link> ( <ESCAPE>
<link linkend="prod68">charVal</link> | ( <LBRACE>
<ESCAPE> <link linkend="prod68">charVal</link>
<RBRACE> ) )?</para></entry></row>
+( <NOT> )? ( <LIKE> | ( <SIMILAR>
<TO> ) ) <link
linkend="prod87">commonValueExpression</link> ( <ESCAPE>
<link linkend="prod65">charVal</link> | ( <LBRACE>
<ESCAPE> <link linkend="prod65">charVal</link>
<RBRACE> ) )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod93"
xreflabel="regexMatchCrit"/>regexMatchCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod90"
xreflabel="regexMatchCrit"/>regexMatchCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <LIKE_REGEX> <link
linkend="prod90">commonValueExpression</link></para></entry></row>
+( <NOT> )? <LIKE_REGEX> <link
linkend="prod87">commonValueExpression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod68"
xreflabel="charVal"/>charVal</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod65"
xreflabel="charVal"/>charVal</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod1">stringVal</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod91"
xreflabel="betweenCrit"/>betweenCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod88"
xreflabel="betweenCrit"/>betweenCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <BETWEEN> <link
linkend="prod90">commonValueExpression</link> <AND>
<link
linkend="prod90">commonValueExpression</link></para></entry></row>
+( <NOT> )? <BETWEEN> <link
linkend="prod87">commonValueExpression</link> <AND>
<link
linkend="prod87">commonValueExpression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod95"
xreflabel="isNullCrit"/>isNullCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod92"
xreflabel="isNullCrit"/>isNullCrit</para></entry>
<entry align="left" valign="top"><para>::=
<IS> ( <NOT> )?
<NULL></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod94"
xreflabel="setCrit"/>setCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod91"
xreflabel="setCrit"/>setCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <IN> ( ( <link
linkend="prod101">subqueryAndHint</link> ) | ( <LPAREN>
<link linkend="prod90">commonValueExpression</link> (
<COMMA> <link
linkend="prod90">commonValueExpression</link> )* <RPAREN>
) )</para></entry></row>
+( <NOT> )? <IN> ( ( <link
linkend="prod98">subqueryAndHint</link> ) | ( <LPAREN>
<link linkend="prod87">commonValueExpression</link> (
<COMMA> <link
linkend="prod87">commonValueExpression</link> )* <RPAREN>
) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod98"
xreflabel="existsCriteria"/>existsCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod95"
xreflabel="existsCriteria"/>existsCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<EXISTS> <link
linkend="prod101">subqueryAndHint</link></para></entry></row>
+<EXISTS> <link
linkend="prod98">subqueryAndHint</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod59"
xreflabel="groupBy"/>groupBy</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod56"
xreflabel="groupBy"/>groupBy</para></entry>
<entry align="left" valign="top"><para>::=
-<GROUP> <BY> <link
linkend="prod47">expressionList</link></para></entry></row>
+<GROUP> <BY> <link
linkend="prod44">expressionList</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod60" xreflabel="having"/>having</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod57" xreflabel="having"/>having</para></entry>
<entry align="left" valign="top"><para>::=
<HAVING> <link
linkend="prod34">criteria</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod52"
xreflabel="orderby"/>orderby</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod49"
xreflabel="orderby"/>orderby</para></entry>
<entry align="left" valign="top"><para>::=
-<ORDER> <BY> <link
linkend="prod102">sortSpecification</link> ( <COMMA>
<link linkend="prod102">sortSpecification</link>
)*</para></entry></row>
+<ORDER> <BY> <link
linkend="prod99">sortSpecification</link> ( <COMMA>
<link linkend="prod99">sortSpecification</link>
)*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod102"
xreflabel="sortSpecification"/>sortSpecification</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod99"
xreflabel="sortSpecification"/>sortSpecification</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod103">sortKey</link> ( <ASC> |
<DESC> )? ( <link linkend="prod11">nonReserved</link>
<link linkend="prod11">nonReserved</link>
)?</para></entry></row>
+<link linkend="prod100">sortKey</link> ( <ASC> |
<DESC> )? ( <link linkend="prod11">nonReserved</link>
<link linkend="prod11">nonReserved</link>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod103"
xreflabel="sortKey"/>sortKey</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod100"
xreflabel="sortKey"/>sortKey</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod24">expression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod104"
xreflabel="intParam"/>intParam</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod101"
xreflabel="intParam"/>intParam</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod83">intVal</link> | <QMARK>
)</para></entry></row>
+( <link linkend="prod80">intVal</link> | <QMARK>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod53" xreflabel="limit"/>limit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod50" xreflabel="limit"/>limit</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <LIMIT> <link linkend="prod104">intParam</link> (
<COMMA> <link linkend="prod104">intParam</link> )? ) |
( <OFFSET> <link linkend="prod104">intParam</link> (
<ROW> | <ROWS> ) ( <link
linkend="prod105">fetchLimit</link> )? ) | ( <link
linkend="prod105">fetchLimit</link> )
)</para></entry></row>
+( ( <LIMIT> <link linkend="prod101">intParam</link> (
<COMMA> <link linkend="prod101">intParam</link> )? ) |
( <OFFSET> <link linkend="prod101">intParam</link> (
<ROW> | <ROWS> ) ( <link
linkend="prod102">fetchLimit</link> )? ) | ( <link
linkend="prod102">fetchLimit</link> )
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod105"
xreflabel="fetchLimit"/>fetchLimit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod102"
xreflabel="fetchLimit"/>fetchLimit</para></entry>
<entry align="left" valign="top"><para>::=
-<FETCH> <link linkend="prod11">nonReserved</link> (
<link linkend="prod104">intParam</link> )? ( <ROW> |
<ROWS> ) <ONLY></para></entry></row>
+<FETCH> <link linkend="prod11">nonReserved</link> (
<link linkend="prod101">intParam</link> )? ( <ROW> |
<ROWS> ) <ONLY></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod44" xreflabel="option"/>option</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod41" xreflabel="option"/>option</para></entry>
<entry align="left" valign="top"><para>::=
<OPTION> ( <MAKEDEP> <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* | <MAKENOTDEP> <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* | <NOCACHE> ( <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* )?
)*</para></entry></row>
<row>
@@ -806,75 +801,75 @@
<entry align="left" valign="top"><para>::=
<link
linkend="prod34">criteria</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod90"
xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod87"
xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod106">plusExpression</link> (
<CONCAT_OP> <link
linkend="prod106">plusExpression</link> )*
)</para></entry></row>
+( <link linkend="prod103">plusExpression</link> (
<CONCAT_OP> <link
linkend="prod103">plusExpression</link> )*
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod106"
xreflabel="plusExpression"/>plusExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod103"
xreflabel="plusExpression"/>plusExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod107">timesExpression</link> ( <link
linkend="prod108">plusOperator</link> <link
linkend="prod107">timesExpression</link> )*
)</para></entry></row>
+( <link linkend="prod104">timesExpression</link> ( <link
linkend="prod105">plusOperator</link> <link
linkend="prod104">timesExpression</link> )*
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod108"
xreflabel="plusOperator"/>plusOperator</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod105"
xreflabel="plusOperator"/>plusOperator</para></entry>
<entry align="left" valign="top"><para>::=
( <PLUS> | <MINUS> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod107"
xreflabel="timesExpression"/>timesExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod104"
xreflabel="timesExpression"/>timesExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod109">valueExpressionPrimary</link> ( <link
linkend="prod110">timesOperator</link> <link
linkend="prod109">valueExpressionPrimary</link> )*
)</para></entry></row>
+( <link linkend="prod106">valueExpressionPrimary</link> ( <link
linkend="prod107">timesOperator</link> <link
linkend="prod106">valueExpressionPrimary</link> )*
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod110"
xreflabel="timesOperator"/>timesOperator</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod107"
xreflabel="timesOperator"/>timesOperator</para></entry>
<entry align="left" valign="top"><para>::=
( <STAR> | <SLASH> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod109"
xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod106"
xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <QMARK> | <POS_REF> | <link
linkend="prod111">literal</link> | ( <LBRACE> <link
linkend="prod11">nonReserved</link> <link
linkend="prod112">function</link> <RBRACE> ) | ( <link
linkend="prod67">textAgg</link> ( <link
linkend="prod113">windowSpecification</link> )? ) | ( <link
linkend="prod69">aggregateSymbol</link> ( <link
linkend="prod113">windowSpecification</link> )? ) | ( <link
linkend="prod69">aggregateSymbol</link> ( <link
linkend="prod113">windowSpecification</link> )? ) | <link
linkend="prod65">orderedAgg</link> ( <link
linkend="prod113">windowSpecification</link> )? | ( <link
linkend="prod69">aggregateSymbol</link> <link
linkend="prod113">windowSpecification</link> ) | ( <link
linkend="prod112">function</link> ) | ( <ID> (
<LSBRACE> <link linkend="prod83">intVal</link>
<RSBRACE> )? ) | <link
linkend="prod100">subquery</link> | ( <LPAREN> <link
linkend="prod24">expression</link> <RPAREN> (
<LSBRACE> <link!
linkend="prod83">intVal</link> <RSBRACE> )? ) |
<link linkend="prod114">searchedCaseExpression</link> | <link
linkend="prod115">caseExpression</link>
)</para></entry></row>
+( <QMARK> | <POS_REF> | <link
linkend="prod108">literal</link> | ( <LBRACE> <link
linkend="prod11">nonReserved</link> <link
linkend="prod109">function</link> <RBRACE> ) | ( <link
linkend="prod64">textAgg</link> ( <link
linkend="prod110">windowSpecification</link> )? ) | ( <link
linkend="prod66">aggregateSymbol</link> ( <link
linkend="prod110">windowSpecification</link> )? ) | ( <link
linkend="prod66">aggregateSymbol</link> ( <link
linkend="prod110">windowSpecification</link> )? ) | <link
linkend="prod62">orderedAgg</link> ( <link
linkend="prod110">windowSpecification</link> )? | ( <link
linkend="prod66">aggregateSymbol</link> <link
linkend="prod110">windowSpecification</link> ) | ( <link
linkend="prod109">function</link> ) | ( <ID> (
<LSBRACE> <link linkend="prod80">intVal</link>
<RSBRACE> )? ) | <link
linkend="prod97">subquery</link> | ( <LPAREN> <link
linkend="prod24">expression</link> <RPAREN> (
<LSBRACE> <link !
linkend="prod80">intVal</link> <RSBRACE> )? ) | <link
linkend="prod111">searchedCaseExpression</link> | <link
linkend="prod112">caseExpression</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod113"
xreflabel="windowSpecification"/>windowSpecification</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod110"
xreflabel="windowSpecification"/>windowSpecification</para></entry>
<entry align="left" valign="top"><para>::=
-<OVER> <LPAREN> ( <PARTITION>
<BY> <link linkend="prod47">expressionList</link> )? (
<link linkend="prod52">orderby</link> )?
<RPAREN></para></entry></row>
+<OVER> <LPAREN> ( <PARTITION>
<BY> <link linkend="prod44">expressionList</link> )? (
<link linkend="prod49">orderby</link> )?
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod115"
xreflabel="caseExpression"/>caseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod112"
xreflabel="caseExpression"/>caseExpression</para></entry>
<entry align="left" valign="top"><para>::=
<CASE> <link linkend="prod24">expression</link> (
<WHEN> <link linkend="prod24">expression</link>
<THEN> <link linkend="prod24">expression</link> )+ (
<ELSE> <link linkend="prod24">expression</link> )?
<END></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod114"
xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod111"
xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
<entry align="left" valign="top"><para>::=
<CASE> ( <WHEN> <link
linkend="prod34">criteria</link> <THEN> <link
linkend="prod24">expression</link> )+ ( <ELSE> <link
linkend="prod24">expression</link> )?
<END></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod112"
xreflabel="function"/>function</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod109"
xreflabel="function"/>function</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <CONVERT> <LPAREN> <link
linkend="prod24">expression</link> <COMMA> <link
linkend="prod37">dataType</link> <RPAREN> ) | (
<CAST> <LPAREN> <link
linkend="prod24">expression</link> <AS> <link
linkend="prod37">dataType</link> <RPAREN> ) | ( <link
linkend="prod11">nonReserved</link> <LPAREN> <link
linkend="prod24">expression</link> <FROM> <link
linkend="prod24">expression</link> ( <FOR> <link
linkend="prod24">expression</link> )? <RPAREN> ) | (
<link linkend="prod11">nonReserved</link> <LPAREN> (
<YEAR> | <MONTH> | <DAY> | <HOUR>
| <MINUTE> | <SECOND> ) <FROM> <link
linkend="prod24">expression</link> <RPAREN> ) | (
<link linkend="prod11">nonReserved</link> <LPAREN> ( (
( ( <LEADING> | <TRAILING> | <BOTH> ) ( <link
linkend="prod24">expression</link> )? ) | <link
linkend="prod24">expression</link> ) <FROM> )? <link
linkend!
="prod24">expression</link> <RPAREN> ) | ( <link
linkend="prod11">nonReserved</link> <LPAREN> <link
linkend="prod24">expression</link> <COMMA> <link
linkend="prod116">stringConstant</link> <RPAREN> ) | (
<link linkend="prod11">nonReserved</link> <LPAREN>
<link linkend="prod117">intervalType</link> <COMMA>
<link linkend="prod24">expression</link> <COMMA>
<link linkend="prod24">expression</link> <RPAREN> ) |
<link linkend="prod118">queryString</link> | ( (
<LEFT> | <RIGHT> | <CHAR> | <USER>
| <YEAR> | <MONTH> | <HOUR> |
<MINUTE> | <SECOND> | <XMLCONCAT> |
<XMLCOMMENT> ) <LPAREN> ( <link
linkend="prod47">expressionList</link> )? <RPAREN> ) | (
( <TRANSLATE> | <INSERT> ) <LPAREN> ( <link
linkend="prod47">expressionList</link> )? <RPAREN> ) |
<link linkend="prod119">xmlParse</link> | <link
linkend="prod120">xmlElement</link> | ( &l!
t;XMLPI> <LPAREN> ( <ID> <link
linkend="prod121!
">idExpr
ession</link> | <link linkend="prod121">idExpression</link> )
( <COMMA> <link linkend="prod24">expression</link> )?
<RPAREN> ) | <link linkend="prod122">xmlForest</link>
| <link linkend="prod81">xmlSerialize</link> | <link
linkend="prod84">xmlQuery</link> | ( <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod47">expressionList</link> )? <RPAREN> )
)</para></entry></row>
+( ( <CONVERT> <LPAREN> <link
linkend="prod24">expression</link> <COMMA> <link
linkend="prod35">dataType</link> <RPAREN> ) | (
<CAST> <LPAREN> <link
linkend="prod24">expression</link> <AS> <link
linkend="prod35">dataType</link> <RPAREN> ) | ( <link
linkend="prod11">nonReserved</link> <LPAREN> <link
linkend="prod24">expression</link> ( ( <FROM> <link
linkend="prod24">expression</link> ( <FOR> <link
linkend="prod24">expression</link> )? ) | ( <COMMA>
<link linkend="prod44">expressionList</link> ) )
<RPAREN> ) | ( <link
linkend="prod11">nonReserved</link> <LPAREN> (
<YEAR> | <MONTH> | <DAY> | <HOUR>
| <MINUTE> | <SECOND> ) <FROM> <link
linkend="prod24">expression</link> <RPAREN> ) | (
<link linkend="prod11">nonReserved</link> <LPAREN> ( (
( ( <LEADING> | <TRAILING> | <BOTH> ) ( <link
linkend="prod24">expression</link> )? ) |!
<link linkend="prod24">expression</link> ) <FROM> )?
<link linkend="prod24">expression</link> <RPAREN> ) |
( <link linkend="prod11">nonReserved</link> <LPAREN>
<link linkend="prod24">expression</link> <COMMA>
<link linkend="prod113">stringConstant</link> <RPAREN>
) | ( <link linkend="prod11">nonReserved</link>
<LPAREN> <link linkend="prod114">intervalType</link>
<COMMA> <link linkend="prod24">expression</link>
<COMMA> <link linkend="prod24">expression</link>
<RPAREN> ) | <link
linkend="prod115">queryString</link> | ( ( <LEFT> |
<RIGHT> | <CHAR> | <USER> | <YEAR>
| <MONTH> | <HOUR> | <MINUTE> |
<SECOND> | <XMLCONCAT> | <XMLCOMMENT> )
<LPAREN> ( <link
linkend="prod44">expressionList</link> )? <RPAREN> ) | (
( <TRANSLATE> | <INSERT> ) <LPAREN> ( <link
linkend="prod44">expressionList</link> )? <RPAREN> ) |
<link linkend="pr!
od116">xmlParse</link> | <link
linkend="prod117">xmlElement</l!
ink> | (
<XMLPI> <LPAREN> ( <ID> <link
linkend="prod118">idExpression</link> | <link
linkend="prod118">idExpression</link> ) ( <COMMA>
<link linkend="prod24">expression</link> )? <RPAREN> )
| <link linkend="prod119">xmlForest</link> | <link
linkend="prod78">xmlSerialize</link> | <link
linkend="prod81">xmlQuery</link> | ( <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod44">expressionList</link> )? <RPAREN> )
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod116"
xreflabel="stringConstant"/>stringConstant</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod113"
xreflabel="stringConstant"/>stringConstant</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod1">stringVal</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod119"
xreflabel="xmlParse"/>xmlParse</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod116"
xreflabel="xmlParse"/>xmlParse</para></entry>
<entry align="left" valign="top"><para>::=
<XMLPARSE> <LPAREN> <link
linkend="prod11">nonReserved</link> <link
linkend="prod24">expression</link> ( <link
linkend="prod11">nonReserved</link> )?
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod118"
xreflabel="queryString"/>queryString</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod115"
xreflabel="queryString"/>queryString</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod11">nonReserved</link> <LPAREN>
<link linkend="prod24">expression</link> ( <COMMA>
<link linkend="prod64">derivedColumn</link> )*
<RPAREN></para></entry></row>
+<link linkend="prod11">nonReserved</link> <LPAREN>
<link linkend="prod24">expression</link> ( <COMMA>
<link linkend="prod61">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod120"
xreflabel="xmlElement"/>xmlElement</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod117"
xreflabel="xmlElement"/>xmlElement</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLELEMENT> <LPAREN> ( <ID> <link
linkend="prod2">id</link> | <link
linkend="prod2">id</link> ) ( <COMMA> <link
linkend="prod85">xmlNamespaces</link> )? ( <COMMA>
<link linkend="prod123">xmlAttributes</link> )? (
<COMMA> <link linkend="prod24">expression</link> )*
<RPAREN></para></entry></row>
+<XMLELEMENT> <LPAREN> ( <ID> <link
linkend="prod2">id</link> | <link
linkend="prod2">id</link> ) ( <COMMA> <link
linkend="prod82">xmlNamespaces</link> )? ( <COMMA>
<link linkend="prod120">xmlAttributes</link> )? (
<COMMA> <link linkend="prod24">expression</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod123"
xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod120"
xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLATTRIBUTES> <LPAREN> <link
linkend="prod64">derivedColumn</link> ( <COMMA> <link
linkend="prod64">derivedColumn</link> )*
<RPAREN></para></entry></row>
+<XMLATTRIBUTES> <LPAREN> <link
linkend="prod61">derivedColumn</link> ( <COMMA> <link
linkend="prod61">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod122"
xreflabel="xmlForest"/>xmlForest</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod119"
xreflabel="xmlForest"/>xmlForest</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLFOREST> <LPAREN> ( <link
linkend="prod85">xmlNamespaces</link> <COMMA> )? <link
linkend="prod64">derivedColumn</link> ( <COMMA> <link
linkend="prod64">derivedColumn</link> )*
<RPAREN></para></entry></row>
+<XMLFOREST> <LPAREN> ( <link
linkend="prod82">xmlNamespaces</link> <COMMA> )? <link
linkend="prod61">derivedColumn</link> ( <COMMA> <link
linkend="prod61">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod85"
xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod82"
xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLNAMESPACES> <LPAREN> <link
linkend="prod124">namespaceItem</link> ( <COMMA> <link
linkend="prod124">namespaceItem</link> )*
<RPAREN></para></entry></row>
+<XMLNAMESPACES> <LPAREN> <link
linkend="prod121">namespaceItem</link> ( <COMMA> <link
linkend="prod121">namespaceItem</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod124"
xreflabel="namespaceItem"/>namespaceItem</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod121"
xreflabel="namespaceItem"/>namespaceItem</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod1">stringVal</link> <AS>
<link linkend="prod2">id</link>
)</para></entry></row>
<row>
@@ -886,7 +881,7 @@
<entry align="left" valign="top"><para>::=
( <DEFAULT_KEYWORD> <link
linkend="prod1">stringVal</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod121"
xreflabel="idExpression"/>idExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod118"
xreflabel="idExpression"/>idExpression</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod2">id</link></para></entry></row>
<row>
@@ -894,17 +889,17 @@
<entry align="left" valign="top"><para>::=
( <STRING> | <VARCHAR> | <BOOLEAN> |
<BYTE> | <TINYINT> | <SHORT> |
<SMALLINT> | <CHAR> | <INTEGER> |
<LONG> | <BIGINT> | <BIGINTEGER> |
<FLOAT> | <REAL> | <DOUBLE> |
<BIGDECIMAL> | <DECIMAL> | <DATE> |
<TIME> | <TIMESTAMP> | <OBJECT> |
<BLOB> | <CLOB> | <XML>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod37"
xreflabel="dataType"/>dataType</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod35"
xreflabel="dataType"/>dataType</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod22">dataTypeString</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod117"
xreflabel="intervalType"/>intervalType</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod114"
xreflabel="intervalType"/>intervalType</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod11">nonReserved</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod111"
xreflabel="literal"/>literal</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod108"
xreflabel="literal"/>literal</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod1">stringVal</link> |
<INTEGERVAL> | <FLOATVAL> | <FALSE> |
<TRUE> | <UNKNOWN> | <NULL> | ( (
<BOOLEANTYPE> | <TIMESTAMPTYPE> | <DATETYPE> |
<TIMETYPE> ) <link linkend="prod1">stringVal</link>
<RBRACE> ) )</para></entry></row>
+( <link linkend="prod1">stringVal</link> |
<INTEGERVAL> | <FLOATVAL> | <DECIMALVAL> |
<FALSE> | <TRUE> | <UNKNOWN> |
<NULL> | ( ( <BOOLEANTYPE> | <TIMESTAMPTYPE> |
<DATETYPE> | <TIMETYPE> ) <link
linkend="prod1">stringVal</link> <RBRACE> )
)</para></entry></row>
</tbody>
</tgroup>
</informaltable>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2012-01-12
18:43:23 UTC (rev 3792)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2012-01-13
19:26:57 UTC (rev 3793)
@@ -104,9 +104,9 @@
</para>
<para>
Usage:
- <synopsis label="Usage">TEXTTABLE(expression COLUMNS
<COLUMN>, ... [NO ROW DELIMITER] [DELIMITER char] [(QUOTE|ESCAPE) char]
- [HEADER [integer]] [SKIP integer] [SELECTOR string]) AS name</synopsis>
- <synopsis label="Usage">COLUMN := name datatype [WIDTH integer
[NO TRIM]]</synopsis>
+ <synopsis label="Usage">TEXTTABLE(expression [SELECTOR string]
COLUMNS <COLUMN>, ... [NO ROW DELIMITER] [DELIMITER char] [(QUOTE|ESCAPE)
char]
+ [HEADER [integer]] [SKIP integer]) AS name</synopsis>
+ <synopsis label="Usage">COLUMN := name datatype [WIDTH integer
[NO TRIM]] [SELECTOR string integer]</synopsis>
</para>
<itemizedlist>
<para>Parameters</para>
@@ -115,6 +115,13 @@
</para>
</listitem>
<listitem>
+ <para>SELECTOR specifies that delemited lines should only match if the
line begins with the selector string followed by a delimiter.
+ The selector value is a valid column value. If a TEXTTABLE SELECTOR is
specified, a SELECTOR may also be specified for column values. A column SELECTOR argument
will
+ select the nearest preceeding text line with the given SELECTOR prefix and
select the value at the given 1-based integer position (which includes the selector
itself).
+ If no such text line or position with a given line exists, a null value will be
produced.
+ </para>
+ </listitem>
+ <listitem>
<para>NO ROW DELIMITER indicates that fixed parsing should not assume the
presense of newline row delimiters.
</para>
</listitem>
@@ -143,10 +150,6 @@
</para>
</listitem>
<listitem>
- <para>SELECTOR specifies that delemited lines should only match if the
line begins with the selector string followed by a delimiter. The selector value is a
valid column value.
- </para>
- </listitem>
- <listitem>
<para>WIDTH indicates the fixed-width length of a column in characters -
not bytes. The CR NL newline value counts as a single character.
</para>
</listitem>
@@ -163,7 +166,7 @@
</para>
</listitem>
<listitem>
- <para>If width is specified, then fixed width parsing is used and ESCAPE,
QUOTE, and HEADER should not be specified.
+ <para>If width is specified, then fixed width parsing is used and ESCAPE,
QUOTE, SELECTOR, and HEADER should not be specified.
</para>
</listitem>
<listitem>
@@ -197,6 +200,10 @@
<para>As a nested table: <programlisting>SELECT x.* FROM t,
TEXTTABLE(t.clobcolumn COLUMNS first string, second date SKIP 1) x</programlisting>
</para>
</listitem>
+ <listitem>
+ <para>Use of SELECTORs, returns 2 rows ['c', 'd',
'b'], ['c', 'f', 'b']: <programlisting>SELECT * FROM
TEXTTABLE('a,b\nc,d\nc,f' SELECTOR 'c' COLUMNS col1 string, col2 string
col3 string SELECTOR 'a' 2) x</programlisting>
+ </para>
+ </listitem>
</itemizedlist>
</section>
<section id="xmltable">
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-01-12
18:43:23 UTC (rev 3792)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-01-13
19:26:57 UTC (rev 3793)
@@ -208,7 +208,7 @@
this.children = newChildren;
}
- protected void addBatchRow(List row) {
+ protected void addBatchRow(List<?> row) {
if(this.getProcessingState().batchRows == null) {
this.getProcessingState().batchRows = new
ArrayList(this.getProcessingState().batchSize / 4);
}
@@ -398,10 +398,10 @@
* @param elements List of elements
* @return Map of element to Integer, which is the index
*/
- public static Map createLookupMap(List elements) {
- Map lookupMap = new HashMap();
+ public static Map<Expression, Integer> createLookupMap(List<? extends
Expression> elements) {
+ Map<Expression, Integer> lookupMap = new HashMap<Expression,
Integer>();
for(int i=0; i<elements.size(); i++) {
- Object element = elements.get(i);
+ Expression element = elements.get(i);
lookupMap.put(element, i);
if (element instanceof AliasSymbol) {
lookupMap.put(((AliasSymbol)element).getSymbol(), i);
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-01-12
18:43:23 UTC (rev 3792)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-01-13
19:26:57 UTC (rev 3793)
@@ -46,6 +46,7 @@
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.sql.lang.TextTable;
import org.teiid.query.sql.lang.TextTable.TextColumn;
+import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.util.CommandContext;
/**
@@ -65,6 +66,7 @@
private char delimiter;
private int lineWidth;
private int[] projectionIndexes;
+ private Map<String, List<String>> parentLines;
//per file state
private BufferedReader reader;
@@ -109,9 +111,17 @@
noQuote = table.isEscape();
quote = table.getQuote();
}
+ for (TextColumn column : table.getColumns()) {
+ if (column.getSelector() != null) {
+ if (parentLines == null) {
+ parentLines = new HashMap<String, List<String>>();
+ }
+ parentLines.put(column.getSelector(), null);
+ }
+ }
lineWidth = table.getColumns().size() * DataTypeManager.MAX_STRING_LENGTH;
}
- Map elementMap = createLookupMap(table.getProjectedSymbols());
+ Map<Expression, Integer> elementMap =
createLookupMap(table.getProjectedSymbols());
this.projectionIndexes = getProjectionIndexes(elementMap, getElements());
}
@@ -135,6 +145,11 @@
this.textLine = 0;
this.cr = false;
this.eof = false;
+ if (this.parentLines != null) {
+ for (Map.Entry<String, List<String>> entry : this.parentLines.entrySet())
{
+ entry.setValue(null);
+ }
+ }
}
public void setTable(TextTable table) {
@@ -170,30 +185,49 @@
break;
}
- if (table.getSelector() != null && !line.startsWith(table.getSelector())) {
- continue;
+ String parentSelector = null;
+ if (table.getSelector() != null && !line.regionMatches(0, table.getSelector(),
0, table.getSelector().length())) {
+ if (parentLines == null) {
+ continue; //doesn't match any selector
+ }
+ parentSelector = line.substring(0, table.getSelector().length());
+
+ if (!parentLines.containsKey(parentSelector)) {
+ continue; //doesn't match any selector
+ }
}
List<String> vals = parseLine(line);
+ if (parentSelector != null) {
+ this.parentLines.put(parentSelector, vals);
+ continue;
+ } else if (table.getSelector() != null &&
!table.getSelector().equals(vals.get(0))) {
+ continue;
+ }
+
List<Object> tuple = new ArrayList<Object>(projectionIndexes.length);
for (int output : projectionIndexes) {
TextColumn col = table.getColumns().get(output);
String val = null;
int index = output;
- if (nameIndexes != null) {
+
+ if (col.getSelector() != null) {
+ vals = this.parentLines.get(col.getSelector());
+ index = col.getPosition() - 1;
+ } else if (nameIndexes != null) {
index = nameIndexes.get(col.getName());
}
- if (index >= vals.size()) {
+ if (vals == null || index >= vals.size()) {
//throw new
TeiidProcessingException(QueryPlugin.Util.getString("TextTableNode.no_value",
col.getName(), textLine, systemId)); //$NON-NLS-1$
tuple.add(null);
- } else {
- val = vals.get(index);
- try {
- tuple.add(DataTypeManager.transformValue(val,
table.getColumns().get(output).getSymbol().getType()));
- } catch (TransformationException e) {
- throw new TeiidProcessingException(e,
QueryPlugin.Util.getString("TextTableNode.conversion_error", col.getName(),
textLine, systemId)); //$NON-NLS-1$
- }
+ continue;
+ }
+ val = vals.get(index);
+ try {
+ tuple.add(DataTypeManager.transformValue(val,
table.getColumns().get(output).getSymbol().getType()));
+ } catch (TransformationException e) {
+ throw new TeiidProcessingException(e,
QueryPlugin.Util.getString("TextTableNode.conversion_error", col.getName(),
textLine, systemId)); //$NON-NLS-1$
}
}
addBatchRow(tuple);
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2012-01-12 18:43:23
UTC (rev 3792)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2012-01-13 19:26:57
UTC (rev 3793)
@@ -37,6 +37,8 @@
public static class TextColumn extends ProjectedColumn {
private Integer width;
private boolean noTrim;
+ private String selector;
+ private Integer position;
public TextColumn(String name, String type, Integer width, boolean noTrim) {
super(name, type);
@@ -74,6 +76,8 @@
}
TextColumn other = (TextColumn)obj;
return EquivalenceUtil.areEqual(width, other.width)
+ && EquivalenceUtil.areEqual(selector, other.selector)
+ && EquivalenceUtil.areEqual(position, other.position)
&& noTrim == other.noTrim;
}
@@ -82,9 +86,28 @@
TextColumn clone = new TextColumn();
clone.width = this.width;
clone.noTrim = this.noTrim;
+ clone.selector = this.selector;
+ clone.position = this.position;
this.copyTo(clone);
return clone;
}
+
+ public String getSelector() {
+ return selector;
+ }
+
+ public void setSelector(String selector) {
+ this.selector = selector;
+ }
+
+ public Integer getPosition() {
+ return position;
+ }
+
+ public void setPosition(Integer position) {
+ this.position = position;
+ }
+
}
private Expression file;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-01-12
18:43:23 UTC (rev 3792)
+++
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-01-13
19:26:57 UTC (rev 3793)
@@ -1667,6 +1667,12 @@
addHintComment(obj);
append("TEXTTABLE("); //$NON-NLS-1$
visitNode(obj.getFile());
+ if (obj.getSelector() != null) {
+ append(SPACE);
+ append(NonReserved.SELECTOR);
+ append(SPACE);
+ append(escapeSinglePart(obj.getSelector()));
+ }
append(SPACE);
append(NonReserved.COLUMNS);
@@ -1688,6 +1694,14 @@
append(SPACE);
append(NonReserved.TRIM);
}
+ if (col.getSelector() != null) {
+ append(SPACE);
+ append(NonReserved.SELECTOR);
+ append(SPACE);
+ append(escapeSinglePart(col.getSelector()));
+ append(SPACE);
+ append(col.getPosition());
+ }
if (cols.hasNext()) {
append(","); //$NON-NLS-1$
}
@@ -1730,12 +1744,6 @@
append(SPACE);
append(obj.getSkip());
}
- if (obj.getSelector() != null) {
- append(SPACE);
- append(NonReserved.SELECTOR);
- append(SPACE);
- append(escapeSinglePart(obj.getSelector()));
- }
append(")");//$NON-NLS-1$
append(SPACE);
append(AS);
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java 2012-01-12 18:43:23
UTC (rev 3792)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java 2012-01-13 19:26:57
UTC (rev 3793)
@@ -301,7 +301,7 @@
private int keyBatchSize;
private int leafBatchSize;
- private Map<ElementSymbol, Integer> columnMap;
+ private Map<Expression, Integer> columnMap;
private List<Integer> notNull = new LinkedList<Integer>();
private Map<Integer, AtomicInteger> sequences;
@@ -803,7 +803,7 @@
return tid.getID() + " (" + columns + ")\n"; //$NON-NLS-1$
//$NON-NLS-2$
}
- Map<ElementSymbol, Integer> getColumnMap() {
+ Map<Expression, Integer> getColumnMap() {
return this.columnMap;
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2012-01-12
18:43:23 UTC (rev 3792)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2012-01-13
19:26:57 UTC (rev 3793)
@@ -1193,6 +1193,7 @@
boolean widthSet = false;
Character delimiter = null;
Character quote = null;
+ boolean usingSelector = false;
for (TextTable.TextColumn column : obj.getColumns()) {
if (column.getWidth() != null) {
widthSet = true;
@@ -1202,9 +1203,18 @@
} else if (widthSet) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_invalid_width"),
obj); //$NON-NLS-1$
}
+ if (column.getSelector() != null) {
+ usingSelector = true;
+ if (obj.getSelector() != null &&
obj.getSelector().equals(column.getSelector())) {
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_selector_required"),
obj); //$NON-NLS-1$
+ }
+ }
+ if (column.getPosition() != null && column.getPosition() < 0) {
+
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_negative"),
obj); //$NON-NLS-1$
+ }
}
if (widthSet) {
- if (obj.getDelimiter() != null || obj.getHeader() != null || obj.getQuote() != null
|| obj.getSelector() != null) {
+ if (obj.getDelimiter() != null || obj.getHeader() != null || obj.getQuote() != null
|| obj.getSelector() != null || usingSelector) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_width"),
obj); //$NON-NLS-1$
}
} else {
@@ -1221,6 +1231,9 @@
if (obj.getSkip() != null && obj.getSkip() < 0) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_negative"),
obj); //$NON-NLS-1$
}
+ if (usingSelector && obj.getSelector() == null) {
+
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_selector_required"),
obj); //$NON-NLS-1$
+ }
}
private void validateTextOptions(LanguageObject obj, Character delimiter,
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-01-12 18:43:23
UTC (rev 3792)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-01-13 19:26:57
UTC (rev 3793)
@@ -2170,6 +2170,10 @@
}
{
<ID> <LPAREN> file = expression(info)
+ [
+ LOOKAHEAD(<ID>, { "selector".equalsIgnoreCase(getToken(1).image) })
<ID>
+ selector = stringVal()
+ ]
nonReserved("COLUMNS")
column = textColumn(info)
{
@@ -2212,10 +2216,6 @@
LOOKAHEAD(<ID>, { "skip".equalsIgnoreCase(getToken(1).image) })
<ID>
skip = intVal()
]
- [
- LOOKAHEAD(<ID>, { "selector".equalsIgnoreCase(getToken(1).image) })
<ID>
- selector = stringVal()
- ]
<RPAREN>
[<AS>] aliasID=id()
{
@@ -2240,6 +2240,8 @@
Constant datatype = null;
Integer width = null;
boolean noTrim = false;
+ String selector = null;
+ Integer position = null;
}
{
name = id()
@@ -2254,8 +2256,16 @@
}
]
]
+ [
+ LOOKAHEAD(<ID>, { "selector".equalsIgnoreCase(getToken(1).image) })
<ID>
+ selector = stringVal()
+ position = intVal()
+ ]
{
- return new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(),
width, noTrim);
+ TextTable.TextColumn result = new TextTable.TextColumn(validateElementName(name),
(String)datatype.getValue(), width, noTrim);
+ result.setSelector(selector);
+ result.setPosition(position);
+ return result;
}
}
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-01-12 18:43:23
UTC (rev 3792)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-01-13 19:26:57
UTC (rev 3793)
@@ -710,7 +710,8 @@
ValidationVisitor.orderby_expression_xml=XML queries cannot order by an expression.
ValidationVisitor.text_table_invalid_width=For a fixed width text table, all columns must
have width set.
ValidationVisitor.text_table_width=Fixed width text tables should not have DELIMITER,
QUOTE, ESCAPE, SELECTOR or HEADER specified.
-ValidationVisitor.text_table_negative=Text table WIDTH, HEADER, or SKIP values must not
be negative.
+ValidationVisitor.text_table_selector_required=The use of a column SELECTOR requires the
use of a TEXTTABLE SELECTOR of a different value.
+ValidationVisitor.text_table_negative=Text table WIDTH, HEADER, SELECTOR position, or
SKIP values must not be negative.
ValidationVisitor.text_table_delimiter=Text DELIMITER cannot be the same as the QUOTE or
ESCAPE characters.
ValidationVisitor.text_table_newline=Text DELIMITER, QUOTE, and ESCAPE characters cannot
be the new line character.
ValidationVisitor.xml_namespaces=At most only one NO DEFAULT or DEFAULT namespace may be
specified.
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2012-01-12
18:43:23 UTC (rev 3792)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2012-01-13
19:26:57 UTC (rev 3793)
@@ -317,7 +317,7 @@
}
@Test public void testTextTableSelector() throws Exception {
- String sql = "select x.* from (select * from pm1.g1) y, texttable(e1 ||
'\n' || e2 || '\n' || e3 COLUMNS x string SELECTOR 'c') x";
+ String sql = "select x.* from (select * from pm1.g1) y, texttable(e1 ||
'\n' || e2 || '\n' || e3 SELECTOR 'c' COLUMNS x string) x";
List[] expected = new List[] {
Arrays.asList("c"),
@@ -326,6 +326,26 @@
process(sql, expected);
}
+ @Test public void testTextTableSelector1() throws Exception {
+ String sql = "select x.* from texttable('cc,bb' SELECTOR 'c'
COLUMNS x string) x";
+
+ List[] expected = new List[] {
+ };
+
+ process(sql, expected);
+ }
+
+ @Test public void testTextTableSelector2() throws Exception {
+ String sql = "select x.* from
texttable('A,10-dec-2011,12345,3322,3000,222\nB,1,123,Sprockets
Black,30,50,1500\nB,2,333,Sprockets Blue,300,5,1500' SELECTOR 'B' COLUMNS x
string, y integer, z string SELECTOR 'A' 2) x";
+
+ List[] expected = new List[] {
+ Arrays.asList("B", 1, "10-dec-2011"),
+ Arrays.asList("B", 2, "10-dec-2011"),
+ };
+
+ process(sql, expected);
+ }
+
public static void process(String sql, List[] expectedResults) throws Exception {
FakeDataManager dataManager = new FakeDataManager();
sampleData1(dataManager);