[teiid-commits] teiid SVN: r2387 - in trunk: build/kits/jboss-container/deploy/teiid and 11 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Jul 28 14:27:58 EDT 2010


Author: shawkins
Date: 2010-07-28 14:27:57 -0400 (Wed, 28 Jul 2010)
New Revision: 2387

Added:
   trunk/engine/src/main/java/org/teiid/common/buffer/LobManager.java
Removed:
   trunk/runtime/src/test/java/com/metamatrix/
Modified:
   trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
   trunk/build/kits/jboss-container/teiid-releasenotes.html
   trunk/client/src/test/java/org/teiid/jdbc/TestResultSet.java
   trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java
   trunk/common-core/src/test/java/org/teiid/core/types/TestBlobValue.java
   trunk/common-core/src/test/java/org/teiid/core/types/TestClobValue.java
   trunk/common-core/src/test/java/org/teiid/core/types/TestXMLValue.java
   trunk/documentation/client-developers-guide/src/main/docbook/en-US/content/odbc.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/common/buffer/SPage.java
   trunk/engine/src/main/java/org/teiid/common/buffer/STree.java
   trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java
   trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
   trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
   trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
   trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java
Log:
TEIID-1167 fixed lob handling in temp tables, added primary key info to the docs, updated the release notes, and made minor edits to the odbc info.

Modified: trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml	2010-07-28 18:27:57 UTC (rev 2387)
@@ -164,7 +164,7 @@
         <property name="inputBufferSize">0</property>
         <!-- SO_SNDBUF size, 0 indicates that system default should be used (default 0) -->
         <property name="outputBufferSize">0</property>
-        <property name="SSLConfiguration"><inject bean="JdbcSslConfiguration"/></property>
+        <property name="SSLConfiguration"><inject bean="OdbcSslConfiguration"/></property>
     </bean>
     
     <bean name="OdbcSslConfiguration" class="org.teiid.transport.SSLConfiguration">

Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html	2010-07-28 18:27:57 UTC (rev 2387)
@@ -10,7 +10,7 @@
 <P><A HREF="http://www.teiid.org/"><IMG SRC="https://www.jboss.org/dms/teiid/images/teiid_banner.png" NAME="graphics1" ALT="Teiid" ALIGN=BOTTOM WIDTH=800></A>
 
 <H1>Teiid ${project.version} Release Notes</H1>
-<P>Teiid ${project.version} adds ODBC and caching features. 
+<P>Teiid ${project.version} adds ODBC, SQL, and caching features. 
 
 <H2>Overview</H2>
 <UL>
@@ -26,6 +26,8 @@
 </UL>
 <H2><A NAME="Highlights"></A>Highlights</H2>
 <UL>
+    <LI><B>ODBC Support</B> - Support for ODBC access is now available through PostgreSQL ODBC driver clients.  See the Client Developer's Guide for more on how
+    to use Teiid's ODBC access. 
     <LI><B>SQL Support</B>
         <ul> 
            <li>Added NULLS FIST/LAST handling - including pushdown support.  
@@ -33,6 +35,7 @@
            <li>Added support for the boolean aggregate functions ANY, SOME, EVERY.
            <li>Added support for using boolean value expression as both criteria and expressions, e.g. "... where boolean_value" or "select x = 1 as boolean_value ...".
            <li>Changed named procedure syntax to accept param=>value, rather than param=value.
+           <li>Added PRIMARY KEY and the associated index support to temp tables.
         </ul>
     <LI><B>Parallel Source Queries</B> - reestablished parallel execution of source queries within a query plan along with a prioritized work system to help prevent resource contention.
     <LI><B>SHOW Statement</B> - added client handling for the SHOW statement to retrieve query plan information and see parameter values.

Modified: trunk/client/src/test/java/org/teiid/jdbc/TestResultSet.java
===================================================================
--- trunk/client/src/test/java/org/teiid/jdbc/TestResultSet.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/client/src/test/java/org/teiid/jdbc/TestResultSet.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -712,9 +712,9 @@
     	StatementImpl statement = createMockStatement(ResultSet.TYPE_FORWARD_ONLY);
     	ResultsFuture<LobChunk> future = new ResultsFuture<LobChunk>();
     	future.getResultsReceiver().receiveResults(new LobChunk("<a/>".getBytes(Charset.forName("UTF-8")), true));
-    	Mockito.stub(statement.getDQP().requestNextLobChunk(0, 0, null)).toReturn(future);
+    	XMLType result = new XMLType();
+    	Mockito.stub(statement.getDQP().requestNextLobChunk(0, 0, result.getReferenceStreamId())).toReturn(future);
         ResultsMessage resultsMsg = new ResultsMessage();
-        XMLType result = new XMLType();
         result.setEncoding("UTF-8");
         resultsMsg.setResults(new List<?>[] {Arrays.asList(result)});
         resultsMsg.setLastRow(1);

Modified: trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -27,6 +27,7 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.nio.charset.Charset;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.teiid.core.CorePlugin;
 
@@ -43,12 +44,14 @@
 
 	private static final long serialVersionUID = -8252488562134729374L;
 	
+	private static AtomicInteger counter = new AtomicInteger();
+	
 	public static final String ENCODING = "UTF-8"; //$NON-NLS-1$
 	public static final Charset CHARSET = Charset.forName(ENCODING);
     public static final String FORCE_STREAMING = "FORCE_STREAMING"; //$NON-NLS-1$
     public static final int STREAMING_BATCH_SIZE_IN_BYTES = 102400; // 100K
 
-    private String referenceStreamId;
+    private String referenceStreamId = String.valueOf(counter.getAndIncrement());
     protected transient T reference;
 	protected long length = -1;
     
@@ -80,9 +83,9 @@
         return this.referenceStreamId;
     }
     
