[teiid-commits] teiid SVN: r2845 - in trunk: build/kits/jboss-container and 18 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Jan 17 15:08:10 EST 2011


Author: shawkins
Date: 2011-01-17 15:08:09 -0500 (Mon, 17 Jan 2011)
New Revision: 2845

Added:
   trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
Removed:
   trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
Modified:
   trunk/api/src/main/java/org/teiid/language/SQLConstants.java
   trunk/build/kits/jboss-container/teiid-releasenotes.html
   trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml
   trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
   trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
   trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
   trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java
   trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
   trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java
   trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java
   trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.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/tempdata/TempTableDataManager.java
   trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.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/parser/TestParser.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
   trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java
Log:
TEIID-1440 adding not null and auto increment support.  also updating pushdown validation checks

Modified: trunk/api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -99,6 +99,8 @@
 		
 		public static final String KEY = "KEY"; //$NON-NLS-1$
 		
+		public static final String SERIAL = "SERIAL"; //$NON-NLS-1$
+		
 		public static final String ENCODING = "ENCODING"; //$NON-NLS-1$
 		public static final String TEXTAGG = "TEXTAGG"; //$NON-NLS-1$
 	}

Deleted: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
===================================================================
(Binary files differ)

Added: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
===================================================================
(Binary files differ)


