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/">downloade...
- 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/">downloade...
+ 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/versi...
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&...;.
</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/versi...
- 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>::=
-<CREATE> <LOCAL> <TEMPORARY>
<TABLE> <link linkend="prod2">id</link>
<LPAREN> <link
linkend="prod14">createElementsWithTypes</link>
<RPAREN></para></entry></row>
+<CREATE> <LOCAL> <TEMPORARY>
<TABLE> <link linkend="prod2">id</link>
<LPAREN> <link
linkend="prod14">createElementsWithTypes</link> ( <COMMA>
<PRIMARY> <link linkend="prod15">nonReserved</link>
<LPAREN> <link linkend="prod2">id</link> (
<COMMA> <link linkend="prod2">id</link> )*
<RPAREN> )? <RPAREN></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>::=
-<ERROR> <link
linkend="prod16">expression</link></para></entry></row>
+<ERROR> <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> )
<SEMICOLON></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> )
<SEMICOLON></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> | ( <BEGIN>
( <link linkend="prod17">statement</link> )* <END> )
)</para></entry></row>
+( <link linkend="prod18">statement</link> | ( <BEGIN>
( <link linkend="prod18">statement</link> )* <END> )
)</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>::=
<BREAK></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>::=
<CONTINUE></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>::=
-<WHILE> <LPAREN> <link
linkend="prod28">criteria</link> <RPAREN> <link
linkend="prod27">block</link></para></entry></row>
+<WHILE> <LPAREN> <link
linkend="prod29">criteria</link> <RPAREN> <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>::=
-<LOOP> <ON> <LPAREN> <link
linkend="prod7">queryExpression</link> <RPAREN>
<AS> <link linkend="prod2">id</link> <link
linkend="prod27">block</link></para></entry></row>
+<LOOP> <ON> <LPAREN> <link
linkend="prod7">queryExpression</link> <RPAREN>
<AS> <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>::=
-<IF> <LPAREN> <link
linkend="prod28">criteria</link> <RPAREN> <link
linkend="prod27">block</link> ( <ELSE> <link
linkend="prod27">block</link>
)?</para></entry></row>
+<IF> <LPAREN> <link
linkend="prod29">criteria</link> <RPAREN> <link
linkend="prod28">block</link> ( <ELSE> <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>::=
( ( <EQ> | <NE> | <NE2> | <LE> |
<GE> | <LT> | <GT> | <IN> |
<LIKE> | ( <IS> <NULL> ) |
<BETWEEN> ) )? <CRITERIA> ( <ON>
<LPAREN> <link linkend="prod2">id</link> (
<COMMA> <link linkend="prod2">id</link> )*
<RPAREN> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="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>::=
-<HAS> <link
linkend="prod29">criteriaSelector</link></para></entry></row>
+<HAS> <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>::=
-<DECLARE> <link linkend="prod31">dataType</link>
<link linkend="prod2">id</link> ( <EQ> <link
linkend="prod32">assignStatementOperand</link>
)?</para></entry></row>
+<DECLARE> <link linkend="prod32">dataType</link>
<link linkend="prod2">id</link> ( <EQ> <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> <EQ> <link
linkend="prod32">assignStatementOperand</link></para></entry></row>
+<link linkend="prod2">id</link> <EQ> <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>::=
-<TRANSLATE> <link
linkend="prod29">criteriaSelector</link> ( <WITH>
<LPAREN> <link linkend="prod2">id</link>
<EQ> <link linkend="prod16">expression</link> (
<COMMA> <link linkend="prod2">id</link>
<EQ> <link linkend="prod16">expression</link> )*
<RPAREN> )?</para></entry></row>
+<TRANSLATE> <link
linkend="prod30">criteriaSelector</link> ( <WITH>
<LPAREN> <link linkend="prod2">id</link>
<EQ> <link linkend="prod17">expression</link> (
<COMMA> <link linkend="prod2">id</link>
<EQ> <link linkend="prod17">expression</link> )*
<RPAREN> )?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod4"
xreflabel="createUpdateProcedure"/>createUpdateProcedure</para></entry>
<entry align="left" valign="top"><para>::=
-<CREATE> ( <VIRTUAL> )? ( <UPDATE> )?
<PROCEDURE> <link
linkend="prod27">block</link></para></entry></row>
+<CREATE> ( <VIRTUAL> )? ( <UPDATE> )?
<PROCEDURE> <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>::=
-( <EXECUTE> | <EXEC> ) <STRING> <link
linkend="prod16">expression</link> ( <AS> <link
linkend="prod14">createElementsWithTypes</link> ( <INTO>
<link linkend="prod2">id</link> )? )? ( <USING>
<link linkend="prod35">setClauseList</link> )? (
<UPDATE> ( ( <INTEGERVAL> ) | ( <STAR> ) )
)?</para></entry></row>
+( <EXECUTE> | <EXEC> ) <STRING> <link
linkend="prod17">expression</link> ( <AS> <link
linkend="prod14">createElementsWithTypes</link> ( <INTO>
<link linkend="prod2">id</link> )? )? ( <USING>
<link linkend="prod36">setClauseList</link> )? (
<UPDATE> ( ( <INTEGERVAL> ) | ( <STAR> ) )
)?</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> <EQ> (
<COMMA> <link linkend="prod2">id</link>
<EQ> )*</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> ( <COMMA> <link
linkend="prod2">id</link> <link
linkend="prod31">dataType</link>
)*</para></entry></row>
+<link linkend="prod2">id</link> <link
linkend="prod32">dataType</link> ( <COMMA> <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>::=
-<LBRACE> ( <QMARK> <EQ> )? <CALL>
<link linkend="prod2">id</link> ( <LPAREN> ( <link
linkend="prod36">executeUnnamedParams</link> ) <RPAREN>
)? <RBRACE> ( <link linkend="prod37">option</link>
)?</para></entry></row>
+<LBRACE> ( <QMARK> <EQ> )? <CALL>
<link linkend="prod2">id</link> ( <LPAREN> ( <link
linkend="prod37">executeUnnamedParams</link> ) <RPAREN>
)? <RBRACE> ( <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>::=
-( ( ( <EXEC> ) | ( <EXECUTE> ) | ( <CALL> ) )
<link linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod38">executeNamedParams</link> | <link
linkend="prod36">executeUnnamedParams</link> ) <RPAREN> )
( <link linkend="prod37">option</link>
)?</para></entry></row>
+( ( ( <EXEC> ) | ( <EXECUTE> ) | ( <CALL> ) )
<link linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod39">executeNamedParams</link> | <link
linkend="prod37">executeUnnamedParams</link> ) <RPAREN> )
( <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> ( <COMMA>
<link linkend="prod16">expression</link> )*
)?</para></entry></row>
+( <link linkend="prod17">expression</link> ( <COMMA>
<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> <EQ> (
<GT> )? <link linkend="prod16">expression</link> (
<COMMA> <link linkend="prod2">id</link>
<EQ> ( <GT> )? <link
linkend="prod16">expression</link> )*
)</para></entry></row>
+( <link linkend="prod2">id</link> <EQ> (
<GT> )? <link linkend="prod17">expression</link> (
<COMMA> <link linkend="prod2">id</link>
<EQ> ( <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>::=
-<INSERT> <INTO> <link
linkend="prod2">id</link> ( <LPAREN> <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* <RPAREN> )? ( (
<VALUES> <link linkend="prod39">rowValues</link> ) | (
<link linkend="prod7">queryExpression</link> ) ) ( <link
linkend="prod37">option</link>
)?</para></entry></row>
+<INSERT> <INTO> <link
linkend="prod2">id</link> ( <LPAREN> <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* <RPAREN> )? ( (
<VALUES> <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>::=
-<LPAREN> <link linkend="prod16">expression</link> (
<COMMA> <link linkend="prod16">expression</link> )*
<RPAREN></para></entry></row>
+<LPAREN> <link linkend="prod17">expression</link> (
<COMMA> <link linkend="prod17">expression</link> )*
<RPAREN></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod10" xreflabel="update"/>update</para></entry>
<entry align="left" valign="top"><para>::=
-<UPDATE> <link linkend="prod2">id</link>
<SET> <link linkend="prod35">setClauseList</link> (
<link linkend="prod40">where</link> )? ( <link
linkend="prod37">option</link>
)?</para></entry></row>
+<UPDATE> <link linkend="prod2">id</link>
<SET> <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>::=
-<DELETE> <FROM> <link
linkend="prod2">id</link> ( <link
linkend="prod40">where</link> )? ( <link
linkend="prod37">option</link>
)?</para></entry></row>
+<DELETE> <FROM> <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> ( ( <UNION> |
<EXCEPT> ) ( <ALL> | <DISTINCT> )? <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> ( ( <UNION> |
<EXCEPT> ) ( <ALL> | <DISTINCT> )? <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> (
<INTERSECT> ( <ALL> | <DISTINCT> )? <link
linkend="prod45">queryPrimary</link>
)*</para></entry></row>
+<link linkend="prod46">queryPrimary</link> (
<INTERSECT> ( <ALL> | <DISTINCT> )? <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> | ( <LPAREN>
<link linkend="prod41">queryExpressionBody</link>
<RPAREN> ) )</para></entry></row>
+( <link linkend="prod47">query</link> | ( <LPAREN>
<link linkend="prod42">queryExpressionBody</link>
<RPAREN> ) )</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>::=
<INTO> ( <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>::=
-<SELECT> ( <ALL> | ( <DISTINCT> ) )? (
<STAR> | ( <link linkend="prod52">selectSymbol</link>
( <COMMA> <link linkend="prod52">selectSymbol</link>
)* ) )</para></entry></row>
+<SELECT> ( <ALL> | ( <DISTINCT> ) )? (
<STAR> | ( <link linkend="prod53">selectSymbol</link>
( <COMMA> <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> ( ( <AS>
)? <link linkend="prod2">id</link> )?
)</para></entry></row>
+( <link linkend="prod17">expression</link> ( ( <AS>
)? <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> ( <AS>
<link linkend="prod2">id</link> )?
)</para></entry></row>
+( <link linkend="prod17">expression</link> ( <AS>
<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>::=
<ALL_IN_GROUP></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>::=
-<XMLAGG> <LPAREN> <link
linkend="prod16">expression</link> ( <link
linkend="prod43">orderby</link> )?
<RPAREN></para></entry></row>
+<XMLAGG> <LPAREN> <link
linkend="prod17">expression</link> ( <link
linkend="prod44">orderby</link> )?
<RPAREN></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>
<LPAREN> <STAR> <RPAREN> ) | ( ( <link
linkend="prod58">nonReserved</link> | <ANY> |
<SOME> ) <LPAREN> ( <DISTINCT> |
<ALL> )? <link linkend="prod16">expression</link>
<RPAREN> ) )</para></entry></row>
+( ( <link linkend="prod15">nonReserved</link>
<LPAREN> <STAR> <RPAREN> ) | ( ( <link
linkend="prod15">nonReserved</link> | <ANY> |
<SOME> ) <LPAREN> ( <DISTINCT> |
<ALL> )? <link linkend="prod17">expression</link>
<RPAREN> ) )</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>::=
<FROM> ( <link linkend="prod59">tableReference</link>
( <COMMA> <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>::=
-( ( <LBRACE> <link
linkend="prod58">nonReserved</link> <link
linkend="prod60">joinedTable</link> <RBRACE> ) | <link
linkend="prod60">joinedTable</link>
)</para></entry></row>
+( ( <LBRACE> <link
linkend="prod15">nonReserved</link> <link
linkend="prod60">joinedTable</link> <RBRACE> ) | <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>::=
-( ( ( <RIGHT> ( <OUTER> )? ) | ( <LEFT> (
<OUTER> )? ) | ( <FULL> ( <OUTER> )? ) |
<INNER> )? <JOIN> <link
linkend="prod59">tableReference</link> <ON> <link
linkend="prod28">criteria</link>
)</para></entry></row>
+( ( ( <RIGHT> ( <OUTER> )? ) | ( <LEFT> (
<OUTER> )? ) | ( <FULL> ( <OUTER> )? ) |
<INNER> )? <JOIN> <link
linkend="prod59">tableReference</link> <ON> <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>::=
-<XMLSERIALIZE> <LPAREN> ( <link
linkend="prod58">nonReserved</link> )? <link
linkend="prod16">expression</link> ( <AS> (
<STRING> | <VARCHAR> | <CLOB> ) )?
<RPAREN></para></entry></row>
+<XMLSERIALIZE> <LPAREN> ( <link
linkend="prod15">nonReserved</link> )? <link
linkend="prod17">expression</link> ( <AS> (
<STRING> | <VARCHAR> | <CLOB> ) )?
<RPAREN></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>::=
<ID></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod64"
xreflabel="textTable"/>textTable</para></entry>
<entry align="left" valign="top"><para>::=
-<ID> <LPAREN> <link
linkend="prod16">expression</link> <link
linkend="prod58">nonReserved</link> <link
linkend="prod69">textColumn</link> ( <COMMA> <link
linkend="prod69">textColumn</link> )* ( <ID> <link
linkend="prod70">charVal</link> )? ( ( <ESCAPE> <link
linkend="prod70">charVal</link> ) | ( <ID> <link
linkend="prod70">charVal</link> ) )? ( <ID> ( <link
linkend="prod71">intVal</link> )? )? ( <ID> <link
linkend="prod71">intVal</link> )? <RPAREN> (
<AS> )? <link
linkend="prod2">id</link></para></entry></row>
+<ID> <LPAREN> <link
linkend="prod17">expression</link> <link
linkend="prod15">nonReserved</link> <link
linkend="prod69">textColumn</link> ( <COMMA> <link
linkend="prod69">textColumn</link> )* ( <ID> <link
linkend="prod70">charVal</link> )? ( ( <ESCAPE> <link
linkend="prod70">charVal</link> ) | ( <ID> <link
linkend="prod70">charVal</link> ) )? ( <ID> ( <link
linkend="prod71">intVal</link> )? )? ( <ID> <link
linkend="prod71">intVal</link> )? <RPAREN> (
<AS> )? <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> ( <ID> <link
linkend="prod71">intVal</link>
)?</para></entry></row>
+<link linkend="prod2">id</link> <link
linkend="prod32">dataType</link> ( <ID> <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>::=
-<XMLQUERY> <LPAREN> ( <link
linkend="prod73">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod55">derivedColumn</link> ( <COMMA> <link
linkend="prod55">derivedColumn</link> )* )? ( ( <NULL> |
<link linkend="prod58">nonReserved</link> ) <ON>
<link linkend="prod58">nonReserved</link> )?
<RPAREN></para></entry></row>
+<XMLQUERY> <LPAREN> ( <link
linkend="prod73">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod56">derivedColumn</link> ( <COMMA> <link
linkend="prod56">derivedColumn</link> )* )? ( ( <NULL> |
<link linkend="prod15">nonReserved</link> ) <ON>
<link linkend="prod15">nonReserved</link> )?
<RPAREN></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod65"
xreflabel="xmlTable"/>xmlTable</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLTABLE> <LPAREN> ( <link
linkend="prod73">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod55">derivedColumn</link> ( <COMMA> <link
linkend="prod55">derivedColumn</link> )* )? ( <ID>
<link linkend="prod74">xmlColumn</link> ( <COMMA>
<link linkend="prod74">xmlColumn</link> )* )? <RPAREN>
( <AS> )? <link
linkend="prod2">id</link></para></entry></row>
+<XMLTABLE> <LPAREN> ( <link
linkend="prod73">xmlNamespaces</link> <COMMA> )? <link
linkend="prod1">stringVal</link> ( <ID> <link
linkend="prod56">derivedColumn</link> ( <COMMA> <link
linkend="prod56">derivedColumn</link> )* )? ( <ID>
<link linkend="prod74">xmlColumn</link> ( <COMMA>
<link linkend="prod74">xmlColumn</link> )* )? <RPAREN>
( <AS> )? <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> ( ( <FOR> <link
linkend="prod58">nonReserved</link> ) | ( <link
linkend="prod31">dataType</link> ( <DEFAULT_KEYWORD>
<link linkend="prod16">expression</link> )? ( <link
linkend="prod58">nonReserved</link> <link
linkend="prod1">stringVal</link> )? )
)</para></entry></row>
+<link linkend="prod2">id</link> ( ( <FOR> <link
linkend="prod15">nonReserved</link> ) | ( <link
linkend="prod32">dataType</link> ( <DEFAULT_KEYWORD>
<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>::=
( <ID> ( ( <AS> )? <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>::=
-<WHERE> <link
linkend="prod28">criteria</link></para></entry></row>
+<WHERE> <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>::=
<EXISTS> <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>::=
<GROUP> <BY> ( <link
linkend="prod89">groupByItem</link> ( <COMMA> <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>::=
-<HAVING> <link
linkend="prod28">criteria</link></para></entry></row>
+<HAVING> <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>::=
<ORDER> <BY> <link
linkend="prod90">sortSpecification</link> ( <COMMA>
<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> ( <ASC> |
<DESC> )? ( <link linkend="prod58">nonReserved</link>
<link linkend="prod58">nonReserved</link>
)?</para></entry></row>
+<link linkend="prod91">sortKey</link> ( <ASC> |
<DESC> )? ( <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>::=
<LIMIT> ( <INTEGERVAL> | <QMARK> ) (
<COMMA> ( <INTEGERVAL> | <QMARK> )
)?</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>::=
<OPTION> ( <MAKEDEP> <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* | <MAKENOTDEP> <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* | <NOCACHE> ( <link
linkend="prod2">id</link> ( <COMMA> <link
linkend="prod2">id</link> )* )?
)*</para></entry></row>
<row>
-<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>::=
-( <QMARK> | <link linkend="prod97">literal</link> | (
<LBRACE> <link linkend="prod58">nonReserved</link>
<link linkend="prod98">function</link> <RBRACE> ) | (
<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> ) | ( <ID> ) | <link
linkend="prod88">subquery</link> | ( <LPAREN> <link
linkend="prod16">expression</link> <RPAREN> ) | <link
linkend="prod99">searchedCaseExpression</link> | <link
linkend="prod100">caseExpression</link>
)</para></entry></row>
+( <QMARK> | <link linkend="prod97">literal</link> | (
<LBRACE> <link linkend="prod15">nonReserved</link>
<link linkend="prod98">function</link> <RBRACE> ) | (
<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> ) | ( <ID> ) | <link
linkend="prod88">subquery</link> | ( <LPAREN> <link
linkend="prod17">expression</link> <RPAREN> ) | <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>::=
-<CASE> <link linkend="prod16">expression</link> (
<WHEN> <link linkend="prod16">expression</link>
<THEN> <link linkend="prod16">expression</link> )+ (
<ELSE> <link linkend="prod16">expression</link> )?
<END></para></entry></row>
+<CASE> <link linkend="prod17">expression</link> (
<WHEN> <link linkend="prod17">expression</link>
<THEN> <link linkend="prod17">expression</link> )+ (
<ELSE> <link linkend="prod17">expression</link> )?
<END></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod99"
xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
<entry align="left" valign="top"><para>::=
-<CASE> ( <WHEN> <link
linkend="prod28">criteria</link> <THEN> <link
linkend="prod16">expression</link> )+ ( <ELSE> <link
linkend="prod16">expression</link> )?
<END></para></entry></row>
+<CASE> ( <WHEN> <link
linkend="prod29">criteria</link> <THEN> <link
linkend="prod17">expression</link> )+ ( <ELSE> <link
linkend="prod17">expression</link> )?
<END></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod98"
xreflabel="function"/>function</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <CONVERT> <LPAREN> <link
linkend="prod16">expression</link> <COMMA> <link
linkend="prod31">dataType</link> <RPAREN> ) | (
<CAST> <LPAREN> <link
linkend="prod16">expression</link> <AS> <link
linkend="prod31">dataType</link> <RPAREN> ) | ( <link
linkend="prod58">nonReserved</link> <LPAREN> <link
linkend="prod16">expression</link> <COMMA> <link
linkend="prod101">stringConstant</link> <RPAREN> ) | (
<link linkend="prod58">nonReserved</link> <LPAREN>
<link linkend="prod102">intervalType</link> <COMMA>
<link linkend="prod16">expression</link> <COMMA>
<link linkend="prod16">expression</link> <RPAREN> ) |
<link linkend="prod103">queryString</link> | ( (
<LEFT> | <RIGHT> | <CHAR> | <USER>
| <YEAR> | <MONTH> | <HOUR> |
<MINUTE> | <SECOND> | <XMLCONCAT> |
<XMLCOMMENT> ) <LPAREN> ( <link
linkend="prod16">expression</link> !
( <COMMA> <link linkend="prod16">expression</link> )*
)? <RPAREN> ) | ( ( <INSERT> ) <LPAREN> (
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod16">expression</link> )* )?
<RPAREN> ) | ( ( <TRANSLATE> ) <LPAREN> (
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod16">expression</link> )* )?
<RPAREN> ) | <link linkend="prod104">xmlParse</link> |
<link linkend="prod105">xmlElement</link> | ( <XMLPI>
<LPAREN> ( <ID> <link
linkend="prod106">idExpression</link> | <link
linkend="prod106">idExpression</link> ) ( <COMMA>
<link linkend="prod16">expression</link> )? <RPAREN> )
| <link linkend="prod107">xmlForest</link> | <link
linkend="prod68">xmlSerialize</link> | <link
linkend="prod72">xmlQuery</link> | ( <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod16">expression</link> ( <COMMA> <link
linkend="prod16">expression</link> )*!
)? <RPAREN> ) )</para></entry></row>
+( ( <CONVERT> <LPAREN> <link
linkend="prod17">expression</link> <COMMA> <link
linkend="prod32">dataType</link> <RPAREN> ) | (
<CAST> <LPAREN> <link
linkend="prod17">expression</link> <AS> <link
linkend="prod32">dataType</link> <RPAREN> ) | ( <link
linkend="prod15">nonReserved</link> <LPAREN> <link
linkend="prod17">expression</link> <COMMA> <link
linkend="prod101">stringConstant</link> <RPAREN> ) | (
<link linkend="prod15">nonReserved</link> <LPAREN>
<link linkend="prod102">intervalType</link> <COMMA>
<link linkend="prod17">expression</link> <COMMA>
<link linkend="prod17">expression</link> <RPAREN> ) |
<link linkend="prod103">queryString</link> | ( (
<LEFT> | <RIGHT> | <CHAR> | <USER>
| <YEAR> | <MONTH> | <HOUR> |
<MINUTE> | <SECOND> | <XMLCONCAT> |
<XMLCOMMENT> ) <LPAREN> ( <link
linkend="prod17">expression</link> !
( <COMMA> <link linkend="prod17">expression</link> )*
)? <RPAREN> ) | ( ( <INSERT> ) <LPAREN> (
<link linkend="prod17">expression</link> ( <COMMA>
<link linkend="prod17">expression</link> )* )?
<RPAREN> ) | ( ( <TRANSLATE> ) <LPAREN> (
<link linkend="prod17">expression</link> ( <COMMA>
<link linkend="prod17">expression</link> )* )?
<RPAREN> ) | <link linkend="prod104">xmlParse</link> |
<link linkend="prod105">xmlElement</link> | ( <XMLPI>
<LPAREN> ( <ID> <link
linkend="prod106">idExpression</link> | <link
linkend="prod106">idExpression</link> ) ( <COMMA>
<link linkend="prod17">expression</link> )? <RPAREN> )
| <link linkend="prod107">xmlForest</link> | <link
linkend="prod68">xmlSerialize</link> | <link
linkend="prod72">xmlQuery</link> | ( <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod17">expression</link> ( <COMMA> <link
linkend="prod17">expression</link> )*!
)? <RPAREN> ) )</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>::=
-<XMLPARSE> <LPAREN> <link
linkend="prod58">nonReserved</link> <link
linkend="prod16">expression</link> ( <link
linkend="prod58">nonReserved</link> )?
<RPAREN></para></entry></row>
+<XMLPARSE> <LPAREN> <link
linkend="prod15">nonReserved</link> <link
linkend="prod17">expression</link> ( <link
linkend="prod15">nonReserved</link> )?
<RPAREN></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> <LPAREN>
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod55">derivedColumn</link> )*
<RPAREN></para></entry></row>
+<link linkend="prod15">nonReserved</link> <LPAREN>
<link linkend="prod17">expression</link> ( <COMMA>
<link linkend="prod56">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod105"
xreflabel="xmlElement"/>xmlElement</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLELEMENT> <LPAREN> ( <ID> <link
linkend="prod2">id</link> | <link
linkend="prod2">id</link> ) ( <COMMA> <link
linkend="prod73">xmlNamespaces</link> )? ( <COMMA>
<link linkend="prod108">xmlAttributes</link> )? (
<COMMA> <link linkend="prod16">expression</link> )*
<RPAREN></para></entry></row>
+<XMLELEMENT> <LPAREN> ( <ID> <link
linkend="prod2">id</link> | <link
linkend="prod2">id</link> ) ( <COMMA> <link
linkend="prod73">xmlNamespaces</link> )? ( <COMMA>
<link linkend="prod108">xmlAttributes</link> )? (
<COMMA> <link linkend="prod17">expression</link> )*
<RPAREN></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod108"
xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLATTRIBUTES> <LPAREN> <link
linkend="prod55">derivedColumn</link> ( <COMMA> <link
linkend="prod55">derivedColumn</link> )*
<RPAREN></para></entry></row>
+<XMLATTRIBUTES> <LPAREN> <link
linkend="prod56">derivedColumn</link> ( <COMMA> <link
linkend="prod56">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod107"
xreflabel="xmlForest"/>xmlForest</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLFOREST> <LPAREN> ( <link
linkend="prod73">xmlNamespaces</link> <COMMA> )? <link
linkend="prod55">derivedColumn</link> ( <COMMA> <link
linkend="prod55">derivedColumn</link> )*
<RPAREN></para></entry></row>
+<XMLFOREST> <LPAREN> ( <link
linkend="prod73">xmlNamespaces</link> <COMMA> )? <link
linkend="prod56">derivedColumn</link> ( <COMMA> <link
linkend="prod56">derivedColumn</link> )*
<RPAREN></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>::=
( <STRING> | <VARCHAR> | <BOOLEAN> |
<BYTE> | <TINYINT> | <SHORT> |
<SMALLINT> | <CHAR> | <INTEGER> |
<LONG> | <BIGINT> | <BIGINTEGER> |
<FLOAT> | <REAL> | <DOUBLE> |
<BIGDECIMAL> | <DECIMAL> | <DATE> |
<TIME> | <TIMESTAMP> | <OBJECT> |
<BLOB> | <CLOB> | <XML>
)</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="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<temporary table name>
(<column name> <data type>,...)
+ <para>CREATE LOCAL TEMPORARY TABLE x (column type, ... [PRIMARY KEY
(column, ...)])
</para>
</listitem>
<listitem>
- <para>SELECT <column name>,...INTO <temporary table
name> FROM <table name>
+ <para>INSERT INTO #x (column, ...) VALUES (value, ...)
</para>
</listitem>
- <listitem>
- <para>INSERT INTO <temporary table name> ((<column
name>,...)VALUES (<value>,...)
- </para>
- </listitem>
</itemizedlist>
<itemizedlist>
<para>Drop syntax:
</para>
<listitem>
- <para>DROP TABLE <temporary table name>
+ <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()));
}
}