[teiid-commits] teiid SVN: r3793 - in trunk: documentation/reference/src/main/docbook/en-US/content and 8 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Fri Jan 13 14:26:58 EST 2012
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);
More information about the teiid-commits
mailing list