Property changes on: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-01-17 20:08:09 UTC (rev 2845)
@@ -31,7 +31,8 @@
 	    <UL>
 	        <LI>Added support to perform simple pass-through and more complicated updates through views by default.
 	        <LI>Added support for "FOR EACH ROW" update procedure handling (similar to INSTEAD OF triggers in other DBMS's), which should be used instead of the deprecated TRANSLATE criteria approach.
-	    </UL>                     
+	    </UL>
+	<LI><B>Temp table enhancements</B> - added support for the SERIAL datatype, which is a not null INTEGER that auto-increments, and the ability to specify a column as NOT NULL.                     
 	<LI><B>UDF</B> - new API objects added to teiid-api to support user defined functions that are capable of pushdown to source.
 	<LI><B>Unescape Function</B> - a new system function, unescape, was added to handle common \ escaping in strings including octal, hex/unicode, \b, \r, \n, \f, and \t.
 	<LI><B>Predicate Optimization</B> - expanded optimizations for detecting always false conditions when using IS NULL, IN, or comparison predicates with literal values.

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml	2011-01-17 20:08:09 UTC (rev 2845)
@@ -65,8 +65,8 @@
             <entry>SMALLINT</entry>
           </row>
           <row>
-            <entry>integer</entry>
-            <entry>numeric, integral type, signed 32-bit</entry>
+            <entry>integer or serial</entry>
+            <entry>numeric, integral type, signed 32-bit.  The serial type also implies not null and has an auto-incrementing value that starts at 1.  serial types are not automatically UNIQUE.</entry>
             <entry>java.lang.Integer</entry>
             <entry>INTEGER</entry>
             <entry>INTEGER</entry>

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml	2011-01-17 20:08:09 UTC (rev 2845)
@@ -122,6 +122,7 @@
 | &lt;DISCONNECT: "disconnect"&gt;
 | &lt;DISTINCT: "distinct"&gt;
 | &lt;DROP: "drop"&gt;
+| &lt;EACH: "each"&gt;
 | &lt;ELSE: "else"&gt;
 | &lt;END: "end"&gt;
 | &lt;ERROR: "error"&gt;
@@ -405,423 +406,435 @@
 <entry align="left" valign="top"><para>::= 
 ( <link linkend="prod4">createUpdateProcedure</link> | <link linkend="prod5">userCommand</link> | <link linkend="prod6">callableStatement</link> ) ( &lt;SEMICOLON&gt; )? &lt;EOF&gt;</para></entry></row>
 <row>
+<entry align="right" valign="top"><para><anchor id="prod7" xreflabel="updateProcedure"/>updateProcedure</para></entry>
+<entry align="left" valign="top"><para>::= 
+( <link linkend="prod4">createUpdateProcedure</link> | <link linkend="prod8">triggerAction</link> ) &lt;EOF&gt;</para></entry></row>
+<row>
+<entry align="right" valign="top"><para><anchor id="prod8" xreflabel="triggerAction"/>triggerAction</para></entry>
+<entry align="left" valign="top"><para>::= 
+&lt;FOR&gt; &lt;EACH&gt; &lt;ROW&gt; <link linkend="prod9">block</link></para></entry></row>
+<row>
 <entry align="right" valign="top"><para><anchor id="prod5" xreflabel="userCommand"/>userCommand</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod7">queryExpression</link> | <link linkend="prod8">storedProcedure</link> | <link linkend="prod9">insert</link> | <link linkend="prod10">update</link> | <link linkend="prod11">delete</link> | <link linkend="prod12">dropTable</link> | <link linkend="prod13">createTempTable</link> )</para></entry></row>
+( <link linkend="prod10">queryExpression</link> | <link linkend="prod11">storedProcedure</link> | <link linkend="prod12">insert</link> | <link linkend="prod13">update</link> | <link linkend="prod14">delete</link> | <link linkend="prod15">dropTable</link> | <link linkend="prod16">createTempTable</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod12" xreflabel="dropTable"/>dropTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod15" xreflabel="dropTable"/>dropTable</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;DROP&gt; &lt;TABLE&gt; <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod13" xreflabel="createTempTable"/>createTempTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod16" xreflabel="createTempTable"/>createTempTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CREATE&gt; &lt;LOCAL&gt; &lt;TEMPORARY&gt; &lt;TABLE&gt; <link linkend="prod2">id</link> &lt;LPAREN&gt; <link linkend="prod14">createElementsWithTypes</link> ( &lt;COMMA&gt; &lt;PRIMARY&gt; <link linkend="prod15">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt; )? &lt;RPAREN&gt;</para></entry></row>
+&lt;CREATE&gt; &lt;LOCAL&gt; &lt;TEMPORARY&gt; &lt;TABLE&gt; <link linkend="prod2">id</link> &lt;LPAREN&gt; <link linkend="prod17">tableElement</link> ( &lt;COMMA&gt; <link linkend="prod17">tableElement</link> )* ( &lt;COMMA&gt; &lt;PRIMARY&gt; <link linkend="prod18">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt; )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod16" xreflabel="errorStatement"/>errorStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod17" xreflabel="tableElement"/>tableElement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ERROR&gt; <link linkend="prod17">expression</link></para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod19">dataTypeString</link> | <link linkend="prod18">nonReserved</link> ) ( &lt;NOT&gt; &lt;NULL&gt; )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod18" xreflabel="statement"/>statement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod20" xreflabel="errorStatement"/>errorStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod19">ifStatement</link> | <link linkend="prod20">loopStatement</link> | <link linkend="prod21">whileStatement</link> | <link linkend="prod22">delimitedStatement</link> )</para></entry></row>
+&lt;ERROR&gt; <link linkend="prod21">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod22" xreflabel="delimitedStatement"/>delimitedStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod22" xreflabel="statement"/>statement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod23">assignStatement</link> | <link linkend="prod24">sqlStatement</link> | <link linkend="prod16">errorStatement</link> | <link linkend="prod25">declareStatement</link> | <link linkend="prod26">continueStatement</link> | <link linkend="prod27">breakStatement</link> ) &lt;SEMICOLON&gt;</para></entry></row>
+( <link linkend="prod23">ifStatement</link> | <link linkend="prod24">loopStatement</link> | <link linkend="prod25">whileStatement</link> | <link linkend="prod26">delimitedStatement</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="block"/>block</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod26" xreflabel="delimitedStatement"/>delimitedStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod18">statement</link> | ( &lt;BEGIN&gt; ( <link linkend="prod18">statement</link> )* &lt;END&gt; ) )</para></entry></row>
+( <link linkend="prod27">assignStatement</link> | <link linkend="prod28">sqlStatement</link> | <link linkend="prod20">errorStatement</link> | <link linkend="prod29">declareStatement</link> | <link linkend="prod30">continueStatement</link> | <link linkend="prod31">breakStatement</link> ) &lt;SEMICOLON&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod27" xreflabel="breakStatement"/>breakStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod9" xreflabel="block"/>block</para></entry>
 <entry align="left" valign="top"><para>::= 
+( <link linkend="prod22">statement</link> | ( &lt;BEGIN&gt; ( <link linkend="prod22">statement</link> )* &lt;END&gt; ) )</para></entry></row>
+<row>
+<entry align="right" valign="top"><para><anchor id="prod31" xreflabel="breakStatement"/>breakStatement</para></entry>
+<entry align="left" valign="top"><para>::= 
 &lt;BREAK&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod26" xreflabel="continueStatement"/>continueStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod30" xreflabel="continueStatement"/>continueStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;CONTINUE&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod21" xreflabel="whileStatement"/>whileStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod25" xreflabel="whileStatement"/>whileStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;WHILE&gt; &lt;LPAREN&gt; <link linkend="prod29">criteria</link> &lt;RPAREN&gt; <link linkend="prod28">block</link></para></entry></row>
+&lt;WHILE&gt; &lt;LPAREN&gt; <link linkend="prod32">criteria</link> &lt;RPAREN&gt; <link linkend="prod9">block</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod20" xreflabel="loopStatement"/>loopStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod24" xreflabel="loopStatement"/>loopStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;LOOP&gt; &lt;ON&gt; &lt;LPAREN&gt; <link linkend="prod7">queryExpression</link> &lt;RPAREN&gt; &lt;AS&gt; <link linkend="prod2">id</link> <link linkend="prod28">block</link></para></entry></row>
+&lt;LOOP&gt; &lt;ON&gt; &lt;LPAREN&gt; <link linkend="prod10">queryExpression</link> &lt;RPAREN&gt; &lt;AS&gt; <link linkend="prod2">id</link> <link linkend="prod9">block</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod19" xreflabel="ifStatement"/>ifStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod23" xreflabel="ifStatement"/>ifStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;IF&gt; &lt;LPAREN&gt; <link linkend="prod29">criteria</link> &lt;RPAREN&gt; <link linkend="prod28">block</link> ( &lt;ELSE&gt; <link linkend="prod28">block</link> )?</para></entry></row>
+&lt;IF&gt; &lt;LPAREN&gt; <link linkend="prod32">criteria</link> &lt;RPAREN&gt; <link linkend="prod9">block</link> ( &lt;ELSE&gt; <link linkend="prod9">block</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod30" xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod33" xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( ( &lt;EQ&gt; | &lt;NE&gt; | &lt;NE2&gt; | &lt;LE&gt; | &lt;GE&gt; | &lt;LT&gt; | &lt;GT&gt; | &lt;IN&gt; | &lt;LIKE&gt; | ( &lt;IS&gt; &lt;NULL&gt; ) | &lt;BETWEEN&gt; ) )? &lt;CRITERIA&gt; ( &lt;ON&gt; &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt; )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod31" xreflabel="hasCriteria"/>hasCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="hasCriteria"/>hasCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;HAS&gt; <link linkend="prod30">criteriaSelector</link></para></entry></row>
+&lt;HAS&gt; <link linkend="prod33">criteriaSelector</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod25" xreflabel="declareStatement"/>declareStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod29" xreflabel="declareStatement"/>declareStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;DECLARE&gt; <link linkend="prod32">dataType</link> <link linkend="prod2">id</link> ( ( <link linkend="prod15">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod33">assignStatementOperand</link> )?</para></entry></row>
+&lt;DECLARE&gt; <link linkend="prod35">dataType</link> <link linkend="prod2">id</link> ( ( <link linkend="prod18">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod36">assignStatementOperand</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod23" xreflabel="assignStatement"/>assignStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod27" xreflabel="assignStatement"/>assignStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> ( <link linkend="prod15">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod33">assignStatementOperand</link></para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod18">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod36">assignStatementOperand</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod33" 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="prod9">insert</link> ) | <link linkend="prod10">update</link> | <link linkend="prod11">delete</link> | ( <link linkend="prod17">expression</link> ) | <link linkend="prod7">queryExpression</link> )</para></entry></row>
+( ( <link linkend="prod12">insert</link> ) | <link linkend="prod13">update</link> | <link linkend="prod14">delete</link> | ( <link linkend="prod21">expression</link> ) | <link linkend="prod10">queryExpression</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod24" xreflabel="sqlStatement"/>sqlStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="sqlStatement"/>sqlStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( <link linkend="prod5">userCommand</link> ) | <link linkend="prod34">dynamicCommand</link> | ( <link linkend="prod2">id</link> ( <link linkend="prod15">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod8">storedProcedure</link> ) )</para></entry></row>
+( ( <link linkend="prod5">userCommand</link> ) | <link linkend="prod37">dynamicCommand</link> | ( <link linkend="prod2">id</link> ( <link linkend="prod18">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod11">storedProcedure</link> ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="translateCriteria"/>translateCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod38" xreflabel="translateCriteria"/>translateCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;TRANSLATE&gt; <link linkend="prod30">criteriaSelector</link> ( &lt;WITH&gt; &lt;LPAREN&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod17">expression</link> )* &lt;RPAREN&gt; )?</para></entry></row>
+&lt;TRANSLATE&gt; <link linkend="prod33">criteriaSelector</link> ( &lt;WITH&gt; &lt;LPAREN&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod21">expression</link> )* &lt;RPAREN&gt; )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod4" xreflabel="createUpdateProcedure"/>createUpdateProcedure</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CREATE&gt; ( &lt;VIRTUAL&gt; )? ( &lt;UPDATE&gt; )? &lt;PROCEDURE&gt; <link linkend="prod28">block</link></para></entry></row>
+&lt;CREATE&gt; ( &lt;VIRTUAL&gt; )? ( &lt;UPDATE&gt; )? &lt;PROCEDURE&gt; <link linkend="prod9">block</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod37" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;EXECUTE&gt; | &lt;EXEC&gt; ) ( ( &lt;STRING&gt; | &lt;IMMEDIATE&gt; ) )? <link linkend="prod17">expression</link> ( &lt;AS&gt; <link linkend="prod14">createElementsWithTypes</link> ( &lt;INTO&gt; <link linkend="prod2">id</link> )? )? ( &lt;USING&gt; <link linkend="prod36">setClauseList</link> )? ( &lt;UPDATE&gt; ( ( &lt;INTEGERVAL&gt; ) | ( &lt;STAR&gt; ) ) )?</para></entry></row>
+( &lt;EXECUTE&gt; | &lt;EXEC&gt; ) ( ( &lt;STRING&gt; | &lt;IMMEDIATE&gt; ) )? <link linkend="prod21">expression</link> ( &lt;AS&gt; <link linkend="prod39">createElementsWithTypes</link> ( &lt;INTO&gt; <link linkend="prod2">id</link> )? )? ( &lt;USING&gt; <link linkend="prod40">setClauseList</link> )? ( &lt;UPDATE&gt; ( ( &lt;INTEGERVAL&gt; ) | ( &lt;STAR&gt; ) ) )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod36" xreflabel="setClauseList"/>setClauseList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod40" xreflabel="setClauseList"/>setClauseList</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod14" xreflabel="createElementsWithTypes"/>createElementsWithTypes</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod39" xreflabel="createElementsWithTypes"/>createElementsWithTypes</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> <link linkend="prod32">dataType</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> <link linkend="prod32">dataType</link> )*</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod35">dataType</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> <link linkend="prod35">dataType</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>::= 
-&lt;LBRACE&gt; ( &lt;QMARK&gt; &lt;EQ&gt; )? &lt;CALL&gt; <link linkend="prod2">id</link> ( &lt;LPAREN&gt; ( <link linkend="prod37">executeUnnamedParams</link> ) &lt;RPAREN&gt; )? &lt;RBRACE&gt; ( <link linkend="prod38">option</link> )?</para></entry></row>
+&lt;LBRACE&gt; ( &lt;QMARK&gt; &lt;EQ&gt; )? &lt;CALL&gt; <link linkend="prod2">id</link> ( &lt;LPAREN&gt; ( <link linkend="prod41">executeUnnamedParams</link> ) &lt;RPAREN&gt; )? &lt;RBRACE&gt; ( <link linkend="prod42">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod8" xreflabel="storedProcedure"/>storedProcedure</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod11" xreflabel="storedProcedure"/>storedProcedure</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;EXEC&gt; | &lt;EXECUTE&gt; | &lt;CALL&gt; ) <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod39">executeNamedParams</link> | <link linkend="prod37">executeUnnamedParams</link> ) &lt;RPAREN&gt; ) ( <link linkend="prod38">option</link> )?</para></entry></row>
+( ( &lt;EXEC&gt; | &lt;EXECUTE&gt; | &lt;CALL&gt; ) <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod43">executeNamedParams</link> | <link linkend="prod41">executeUnnamedParams</link> ) &lt;RPAREN&gt; ) ( <link linkend="prod42">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod37" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod41" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* )?</para></entry></row>
+( <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )* )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod39" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod17">expression</link> )* )</para></entry></row>
+( <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod21">expression</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod9" xreflabel="insert"/>insert</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod12" xreflabel="insert"/>insert</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;INSERT&gt; &lt;INTO&gt; <link linkend="prod2">id</link> ( <link linkend="prod40">columnList</link> )? ( ( &lt;VALUES&gt; <link linkend="prod41">rowValues</link> ) | ( <link linkend="prod7">queryExpression</link> ) ) ( <link linkend="prod38">option</link> )?</para></entry></row>
+&lt;INSERT&gt; &lt;INTO&gt; <link linkend="prod2">id</link> ( <link linkend="prod44">columnList</link> )? ( ( &lt;VALUES&gt; <link linkend="prod45">rowValues</link> ) | ( <link linkend="prod10">queryExpression</link> ) ) ( <link linkend="prod42">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod40" xreflabel="columnList"/>columnList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="columnList"/>columnList</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod41" xreflabel="rowValues"/>rowValues</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod45" xreflabel="rowValues"/>rowValues</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;LPAREN&gt; <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;LPAREN&gt; <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod10" xreflabel="update"/>update</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod13" xreflabel="update"/>update</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;UPDATE&gt; <link linkend="prod2">id</link> &lt;SET&gt; <link linkend="prod36">setClauseList</link> ( <link linkend="prod42">where</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
+&lt;UPDATE&gt; <link linkend="prod2">id</link> &lt;SET&gt; <link linkend="prod40">setClauseList</link> ( <link linkend="prod46">where</link> )? ( <link linkend="prod42">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod11" xreflabel="delete"/>delete</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod14" xreflabel="delete"/>delete</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;DELETE&gt; &lt;FROM&gt; <link linkend="prod2">id</link> ( <link linkend="prod42">where</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
+&lt;DELETE&gt; &lt;FROM&gt; <link linkend="prod2">id</link> ( <link linkend="prod46">where</link> )? ( <link linkend="prod42">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod7" xreflabel="queryExpression"/>queryExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod10" xreflabel="queryExpression"/>queryExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;WITH&gt; <link linkend="prod43">withListElement</link> ( &lt;COMMA&gt; <link linkend="prod43">withListElement</link> )* )? <link linkend="prod44">queryExpressionBody</link></para></entry></row>
+( &lt;WITH&gt; <link linkend="prod47">withListElement</link> ( &lt;COMMA&gt; <link linkend="prod47">withListElement</link> )* )? <link linkend="prod48">queryExpressionBody</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="withListElement"/>withListElement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod47" xreflabel="withListElement"/>withListElement</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> ( <link linkend="prod40">columnList</link> )? &lt;AS&gt; &lt;LPAREN&gt; <link linkend="prod7">queryExpression</link> &lt;RPAREN&gt;</para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod44">columnList</link> )? &lt;AS&gt; &lt;LPAREN&gt; <link linkend="prod10">queryExpression</link> &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod48" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod45">queryTerm</link> ( ( &lt;UNION&gt; | &lt;EXCEPT&gt; ) ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod45">queryTerm</link> )* ( <link linkend="prod46">orderby</link> )? ( <link linkend="prod47">limit</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
+<link linkend="prod49">queryTerm</link> ( ( &lt;UNION&gt; | &lt;EXCEPT&gt; ) ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod49">queryTerm</link> )* ( <link linkend="prod50">orderby</link> )? ( <link linkend="prod51">limit</link> )? ( <link linkend="prod42">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod45" xreflabel="queryTerm"/>queryTerm</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod49" xreflabel="queryTerm"/>queryTerm</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod48">queryPrimary</link> ( &lt;INTERSECT&gt; ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod48">queryPrimary</link> )*</para></entry></row>
+<link linkend="prod52">queryPrimary</link> ( &lt;INTERSECT&gt; ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod52">queryPrimary</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod48" xreflabel="queryPrimary"/>queryPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="queryPrimary"/>queryPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod49">query</link> | ( &lt;TABLE&gt; <link linkend="prod2">id</link> ) | ( &lt;LPAREN&gt; <link linkend="prod44">queryExpressionBody</link> &lt;RPAREN&gt; ) )</para></entry></row>
+( <link linkend="prod53">query</link> | ( &lt;TABLE&gt; <link linkend="prod2">id</link> ) | ( &lt;LPAREN&gt; <link linkend="prod48">queryExpressionBody</link> &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod49" xreflabel="query"/>query</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="query"/>query</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod50">select</link> ( <link linkend="prod51">into</link> )? ( <link linkend="prod52">from</link> ( <link linkend="prod42">where</link> )? ( <link linkend="prod53">groupBy</link> )? ( <link linkend="prod54">having</link> )? )?</para></entry></row>
+<link linkend="prod54">select</link> ( <link linkend="prod55">into</link> )? ( <link linkend="prod56">from</link> ( <link linkend="prod46">where</link> )? ( <link linkend="prod57">groupBy</link> )? ( <link linkend="prod58">having</link> )? )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="into"/>into</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod55" xreflabel="into"/>into</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;INTO&gt; ( <link linkend="prod2">id</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="select"/>select</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="select"/>select</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;SELECT&gt; ( &lt;ALL&gt; | ( &lt;DISTINCT&gt; ) )? ( &lt;STAR&gt; | ( <link linkend="prod55">selectSymbol</link> ( &lt;COMMA&gt; <link linkend="prod55">selectSymbol</link> )* ) )</para></entry></row>
+&lt;SELECT&gt; ( &lt;ALL&gt; | ( &lt;DISTINCT&gt; ) )? ( &lt;STAR&gt; | ( <link linkend="prod59">selectSymbol</link> ( &lt;COMMA&gt; <link linkend="prod59">selectSymbol</link> )* ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod55" xreflabel="selectSymbol"/>selectSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod59" xreflabel="selectSymbol"/>selectSymbol</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod56">selectExpression</link> | <link linkend="prod57">allInGroupSymbol</link> )</para></entry></row>
+( <link linkend="prod60">selectExpression</link> | <link linkend="prod61">allInGroupSymbol</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod56" xreflabel="selectExpression"/>selectExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod60" xreflabel="selectExpression"/>selectExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod17">expression</link> ( ( &lt;AS&gt; )? <link linkend="prod2">id</link> )? )</para></entry></row>
+( <link linkend="prod21">expression</link> ( ( &lt;AS&gt; )? <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="derivedColumn"/>derivedColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod62" xreflabel="derivedColumn"/>derivedColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod17">expression</link> ( &lt;AS&gt; <link linkend="prod2">id</link> )? )</para></entry></row>
+( <link linkend="prod21">expression</link> ( &lt;AS&gt; <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod61" xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;ALL_IN_GROUP&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod59" xreflabel="xmlAgg"/>xmlAgg</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod63" xreflabel="xmlAgg"/>xmlAgg</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLAGG&gt; &lt;LPAREN&gt; <link linkend="prod17">expression</link> ( <link linkend="prod46">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLAGG&gt; &lt;LPAREN&gt; <link linkend="prod21">expression</link> ( <link linkend="prod50">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod60" 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="prod15">nonReserved</link> &lt;LPAREN&gt; &lt;FOR&gt; <link linkend="prod58">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod58">derivedColumn</link> )* ( &lt;ID&gt; <link linkend="prod61">charVal</link> )? ( ( &lt;ID&gt; <link linkend="prod61">charVal</link> ) )? ( &lt;ID&gt; )? ( ( &lt;ID&gt; <link linkend="prod2">id</link> ) )? ( <link linkend="prod46">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
+<link linkend="prod18">nonReserved</link> &lt;LPAREN&gt; &lt;FOR&gt; <link linkend="prod62">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod62">derivedColumn</link> )* ( &lt;ID&gt; <link linkend="prod65">charVal</link> )? ( ( &lt;ID&gt; <link linkend="prod65">charVal</link> ) )? ( &lt;ID&gt; )? ( ( &lt;ID&gt; <link linkend="prod2">id</link> ) )? ( <link linkend="prod50">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod62" 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="prod15">nonReserved</link> &lt;LPAREN&gt; &lt;STAR&gt; &lt;RPAREN&gt; ) | ( ( <link linkend="prod15">nonReserved</link> | &lt;ANY&gt; | &lt;SOME&gt; ) &lt;LPAREN&gt; ( &lt;DISTINCT&gt; | &lt;ALL&gt; )? <link linkend="prod17">expression</link> &lt;RPAREN&gt; ) )</para></entry></row>
+( ( <link linkend="prod18">nonReserved</link> &lt;LPAREN&gt; &lt;STAR&gt; &lt;RPAREN&gt; ) | ( ( <link linkend="prod18">nonReserved</link> | &lt;ANY&gt; | &lt;SOME&gt; ) &lt;LPAREN&gt; ( &lt;DISTINCT&gt; | &lt;ALL&gt; )? <link linkend="prod21">expression</link> &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="from"/>from</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod56" xreflabel="from"/>from</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;FROM&gt; ( <link linkend="prod63">tableReference</link> ( &lt;COMMA&gt; <link linkend="prod63">tableReference</link> )* )</para></entry></row>
+&lt;FROM&gt; ( <link linkend="prod67">tableReference</link> ( &lt;COMMA&gt; <link linkend="prod67">tableReference</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod63" xreflabel="tableReference"/>tableReference</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod67" xreflabel="tableReference"/>tableReference</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;LBRACE&gt; <link linkend="prod15">nonReserved</link> <link linkend="prod64">joinedTable</link> &lt;RBRACE&gt; ) | <link linkend="prod64">joinedTable</link> )</para></entry></row>
+( ( &lt;LBRACE&gt; <link linkend="prod18">nonReserved</link> <link linkend="prod68">joinedTable</link> &lt;RBRACE&gt; ) | <link linkend="prod68">joinedTable</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod64" xreflabel="joinedTable"/>joinedTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod68" xreflabel="joinedTable"/>joinedTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod65">tablePrimary</link> ( ( <link linkend="prod66">crossJoin</link> | <link linkend="prod67">qualifiedJoin</link> ) )*</para></entry></row>
+<link linkend="prod69">tablePrimary</link> ( ( <link linkend="prod70">crossJoin</link> | <link linkend="prod71">qualifiedJoin</link> ) )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod66" xreflabel="crossJoin"/>crossJoin</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod70" xreflabel="crossJoin"/>crossJoin</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;CROSS&gt; | &lt;UNION&gt; ) &lt;JOIN&gt; <link linkend="prod65">tablePrimary</link> )</para></entry></row>
+( ( &lt;CROSS&gt; | &lt;UNION&gt; ) &lt;JOIN&gt; <link linkend="prod69">tablePrimary</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod67" xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod71" xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( ( &lt;RIGHT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;LEFT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;FULL&gt; ( &lt;OUTER&gt; )? ) | &lt;INNER&gt; )? &lt;JOIN&gt; <link linkend="prod63">tableReference</link> &lt;ON&gt; <link linkend="prod29">criteria</link> )</para></entry></row>
+( ( ( &lt;RIGHT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;LEFT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;FULL&gt; ( &lt;OUTER&gt; )? ) | &lt;INNER&gt; )? &lt;JOIN&gt; <link linkend="prod67">tableReference</link> &lt;ON&gt; <link linkend="prod32">criteria</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod65" xreflabel="tablePrimary"/>tablePrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod69" xreflabel="tablePrimary"/>tablePrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod68">textTable</link> | <link linkend="prod69">xmlTable</link> | <link linkend="prod70">unaryFromClause</link> | <link linkend="prod71">subqueryFromClause</link> | ( &lt;LPAREN&gt; <link linkend="prod64">joinedTable</link> &lt;RPAREN&gt; ) ) ( ( &lt;MAKEDEP&gt; ) | ( &lt;MAKENOTDEP&gt; ) )?</para></entry></row>
+( <link linkend="prod72">textTable</link> | <link linkend="prod73">xmlTable</link> | <link linkend="prod74">unaryFromClause</link> | <link linkend="prod75">subqueryFromClause</link> | ( &lt;LPAREN&gt; <link linkend="prod68">joinedTable</link> &lt;RPAREN&gt; ) ) ( ( &lt;MAKEDEP&gt; ) | ( &lt;MAKENOTDEP&gt; ) )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod72" xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLSERIALIZE&gt; &lt;LPAREN&gt; ( <link linkend="prod15">nonReserved</link> )? <link linkend="prod17">expression</link> ( &lt;AS&gt; ( &lt;STRING&gt; | &lt;VARCHAR&gt; | &lt;CLOB&gt; ) )? &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLSERIALIZE&gt; &lt;LPAREN&gt; ( <link linkend="prod18">nonReserved</link> )? <link linkend="prod21">expression</link> ( &lt;AS&gt; ( &lt;STRING&gt; | &lt;VARCHAR&gt; | &lt;CLOB&gt; ) )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod15" xreflabel="nonReserved"/>nonReserved</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod18" xreflabel="nonReserved"/>nonReserved</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;ID&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod68" xreflabel="textTable"/>textTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod72" xreflabel="textTable"/>textTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod17">expression</link> <link linkend="prod15">nonReserved</link> <link linkend="prod73">textColumn</link> ( &lt;COMMA&gt; <link linkend="prod73">textColumn</link> )* ( &lt;ID&gt; <link linkend="prod61">charVal</link> )? ( ( &lt;ESCAPE&gt; <link linkend="prod61">charVal</link> ) | ( &lt;ID&gt; <link linkend="prod61">charVal</link> ) )? ( &lt;ID&gt; ( <link linkend="prod74">intVal</link> )? )? ( &lt;ID&gt; <link linkend="prod74">intVal</link> )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod21">expression</link> <link linkend="prod18">nonReserved</link> <link linkend="prod77">textColumn</link> ( &lt;COMMA&gt; <link linkend="prod77">textColumn</link> )* ( &lt;ID&gt; <link linkend="prod65">charVal</link> )? ( ( &lt;ESCAPE&gt; <link linkend="prod65">charVal</link> ) | ( &lt;ID&gt; <link linkend="prod65">charVal</link> ) )? ( &lt;ID&gt; ( <link linkend="prod78">intVal</link> )? )? ( &lt;ID&gt; <link linkend="prod78">intVal</link> )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod73" xreflabel="textColumn"/>textColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod77" xreflabel="textColumn"/>textColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> <link linkend="prod32">dataType</link> ( &lt;ID&gt; <link linkend="prod74">intVal</link> )?</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod35">dataType</link> ( &lt;ID&gt; <link linkend="prod78">intVal</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod75" xreflabel="xmlQuery"/>xmlQuery</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod79" xreflabel="xmlQuery"/>xmlQuery</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLQUERY&gt; &lt;LPAREN&gt; ( <link linkend="prod76">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod58">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod58">derivedColumn</link> )* )? ( ( &lt;NULL&gt; | <link linkend="prod15">nonReserved</link> ) &lt;ON&gt; <link linkend="prod15">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLQUERY&gt; &lt;LPAREN&gt; ( <link linkend="prod80">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod62">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod62">derivedColumn</link> )* )? ( ( &lt;NULL&gt; | <link linkend="prod18">nonReserved</link> ) &lt;ON&gt; <link linkend="prod18">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod69" xreflabel="xmlTable"/>xmlTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod73" xreflabel="xmlTable"/>xmlTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLTABLE&gt; &lt;LPAREN&gt; ( <link linkend="prod76">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod58">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod58">derivedColumn</link> )* )? ( &lt;ID&gt; <link linkend="prod77">xmlColumn</link> ( &lt;COMMA&gt; <link linkend="prod77">xmlColumn</link> )* )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+&lt;XMLTABLE&gt; &lt;LPAREN&gt; ( <link linkend="prod80">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod62">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod62">derivedColumn</link> )* )? ( &lt;ID&gt; <link linkend="prod81">xmlColumn</link> ( &lt;COMMA&gt; <link linkend="prod81">xmlColumn</link> )* )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod77" xreflabel="xmlColumn"/>xmlColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod81" xreflabel="xmlColumn"/>xmlColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> ( ( &lt;FOR&gt; <link linkend="prod15">nonReserved</link> ) | ( <link linkend="prod32">dataType</link> ( &lt;DEFAULT_KEYWORD&gt; <link linkend="prod17">expression</link> )? ( <link linkend="prod15">nonReserved</link> <link linkend="prod1">stringVal</link> )? ) )</para></entry></row>
+<link linkend="prod2">id</link> ( ( &lt;FOR&gt; <link linkend="prod18">nonReserved</link> ) | ( <link linkend="prod35">dataType</link> ( &lt;DEFAULT_KEYWORD&gt; <link linkend="prod21">expression</link> )? ( <link linkend="prod18">nonReserved</link> <link linkend="prod1">stringVal</link> )? ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod74" xreflabel="intVal"/>intVal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod78" xreflabel="intVal"/>intVal</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;INTEGERVAL&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod71" xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod75" xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;TABLE&gt; )? &lt;LPAREN&gt; ( <link linkend="prod7">queryExpression</link> | <link linkend="prod8">storedProcedure</link> ) &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+( &lt;TABLE&gt; )? &lt;LPAREN&gt; ( <link linkend="prod10">queryExpression</link> | <link linkend="prod11">storedProcedure</link> ) &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod70" xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod74" xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( &lt;ID&gt; ( ( &lt;AS&gt; )? <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="where"/>where</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="where"/>where</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;WHERE&gt; <link linkend="prod29">criteria</link></para></entry></row>
+&lt;WHERE&gt; <link linkend="prod32">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod29" xreflabel="criteria"/>criteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod32" xreflabel="criteria"/>criteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod78">compoundCritOr</link></para></entry></row>
+<link linkend="prod82">compoundCritOr</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod78" xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod79">compoundCritAnd</link> ( &lt;OR&gt; <link linkend="prod79">compoundCritAnd</link> )*</para></entry></row>
+<link linkend="prod83">compoundCritAnd</link> ( &lt;OR&gt; <link linkend="prod83">compoundCritAnd</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod79" xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod83" xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod80">notCrit</link> ( &lt;AND&gt; <link linkend="prod80">notCrit</link> )*</para></entry></row>
+<link linkend="prod84">notCrit</link> ( &lt;AND&gt; <link linkend="prod84">notCrit</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod80" xreflabel="notCrit"/>notCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="notCrit"/>notCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? <link linkend="prod81">booleanPrimary</link></para></entry></row>
+( &lt;NOT&gt; )? <link linkend="prod85">booleanPrimary</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod81" xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod85" xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod35">translateCriteria</link> | ( <link linkend="prod82">commonValueExpression</link> ( ( <link linkend="prod83">betweenCrit</link> | <link linkend="prod84">matchCrit</link> | <link linkend="prod85">setCrit</link> | <link linkend="prod86">isNullCrit</link> | <link linkend="prod87">subqueryCompareCriteria</link> | <link linkend="prod88">compareCrit</link> ) )? ) | <link linkend="prod89">existsCriteria</link> | <link linkend="prod31">hasCriteria</link> )</para></entry></row>
+( <link linkend="prod38">translateCriteria</link> | ( <link linkend="prod86">commonValueExpression</link> ( ( <link linkend="prod87">betweenCrit</link> | <link linkend="prod88">matchCrit</link> | <link linkend="prod89">setCrit</link> | <link linkend="prod90">isNullCrit</link> | <link linkend="prod91">subqueryCompareCriteria</link> | <link linkend="prod92">compareCrit</link> ) )? ) | <link linkend="prod93">existsCriteria</link> | <link linkend="prod34">hasCriteria</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod90" xreflabel="operator"/>operator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod94" xreflabel="operator"/>operator</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( &lt;EQ&gt; | &lt;NE&gt; | &lt;NE2&gt; | &lt;LT&gt; | &lt;LE&gt; | &lt;GT&gt; | &lt;GE&gt; )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod88" xreflabel="compareCrit"/>compareCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod92" xreflabel="compareCrit"/>compareCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod90">operator</link> <link linkend="prod82">commonValueExpression</link></para></entry></row>
+<link linkend="prod94">operator</link> <link linkend="prod86">commonValueExpression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod91" xreflabel="subquery"/>subquery</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod95" xreflabel="subquery"/>subquery</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;LPAREN&gt; ( <link linkend="prod7">queryExpression</link> | ( <link linkend="prod8">storedProcedure</link> ) ) &lt;RPAREN&gt;</para></entry></row>
+&lt;LPAREN&gt; ( <link linkend="prod10">queryExpression</link> | ( <link linkend="prod11">storedProcedure</link> ) ) &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod87" xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod91" xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod90">operator</link> ( &lt;ANY&gt; | &lt;SOME&gt; | &lt;ALL&gt; ) <link linkend="prod91">subquery</link></para></entry></row>
+<link linkend="prod94">operator</link> ( &lt;ANY&gt; | &lt;SOME&gt; | &lt;ALL&gt; ) <link linkend="prod95">subquery</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="matchCrit"/>matchCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod88" xreflabel="matchCrit"/>matchCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? &lt;LIKE&gt; <link linkend="prod82">commonValueExpression</link> ( &lt;ESCAPE&gt; <link linkend="prod61">charVal</link> | ( &lt;LBRACE&gt; &lt;ESCAPE&gt; <link linkend="prod61">charVal</link> &lt;RBRACE&gt; ) )?</para></entry></row>
+( &lt;NOT&gt; )? &lt;LIKE&gt; <link linkend="prod86">commonValueExpression</link> ( &lt;ESCAPE&gt; <link linkend="prod65">charVal</link> | ( &lt;LBRACE&gt; &lt;ESCAPE&gt; <link linkend="prod65">charVal</link> &lt;RBRACE&gt; ) )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod61" 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="prod83" xreflabel="betweenCrit"/>betweenCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod87" xreflabel="betweenCrit"/>betweenCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? &lt;BETWEEN&gt; <link linkend="prod82">commonValueExpression</link> &lt;AND&gt; <link linkend="prod82">commonValueExpression</link></para></entry></row>
+( &lt;NOT&gt; )? &lt;BETWEEN&gt; <link linkend="prod86">commonValueExpression</link> &lt;AND&gt; <link linkend="prod86">commonValueExpression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod86" xreflabel="isNullCrit"/>isNullCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod90" xreflabel="isNullCrit"/>isNullCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;IS&gt; ( &lt;NOT&gt; )? &lt;NULL&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod85" xreflabel="setCrit"/>setCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod89" xreflabel="setCrit"/>setCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? &lt;IN&gt; ( ( <link linkend="prod91">subquery</link> ) | ( &lt;LPAREN&gt; <link linkend="prod82">commonValueExpression</link> ( &lt;COMMA&gt; <link linkend="prod82">commonValueExpression</link> )* &lt;RPAREN&gt; ) )</para></entry></row>
+( &lt;NOT&gt; )? &lt;IN&gt; ( ( <link linkend="prod95">subquery</link> ) | ( &lt;LPAREN&gt; <link linkend="prod86">commonValueExpression</link> ( &lt;COMMA&gt; <link linkend="prod86">commonValueExpression</link> )* &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod89" xreflabel="existsCriteria"/>existsCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod93" xreflabel="existsCriteria"/>existsCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;EXISTS&gt; <link linkend="prod91">subquery</link></para></entry></row>
+&lt;EXISTS&gt; <link linkend="prod95">subquery</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="groupBy"/>groupBy</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="groupBy"/>groupBy</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;GROUP&gt; &lt;BY&gt; ( <link linkend="prod92">groupByItem</link> ( &lt;COMMA&gt; <link linkend="prod92">groupByItem</link> )* )</para></entry></row>
+&lt;GROUP&gt; &lt;BY&gt; ( <link linkend="prod96">groupByItem</link> ( &lt;COMMA&gt; <link linkend="prod96">groupByItem</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod92" xreflabel="groupByItem"/>groupByItem</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod96" xreflabel="groupByItem"/>groupByItem</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod17">expression</link></para></entry></row>
+<link linkend="prod21">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="having"/>having</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="having"/>having</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;HAVING&gt; <link linkend="prod29">criteria</link></para></entry></row>
+&lt;HAVING&gt; <link linkend="prod32">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="orderby"/>orderby</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="orderby"/>orderby</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ORDER&gt; &lt;BY&gt; <link linkend="prod93">sortSpecification</link> ( &lt;COMMA&gt; <link linkend="prod93">sortSpecification</link> )*</para></entry></row>
+&lt;ORDER&gt; &lt;BY&gt; <link linkend="prod97">sortSpecification</link> ( &lt;COMMA&gt; <link linkend="prod97">sortSpecification</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod93" xreflabel="sortSpecification"/>sortSpecification</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod97" xreflabel="sortSpecification"/>sortSpecification</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod94">sortKey</link> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="prod15">nonReserved</link> <link linkend="prod15">nonReserved</link> )?</para></entry></row>
+<link linkend="prod98">sortKey</link> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="prod18">nonReserved</link> <link linkend="prod18">nonReserved</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod94" xreflabel="sortKey"/>sortKey</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod98" xreflabel="sortKey"/>sortKey</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod17">expression</link></para></entry></row>
+<link linkend="prod21">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod47" xreflabel="limit"/>limit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="limit"/>limit</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;LIMIT&gt; ( &lt;INTEGERVAL&gt; | &lt;QMARK&gt; ) ( &lt;COMMA&gt; ( &lt;INTEGERVAL&gt; | &lt;QMARK&gt; ) )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod38" xreflabel="option"/>option</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="option"/>option</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;OPTION&gt; ( &lt;MAKEDEP&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* | &lt;MAKENOTDEP&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* | &lt;NOCACHE&gt; ( <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* )? )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod17" xreflabel="expression"/>expression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod21" xreflabel="expression"/>expression</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod29">criteria</link></para></entry></row>
+<link linkend="prod32">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod86" xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod95">plusExpression</link> ( &lt;CONCAT_OP&gt; <link linkend="prod95">plusExpression</link> )* )</para></entry></row>
+( <link linkend="prod99">plusExpression</link> ( &lt;CONCAT_OP&gt; <link linkend="prod99">plusExpression</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod95" xreflabel="plusExpression"/>plusExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod99" xreflabel="plusExpression"/>plusExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod96">timesExpression</link> ( <link linkend="prod97">plusOperator</link> <link linkend="prod96">timesExpression</link> )* )</para></entry></row>
+( <link linkend="prod100">timesExpression</link> ( <link linkend="prod101">plusOperator</link> <link linkend="prod100">timesExpression</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod97" xreflabel="plusOperator"/>plusOperator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod101" xreflabel="plusOperator"/>plusOperator</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( &lt;PLUS&gt; | &lt;MINUS&gt; )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod96" xreflabel="timesExpression"/>timesExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod100" xreflabel="timesExpression"/>timesExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod98">valueExpressionPrimary</link> ( <link linkend="prod99">timesOperator</link> <link linkend="prod98">valueExpressionPrimary</link> )* )</para></entry></row>
+( <link linkend="prod102">valueExpressionPrimary</link> ( <link linkend="prod103">timesOperator</link> <link linkend="prod102">valueExpressionPrimary</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod99" xreflabel="timesOperator"/>timesOperator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod103" xreflabel="timesOperator"/>timesOperator</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( &lt;STAR&gt; | &lt;SLASH&gt; )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod98" xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod102" xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;QMARK&gt; | <link linkend="prod100">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod15">nonReserved</link> <link linkend="prod101">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod60">textAgg</link> ) | ( <link linkend="prod62">aggregateSymbol</link> ) | ( <link linkend="prod62">aggregateSymbol</link> ) | ( <link linkend="prod62">aggregateSymbol</link> ) | ( <link linkend="prod59">xmlAgg</link> ) | ( <link linkend="prod101">function</link> ) | ( &lt;ID&gt; ) | <link linkend="prod91">subquery</link> | ( &lt;LPAREN&gt; <link linkend="prod17">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod102">searchedCaseExpression</link> | <link linkend="prod103">caseExpression</link> )</para></entry></row>
+( &lt;QMARK&gt; | <link linkend="prod104">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod18">nonReserved</link> <link linkend="prod105">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod64">textAgg</link> ) | ( <link linkend="prod66">aggregateSymbol</link> ) | ( <link linkend="prod66">aggregateSymbol</link> ) | ( <link linkend="prod66">aggregateSymbol</link> ) | ( <link linkend="prod63">xmlAgg</link> ) | ( <link linkend="prod105">function</link> ) | ( &lt;ID&gt; ) | <link linkend="prod95">subquery</link> | ( &lt;LPAREN&gt; <link linkend="prod21">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod106">searchedCaseExpression</link> | <link linkend="prod107">caseExpression</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod103" xreflabel="caseExpression"/>caseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod107" xreflabel="caseExpression"/>caseExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CASE&gt; <link linkend="prod17">expression</link> ( &lt;WHEN&gt; <link linkend="prod17">expression</link> &lt;THEN&gt; <link linkend="prod17">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod17">expression</link> )? &lt;END&gt;</para></entry></row>
+&lt;CASE&gt; <link linkend="prod21">expression</link> ( &lt;WHEN&gt; <link linkend="prod21">expression</link> &lt;THEN&gt; <link linkend="prod21">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod21">expression</link> )? &lt;END&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod102" xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod106" xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CASE&gt; ( &lt;WHEN&gt; <link linkend="prod29">criteria</link> &lt;THEN&gt; <link linkend="prod17">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod17">expression</link> )? &lt;END&gt;</para></entry></row>
+&lt;CASE&gt; ( &lt;WHEN&gt; <link linkend="prod32">criteria</link> &lt;THEN&gt; <link linkend="prod21">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod21">expression</link> )? &lt;END&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod101" xreflabel="function"/>function</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod105" xreflabel="function"/>function</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;CONVERT&gt; &lt;LPAREN&gt; <link linkend="prod17">expression</link> &lt;COMMA&gt; <link linkend="prod32">dataType</link> &lt;RPAREN&gt; ) | ( &lt;CAST&gt; &lt;LPAREN&gt; <link linkend="prod17">expression</link> &lt;AS&gt; <link linkend="prod32">dataType</link> &lt;RPAREN&gt; ) | ( <link linkend="prod15">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod17">expression</link> &lt;COMMA&gt; <link linkend="prod104">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod15">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod105">intervalType</link> &lt;COMMA&gt; <link linkend="prod17">expression</link> &lt;COMMA&gt; <link linkend="prod17">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod106">queryString</link> | ( ( &lt;LEFT&gt; | &lt;RIGHT&gt; | &lt;CHAR&gt; | &lt;USER&gt; | &lt;YEAR&gt; | &lt;MONTH&gt; | &lt;HOUR&gt; | &lt;MINUTE&gt; | &lt;SECOND&gt; | &lt;XMLCONCAT&gt; | &lt;XMLCOMMENT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod17">expression</link> !
 ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;INSERT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;TRANSLATE&gt; ) &lt;LPAREN&gt; ( <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* )? &lt;RPAREN&gt; ) | <link linkend="prod107">xmlParse</link> | <link linkend="prod108">xmlElement</link> | ( &lt;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod109">idExpression</link> | <link linkend="prod109">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod110">xmlForest</link> | <link linkend="prod72">xmlSerialize</link> | <link linkend="prod75">xmlQuery</link> | ( <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )*!
  )? &lt;RPAREN&gt; ) )</para></entry></row>
+( ( &lt;CONVERT&gt; &lt;LPAREN&gt; <link linkend="prod21">expression</link> &lt;COMMA&gt; <link linkend="prod35">dataType</link> &lt;RPAREN&gt; ) | ( &lt;CAST&gt; &lt;LPAREN&gt; <link linkend="prod21">expression</link> &lt;AS&gt; <link linkend="prod35">dataType</link> &lt;RPAREN&gt; ) | ( <link linkend="prod18">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod21">expression</link> &lt;COMMA&gt; <link linkend="prod108">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod18">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod109">intervalType</link> &lt;COMMA&gt; <link linkend="prod21">expression</link> &lt;COMMA&gt; <link linkend="prod21">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod110">queryString</link> | ( ( &lt;LEFT&gt; | &lt;RIGHT&gt; | &lt;CHAR&gt; | &lt;USER&gt; | &lt;YEAR&gt; | &lt;MONTH&gt; | &lt;HOUR&gt; | &lt;MINUTE&gt; | &lt;SECOND&gt; | &lt;XMLCONCAT&gt; | &lt;XMLCOMMENT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod21">expression</link> !
 ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;INSERT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;TRANSLATE&gt; ) &lt;LPAREN&gt; ( <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )* )? &lt;RPAREN&gt; ) | <link linkend="prod111">xmlParse</link> | <link linkend="prod112">xmlElement</link> | ( &lt;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod113">idExpression</link> | <link linkend="prod113">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod114">xmlForest</link> | <link linkend="prod76">xmlSerialize</link> | <link linkend="prod79">xmlQuery</link> | ( <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )*!
  )? &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod104" xreflabel="stringConstant"/>stringConstant</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod108" 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="prod107" xreflabel="xmlParse"/>xmlParse</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod111" xreflabel="xmlParse"/>xmlParse</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLPARSE&gt; &lt;LPAREN&gt; <link linkend="prod15">nonReserved</link> <link linkend="prod17">expression</link> ( <link linkend="prod15">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLPARSE&gt; &lt;LPAREN&gt; <link linkend="prod18">nonReserved</link> <link linkend="prod21">expression</link> ( <link linkend="prod18">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod106" xreflabel="queryString"/>queryString</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod110" xreflabel="queryString"/>queryString</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod15">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod58">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+<link linkend="prod18">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod21">expression</link> ( &lt;COMMA&gt; <link linkend="prod62">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod108" xreflabel="xmlElement"/>xmlElement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod112" xreflabel="xmlElement"/>xmlElement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLELEMENT&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod2">id</link> | <link linkend="prod2">id</link> ) ( &lt;COMMA&gt; <link linkend="prod76">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod111">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLELEMENT&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod2">id</link> | <link linkend="prod2">id</link> ) ( &lt;COMMA&gt; <link linkend="prod80">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod115">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod21">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod111" xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod115" xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLATTRIBUTES&gt; &lt;LPAREN&gt; <link linkend="prod58">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod58">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLATTRIBUTES&gt; &lt;LPAREN&gt; <link linkend="prod62">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod62">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod110" xreflabel="xmlForest"/>xmlForest</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod114" xreflabel="xmlForest"/>xmlForest</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLFOREST&gt; &lt;LPAREN&gt; ( <link linkend="prod76">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod58">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod58">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLFOREST&gt; &lt;LPAREN&gt; ( <link linkend="prod80">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod62">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod62">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod80" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLNAMESPACES&gt; &lt;LPAREN&gt; <link linkend="prod112">namespaceItem</link> ( &lt;COMMA&gt; <link linkend="prod112">namespaceItem</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLNAMESPACES&gt; &lt;LPAREN&gt; <link linkend="prod116">namespaceItem</link> ( &lt;COMMA&gt; <link linkend="prod116">namespaceItem</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod112" xreflabel="namespaceItem"/>namespaceItem</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod116" xreflabel="namespaceItem"/>namespaceItem</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( <link linkend="prod1">stringVal</link> &lt;AS&gt; <link linkend="prod2">id</link> )</para></entry></row>
 <row>
@@ -833,20 +846,24 @@
 <entry align="left" valign="top"><para>::= 
 ( &lt;DEFAULT_KEYWORD&gt; <link linkend="prod1">stringVal</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod109" xreflabel="idExpression"/>idExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod113" xreflabel="idExpression"/>idExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod32" xreflabel="dataType"/>dataType</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod19" xreflabel="dataTypeString"/>dataTypeString</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( &lt;STRING&gt; | &lt;VARCHAR&gt; | &lt;BOOLEAN&gt; | &lt;BYTE&gt; | &lt;TINYINT&gt; | &lt;SHORT&gt; | &lt;SMALLINT&gt; | &lt;CHAR&gt; | &lt;INTEGER&gt; | &lt;LONG&gt; | &lt;BIGINT&gt; | &lt;BIGINTEGER&gt; | &lt;FLOAT&gt; | &lt;REAL&gt; | &lt;DOUBLE&gt; | &lt;BIGDECIMAL&gt; | &lt;DECIMAL&gt; | &lt;DATE&gt; | &lt;TIME&gt; | &lt;TIMESTAMP&gt; | &lt;OBJECT&gt; | &lt;BLOB&gt; | &lt;CLOB&gt; | &lt;XML&gt; )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod105" xreflabel="intervalType"/>intervalType</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="dataType"/>dataType</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod15">nonReserved</link> )</para></entry></row>
+<link linkend="prod19">dataTypeString</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod100" xreflabel="literal"/>literal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod109" xreflabel="intervalType"/>intervalType</para></entry>
 <entry align="left" valign="top"><para>::= 
+( <link linkend="prod18">nonReserved</link> )</para></entry></row>
+<row>
+<entry align="right" valign="top"><para><anchor id="prod104" xreflabel="literal"/>literal</para></entry>
+<entry align="left" valign="top"><para>::= 
 ( <link linkend="prod1">stringVal</link> | &lt;INTEGERVAL&gt; | &lt;FLOATVAL&gt; | &lt;FALSE&gt; | &lt;TRUE&gt; | &lt;UNKNOWN&gt; | &lt;NULL&gt; | ( ( &lt;BOOLEANTYPE&gt; | &lt;TIMESTAMPTYPE&gt; | &lt;DATETYPE&gt; | &lt;TIMETYPE&gt; ) <link linkend="prod1">stringVal</link> &lt;RBRACE&gt; ) )</para></entry></row>
 </tbody>
 </tgroup>

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml	2011-01-17 20:08:09 UTC (rev 2845)
@@ -665,7 +665,7 @@
       <para>Creation syntax:
       </para>
       <listitem>
-        <para>Explicit: CREATE LOCAL TEMPORARY TABLE x (column type, ... [PRIMARY KEY (column, ...)])
+        <para>Explicit: CREATE LOCAL TEMPORARY TABLE x (column type [NOT NULL], ... [PRIMARY KEY (column, ...)])
         </para>
       </listitem>
       <listitem>
@@ -680,6 +680,9 @@
         <para>If #x doesn't exist, it will be defined using the target column names (in not supplied, the column names will match the derived column names from the query), and the types from the query derived columns. 
         </para>
       </listitem>
+      <listitem>
+      	<para>Use the SERIAL data type to specify a NOT NULL and auto-incrementing INTEGER column.  The starting value of a SERIAL column is 1.</para>
+      </listitem>
     </itemizedlist>
     <itemizedlist>
       <para>Drop syntax:

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -337,6 +337,13 @@
                 case SupportConstants.Element.SEARCHABLE_LIKE:   return true;
                 case SupportConstants.Element.SEARCHABLE_COMPARE:return true;
                 case SupportConstants.Element.SELECT:            return true;
+                case SupportConstants.Element.NULL: {
+                	if (id.isNotNull()) {
+                		return false;
+                	}
+                	break;
+                }
+                case SupportConstants.Element.AUTO_INCREMENT:	 return id.isAutoIncrement();
             }
             
             // If this is a temp table column or real metadata is unknown, return hard-coded values

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -44,6 +44,7 @@
  */
 public class TempMetadataID implements Serializable {
     
+	private static final long serialVersionUID = -1879211827339120135L;
 	private static final int LOCAL_CACHE_SIZE = 8;
 	
 	static class TableData {
@@ -75,6 +76,8 @@
 	//Column metadata
     private int position;
     private Class<?> type;     // type of this element, only for element
+    private boolean autoIncrement;
+    private boolean notNull;
     
     /**
      * Constructor for group form of metadata ID.
@@ -331,5 +334,21 @@
 		}
 		return data;
 	}
+
+	public boolean isAutoIncrement() {
+		return autoIncrement;
+	}
+	
+	public void setAutoIncrement(boolean autoIncrement) {
+		this.autoIncrement = autoIncrement;
+	}
+
+	public boolean isNotNull() {
+		return notNull;
+	}
+	
+	public void setNotNull(boolean notNull) {
+		this.notNull = notNull;
+	}
 		
 }

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -25,7 +25,6 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -71,7 +70,7 @@
      * Get all temp group and element metadata
      * @param data Map of upper case group name to group TempMetadataID object
      */
-    public Map getData() {
+    public Map<String, TempMetadataID> getData() {
         return this.tempGroups;
     }
    
@@ -107,7 +106,7 @@
         // Add the temporary group
         String tempName = tempGroup.toUpperCase();
         
-        List elementIDs = new ArrayList(tempSymbols.size());
+        List<TempMetadataID> elementIDs = new ArrayList<TempMetadataID>(tempSymbols.size());
         
         for (SingleElementSymbol symbol : tempSymbols) {
             TempMetadataID elementID = createElementSymbol(tempName, symbol, isTempTable);
@@ -178,23 +177,6 @@
     }
     
     /**
-     * Add a bunch of temp groups all at once.  This map should contain temp
-     * group names (Strings) as keys and the TempMetadataID for the group as the 
-     * value.
-     * @param tempGroupMap (tempGroupName (String) --> TempMetadataID)
-     */
-    public void addTempGroups(Map tempGroupMap) {
-        if(tempGroupMap != null && tempGroupMap.size() > 0) {
-            Iterator keyIter = tempGroupMap.keySet().iterator();
-            while(keyIter.hasNext()) {
-                String tempGroupName = (String) keyIter.next();
-                TempMetadataID groupID = (TempMetadataID) tempGroupMap.get(tempGroupName);
-                this.tempGroups.put(tempGroupName, groupID);
-            }    
-        }
-    }
-    
-    /**
      * Get temporary group ID based on group name
      * @param tempGroup Group name
      * @return Metadata ID or null if not found
@@ -217,9 +199,7 @@
             
         TempMetadataID groupID = tempGroups.get(groupName.toUpperCase());
         if(groupID != null) {
-            Iterator elementIter = groupID.getElements().iterator();
-            while(elementIter.hasNext()) { 
-                TempMetadataID elementID = (TempMetadataID) elementIter.next();
+        	for (TempMetadataID elementID : groupID.getElements()) {
                 if(elementID.getID().equalsIgnoreCase(tempElement)) { 
                     return elementID;
                 }

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -531,9 +531,8 @@
 				if(command instanceof StoredProcedure){
 					modelID = ((StoredProcedure)command).getModelID();
 				}else{
-					Collection groups = GroupCollectorVisitor.getGroups(command, true);
-					Iterator groupIter = groups.iterator();
-					GroupSymbol group = (GroupSymbol) groupIter.next();
+					Collection<GroupSymbol> groups = GroupCollectorVisitor.getGroups(command, true);
+					GroupSymbol group = groups.iterator().next();
 
 					modelID = metadata.getModelID(group.getMetadataID());
 				}

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -78,6 +78,7 @@
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.lang.Delete;
+import org.teiid.query.sql.lang.ExistsCriteria;
 import org.teiid.query.sql.lang.From;
 import org.teiid.query.sql.lang.FromClause;
 import org.teiid.query.sql.lang.GroupBy;
@@ -108,6 +109,7 @@
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
+import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SelectSymbol;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.util.SymbolMap;
@@ -594,8 +596,10 @@
 			//skip the rewrite here, we'll do that in the optimizer
 			//so that we know what the determinism level is.
 			addNestedCommand(sourceNode, container.getGroup(), container, c, false);
-		} else if (container instanceof TranslatableProcedureContainer && !container.getGroup().isTempGroupSymbol() && 
-				!CriteriaCapabilityValidatorVisitor.canPushLanguageObject(container, metadata.getModelID(container.getGroup().getMetadataID()), metadata, capFinder, analysisRecord)) {
+		} else if (!container.getGroup().isTempTable() && //we hope for the best, and do a specific validation for subqueries below
+				container instanceof TranslatableProcedureContainer //we force the evaluation of procedure params - TODO: inserts are fine except for nonpushdown functions on columns
+				&& !CriteriaCapabilityValidatorVisitor.canPushLanguageObject(container, metadata.getModelID(container.getGroup().getMetadataID()), metadata, capFinder, analysisRecord)) {
+			//do a workaround of row-by-row processing for update/delete
 			if (metadata.getUniqueKeysInGroup(container.getGroup().getMetadataID()).isEmpty() 
 					|| !CapabilitiesUtil.supports(Capability.CRITERIA_COMPARE_EQ, metadata.getModelID(container.getGroup().getMetadataID()), metadata, capFinder)) {
 				throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
@@ -612,8 +616,21 @@
 		}
 		
 		//plan any subqueries in criteria/parameters/values
-		for (SubqueryContainer subqueryContainer : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(container)) {
-    		ProcessorPlan plan = QueryOptimizer.optimizePlan(subqueryContainer.getCommand(), metadata, null, capFinder, analysisRecord, context);
+		for (SubqueryContainer<?> subqueryContainer : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(container)) {
+			if (c == null && container.getGroup().isTempTable()) {
+				if (subqueryContainer.getCommand().getCorrelatedReferences() == null) {
+					if (subqueryContainer instanceof ScalarSubquery) {
+						((ScalarSubquery) subqueryContainer).setShouldEvaluate(true);
+					} else if (subqueryContainer instanceof ExistsCriteria) {
+						((ExistsCriteria) subqueryContainer).setShouldEvaluate(true);
+					} else {
+						throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
+					}
+				} else {
+					throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
+				}
+    		}
+			ProcessorPlan plan = QueryOptimizer.optimizePlan(subqueryContainer.getCommand(), metadata, null, capFinder, analysisRecord, context);
     		subqueryContainer.getCommand().setProcessorPlan(plan);
     		
     		if (c == null) {

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -57,7 +57,7 @@
 import org.teiid.query.sql.lang.SubqueryCompareCriteria;
 import org.teiid.query.sql.lang.SubqueryContainer;
 import org.teiid.query.sql.lang.SubquerySetCriteria;
-import org.teiid.query.sql.navigator.PreOrderNavigator;
+import org.teiid.query.sql.navigator.PostOrderNavigator;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Function;
@@ -498,12 +498,12 @@
 			QueryCommand queryCommand) throws TeiidComponentException {
 		// Check that query in access node is for the same model as current node
 		try {                
-		    Collection subQueryGroups = GroupCollectorVisitor.getGroupsIgnoreInlineViews(queryCommand, false);
+		    Collection<GroupSymbol> subQueryGroups = GroupCollectorVisitor.getGroupsIgnoreInlineViews(queryCommand, false);
 		    if(subQueryGroups.size() == 0) {
 		        // No FROM?
 		        return null;
 		    }
-		    GroupSymbol subQueryGroup = (GroupSymbol)subQueryGroups.iterator().next();
+		    GroupSymbol subQueryGroup = subQueryGroups.iterator().next();
 
 		    Object modelID = subQueryGroup.getModelMetadataId();
 		    if (modelID == null) {
@@ -583,7 +583,7 @@
         }
         
         CriteriaCapabilityValidatorVisitor visitor = new CriteriaCapabilityValidatorVisitor(modelID, metadata, capFinder, caps);
-        PreOrderNavigator.doVisit(obj, visitor);
+        PostOrderNavigator.doVisit(obj, visitor);
         
         if(visitor.getException() != null) {
             throw visitor.getException();

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -131,7 +131,7 @@
 	        		ProcessorPlan plan = withCommand.getCommand().getProcessorPlan();
 					withProcessor = new QueryProcessor(plan, getContext(), this.root.getBufferManager(), this.root.getDataManager());
 					Create create = new Create();
-					create.setColumns(withCommand.getColumns());
+					create.setElementSymbolsAsColumns(withCommand.getColumns());
 					create.setTable(withCommand.getGroupSymbol());
 					this.root.getDataManager().registerRequest(getContext(), create, TempMetadataAdapter.TEMP_MODEL.getID(), null, 0);
     			}

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -306,6 +306,9 @@
 	    externalGroups.addGroup(variables);
 	    TempMetadataID tid = metadata.addTempGroup(name, symbols);
 	    tid.setMetadataType(Type.SCALAR);
+	    for (TempMetadataID cid : tid.getElements()) {
+			cid.setMetadataType(Type.SCALAR);
+		}
 	    variables.setMetadataID(tid);
 	    return variables;
 	}

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -282,7 +282,7 @@
             if (externalGroups != null) {
             	container.getCommand().pushNewResolvingContext(externalGroups);
             }
-            QueryResolver.resolveCommand(container.getCommand(), metadata.getMetadata());
+            QueryResolver.resolveCommand(container.getCommand(), metadata.getMetadata(), false);
         }
 	}
 	

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -30,6 +30,8 @@
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
+import org.teiid.metadata.Column;
+import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataID;
@@ -77,18 +79,18 @@
             //if we get here then either the group does not exist or has already been defined as a temp table
             //if it has been defined as a temp table, that's ok we'll use this as the new definition and throw an
             //exception at runtime if the user has not dropped the previous table yet
-            TempMetadataID tempTable = ResolverUtil.addTempTable(metadata, group, create.getColumns());
+            TempMetadataID tempTable = ResolverUtil.addTempTable(metadata, group, create.getColumnSymbols());
             ResolverUtil.resolveGroup(create.getTable(), metadata);
             Set<GroupSymbol> groups = new HashSet<GroupSymbol>();
             groups.add(create.getTable());
             ResolverVisitor.resolveLanguageObject(command, groups, metadata);
-            addPrimaryKey(create, tempTable);
+            addAdditionalMetadata(create, tempTable);
         } else if(command.getType() == Command.TYPE_DROP) {
             ResolverUtil.resolveGroup(((Drop)command).getTable(), metadata);
         }
     }
 
-	public static void addPrimaryKey(Create create, TempMetadataID tempTable) {
+	public static void addAdditionalMetadata(Create create, TempMetadataID tempTable) {
 		if (!create.getPrimaryKey().isEmpty()) {
 			ArrayList<TempMetadataID> primaryKey = new ArrayList<TempMetadataID>(create.getPrimaryKey().size());
 			for (ElementSymbol symbol : create.getPrimaryKey()) {
@@ -96,6 +98,16 @@
 			}
 			tempTable.setPrimaryKey(primaryKey);
 		}
+		for (int i = 0; i < create.getColumns().size(); i++) {
+			Column column = create.getColumns().get(i);
+			TempMetadataID tid = tempTable.getElements().get(i);
+			if (column.isAutoIncremented()) {
+				tid.setAutoIncrement(true);
+			}
+			if (column.getNullType() == NullType.No_Nulls) {
+				tid.setNotNull(true);
+			}
+		}
 	}
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -595,10 +595,9 @@
 
     public static TempMetadataID addTempGroup(TempMetadataAdapter metadata,
                                     GroupSymbol symbol,
-                                    List symbols, boolean tempTable) throws QueryResolverException {
+                                    List<? extends SingleElementSymbol> symbols, boolean tempTable) throws QueryResolverException {
         HashSet<String> names = new HashSet<String>();
-        for (Iterator i = symbols.iterator(); i.hasNext();) {
-            SingleElementSymbol ses = (SingleElementSymbol)i.next();
+        for (SingleElementSymbol ses : symbols) {
             if (!names.add(ses.getShortCanonicalName())) {
                 throw new QueryResolverException(QueryPlugin.Util.getString("ResolverUtil.duplicateName", symbol, ses.getShortName())); //$NON-NLS-1$
             }
@@ -613,7 +612,7 @@
     
     public static TempMetadataID addTempTable(TempMetadataAdapter metadata,
                                      GroupSymbol symbol,
-                                     List symbols) throws QueryResolverException {
+                                     List<? extends SingleElementSymbol> symbols) throws QueryResolverException {
         return addTempGroup(metadata, symbol, symbols, true);
     }
 

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -25,8 +25,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.util.EquivalenceUtil;
-import org.teiid.core.util.HashCodeUtil;
+import org.teiid.metadata.Column;
+import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.symbol.ElementSymbol;
@@ -40,10 +42,9 @@
 public class Create extends Command {
     /** Identifies the table to be created. */
     private GroupSymbol table;
-    
-    private List<ElementSymbol> columns = new ArrayList<ElementSymbol>();
-    
     private List<ElementSymbol> primaryKey = new ArrayList<ElementSymbol>();
+    private List<Column> columns = new ArrayList<Column>();
+    private List<ElementSymbol> columnSymbols;
     
     public GroupSymbol getTable() {
         return table;
@@ -53,7 +54,7 @@
         this.table = table;
     }
     
-    public List<ElementSymbol> getColumns() {
+    public List<Column> getColumns() {
         return columns;
     }
     
@@ -61,6 +62,22 @@
 		return primaryKey;
 	}
     
+    /**
+     * Derived ElementSymbol list.  Do not modify without also modifying the columns.
+     * @return
+     */
+    public List<ElementSymbol> getColumnSymbols() {
+    	if (columnSymbols == null) {
+    		columnSymbols = new ArrayList<ElementSymbol>(columns.size());
+    		for (Column column : columns) {
+				ElementSymbol es = new ElementSymbol(column.getName());
+				es.setType(DataTypeManager.getDataTypeClass(column.getRuntimeType()));
+				columnSymbols.add(es);
+			}
+    	}
+		return columnSymbols;
+	}
+    
     /** 
      * @see org.teiid.query.sql.lang.Command#getType()
      * @since 5.5
@@ -75,9 +92,17 @@
      */
     public Object clone() {  
         Create copy = new Create();      
-        GroupSymbol copyTable = (GroupSymbol) table.clone();    
+        GroupSymbol copyTable = table.clone();    
         copy.setTable(copyTable);
-        copy.setColumns(LanguageObject.Util.deepClone(columns, ElementSymbol.class));
+        copy.columns = new ArrayList<Column>(columns.size());
+        for (Column column : columns) {
+			Column copyColumn = new Column();
+			copyColumn.setName(column.getName());
+			copyColumn.setRuntimeType(column.getRuntimeType());
+			copyColumn.setAutoIncremented(column.isAutoIncremented());
+			copyColumn.setNullType(column.getNullType());
+			copy.columns.add(copyColumn);
+		}
         copy.primaryKey = LanguageObject.Util.deepClone(primaryKey, ElementSymbol.class);
         copyMetadataState(copy);
         return copy;
@@ -107,15 +132,19 @@
         visitor.visit(this);
     }
 
-    public void setColumns(List<ElementSymbol> columns) {
-        this.columns = columns;
+    public void setElementSymbolsAsColumns(List<ElementSymbol> columns) {
+    	this.columns.clear();
+    	for (ElementSymbol elementSymbol : columns) {
+    		Column c = new Column();
+    		c.setName(elementSymbol.getName());
+    		c.setRuntimeType(DataTypeManager.getDataTypeName(elementSymbol.getType()));
+    		c.setNullType(NullType.Nullable);
+    		this.columns.add(c);
+		}
     }
     
     public int hashCode() {
-        int myHash = 0;
-        myHash = HashCodeUtil.hashCode(myHash, this.table);
-        myHash = HashCodeUtil.hashCode(myHash, this.columns);
-        return myHash;
+        return this.table.hashCode();
     }
     
     public String toString() {
@@ -135,8 +164,22 @@
 
         Create other = (Create) obj;
         
+        if (other.columns.size() != this.columns.size()) {
+        	return false;
+        }
+        
+        for (int i = 0; i < this.columns.size(); i++) {
+        	Column c = this.columns.get(i);
+        	Column o = other.columns.get(i);
+        	if (!c.getName().equalsIgnoreCase(o.getName()) 
+        		|| DataTypeManager.getDataTypeClass(c.getRuntimeType().toLowerCase()) != DataTypeManager.getDataTypeClass(o.getRuntimeType().toLowerCase())
+        		|| c.isAutoIncremented() != o.isAutoIncremented()
+        		|| c.getNullType() != o.getNullType()) {
+        		return false;
+        	}
+		}
+        
         return EquivalenceUtil.areEqual(getTable(), other.getTable()) &&
-               EquivalenceUtil.areEqual(getColumns(), other.getColumns()) &&
                EquivalenceUtil.areEqual(getPrimaryKey(), other.getPrimaryKey());
     }
 }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -23,7 +23,6 @@
 package org.teiid.query.sql.navigator;
 
 import java.util.Collection;
-import java.util.Iterator;
 
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
@@ -63,15 +62,15 @@
         }
     }
     
-    protected void visitNodes(Collection nodes) {
+    protected void visitNodes(Collection<? extends LanguageObject> nodes) {
         if(this.visitor.shouldAbort()) {
             return;
         }
         
         if (nodes != null && nodes.size() > 0) {
-            for (Iterator i = nodes.iterator(); i.hasNext();) {
-                visitNode((LanguageObject)i.next());
-            }
+        	for (LanguageObject languageObject : nodes) {
+				visitNode(languageObject);
+			}
         }
     }
 

Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -305,7 +305,7 @@
         visitNode(obj.getGroup());
         visitNodes(obj.getVariables());
         visitNodes(obj.getValues());
-        if(obj.getQueryExpression()!=null) {
+        if(deep && obj.getQueryExpression()!=null) {
         	visitNode(obj.getQueryExpression());
         }
         visitNode(obj.getOption());
@@ -314,7 +314,7 @@
     public void visit(Create obj) {
         preVisitVisitor(obj);
         visitNode(obj.getTable());
-        visitNodes(obj.getColumns());
+        visitNodes(obj.getColumnSymbols());
         visitNodes(obj.getPrimaryKey());
         postVisitVisitor(obj);
     }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -30,7 +30,6 @@
 import org.teiid.query.sql.lang.BatchedUpdateCommand;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.ExistsCriteria;
-import org.teiid.query.sql.lang.Insert;
 import org.teiid.query.sql.lang.SetQuery;
 import org.teiid.query.sql.lang.SubqueryCompareCriteria;
 import org.teiid.query.sql.lang.SubqueryFromClause;
@@ -124,7 +123,7 @@
      */
     public static final List<Command> getCommands(Command command) {
         CommandCollectorVisitor visitor = new CommandCollectorVisitor();
-        final boolean visitCommands = command instanceof SetQuery || command instanceof Insert;
+        final boolean visitCommands = command instanceof SetQuery;
         PreOrderNavigator navigator = new PreOrderNavigator(visitor) {
 
         	@Override

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	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -34,6 +34,8 @@
 import org.teiid.language.SQLConstants;
 import org.teiid.language.SQLConstants.NonReserved;
 import org.teiid.language.SQLConstants.Tokens;
+import org.teiid.metadata.Column;
+import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.lang.AtomicCriteria;
@@ -379,14 +381,23 @@
         append(SPACE);
 
         // Columns clause
-        List<ElementSymbol> columns = obj.getColumns();
+        List<Column> columns = obj.getColumns();
         append("("); //$NON-NLS-1$
-        Iterator<ElementSymbol> iter = columns.iterator();
+        Iterator<Column> iter = columns.iterator();
         while (iter.hasNext()) {
-            ElementSymbol element = iter.next();
-            outputShortName(element);
+            Column element = iter.next();
+            outputDisplayName(element.getName());
             append(SPACE);
-            append(DataTypeManager.getDataTypeName(element.getType()));
+            if (element.isAutoIncremented()) {
+            	append(NonReserved.SERIAL);
+            } else {
+	            append(element.getRuntimeType());
+	            if (element.getNullType() == NullType.No_Nulls) {
+	            	append(NOT);
+	            	append(SPACE);
+	            	append(NULL);
+	            }
+            }
             if (iter.hasNext()) {
                 append(", "); //$NON-NLS-1$
             }
@@ -397,10 +408,10 @@
             append(" "); //$NON-NLS-1$
             append(NonReserved.KEY);
             append(Tokens.LPAREN);
-            iter = obj.getPrimaryKey().iterator();
-            while (iter.hasNext()) {
-                outputShortName(iter.next());
-                if (iter.hasNext()) {
+            Iterator<ElementSymbol> pkiter = obj.getPrimaryKey().iterator();
+            while (pkiter.hasNext()) {
+                outputShortName(pkiter.next());
+                if (pkiter.hasNext()) {
                     append(", "); //$NON-NLS-1$
                 }
             }

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -25,8 +25,10 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -94,7 +96,12 @@
 				}
 				for (int i = 0; i < indexes.length; i++) {
 					if (indexes[i] == -1) {
-						newTuple.add(null);
+						AtomicInteger sequence = sequences.get(i);
+						if (sequence != null) {
+							newTuple.add(sequence.getAndIncrement());
+						} else {
+							newTuple.add(null);
+						}
 					} else {
 						newTuple.add(tuple.get(indexes[i]));
 					}
@@ -105,6 +112,11 @@
 				tuple.add(0, rowId.getAndIncrement());
 			}
 			currentTuple = tuple;
+			for (int i : notNull) {
+				if (tuple.get(i) == null) {
+					throw new TeiidProcessingException(QueryPlugin.Util.getString("TempTable.not_null", columns.get(i)));
+				}
+			}
 			insertTuple(tuple, addRowId);
 		}
 
@@ -266,11 +278,16 @@
 	private int keyBatchSize;
 	private int leafBatchSize;
 	private Map columnMap;
+	
+	private List<Integer> notNull = new LinkedList<Integer>();
+	private Map<Integer, AtomicInteger> sequences;
 
 	TempTable(TempMetadataID tid, BufferManager bm, List<ElementSymbol> columns, int primaryKeyLength, String sessionID) {
 		this.tid = tid;
 		this.bm = bm;
+		int startIndex = 0;
 		if (primaryKeyLength == 0) {
+			startIndex = 1;
             ElementSymbol id = new ElementSymbol("rowId"); //$NON-NLS-1$
     		id.setType(DataTypeManager.DefaultDataClasses.INTEGER);
     		columns.add(0, id);
@@ -281,6 +298,24 @@
         }
 		this.columnMap = RelationalNode.createLookupMap(columns);
 		this.columns = columns;
+		if (!tid.getElements().isEmpty()) {
+			//not relevant for indexes
+			for (int i = startIndex; i < columns.size(); i++) {
+				TempMetadataID col = tid.getElements().get(i - startIndex);
+				if (col.isAutoIncrement()) {
+					if (this.sequences == null) {
+						this.sequences = new HashMap<Integer, AtomicInteger>();
+					}
+					sequences.put(i, new AtomicInteger(1));
+				}
+				if (col.isNotNull()) {
+					notNull.add(i);
+				}
+			}
+		}
+		if (this.sequences == null) {
+			this.sequences = Collections.emptyMap();
+		}
 		this.sessionID = sessionID;
 		this.keyBatchSize = bm.getSchemaSize(columns);
 		this.leafBatchSize = bm.getSchemaSize(columns.subList(0, primaryKeyLength));

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -460,7 +460,7 @@
 		Create create = new Create();
 		create.setTable(group);
 		List<ElementSymbol> allColumns = ResolverUtil.resolveElementsInGroup(group, metadata); 
-		create.setColumns(allColumns);
+		create.setElementSymbolsAsColumns(allColumns);
 		Object pk = metadata.getPrimaryKey(group.getMetadataID());
 		if (pk != null) {
 			List<ElementSymbol> pkColumns = resolveIndex(metadata, allColumns, pk);

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -153,14 +153,14 @@
     }
 
     TempTable addTempTable(String tempTableName, Create create, BufferManager buffer, boolean add) {
-    	List<ElementSymbol> columns = create.getColumns();
+    	List<ElementSymbol> columns = create.getColumnSymbols();
     	TempMetadataID id = tempMetadataStore.getTempGroupID(tempTableName);
     	if (id == null) {
 	        //add metadata
 	    	id = tempMetadataStore.addTempGroup(tempTableName, columns, false, true);
-	        TempTableResolver.addPrimaryKey(create, id);
+	        TempTableResolver.addAdditionalMetadata(create, id);
     	}
-    	columns = new ArrayList<ElementSymbol>(create.getColumns());
+    	columns = new ArrayList<ElementSymbol>(create.getColumnSymbols());
         if (!create.getPrimaryKey().isEmpty()) {
     		//reorder the columns to put the key in front
     		List<ElementSymbol> primaryKey = create.getPrimaryKey();
@@ -228,7 +228,7 @@
         }
         Create create = new Create();
         create.setTable(new GroupSymbol(tempTableID));
-        create.setColumns(columns);
+        create.setElementSymbolsAsColumns(columns);
         return addTempTable(tempTableID, create, buffer, true);       
     }
     

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-01-17 20:08:09 UTC (rev 2845)
@@ -21,6 +21,8 @@
 import org.teiid.query.sql.lang.*;
 import org.teiid.query.sql.proc.*;
 import org.teiid.query.sql.symbol.*;
+import org.teiid.metadata.*;
+import org.teiid.metadata.BaseColumn.NullType;
 
 /** 
  * <p>The SQLParser is a JavaCC-generated parser that reads a SQL string and produces a 
@@ -525,8 +527,8 @@
 {
 	Create create = new Create();
 	String table = null;
-	List columns = null;
 	String pkId = null;
+	Column col = null;
 }
 {
 	<CREATE> <LOCAL> <TEMPORARY> <TABLE> 
@@ -535,10 +537,16 @@
 	{
 		create.setTable(new GroupSymbol(table));
 	}
-	columns = createElementsWithTypes(info)
-	{
-		create.setColumns(columns);
-	}
+    col = tableElement(info)
+    {
+      create.getColumns().add(col);
+    }
+    (LOOKAHEAD(2) <COMMA>
+      col = tableElement(info)
+      {
+        create.getColumns().add(col);
+      }
+    )*	
 	[<COMMA> <PRIMARY> nonReserved("KEY") <LPAREN>
 	  pkId = id()
 	  {
@@ -557,6 +565,36 @@
 	}
 }
 
+Column tableElement(ParseInfo info) :
+{
+	String element = null;
+	String type = null;
+	boolean autoIncrement = false;
+	boolean notNull = false;
+}
+{
+	 element = id()
+	 (
+	  type = dataTypeString()
+	  |
+	  nonReserved("SERIAL")
+	  {
+	    type = "INTEGER";
+	    autoIncrement = true;
+	    notNull = true;
+	  }
+	 )
+	 [<NOT> <NULL> { notNull = true; }]
+	 {
+	    Column c = new Column();
+	    c.setName(validateElementName(element));
+	    c.setRuntimeType(type);
+	    c.setAutoIncremented(autoIncrement);
+	    c.setNullType(notNull?NullType.No_Nulls:NullType.Nullable);
+	    return c;
+	 }
+}
+
 /**
  * Parse error statement
  * @throws ParseException if parsing failed
@@ -3769,13 +3807,7 @@
 	}
 }
 
-
-/**
- * Parse a data type name - used only in conversion.
- * @return Data type parsed into a constant string object
- * @throws ParseException if parsing failed
- */
-Constant dataType() : 
+String dataTypeString() : 
 {
 	Token typeToken = null;
 }
@@ -3809,10 +3841,22 @@
 	)
 	
 	{
-		return new Constant(typeToken.image);
+		return typeToken.image;
 	}
 }
 
+
+Constant dataType() : 
+{
+	String type = null;
+}
+{
+	type = dataTypeString()	
+	{
+		return new Constant(type);
+	}
+}
+
 /**
  * Parse an interval type name - used only in TIMESTAMPADD and TIMESTAMPDIFF functions.
  * @return Interval type parsed into a constant string object

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-01-17 20:08:09 UTC (rev 2845)
@@ -739,6 +739,7 @@
 
 
 TempTable.duplicate_key=Duplicate key
+TempTable.not_null=Null value is not allowed for column {0}
 ValidationVisitor.group_in_both_dep=Table specified in both dependent and independent queries '{0}'
 XMLQuery.resolvingError=Failed to resolve the query '{0}'
 SQLParser.non_position_constant=Invalid order by at {0} 

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -6492,7 +6492,7 @@
         column = new ElementSymbol("c2");//$NON-NLS-1$
         column.setType(DataTypeManager.DefaultDataClasses.BYTE);
         columns.add(column);
-        create.setColumns(columns);
+        create.setElementSymbolsAsColumns(columns);
         helpTest("Create local TEMPORARY table tempTable (c1 boolean, c2 byte)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 boolean, c2 byte)", create); //$NON-NLS-1$ //$NON-NLS-2$
     }
     
@@ -6506,7 +6506,7 @@
         column = new ElementSymbol("c2");//$NON-NLS-1$
         column.setType(DataTypeManager.DefaultDataClasses.BYTE);
         columns.add(column);
-        create.setColumns(columns);
+        create.setElementSymbolsAsColumns(columns);
         helpTest("Create local TEMPORARY table tempTable(c1 boolean, c2 byte)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 boolean, c2 byte)", create); //$NON-NLS-1$ //$NON-NLS-2$
     }
     
@@ -6536,7 +6536,7 @@
         column = new ElementSymbol("c2");//$NON-NLS-1$
         column.setType(DataTypeManager.DefaultDataClasses.BYTE);
         columns.add(column);
-        create.setColumns(columns);
+        create.setElementSymbolsAsColumns(columns);
         create.getPrimaryKey().add(column);
         helpTest("Create local TEMPORARY table tempTable(c1 boolean, c2 byte, primary key (c2))", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 boolean, c2 byte, PRIMARY KEY(c2))", create); //$NON-NLS-1$ //$NON-NLS-2$
     }
@@ -6678,8 +6678,8 @@
         column = new ElementSymbol("c5");//$NON-NLS-1$
         column.setType(DataTypeManager.DefaultDataClasses.BIG_DECIMAL);
         columns.add(column);
-        create.setColumns(columns);
-        helpTest("Create local TEMPORARY table tempTable (c1 varchar, c2 tinyint, c3 smallint, c4 real, c5 decimal)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 string, c2 byte, c3 short, c4 float, c5 bigdecimal)", create); //$NON-NLS-1$ 
+        create.setElementSymbolsAsColumns(columns);
+        helpTest("Create local TEMPORARY table tempTable (c1 varchar, c2 tinyint, c3 smallint, c4 real, c5 decimal)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 varchar, c2 tinyint, c3 smallint, c4 real, c5 decimal)", create); //$NON-NLS-1$ 
     }
     
     @Test public void testXmlElement() throws Exception {

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -57,6 +57,7 @@
 	
 	private void execute(ProcessorPlan processorPlan, List[] expectedResults) throws Exception {
 		CommandContext cc = TestProcessor.createCommandContext();
+		cc.setMetadata(metadata);
 		cc.setTempTableStore(tempStore);
 		TestProcessor.doProcess(processorPlan, dataManager, expectedResults, cc);
 		assertTrue(Determinism.SESSION_DETERMINISTIC.compareTo(cc.getDeterminismLevel()) <= 0);
@@ -268,6 +269,23 @@
 		execute("select count(*) a from x", new List[] {Arrays.asList(4)});
 		execute("select count(*) a from x where e2 = 1 order by a", new List[] {Arrays.asList(2)});
 	}
+	
+	@Test public void testAutoIncrement() throws Exception {
+		execute("create local temporary table x (e1 serial, e2 integer, primary key (e1))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
+		execute("insert into x (e2) values (1)", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+		execute("insert into x (e2) values (3)", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+		execute("select * from x", new List[] {Arrays.asList(1, 1), Arrays.asList(2, 3)});
+	}
+	
+	@Test(expected=TeiidProcessingException.class) public void testNotNull() throws Exception {
+		execute("create local temporary table x (e1 serial, e2 integer not null, primary key (e1))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
+		execute("insert into x (e1, e2) values ((select null), 1)", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+	}
+	
+	@Test(expected=TeiidProcessingException.class) public void testNotNull1() throws Exception {
+		execute("create local temporary table x (e1 serial, e2 integer not null, primary key (e1))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
+		execute("insert into x (e2) values ((select null))", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+	}
 
 	private void sampleTable() throws Exception {
 		execute("create local temporary table x (e1 string, e2 integer, primary key (e1, e2))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java	2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java	2011-01-17 20:08:09 UTC (rev 2845)
@@ -52,7 +52,7 @@
         elements.add(new ElementSymbol("a")); //$NON-NLS-1$
         elements.add(new ElementSymbol("b")); //$NON-NLS-1$
 
-	    create.setColumns(elements);
+	    create.setElementSymbolsAsColumns(elements);
 	    return create;	
 	}
 
@@ -64,7 +64,7 @@
         elements.add(new ElementSymbol("a")); //$NON-NLS-1$
         elements.add(new ElementSymbol("b")); //$NON-NLS-1$
 
-        create.setColumns(elements);
+        create.setElementSymbolsAsColumns(elements);
         return create;  	}
 			
 	// ################################## ACTUAL TESTS ################################



More information about the teiid-commits mailing list