-    public void setReferenceStreamId(String id) {
+    /*public void setReferenceStreamId(String id) {
         this.referenceStreamId = id;
-    }
+    }*/
     
     @Override
     public String toString() {

Modified: trunk/common-core/src/test/java/org/teiid/core/types/TestBlobValue.java
===================================================================
--- trunk/common-core/src/test/java/org/teiid/core/types/TestBlobValue.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/common-core/src/test/java/org/teiid/core/types/TestBlobValue.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -51,9 +51,8 @@
         String testString = "this is test clob"; //$NON-NLS-1$
         SerialBlob blob = new SerialBlob(testString.getBytes());
         
-        String key = "keytodata"; //$NON-NLS-1$
         BlobType bv = new BlobType(blob);
-        bv.setReferenceStreamId(key); 
+        String key = bv.getReferenceStreamId();
         
         // now force to serialize
         File saved = new File(UnitTestUtil.getTestScratchPath()+"/blobassaved.bin"); //$NON-NLS-1$

Modified: trunk/common-core/src/test/java/org/teiid/core/types/TestClobValue.java
===================================================================
--- trunk/common-core/src/test/java/org/teiid/core/types/TestClobValue.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/common-core/src/test/java/org/teiid/core/types/TestClobValue.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -52,9 +52,8 @@
         String testString = "this is test clob"; //$NON-NLS-1$
         SerialClob clob = new SerialClob(testString.toCharArray());
         
-        String key = "keytodata"; //$NON-NLS-1$
         ClobType cv = new ClobType(clob);
-        cv.setReferenceStreamId(key); 
+        String key = cv.getReferenceStreamId();
         
         // now force to serialize
         File saved = new File(UnitTestUtil.getTestScratchPath()+"/clobassaved.bin"); //$NON-NLS-1$

Modified: trunk/common-core/src/test/java/org/teiid/core/types/TestXMLValue.java
===================================================================
--- trunk/common-core/src/test/java/org/teiid/core/types/TestXMLValue.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/common-core/src/test/java/org/teiid/core/types/TestXMLValue.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -51,10 +51,8 @@
         String testString = "<foo>this is an xml value test</foo>"; //$NON-NLS-1$
         SQLXMLImpl xml = new SQLXMLImpl(testString); 
         
-        String key = "keytodata"; //$NON-NLS-1$
-        String pkey = "peresistkeytodata"; //$NON-NLS-1$
         XMLType xv = new XMLType(xml);
-        xv.setReferenceStreamId(key); 
+        String key = xv.getReferenceStreamId();
         
         // now force to serialize
         File saved = new File(UnitTestUtil.getTestScratchPath()+"/xmlsaved.bin"); //$NON-NLS-1$

Modified: trunk/documentation/client-developers-guide/src/main/docbook/en-US/content/odbc.xml
===================================================================
--- trunk/documentation/client-developers-guide/src/main/docbook/en-US/content/odbc.xml	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/documentation/client-developers-guide/src/main/docbook/en-US/content/odbc.xml	2010-07-28 18:27:57 UTC (rev 2387)
@@ -6,37 +6,36 @@
 <chapter id="ODBC">
     <title>ODBC Support</title>
     
-    <para>Short for Open DataBase Connectivity, a standard database access method developed by the SQL Access group in 1992. 
-    The goal of ODBC is to make it possible to access any data from any application, regardless of which database management 
-    system (DBMS) is handling the data. ODBC manages this by inserting a middle layer, called a database driver , 
-    between an application and the DBMS. The purpose of this layer is to translate the application's data queries 
+    <para>Open DataBase Connectivity (ODBC) is a standard database access method developed by the SQL Access group in 1992. 
+    ODBC, just like JDBC in Java, allows consistent client access regardless of which database management 
+    system (DBMS) is handling the data.  ODBC uses a driver to translate the application's data queries 
     into commands that the DBMS understands. For this to work, both the application and the DBMS must be ODBC-compliant 
     -- that is, the application must be capable of issuing ODBC commands and the 
-    DBMS must be capable of responding to them</para>
+    DBMS must be capable of responding to them.</para>
 
-    <para>Teiid provides the ODBC access to deployed VDBs in the Teiid runtime through 
-     <ulink url="http://www.postgresql.org/">PostgreSQL</ulink>'s ODBC driver. This is possible by redirecting the ODBC commands 
-     from a client application to a different port than default PostgreSQL port.</para>
+    <para>Teiid can provide ODBC access to deployed VDBs in the Teiid runtime through 
+     <ulink url="http://www.postgresql.org/">PostgreSQL</ulink>'s ODBC driver. 
+     This is possible because Teiid has specialized handling that allows it emulate a PostgreSQL server and respond appropriate to expected
+     metadata queries.</para>
      
      <note><para>By default, ODBC on the Teiid is enabled and running on on port <emphasis>35432</emphasis>.</para></note>
      
-     <para>Before your application can use the ODBC, you must first install ODBC driver on same machine that 
-     your application is running and then create Data Source Name (DSN) for that represents a connection profile for your Teiid VDB.
+     <para>Before an application can use ODBC, you must first install the ODBC driver on same machine that 
+     the application is running on and then create Data Source Name (DSN) that represents a connection profile for your Teiid VDB.
      </para>
 
     <sect1 id="install">
         <title>Installing the ODBC Driver Client</title>
-        <para>The PostgreSQL ODBC driver that is needed to make the ODBC connection to Teiid is <emphasis>not</emphasis> 
-        bundled with Teiid distribution. The driver needs be <ulink url="http://www.postgresql.org/ftp/odbc/versions/">downloaded</ulink> 
-        directly from PostgreSQL web site. We have tested with <emphasis>8.04.200</emphasis> version of the ODBC driver for 
-        this release.</para>
+        <para>A PostgreSQL ODBC driver needed to make the ODBC connection to Teiid is <emphasis>not</emphasis> 
+        bundled with the Teiid distribution. The appropriate driver needs be <ulink url="http://www.postgresql.org/ftp/odbc/versions/">downloaded</ulink> 
+        directly from the PostgreSQL web site. We have tested with <emphasis>8.04.200</emphasis> version of the ODBC driver.</para>
         
         <sect2>
             <title>Microsoft Windows</title>
             <orderedlist>
                 <listitem><para>Download the ODBC driver from <ulink url="http://wwwmaster.postgresql.org/download/mirrors-ftp/odbc/versions/msi/psqlodbc_08_04_0200.zip">
                 PostgreSQL download site</ulink>. If you are looking for 64-bit Windows driver download the driver from <ulink url="http://code.google.com/p/visionmap/wiki/psqlODBC">here</ulink>. </para></listitem>
-                <listitem><para>Extract the contents of the ZIP file into a temporary location on you system. For example: "c:\temp\pgodbc"</para></listitem>
+                <listitem><para>Extract the contents of the ZIP file into a temporary location on your system. For example: "c:\temp\pgodbc"</para></listitem>
                 <listitem><para>Double click on "psqlodbc.msi" file or (.exe file in the case of 64 bit) to start installation of the driver.</para></listitem>
                  <listitem>
                     <para>The Wizard appears as</para>
@@ -62,7 +61,7 @@
                         <graphic align="center" scale="100" fileref="../images/winsetup3.png" />
                     </figure>
                     <para>If you want to install in a different directory than the default that is already selected, 
-                    click the "Browse" button and select a directory if you want install. 
+                    click the "Browse" button and select a directory. 
                     Click "Next" to start installing in the selected directory.</para>
                 </listitem>
                  <listitem>
@@ -88,10 +87,10 @@
         </sect2>
         <sect2>
             <title>Other *nix Platform Installations</title>
-            <para>For all other platforms other than Microsoft Windows, the ODBC driver needs compiled and built from the 
+            <para>For all other platforms other than Microsoft Windows, the ODBC driver needs built from the 
             source files provided. Download the ODBC driver source files from 
             <ulink url="http://wwwmaster.postgresql.org/download/mirrors-ftp/odbc/versions/src/psqlodbc-08.04.0200.tar.gz">
-                PostgreSQL download site</ulink>. Untar the files to a temporary location. For example: "~/tmp/pgodbc". 
+                the PostgreSQL download site</ulink>. Untar the files to a temporary location. For example: "~/tmp/pgodbc". 
                 Build and install the driver by running the commands below.</para>
             <note><para>You should use super user account or use "sudo" command for running the "make install" command. </para></note>
             <programlisting><![CDATA[
@@ -101,8 +100,8 @@
                 % make
                 % make install
             ]]></programlisting>
-            
-            <para>The the next step in the process is to create a DSN for accessing the Teiid VDB.</para>
+            <para>Some *nix distributions may already provide binary forms of the appropriate driver, which can be used as an alternative to
+            building from source.</para>
         </sect2>
     </sect1>
     

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml	2010-07-28 18:27:57 UTC (rev 2387)
@@ -415,179 +415,179 @@
 <row>
 <entry align="right" valign="top"><para><anchor id="prod13" 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;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="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>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod15" xreflabel="errorStatement"/>errorStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod16" xreflabel="errorStatement"/>errorStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ERROR&gt; <link linkend="prod16">expression</link></para></entry></row>
+&lt;ERROR&gt; <link linkend="prod17">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod17" xreflabel="statement"/>statement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod18" xreflabel="statement"/>statement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod18">ifStatement</link> | <link linkend="prod19">loopStatement</link> | <link linkend="prod20">whileStatement</link> | <link linkend="prod21">delimitedStatement</link> )</para></entry></row>
+( <link linkend="prod19">ifStatement</link> | <link linkend="prod20">loopStatement</link> | <link linkend="prod21">whileStatement</link> | <link linkend="prod22">delimitedStatement</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod21" xreflabel="delimitedStatement"/>delimitedStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod22" xreflabel="delimitedStatement"/>delimitedStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod22">sqlStatement</link> | <link linkend="prod15">errorStatement</link> | <link linkend="prod23">assignStatement</link> | <link linkend="prod24">declareStatement</link> | <link linkend="prod25">continueStatement</link> | <link linkend="prod26">breakStatement</link> ) &lt;SEMICOLON&gt;</para></entry></row>
+( <link linkend="prod23">sqlStatement</link> | <link linkend="prod16">errorStatement</link> | <link linkend="prod24">assignStatement</link> | <link linkend="prod25">declareStatement</link> | <link linkend="prod26">continueStatement</link> | <link linkend="prod27">breakStatement</link> ) &lt;SEMICOLON&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod27" xreflabel="block"/>block</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="block"/>block</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod17">statement</link> | ( &lt;BEGIN&gt; ( <link linkend="prod17">statement</link> )* &lt;END&gt; ) )</para></entry></row>
+( <link linkend="prod18">statement</link> | ( &lt;BEGIN&gt; ( <link linkend="prod18">statement</link> )* &lt;END&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod26" xreflabel="breakStatement"/>breakStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod27" 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="prod25" xreflabel="continueStatement"/>continueStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod26" 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="prod20" xreflabel="whileStatement"/>whileStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod21" xreflabel="whileStatement"/>whileStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;WHILE&gt; &lt;LPAREN&gt; <link linkend="prod28">criteria</link> &lt;RPAREN&gt; <link linkend="prod27">block</link></para></entry></row>
+&lt;WHILE&gt; &lt;LPAREN&gt; <link linkend="prod29">criteria</link> &lt;RPAREN&gt; <link linkend="prod28">block</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod19" xreflabel="loopStatement"/>loopStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod20" 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="prod27">block</link></para></entry></row>
+&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>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod18" xreflabel="ifStatement"/>ifStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod19" xreflabel="ifStatement"/>ifStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;IF&gt; &lt;LPAREN&gt; <link linkend="prod28">criteria</link> &lt;RPAREN&gt; <link linkend="prod27">block</link> ( &lt;ELSE&gt; <link linkend="prod27">block</link> )?</para></entry></row>
+&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>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod29" xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod30" 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="prod30" xreflabel="hasCriteria"/>hasCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod31" xreflabel="hasCriteria"/>hasCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;HAS&gt; <link linkend="prod29">criteriaSelector</link></para></entry></row>
+&lt;HAS&gt; <link linkend="prod30">criteriaSelector</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod24" xreflabel="declareStatement"/>declareStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod25" xreflabel="declareStatement"/>declareStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;DECLARE&gt; <link linkend="prod31">dataType</link> <link linkend="prod2">id</link> ( &lt;EQ&gt; <link linkend="prod32">assignStatementOperand</link> )?</para></entry></row>
+&lt;DECLARE&gt; <link linkend="prod32">dataType</link> <link linkend="prod2">id</link> ( &lt;EQ&gt; <link linkend="prod33">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="prod24" xreflabel="assignStatement"/>assignStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod32">assignStatementOperand</link></para></entry></row>
+<link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod33">assignStatementOperand</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod32" xreflabel="assignStatementOperand"/>assignStatementOperand</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod33" 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="prod8">storedProcedure</link> | ( <link linkend="prod16">expression</link> ) | <link linkend="prod7">queryExpression</link> )</para></entry></row>
+( ( <link linkend="prod9">insert</link> ) | <link linkend="prod10">update</link> | <link linkend="prod11">delete</link> | <link linkend="prod8">storedProcedure</link> | ( <link linkend="prod17">expression</link> ) | <link linkend="prod7">queryExpression</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod22" xreflabel="sqlStatement"/>sqlStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod23" xreflabel="sqlStatement"/>sqlStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( <link linkend="prod33">dynamicCommand</link> ) | <link linkend="prod5">userCommand</link> )</para></entry></row>
+( ( <link linkend="prod34">dynamicCommand</link> ) | <link linkend="prod5">userCommand</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="translateCriteria"/>translateCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="translateCriteria"/>translateCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;TRANSLATE&gt; <link linkend="prod29">criteriaSelector</link> ( &lt;WITH&gt; &lt;LPAREN&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod16">expression</link> )* &lt;RPAREN&gt; )?</para></entry></row>
+&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>
 <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="prod27">block</link></para></entry></row>
+&lt;CREATE&gt; ( &lt;VIRTUAL&gt; )? ( &lt;UPDATE&gt; )? &lt;PROCEDURE&gt; <link linkend="prod28">block</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod33" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;EXECUTE&gt; | &lt;EXEC&gt; ) &lt;STRING&gt; <link linkend="prod16">expression</link> ( &lt;AS&gt; <link linkend="prod14">createElementsWithTypes</link> ( &lt;INTO&gt; <link linkend="prod2">id</link> )? )? ( &lt;USING&gt; <link linkend="prod35">setClauseList</link> )? ( &lt;UPDATE&gt; ( ( &lt;INTEGERVAL&gt; ) | ( &lt;STAR&gt; ) ) )?</para></entry></row>
+( &lt;EXECUTE&gt; | &lt;EXEC&gt; ) &lt;STRING&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>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="setClauseList"/>setClauseList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod36" 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="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> <link linkend="prod31">dataType</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> <link linkend="prod31">dataType</link> )*</para></entry></row>
+<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>
 <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="prod36">executeUnnamedParams</link> ) &lt;RPAREN&gt; )? &lt;RBRACE&gt; ( <link linkend="prod37">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="prod37">executeUnnamedParams</link> ) &lt;RPAREN&gt; )? &lt;RBRACE&gt; ( <link linkend="prod38">option</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod8" 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="prod38">executeNamedParams</link> | <link linkend="prod36">executeUnnamedParams</link> ) &lt;RPAREN&gt; ) ( <link linkend="prod37">option</link> )?</para></entry></row>
+( ( ( &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>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod36" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod37" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )?</para></entry></row>
+( <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod38" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod39" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod16">expression</link> )* )</para></entry></row>
+( <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>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod9" xreflabel="insert"/>insert</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;INSERT&gt; &lt;INTO&gt; <link linkend="prod2">id</link> ( &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt; )? ( ( &lt;VALUES&gt; <link linkend="prod39">rowValues</link> ) | ( <link linkend="prod7">queryExpression</link> ) ) ( <link linkend="prod37">option</link> )?</para></entry></row>
+&lt;INSERT&gt; &lt;INTO&gt; <link linkend="prod2">id</link> ( &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt; )? ( ( &lt;VALUES&gt; <link linkend="prod40">rowValues</link> ) | ( <link linkend="prod7">queryExpression</link> ) ) ( <link linkend="prod38">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod39" xreflabel="rowValues"/>rowValues</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod40" xreflabel="rowValues"/>rowValues</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;LPAREN&gt; <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;LPAREN&gt; <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod17">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="left" valign="top"><para>::= 
-&lt;UPDATE&gt; <link linkend="prod2">id</link> &lt;SET&gt; <link linkend="prod35">setClauseList</link> ( <link linkend="prod40">where</link> )? ( <link linkend="prod37">option</link> )?</para></entry></row>
+&lt;UPDATE&gt; <link linkend="prod2">id</link> &lt;SET&gt; <link linkend="prod36">setClauseList</link> ( <link linkend="prod41">where</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod11" xreflabel="delete"/>delete</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;DELETE&gt; &lt;FROM&gt; <link linkend="prod2">id</link> ( <link linkend="prod40">where</link> )? ( <link linkend="prod37">option</link> )?</para></entry></row>
+&lt;DELETE&gt; &lt;FROM&gt; <link linkend="prod2">id</link> ( <link linkend="prod41">where</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod7" xreflabel="queryExpression"/>queryExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod41">queryExpressionBody</link></para></entry></row>
+<link linkend="prod42">queryExpressionBody</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod41" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod42">queryTerm</link> ( ( &lt;UNION&gt; | &lt;EXCEPT&gt; ) ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod42">queryTerm</link> )* ( <link linkend="prod43">orderby</link> )? ( <link linkend="prod44">limit</link> )? ( <link linkend="prod37">option</link> )?</para></entry></row>
+<link linkend="prod43">queryTerm</link> ( ( &lt;UNION&gt; | &lt;EXCEPT&gt; ) ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod43">queryTerm</link> )* ( <link linkend="prod44">orderby</link> )? ( <link linkend="prod45">limit</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="queryTerm"/>queryTerm</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="queryTerm"/>queryTerm</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod45">queryPrimary</link> ( &lt;INTERSECT&gt; ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod45">queryPrimary</link> )*</para></entry></row>
+<link linkend="prod46">queryPrimary</link> ( &lt;INTERSECT&gt; ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod46">queryPrimary</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod45" xreflabel="queryPrimary"/>queryPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="queryPrimary"/>queryPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod46">query</link> | ( &lt;LPAREN&gt; <link linkend="prod41">queryExpressionBody</link> &lt;RPAREN&gt; ) )</para></entry></row>
+( <link linkend="prod47">query</link> | ( &lt;LPAREN&gt; <link linkend="prod42">queryExpressionBody</link> &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="query"/>query</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod47" xreflabel="query"/>query</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod47">select</link> ( <link linkend="prod48">into</link> )? ( <link linkend="prod49">from</link> ( <link linkend="prod40">where</link> )? ( <link linkend="prod50">groupBy</link> )? ( <link linkend="prod51">having</link> )? )?</para></entry></row>
+<link linkend="prod48">select</link> ( <link linkend="prod49">into</link> )? ( <link linkend="prod50">from</link> ( <link linkend="prod41">where</link> )? ( <link linkend="prod51">groupBy</link> )? ( <link linkend="prod52">having</link> )? )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod48" xreflabel="into"/>into</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod49" 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="prod47" xreflabel="select"/>select</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod48" 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="prod52">selectSymbol</link> ( &lt;COMMA&gt; <link linkend="prod52">selectSymbol</link> )* ) )</para></entry></row>
+&lt;SELECT&gt; ( &lt;ALL&gt; | ( &lt;DISTINCT&gt; ) )? ( &lt;STAR&gt; | ( <link linkend="prod53">selectSymbol</link> ( &lt;COMMA&gt; <link linkend="prod53">selectSymbol</link> )* ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="selectSymbol"/>selectSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="selectSymbol"/>selectSymbol</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod53">selectExpression</link> | <link linkend="prod54">allInGroupSymbol</link> )</para></entry></row>
+( <link linkend="prod54">selectExpression</link> | <link linkend="prod55">allInGroupSymbol</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="selectExpression"/>selectExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="selectExpression"/>selectExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod16">expression</link> ( ( &lt;AS&gt; )? <link linkend="prod2">id</link> )? )</para></entry></row>
+( <link linkend="prod17">expression</link> ( ( &lt;AS&gt; )? <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod55" xreflabel="derivedColumn"/>derivedColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod56" xreflabel="derivedColumn"/>derivedColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod16">expression</link> ( &lt;AS&gt; <link linkend="prod2">id</link> )? )</para></entry></row>
+( <link linkend="prod17">expression</link> ( &lt;AS&gt; <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod55" 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="prod56" xreflabel="xmlAgg"/>xmlAgg</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="xmlAgg"/>xmlAgg</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLAGG&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> ( <link linkend="prod43">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLAGG&gt; &lt;LPAREN&gt; <link linkend="prod17">expression</link> ( <link linkend="prod44">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( <link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; &lt;STAR&gt; &lt;RPAREN&gt; ) | ( ( <link linkend="prod58">nonReserved</link> | &lt;ANY&gt; | &lt;SOME&gt; ) &lt;LPAREN&gt; ( &lt;DISTINCT&gt; | &lt;ALL&gt; )? <link linkend="prod16">expression</link> &lt;RPAREN&gt; ) )</para></entry></row>
+( ( <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>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod49" xreflabel="from"/>from</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="from"/>from</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;FROM&gt; ( <link linkend="prod59">tableReference</link> ( &lt;COMMA&gt; <link linkend="prod59">tableReference</link> )* )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod59" xreflabel="tableReference"/>tableReference</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;LBRACE&gt; <link linkend="prod58">nonReserved</link> <link linkend="prod60">joinedTable</link> &lt;RBRACE&gt; ) | <link linkend="prod60">joinedTable</link> )</para></entry></row>
+( ( &lt;LBRACE&gt; <link linkend="prod15">nonReserved</link> <link linkend="prod60">joinedTable</link> &lt;RBRACE&gt; ) | <link linkend="prod60">joinedTable</link> )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod60" xreflabel="joinedTable"/>joinedTable</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -599,7 +599,7 @@
 <row>
 <entry align="right" valign="top"><para><anchor id="prod63" 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="prod59">tableReference</link> &lt;ON&gt; <link linkend="prod28">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="prod59">tableReference</link> &lt;ON&gt; <link linkend="prod29">criteria</link> )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod61" xreflabel="tablePrimary"/>tablePrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -607,31 +607,31 @@
 <row>
 <entry align="right" valign="top"><para><anchor id="prod68" xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLSERIALIZE&gt; &lt;LPAREN&gt; ( <link linkend="prod58">nonReserved</link> )? <link linkend="prod16">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="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>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="nonReserved"/>nonReserved</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod15" 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="prod64" xreflabel="textTable"/>textTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> <link linkend="prod58">nonReserved</link> <link linkend="prod69">textColumn</link> ( &lt;COMMA&gt; <link linkend="prod69">textColumn</link> )* ( &lt;ID&gt; <link linkend="prod70">charVal</link> )? ( ( &lt;ESCAPE&gt; <link linkend="prod70">charVal</link> ) | ( &lt;ID&gt; <link linkend="prod70">charVal</link> ) )? ( &lt;ID&gt; ( <link linkend="prod71">intVal</link> )? )? ( &lt;ID&gt; <link linkend="prod71">intVal</link> )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod17">expression</link> <link linkend="prod15">nonReserved</link> <link linkend="prod69">textColumn</link> ( &lt;COMMA&gt; <link linkend="prod69">textColumn</link> )* ( &lt;ID&gt; <link linkend="prod70">charVal</link> )? ( ( &lt;ESCAPE&gt; <link linkend="prod70">charVal</link> ) | ( &lt;ID&gt; <link linkend="prod70">charVal</link> ) )? ( &lt;ID&gt; ( <link linkend="prod71">intVal</link> )? )? ( &lt;ID&gt; <link linkend="prod71">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="prod69" xreflabel="textColumn"/>textColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> <link linkend="prod31">dataType</link> ( &lt;ID&gt; <link linkend="prod71">intVal</link> )?</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod32">dataType</link> ( &lt;ID&gt; <link linkend="prod71">intVal</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod72" xreflabel="xmlQuery"/>xmlQuery</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLQUERY&gt; &lt;LPAREN&gt; ( <link linkend="prod73">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod55">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* )? ( ( &lt;NULL&gt; | <link linkend="prod58">nonReserved</link> ) &lt;ON&gt; <link linkend="prod58">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLQUERY&gt; &lt;LPAREN&gt; ( <link linkend="prod73">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod56">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod56">derivedColumn</link> )* )? ( ( &lt;NULL&gt; | <link linkend="prod15">nonReserved</link> ) &lt;ON&gt; <link linkend="prod15">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod65" xreflabel="xmlTable"/>xmlTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLTABLE&gt; &lt;LPAREN&gt; ( <link linkend="prod73">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod55">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* )? ( &lt;ID&gt; <link linkend="prod74">xmlColumn</link> ( &lt;COMMA&gt; <link linkend="prod74">xmlColumn</link> )* )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+&lt;XMLTABLE&gt; &lt;LPAREN&gt; ( <link linkend="prod73">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod56">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod56">derivedColumn</link> )* )? ( &lt;ID&gt; <link linkend="prod74">xmlColumn</link> ( &lt;COMMA&gt; <link linkend="prod74">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="prod74" xreflabel="xmlColumn"/>xmlColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> ( ( &lt;FOR&gt; <link linkend="prod58">nonReserved</link> ) | ( <link linkend="prod31">dataType</link> ( &lt;DEFAULT_KEYWORD&gt; <link linkend="prod16">expression</link> )? ( <link linkend="prod58">nonReserved</link> <link linkend="prod1">stringVal</link> )? ) )</para></entry></row>
+<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>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod71" xreflabel="intVal"/>intVal</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -645,11 +645,11 @@
 <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="prod40" xreflabel="where"/>where</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod41" xreflabel="where"/>where</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;WHERE&gt; <link linkend="prod28">criteria</link></para></entry></row>
+&lt;WHERE&gt; <link linkend="prod29">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="criteria"/>criteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod29" xreflabel="criteria"/>criteria</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod75">compoundCritOr</link></para></entry></row>
 <row>
@@ -667,7 +667,7 @@
 <row>
 <entry align="right" valign="top"><para><anchor id="prod78" xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod34">translateCriteria</link> | ( <link linkend="prod79">commonValueExpression</link> ( ( <link linkend="prod80">betweenCrit</link> | <link linkend="prod81">matchCrit</link> | <link linkend="prod82">setCrit</link> | <link linkend="prod83">isNullCrit</link> | <link linkend="prod84">subqueryCompareCriteria</link> | <link linkend="prod85">compareCrit</link> ) )? ) | <link linkend="prod86">existsCriteria</link> | <link linkend="prod30">hasCriteria</link> )</para></entry></row>
+( <link linkend="prod35">translateCriteria</link> | ( <link linkend="prod79">commonValueExpression</link> ( ( <link linkend="prod80">betweenCrit</link> | <link linkend="prod81">matchCrit</link> | <link linkend="prod82">setCrit</link> | <link linkend="prod83">isNullCrit</link> | <link linkend="prod84">subqueryCompareCriteria</link> | <link linkend="prod85">compareCrit</link> ) )? ) | <link linkend="prod86">existsCriteria</link> | <link linkend="prod31">hasCriteria</link> )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod87" xreflabel="operator"/>operator</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -709,41 +709,41 @@
 <entry align="left" valign="top"><para>::= 
 &lt;EXISTS&gt; <link linkend="prod88">subquery</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="groupBy"/>groupBy</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="groupBy"/>groupBy</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;GROUP&gt; &lt;BY&gt; ( <link linkend="prod89">groupByItem</link> ( &lt;COMMA&gt; <link linkend="prod89">groupByItem</link> )* )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod89" xreflabel="groupByItem"/>groupByItem</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod16">expression</link></para></entry></row>
+<link linkend="prod17">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="having"/>having</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="having"/>having</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;HAVING&gt; <link linkend="prod28">criteria</link></para></entry></row>
+&lt;HAVING&gt; <link linkend="prod29">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="orderby"/>orderby</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="orderby"/>orderby</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;ORDER&gt; &lt;BY&gt; <link linkend="prod90">sortSpecification</link> ( &lt;COMMA&gt; <link linkend="prod90">sortSpecification</link> )*</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod90" xreflabel="sortSpecification"/>sortSpecification</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod91">sortKey</link> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="prod58">nonReserved</link> <link linkend="prod58">nonReserved</link> )?</para></entry></row>
+<link linkend="prod91">sortKey</link> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="prod15">nonReserved</link> <link linkend="prod15">nonReserved</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod91" xreflabel="sortKey"/>sortKey</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod16">expression</link></para></entry></row>
+<link linkend="prod17">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="limit"/>limit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod45" 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="prod37" xreflabel="option"/>option</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod38" 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="prod16" xreflabel="expression"/>expression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod17" xreflabel="expression"/>expression</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod28">criteria</link></para></entry></row>
+<link linkend="prod29">criteria</link></para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod79" xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -767,19 +767,19 @@
 <row>
 <entry align="right" valign="top"><para><anchor id="prod95" xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;QMARK&gt; | <link linkend="prod97">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod58">nonReserved</link> <link linkend="prod98">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod56">xmlAgg</link> ) | ( <link linkend="prod98">function</link> ) | ( &lt;ID&gt; ) | <link linkend="prod88">subquery</link> | ( &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod99">searchedCaseExpression</link> | <link linkend="prod100">caseExpression</link> )</para></entry></row>
+( &lt;QMARK&gt; | <link linkend="prod97">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod15">nonReserved</link> <link linkend="prod98">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod58">aggregateSymbol</link> ) | ( <link linkend="prod58">aggregateSymbol</link> ) | ( <link linkend="prod58">aggregateSymbol</link> ) | ( <link linkend="prod57">xmlAgg</link> ) | ( <link linkend="prod98">function</link> ) | ( &lt;ID&gt; ) | <link linkend="prod88">subquery</link> | ( &lt;LPAREN&gt; <link linkend="prod17">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod99">searchedCaseExpression</link> | <link linkend="prod100">caseExpression</link> )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod100" xreflabel="caseExpression"/>caseExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CASE&gt; <link linkend="prod16">expression</link> ( &lt;WHEN&gt; <link linkend="prod16">expression</link> &lt;THEN&gt; <link linkend="prod16">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod16">expression</link> )? &lt;END&gt;</para></entry></row>
+&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>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod99" xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CASE&gt; ( &lt;WHEN&gt; <link linkend="prod28">criteria</link> &lt;THEN&gt; <link linkend="prod16">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod16">expression</link> )? &lt;END&gt;</para></entry></row>
+&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>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod98" xreflabel="function"/>function</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;CONVERT&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod31">dataType</link> &lt;RPAREN&gt; ) | ( &lt;CAST&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;AS&gt; <link linkend="prod31">dataType</link> &lt;RPAREN&gt; ) | ( <link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod101">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod102">intervalType</link> &lt;COMMA&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod16">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod103">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="prod16">expression</link> !
 ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;INSERT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;TRANSLATE&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | <link linkend="prod104">xmlParse</link> | <link linkend="prod105">xmlElement</link> | ( &lt;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod106">idExpression</link> | <link linkend="prod106">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod107">xmlForest</link> | <link linkend="prod68">xmlSerialize</link> | <link linkend="prod72">xmlQuery</link> | ( <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )*!
  )? &lt;RPAREN&gt; ) )</para></entry></row>
+( ( &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="prod101">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod15">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod102">intervalType</link> &lt;COMMA&gt; <link linkend="prod17">expression</link> &lt;COMMA&gt; <link linkend="prod17">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod103">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="prod104">xmlParse</link> | <link linkend="prod105">xmlElement</link> | ( &lt;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod106">idExpression</link> | <link linkend="prod106">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod107">xmlForest</link> | <link linkend="prod68">xmlSerialize</link> | <link linkend="prod72">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>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod101" xreflabel="stringConstant"/>stringConstant</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -787,23 +787,23 @@
 <row>
 <entry align="right" valign="top"><para><anchor id="prod104" xreflabel="xmlParse"/>xmlParse</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLPARSE&gt; &lt;LPAREN&gt; <link linkend="prod58">nonReserved</link> <link linkend="prod16">expression</link> ( <link linkend="prod58">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
+&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>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod103" xreflabel="queryString"/>queryString</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+<link linkend="prod15">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod17">expression</link> ( &lt;COMMA&gt; <link linkend="prod56">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod105" 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="prod73">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod108">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod16">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="prod73">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod108">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod17">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod108" xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLATTRIBUTES&gt; &lt;LPAREN&gt; <link linkend="prod55">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLATTRIBUTES&gt; &lt;LPAREN&gt; <link linkend="prod56">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod56">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod107" xreflabel="xmlForest"/>xmlForest</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLFOREST&gt; &lt;LPAREN&gt; ( <link linkend="prod73">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod55">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLFOREST&gt; &lt;LPAREN&gt; ( <link linkend="prod73">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod56">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod56">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod73" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -825,13 +825,13 @@
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod31" xreflabel="dataType"/>dataType</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod32" xreflabel="dataType"/>dataType</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="prod102" xreflabel="intervalType"/>intervalType</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod58">nonReserved</link> )</para></entry></row>
+( <link linkend="prod15">nonReserved</link> )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod97" xreflabel="literal"/>literal</para></entry>
 <entry align="left" valign="top"><para>::= 

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	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml	2010-07-28 18:27:57 UTC (rev 2387)
@@ -639,7 +639,7 @@
     </para>
     <para>
       Temp tables can be defined implicitly by referencing them in a
-      SELECT INTO or in an INSERT statement or explicitly with a CREATE TABLE
+      INSERT statement or explicitly with a CREATE TABLE
       statement. Implicitly created temp tables must have a name that
       starts with '#'.
     </para>
@@ -647,31 +647,39 @@
       <para>Creation syntax:
       </para>
       <listitem>
-        <para>CREATE LOCAL TEMPORARY TABLE&lt;temporary table name&gt; (&lt;column name> &lt;data type>,...)
+        <para>CREATE LOCAL TEMPORARY TABLE x (column type, ... [PRIMARY KEY (column, ...)])
         </para>
       </listitem>
       <listitem>
-        <para>SELECT &lt;column name>,...INTO &lt;temporary table name&gt; FROM &lt;table name&gt;
+        <para>INSERT INTO #x (column, ...) VALUES (value, ...)
         </para>
       </listitem>
-      <listitem>
-        <para>INSERT INTO &lt;temporary table name> ((&lt;column name&gt;,...)VALUES (&lt;value&gt;,...)
-        </para>
-      </listitem>
     </itemizedlist>
     <itemizedlist>
       <para>Drop syntax:
       </para>
       <listitem>
-        <para>DROP TABLE &lt;temporary table name&gt;
+        <para>DROP TABLE x
         </para>
       </listitem>
     </itemizedlist>
     <itemizedlist>
+    	<para>Primary Key Support</para>
+    	<listitem>
+        	<para>All key columns must be comparable.</para>
+      	</listitem>
+      	<listitem>
+        	<para>Use of a primary key creates a clustered index that supports search improvements for comparison, in, like, and order by.</para>
+      	</listitem>
+      	<listitem>
+        	<para>Null is an allowable primary key value, but there must be only 1 row that has an all null key.</para>
+      	</listitem>
+    </itemizedlist>
+    <itemizedlist>
       <para>Limitations:
       </para>
       <listitem> 
-        <para>With the CREATE TABLE syntax only basic table definition (column name and type information) is supported.
+        <para>With the CREATE TABLE syntax only basic table definition (column name and type information) and an optional primary key are supported.
         </para>
       </listitem>
       <listitem> 
@@ -691,8 +699,13 @@
         </para>    
       </listitem>    
       <listitem>
-        <para>temp tables are non-transactional.
+        <para>Temp tables are non-transactional.
         </para>    
+      </listitem>  
+      <listitem>
+        <para>Lob values (xml, clob, blob) are tracked by reference rather than by value in a temporary table.  
+        Lob values from external sources that are inserted in a temporary table may become unreadable when the associated statement or connection is closed.
+        </para>    
       </listitem>    
     </itemizedlist>
     <para>The following example is a series of statements that loads a temporary table with data from 2 sources, and with a manually inserted record, and then uses that temp table in a subsequent query.</para>

Added: trunk/engine/src/main/java/org/teiid/common/buffer/LobManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/LobManager.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/LobManager.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.common.buffer;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.types.Streamable;
+import org.teiid.dqp.DQPPlugin;
+import org.teiid.query.sql.symbol.Expression;
+
+/**
+ * Tracks lob references so they are not lost during serialization.
+ * TODO: for temp tables we may need to have a copy by value management strategy
+ */
+public class LobManager {
+
+	private Map<String, Streamable<?>> lobReferences = new ConcurrentHashMap<String, Streamable<?>>(); 
+
+	public void updateReferences(int[] lobIndexes, List<?> tuple)
+			throws TeiidComponentException {
+		for (int i = 0; i < lobIndexes.length; i++) {
+			Object anObj = tuple.get(lobIndexes[i]);
+			if (!(anObj instanceof Streamable<?>)) {
+				continue;
+			}
+			Streamable lob = (Streamable) anObj;
+			if (lob.getReference() == null) {
+				lob.setReference(getLobReference(lob.getReferenceStreamId()).getReference());
+			} else {
+				String id = lob.getReferenceStreamId();
+				this.lobReferences.put(id, lob);
+			}
+		}
+	}
+	
+    public Streamable<?> getLobReference(String id) throws TeiidComponentException {
+    	Streamable<?> lob = null;
+    	if (this.lobReferences != null) {
+    		lob = this.lobReferences.get(id);
+    	}
+    	if (lob == null) {
+    		throw new TeiidComponentException(DQPPlugin.Util.getString("ProcessWorker.wrongdata")); //$NON-NLS-1$
+    	}
+    	return lob;
+    }
+    
+    public void clear() {
+    	this.lobReferences.clear();
+    }
+    
+    public static int[] getLobIndexes(List expressions) {
+    	if (expressions == null) {
+    		return null;
+    	}
+		int[] result = new int[expressions.size()];
+		int resultIndex = 0;
+	    for (int i = 0; i < expressions.size(); i++) {
+	    	Expression expr = (Expression) expressions.get(i);
+	        if (DataTypeManager.isLOB(expr.getType()) || expr.getType() == DataTypeManager.DefaultDataClasses.OBJECT) {
+	        	result[resultIndex++] = i;
+	        }
+	    }
+	    if (resultIndex == 0) {
+	    	return null;
+	    }
+	    return Arrays.copyOf(result, resultIndex);
+    }
+
+}


Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/LobManager.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/common/buffer/SPage.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/SPage.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/SPage.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -126,7 +126,11 @@
 		} else {
 			values.setDataTypes(stree.types);
 		}
-		managedBatch = stree.manager.createManagedBatch(values);
+		if (children != null) {
+			managedBatch = stree.keyManager.createManagedBatch(values);
+		} else {
+			managedBatch = stree.leafManager.createManagedBatch(values);
+		}
 	}
 	
 	protected void remove() {
@@ -145,6 +149,9 @@
 		if (managedBatch == null) {
 			throw new AssertionError("Batch removed"); //$NON-NLS-1$
 		}
+		if (children != null) {
+			return managedBatch.getBatch(true, stree.keytypes);
+		}
 		return managedBatch.getBatch(true, stree.types);
 	}
 	

Modified: trunk/engine/src/main/java/org/teiid/common/buffer/STree.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/STree.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/STree.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -50,7 +50,8 @@
 	private int shift = 1;
 	
 	protected SPage[] header = new SPage[] {new SPage(this, true)};
-    protected BatchManager manager;
+    protected BatchManager keyManager;
+    protected BatchManager leafManager;
     protected Comparator comparator;
     protected int pageSize;
     protected int keyLength;
@@ -59,13 +60,16 @@
     
     private AtomicInteger rowCount = new AtomicInteger();
 	
-	public STree(BatchManager recman,
+	public STree(BatchManager manager,
+			BatchManager leafManager,
             final Comparator comparator,
             int pageSize,
             int keyLength,
             String[] types) {
 		randomSeed = seedGenerator.nextInt() | 0x00000100; // ensure nonzero
-		this.manager = recman;
+		randomSeed = 1;
+		this.keyManager = manager;
+		this.leafManager = leafManager;
 		this.comparator = comparator;
 		this.pageSize = Math.max(pageSize, SPage.MIN_PERSISTENT_SIZE);
 		pageSize >>>= 4;
@@ -144,10 +148,6 @@
 		return null;
 	}
 	
-	public List find(List k) throws TeiidComponentException {
-		return find(k, new LinkedList<SearchResult>());
-	}
-	
 	public List insert(List tuple, boolean replace) throws TeiidComponentException {
 		LinkedList<SearchResult> places = new LinkedList<SearchResult>();
 		List match = find(tuple, places);
@@ -306,7 +306,8 @@
 	
 	public void remove() {
 		truncate();
-		this.manager.remove();
+		this.keyManager.remove();
+		this.leafManager.remove();
 	}
 
 	public int getRowCount() {

Modified: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -63,13 +63,6 @@
     public TupleBatch() {
     }
     
-    public static TupleBatch directBatch(int rowOffset, List<List> tuples) {
-    	TupleBatch result = new TupleBatch();
-    	result.rowOffset = rowOffset;
-    	result.tuples = tuples;
-    	return result;
-    }
-    
     /**
      * Constructor
      * @param beginRow indicates the row of the tuple source which is the
@@ -156,10 +149,6 @@
         this.terminationFlag = terminationFlag;    
     }
     
-    public String[] getDataTypes() {
-		return types;
-	}
-    
     public void setDataTypes(String[] types) {
         this.types = types;
     }

Modified: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -27,8 +27,6 @@
 import java.util.ListIterator;
 import java.util.Map;
 import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
@@ -61,8 +59,6 @@
         return types;
     }
 
-	private static final AtomicLong LOB_ID = new AtomicLong();
-	
 	//construction state
 	private BatchManager manager;
 	private String tupleSourceID;
@@ -77,36 +73,28 @@
 	private boolean removed;
 	private boolean forwardOnly;
 
-    //lob management
-    private Map<String, Streamable<?>> lobReferences; //references to contained lobs
-    private boolean lobs = true;
+	private LobManager lobManager;
+	private int[] lobIndexes;
 	
-	public TupleBuffer(BatchManager manager, String id, List<?> schema, int batchSize) {
+	public TupleBuffer(BatchManager manager, String id, List<?> schema, int[] lobIndexes, int batchSize) {
 		this.manager = manager;
 		this.tupleSourceID = id;
 		this.schema = schema;
 		this.types = getTypeNames(schema);
+		this.lobIndexes = lobIndexes;
+		if (this.lobIndexes != null) {
+			this.lobManager = new LobManager();
+		}
 		this.batchSize = batchSize;
-		if (types != null) {
-			int i = 0;
-		    for (i = 0; i < types.length; i++) {
-		        if (DataTypeManager.isLOB(types[i]) || types[i] == DataTypeManager.DefaultDataTypes.OBJECT) {
-		        	break;
-		        }
-		    }
-		    if (i == types.length) {
-		    	lobs = false;
-		    }
-        }
 	}
 	
 	public boolean isLobs() {
-		return lobs;
+		return lobIndexes != null;
 	}
 	
 	public void addTuple(List<?> tuple) throws TeiidComponentException {
-		if (lobs) {
-			correctLobReferences(schema.size(), tuple);
+		if (isLobs()) {
+			lobManager.updateReferences(lobIndexes, tuple);
 		}
 		this.rowCount++;
 		if (batchBuffer == null) {
@@ -131,7 +119,11 @@
 			}
 		} else {
 			//add the lob references only, since they may still be referenced later
-			correctLobReferences(batch.getTuples()); 
+			if (isLobs()) {
+				for (List<?> tuple : batch.getTuples()) {
+					lobManager.updateReferences(lobIndexes, tuple);
+				}
+			}
 		}
 	}
 
@@ -209,9 +201,6 @@
 			Assertion.isNotNull(entry);
 			BatchManager.ManagedBatch batch = entry.getValue();
 	    	result = batch.getBatch(!forwardOnly, types);
-	    	if (lobs && result.getDataTypes() == null) {
-		        correctLobReferences(result.getTuples());
-	    	}
 	    	result.setDataTypes(types);
 	    	if (forwardOnly) {
 				batches.remove(entry.getKey());
@@ -260,55 +249,12 @@
 	}
 	    
     public Streamable<?> getLobReference(String id) throws TeiidComponentException {
-    	Streamable<?> lob = null;
-    	if (this.lobReferences != null) {
-    		lob = this.lobReferences.get(id);
-    	}
-    	if (lob == null) {
+    	if (lobManager == null) {
     		throw new TeiidComponentException(DQPPlugin.Util.getString("ProcessWorker.wrongdata")); //$NON-NLS-1$
     	}
-    	return lob;
+    	return lobManager.getLobReference(id);
     }
     
-    /**
-     * If a tuple batch is being added with Lobs, then references to
-     * the lobs will be held on the {@link TupleSourceInfo} 
-     * @param batch
-     * @throws TeiidComponentException 
-     */
-    @SuppressWarnings("unchecked")
-	private void correctLobReferences(List<List> rows) throws TeiidComponentException {
-        int columns = schema.size();
-        // walk through the results and find all the lobs
-        for (List list : rows) {
-            correctLobReferences(columns, list);
-        }
-    }
-
-	private void correctLobReferences(int columns, List list)
-			throws TeiidComponentException {
-		for (int col = 0; col < columns; col++) {                                                
-		    Object anObj = list.get(col);
-		    
-		    if (!(anObj instanceof Streamable<?>)) {
-		    	continue;
-		    }
-		    Streamable lob = (Streamable)anObj;                  
-		    String id = lob.getReferenceStreamId();
-			if (id == null) {
-				id = String.valueOf(LOB_ID.getAndIncrement());
-				lob.setReferenceStreamId(id);
-			}
-			if (this.lobReferences == null) {
-				this.lobReferences = new ConcurrentHashMap<String, Streamable<?>>();
-			}
-			this.lobReferences.put(id, lob);
-		    if (lob.getReference() == null) {
-		    	lob.setReference(getLobReference(lob.getReferenceStreamId()).getReference());
-		    }
-		}
-	}
-    
     public void setForwardOnly(boolean forwardOnly) {
 		this.forwardOnly = forwardOnly;
 	}

Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -39,7 +39,6 @@
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Condition;
@@ -52,6 +51,7 @@
 import org.teiid.common.buffer.BatchManager;
 import org.teiid.common.buffer.BufferManager;
 import org.teiid.common.buffer.FileStore;
+import org.teiid.common.buffer.LobManager;
 import org.teiid.common.buffer.STree;
 import org.teiid.common.buffer.StorageManager;
 import org.teiid.common.buffer.TupleBatch;
@@ -100,15 +100,16 @@
 		private final int columnCount;
 		private volatile FileStore store;
 		private Map<Long, long[]> physicalMapping = new ConcurrentHashMap<Long, long[]>();
-		private Map<Long, String[]> types = new ConcurrentSkipListMap<Long, String[]>();
 		private ReadWriteLock compactionLock = new ReentrantReadWriteLock();
 		private AtomicLong unusedSpace = new AtomicLong();
+		private int[] lobIndexes;
 
-		private BatchManagerImpl(String newID, int columnCount) {
+		private BatchManagerImpl(String newID, int columnCount, int[] lobIndexes) {
 			this.id = newID;
 			this.columnCount = columnCount;
 			this.store = createFileStore(id);
 			this.store.setCleanupReference(this);
+			this.lobIndexes = lobIndexes;
 		}
 
 		@Override
@@ -197,6 +198,7 @@
 		private int beginRow;
 		private BatchManagerImpl batchManager;
 		private long id;
+		private LobManager lobManager;
 		
 		public ManagedBatchImpl(TupleBatch batch, BatchManagerImpl manager) {
 			id = batchAdded.incrementAndGet();
@@ -204,6 +206,9 @@
 			this.activeBatch = batch;
 			this.beginRow = batch.getBeginRow();
 			this.batchManager = manager;
+			if (this.batchManager.lobIndexes != null) {
+				this.lobManager = new LobManager();
+			}
 		}
 
 		private void addToCache(boolean update) {
@@ -280,6 +285,11 @@
 		            batch.readExternal(ois);
 		            batch.setRowOffset(this.beginRow);
 			        batch.setDataTypes(null);
+					if (lobManager != null) {
+						for (List<?> tuple : batch.getTuples()) {
+							lobManager.updateReferences(batchManager.lobIndexes, tuple);
+						}
+					}
 			        if (cache) {
 			        	this.activeBatch = batch;
 			        	addToCache(true);
@@ -297,13 +307,18 @@
 
 		public synchronized void persist() throws TeiidComponentException {
 			boolean lockheld = false;
-			try {
+            try {
 				TupleBatch batch = activeBatch;
 				if (batch != null) {
 					if (!persistent) {
 						long count = writeCount.incrementAndGet();
 						LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, batchManager.id, id, "writing batch to disk, total writes: ", count); //$NON-NLS-1$
 						long offset = 0;
+						if (lobManager != null) {
+							for (List<?> tuple : batch.getTuples()) {
+								lobManager.updateReferences(batchManager.lobIndexes, tuple);
+							}
+						}
 						synchronized (batchManager.store) {
 							offset = batchManager.getOffset();
 							OutputStream fsos = new BufferedOutputStream(batchManager.store.createOutputStream(), IO_BUFFER_SIZE);
@@ -313,14 +328,17 @@
 				            long size = batchManager.store.getLength() - offset;
 				            long[] info = new long[] {offset, size};
 				            batchManager.physicalMapping.put(this.id, info);
-				            batchManager.types.put(this.id, batch.getDataTypes());
 						}
 						LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, batchManager.id, id, "batch written starting at:", offset); //$NON-NLS-1$
 					}
 					this.batchReference = new WeakReference<TupleBatch>(batch);
+				} else {
+					assert persistent;
 				}
 			} catch (IOException e) {
 				throw new TeiidComponentException(e);
+			} catch (Throwable e) {
+				throw new TeiidComponentException(e);
 			} finally {
 				persistent = true;
 				activeBatch = null;
@@ -343,6 +361,9 @@
 			if (info != null) {
 				batchManager.unusedSpace.addAndGet(info[1]); 
 			}
+			if (lobManager != null) {
+				lobManager.clear();
+			}
 			activeBatch = null;
 			batchReference = null;
 		}
@@ -444,23 +465,24 @@
     public TupleBuffer createTupleBuffer(final List elements, String groupName,
     		TupleSourceType tupleSourceType) {
     	final String newID = String.valueOf(this.tsId.getAndIncrement());
-    	
-    	BatchManager batchManager = new BatchManagerImpl(newID, elements.size());
-        TupleBuffer tupleBuffer = new TupleBuffer(batchManager, newID, elements, getProcessorBatchSize());
+    	int[] lobIndexes = LobManager.getLobIndexes(elements);
+    	BatchManager batchManager = new BatchManagerImpl(newID, elements.size(), lobIndexes);
+        TupleBuffer tupleBuffer = new TupleBuffer(batchManager, newID, elements, lobIndexes, getProcessorBatchSize());
         LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Creating TupleBuffer:", newID, "of type ", tupleSourceType); //$NON-NLS-1$ //$NON-NLS-2$
         return tupleBuffer;
     }
     
     public STree createSTree(final List elements, String groupName, TupleSourceType tupleSourceType, int keyLength) {
-    	final String newID = String.valueOf(this.tsId.getAndIncrement());
-    	
-    	BatchManager bm = new BatchManagerImpl(newID, elements.size());
+    	String newID = String.valueOf(this.tsId.getAndIncrement());
+    	int[] lobIndexes = LobManager.getLobIndexes(elements);
+    	BatchManager bm = new BatchManagerImpl(newID, elements.size(), lobIndexes);
+    	BatchManager keyManager = new BatchManagerImpl(String.valueOf(this.tsId.getAndIncrement()), keyLength, null);
     	int[] compareIndexes = new int[keyLength];
     	for (int i = 1; i < compareIndexes.length; i++) {
 			compareIndexes[i] = i;
 		}
         LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Creating STree:", newID, "of type ", tupleSourceType); //$NON-NLS-1$ //$NON-NLS-2$
-    	return new STree(bm, new ListNestedSortComparator(compareIndexes), getProcessorBatchSize(), keyLength, TupleBuffer.getTypeNames(elements));
+    	return new STree(keyManager, bm, new ListNestedSortComparator(compareIndexes), getProcessorBatchSize(), keyLength, TupleBuffer.getTypeNames(elements));
     }
 
     @Override

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -193,7 +193,7 @@
         	LogManager.logDetail(LogConstants.CTX_DQP, e, "Request Thread", requestID, "- error occurred"); //$NON-NLS-1$ //$NON-NLS-2$
             
             if (!isCanceled()) {
-            	dqpCore.logMMCommand(this, Event.CANCEL, null);
+            	dqpCore.logMMCommand(this, Event.ERROR, null);
                 //Case 5558: Differentiate between system level errors and
                 //processing errors.  Only log system level errors as errors, 
                 //log the processing errors as warnings only

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -288,7 +288,7 @@
 			SortUtility sort = new SortUtility(ts, orderBy.getOrderByItems(), Mode.SORT, bm, sessionID);
 			tb = sort.sort();
 		} else {
-			tb = bm.createTupleBuffer(getColumns(), sessionID, TupleSourceType.PROCESSOR);
+			tb = bm.createTupleBuffer(projectedCols, sessionID, TupleSourceType.PROCESSOR);
 			List next = null;
 			while ((next = ts.nextTuple()) != null) {
 				tb.addTuple(next);
@@ -359,7 +359,7 @@
         	protected void tuplePassed(List tuple) 
         	throws BlockedException, TeiidComponentException, TeiidProcessingException {
         		if (rowId != null) {
-        			tuple.add(0, rowId.getAndAdd(1));
+        			tuple.add(0, rowId.getAndIncrement());
         		}
         		insertTuple(tuple);
         	}

Modified: trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java	2010-07-28 18:04:14 UTC (rev 2386)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java	2010-07-28 18:27:57 UTC (rev 2387)
@@ -67,7 +67,7 @@
 		ElementSymbol x = new ElementSymbol("x"); //$NON-NLS-1$
 		x.setType(DataTypeManager.DefaultDataClasses.INTEGER);
 		List<ElementSymbol> schema = Arrays.asList(x);
-		TupleBuffer tb = new TupleBuffer(new FakeBatchManager(), "x", schema, 32); //$NON-NLS-1$ 
+		TupleBuffer tb = new TupleBuffer(new FakeBatchManager(), "x", schema, null, 32); //$NON-NLS-1$ 
 		tb.setForwardOnly(true);
 		tb.addTuple(Arrays.asList(1));
 		TupleBatch batch = tb.getBatch(1);
@@ -90,11 +90,11 @@
 		ElementSymbol x = new ElementSymbol("x"); //$NON-NLS-1$
 		x.setType(DataTypeManager.DefaultDataClasses.CLOB);
 		List<ElementSymbol> schema = Arrays.asList(x);
-		TupleBuffer tb = new TupleBuffer(new FakeBatchManager(), "x", schema, 32); //$NON-NLS-1$
+		TupleBuffer tb = new TupleBuffer(new FakeBatchManager(), "x", schema, LobManager.getLobIndexes(schema), 32); //$NON-NLS-1$
 		ClobType c = new ClobType(new SerialClob(new char[0]));
 		TupleBatch batch = new TupleBatch(1, new List[] {Arrays.asList(c)});
 		tb.addTupleBatch(batch, false);
-		assertNotNull(c.getReferenceStreamId());
+		assertNotNull(tb.getLobReference(c.getReferenceStreamId()));
 	}
 	
 }



More information about the teiid-commits mailing list