teiid SVN: r2846 - trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-portfolio.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-17 16:54:13 -0500 (Mon, 17 Jan 2011)
New Revision: 2846
Modified:
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-portfolio/customer-schema.sql
Log:
TEIID-1434 removing bad holdings entries
Modified: trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-portfolio/customer-schema.sql
===================================================================
--- trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-portfolio/customer-schema.sql 2011-01-17 20:08:09 UTC (rev 2845)
+++ trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-portfolio/customer-schema.sql 2011-01-17 21:54:13 UTC (rev 2846)
@@ -125,7 +125,6 @@
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (19990007,1008,{ts '1999-05-11 00:00:00.000'},85);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (19990008,1005,{ts '1999-05-21 00:00:00.000'},105);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (19990009,1004,{ts '1999-06-25 00:00:00.000'},120);
-INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (19980003,1020,{ts '1999-07-22 00:00:00.000'},150);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (20000015,1018,{ts '2000-04-20 00:00:00.000'},135);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (19980006,1030,{ts '2000-06-12 00:00:00.000'},91);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (20000019,1029,{ts '2000-10-08 00:00:00.000'},351);
@@ -140,7 +139,6 @@
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (20000020,1006,{ts '2001-11-14 00:00:00.000'},125);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (19980003,1029,{ts '2001-11-15 00:00:00.000'},100);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (20000021,1011,{ts '2001-12-18 00:00:00.000'},44);
-INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (20010027,1022,{ts '2001-12-19 00:00:00.000'},115);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (20020034,1024,{ts '2002-01-22 00:00:00.000'},189);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (19990009,1022,{ts '2002-01-24 00:00:00.000'},30);
INSERT INTO HOLDINGS (ACCOUNT_ID,PRODUCT_ID,PURCHASE_DATE,SHARES_COUNT) VALUES (20020035,1013,{ts '2002-02-12 00:00:00.000'},110);
15 years, 2 months
teiid SVN: r2845 - in trunk: build/kits/jboss-container and 18 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-17 15:08:09 -0500 (Mon, 17 Jan 2011)
New Revision: 2845
Added:
trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
Removed:
trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
Modified:
trunk/api/src/main/java/org/teiid/language/SQLConstants.java
trunk/build/kits/jboss-container/teiid-releasenotes.html
trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml
trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java
trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java
trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java
trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java
trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java
Log:
TEIID-1440 adding not null and auto increment support. also updating pushdown validation checks
Modified: trunk/api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLConstants.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/api/src/main/java/org/teiid/language/SQLConstants.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -99,6 +99,8 @@
public static final String KEY = "KEY"; //$NON-NLS-1$
+ public static final String SERIAL = "SERIAL"; //$NON-NLS-1$
+
public static final String ENCODING = "ENCODING"; //$NON-NLS-1$
public static final String TEXTAGG = "TEXTAGG"; //$NON-NLS-1$
}
Deleted: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
===================================================================
(Binary files differ)
Added: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
===================================================================
(Binary files differ)
Property changes on: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-01-17 20:08:09 UTC (rev 2845)
@@ -31,7 +31,8 @@
<UL>
<LI>Added support to perform simple pass-through and more complicated updates through views by default.
<LI>Added support for "FOR EACH ROW" update procedure handling (similar to INSTEAD OF triggers in other DBMS's), which should be used instead of the deprecated TRANSLATE criteria approach.
- </UL>
+ </UL>
+ <LI><B>Temp table enhancements</B> - added support for the SERIAL datatype, which is a not null INTEGER that auto-increments, and the ability to specify a column as NOT NULL.
<LI><B>UDF</B> - new API objects added to teiid-api to support user defined functions that are capable of pushdown to source.
<LI><B>Unescape Function</B> - a new system function, unescape, was added to handle common \ escaping in strings including octal, hex/unicode, \b, \r, \n, \f, and \t.
<LI><B>Predicate Optimization</B> - expanded optimizations for detecting always false conditions when using IS NULL, IN, or comparison predicates with literal values.
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/datatypes.xml 2011-01-17 20:08:09 UTC (rev 2845)
@@ -65,8 +65,8 @@
<entry>SMALLINT</entry>
</row>
<row>
- <entry>integer</entry>
- <entry>numeric, integral type, signed 32-bit</entry>
+ <entry>integer or serial</entry>
+ <entry>numeric, integral type, signed 32-bit. The serial type also implies not null and has an auto-incrementing value that starts at 1. serial types are not automatically UNIQUE.</entry>
<entry>java.lang.Integer</entry>
<entry>INTEGER</entry>
<entry>INTEGER</entry>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2011-01-17 20:08:09 UTC (rev 2845)
@@ -122,6 +122,7 @@
| <DISCONNECT: "disconnect">
| <DISTINCT: "distinct">
| <DROP: "drop">
+| <EACH: "each">
| <ELSE: "else">
| <END: "end">
| <ERROR: "error">
@@ -405,423 +406,435 @@
<entry align="left" valign="top"><para>::=
( <link linkend="prod4">createUpdateProcedure</link> | <link linkend="prod5">userCommand</link> | <link linkend="prod6">callableStatement</link> ) ( <SEMICOLON> )? <EOF></para></entry></row>
<row>
+<entry align="right" valign="top"><para><anchor id="prod7" xreflabel="updateProcedure"/>updateProcedure</para></entry>
+<entry align="left" valign="top"><para>::=
+( <link linkend="prod4">createUpdateProcedure</link> | <link linkend="prod8">triggerAction</link> ) <EOF></para></entry></row>
+<row>
+<entry align="right" valign="top"><para><anchor id="prod8" xreflabel="triggerAction"/>triggerAction</para></entry>
+<entry align="left" valign="top"><para>::=
+<FOR> <EACH> <ROW> <link linkend="prod9">block</link></para></entry></row>
+<row>
<entry align="right" valign="top"><para><anchor id="prod5" xreflabel="userCommand"/>userCommand</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod7">queryExpression</link> | <link linkend="prod8">storedProcedure</link> | <link linkend="prod9">insert</link> | <link linkend="prod10">update</link> | <link linkend="prod11">delete</link> | <link linkend="prod12">dropTable</link> | <link linkend="prod13">createTempTable</link> )</para></entry></row>
+( <link linkend="prod10">queryExpression</link> | <link linkend="prod11">storedProcedure</link> | <link linkend="prod12">insert</link> | <link linkend="prod13">update</link> | <link linkend="prod14">delete</link> | <link linkend="prod15">dropTable</link> | <link linkend="prod16">createTempTable</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod12" xreflabel="dropTable"/>dropTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod15" xreflabel="dropTable"/>dropTable</para></entry>
<entry align="left" valign="top"><para>::=
<DROP> <TABLE> <link linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod13" xreflabel="createTempTable"/>createTempTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod16" xreflabel="createTempTable"/>createTempTable</para></entry>
<entry align="left" valign="top"><para>::=
-<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>
+<CREATE> <LOCAL> <TEMPORARY> <TABLE> <link linkend="prod2">id</link> <LPAREN> <link linkend="prod17">tableElement</link> ( <COMMA> <link linkend="prod17">tableElement</link> )* ( <COMMA> <PRIMARY> <link linkend="prod18">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="prod16" xreflabel="errorStatement"/>errorStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod17" xreflabel="tableElement"/>tableElement</para></entry>
<entry align="left" valign="top"><para>::=
-<ERROR> <link linkend="prod17">expression</link></para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod19">dataTypeString</link> | <link linkend="prod18">nonReserved</link> ) ( <NOT> <NULL> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod18" xreflabel="statement"/>statement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod20" xreflabel="errorStatement"/>errorStatement</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod19">ifStatement</link> | <link linkend="prod20">loopStatement</link> | <link linkend="prod21">whileStatement</link> | <link linkend="prod22">delimitedStatement</link> )</para></entry></row>
+<ERROR> <link linkend="prod21">expression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod22" xreflabel="delimitedStatement"/>delimitedStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod22" xreflabel="statement"/>statement</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod23">assignStatement</link> | <link linkend="prod24">sqlStatement</link> | <link linkend="prod16">errorStatement</link> | <link linkend="prod25">declareStatement</link> | <link linkend="prod26">continueStatement</link> | <link linkend="prod27">breakStatement</link> ) <SEMICOLON></para></entry></row>
+( <link linkend="prod23">ifStatement</link> | <link linkend="prod24">loopStatement</link> | <link linkend="prod25">whileStatement</link> | <link linkend="prod26">delimitedStatement</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="block"/>block</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod26" xreflabel="delimitedStatement"/>delimitedStatement</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod18">statement</link> | ( <BEGIN> ( <link linkend="prod18">statement</link> )* <END> ) )</para></entry></row>
+( <link linkend="prod27">assignStatement</link> | <link linkend="prod28">sqlStatement</link> | <link linkend="prod20">errorStatement</link> | <link linkend="prod29">declareStatement</link> | <link linkend="prod30">continueStatement</link> | <link linkend="prod31">breakStatement</link> ) <SEMICOLON></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod27" xreflabel="breakStatement"/>breakStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod9" xreflabel="block"/>block</para></entry>
<entry align="left" valign="top"><para>::=
+( <link linkend="prod22">statement</link> | ( <BEGIN> ( <link linkend="prod22">statement</link> )* <END> ) )</para></entry></row>
+<row>
+<entry align="right" valign="top"><para><anchor id="prod31" xreflabel="breakStatement"/>breakStatement</para></entry>
+<entry align="left" valign="top"><para>::=
<BREAK></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod26" xreflabel="continueStatement"/>continueStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod30" xreflabel="continueStatement"/>continueStatement</para></entry>
<entry align="left" valign="top"><para>::=
<CONTINUE></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod21" xreflabel="whileStatement"/>whileStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod25" xreflabel="whileStatement"/>whileStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<WHILE> <LPAREN> <link linkend="prod29">criteria</link> <RPAREN> <link linkend="prod28">block</link></para></entry></row>
+<WHILE> <LPAREN> <link linkend="prod32">criteria</link> <RPAREN> <link linkend="prod9">block</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod20" xreflabel="loopStatement"/>loopStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod24" xreflabel="loopStatement"/>loopStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<LOOP> <ON> <LPAREN> <link linkend="prod7">queryExpression</link> <RPAREN> <AS> <link linkend="prod2">id</link> <link linkend="prod28">block</link></para></entry></row>
+<LOOP> <ON> <LPAREN> <link linkend="prod10">queryExpression</link> <RPAREN> <AS> <link linkend="prod2">id</link> <link linkend="prod9">block</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod19" xreflabel="ifStatement"/>ifStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod23" xreflabel="ifStatement"/>ifStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<IF> <LPAREN> <link linkend="prod29">criteria</link> <RPAREN> <link linkend="prod28">block</link> ( <ELSE> <link linkend="prod28">block</link> )?</para></entry></row>
+<IF> <LPAREN> <link linkend="prod32">criteria</link> <RPAREN> <link linkend="prod9">block</link> ( <ELSE> <link linkend="prod9">block</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod30" xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod33" xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
<entry align="left" valign="top"><para>::=
( ( <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="prod31" xreflabel="hasCriteria"/>hasCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="hasCriteria"/>hasCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<HAS> <link linkend="prod30">criteriaSelector</link></para></entry></row>
+<HAS> <link linkend="prod33">criteriaSelector</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod25" xreflabel="declareStatement"/>declareStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod29" xreflabel="declareStatement"/>declareStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<DECLARE> <link linkend="prod32">dataType</link> <link linkend="prod2">id</link> ( ( <link linkend="prod15">nonReserved</link> | <EQ> ) <link linkend="prod33">assignStatementOperand</link> )?</para></entry></row>
+<DECLARE> <link linkend="prod35">dataType</link> <link linkend="prod2">id</link> ( ( <link linkend="prod18">nonReserved</link> | <EQ> ) <link linkend="prod36">assignStatementOperand</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod23" xreflabel="assignStatement"/>assignStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod27" xreflabel="assignStatement"/>assignStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> ( <link linkend="prod15">nonReserved</link> | <EQ> ) <link linkend="prod33">assignStatementOperand</link></para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod18">nonReserved</link> | <EQ> ) <link linkend="prod36">assignStatementOperand</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod33" xreflabel="assignStatementOperand"/>assignStatementOperand</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod36" xreflabel="assignStatementOperand"/>assignStatementOperand</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <link linkend="prod9">insert</link> ) | <link linkend="prod10">update</link> | <link linkend="prod11">delete</link> | ( <link linkend="prod17">expression</link> ) | <link linkend="prod7">queryExpression</link> )</para></entry></row>
+( ( <link linkend="prod12">insert</link> ) | <link linkend="prod13">update</link> | <link linkend="prod14">delete</link> | ( <link linkend="prod21">expression</link> ) | <link linkend="prod10">queryExpression</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod24" xreflabel="sqlStatement"/>sqlStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="sqlStatement"/>sqlStatement</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <link linkend="prod5">userCommand</link> ) | <link linkend="prod34">dynamicCommand</link> | ( <link linkend="prod2">id</link> ( <link linkend="prod15">nonReserved</link> | <EQ> ) <link linkend="prod8">storedProcedure</link> ) )</para></entry></row>
+( ( <link linkend="prod5">userCommand</link> ) | <link linkend="prod37">dynamicCommand</link> | ( <link linkend="prod2">id</link> ( <link linkend="prod18">nonReserved</link> | <EQ> ) <link linkend="prod11">storedProcedure</link> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="translateCriteria"/>translateCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod38" xreflabel="translateCriteria"/>translateCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<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>
+<TRANSLATE> <link linkend="prod33">criteriaSelector</link> ( <WITH> <LPAREN> <link linkend="prod2">id</link> <EQ> <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod2">id</link> <EQ> <link linkend="prod21">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="prod28">block</link></para></entry></row>
+<CREATE> ( <VIRTUAL> )? ( <UPDATE> )? <PROCEDURE> <link linkend="prod9">block</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod37" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
<entry align="left" valign="top"><para>::=
-( <EXECUTE> | <EXEC> ) ( ( <STRING> | <IMMEDIATE> ) )? <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>
+( <EXECUTE> | <EXEC> ) ( ( <STRING> | <IMMEDIATE> ) )? <link linkend="prod21">expression</link> ( <AS> <link linkend="prod39">createElementsWithTypes</link> ( <INTO> <link linkend="prod2">id</link> )? )? ( <USING> <link linkend="prod40">setClauseList</link> )? ( <UPDATE> ( ( <INTEGERVAL> ) | ( <STAR> ) ) )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod36" xreflabel="setClauseList"/>setClauseList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod40" xreflabel="setClauseList"/>setClauseList</para></entry>
<entry align="left" valign="top"><para>::=
<link linkend="prod2">id</link> <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="right" valign="top"><para><anchor id="prod39" xreflabel="createElementsWithTypes"/>createElementsWithTypes</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> <link linkend="prod32">dataType</link> ( <COMMA> <link linkend="prod2">id</link> <link linkend="prod32">dataType</link> )*</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod35">dataType</link> ( <COMMA> <link linkend="prod2">id</link> <link linkend="prod35">dataType</link> )*</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor id="prod6" xreflabel="callableStatement"/>callableStatement</para></entry>
<entry align="left" valign="top"><para>::=
-<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>
+<LBRACE> ( <QMARK> <EQ> )? <CALL> <link linkend="prod2">id</link> ( <LPAREN> ( <link linkend="prod41">executeUnnamedParams</link> ) <RPAREN> )? <RBRACE> ( <link linkend="prod42">option</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod8" xreflabel="storedProcedure"/>storedProcedure</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod11" xreflabel="storedProcedure"/>storedProcedure</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <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>
+( ( <EXEC> | <EXECUTE> | <CALL> ) <link linkend="prod2">id</link> <LPAREN> ( <link linkend="prod43">executeNamedParams</link> | <link linkend="prod41">executeUnnamedParams</link> ) <RPAREN> ) ( <link linkend="prod42">option</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod37" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod41" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod17">expression</link> ( <COMMA> <link linkend="prod17">expression</link> )* )?</para></entry></row>
+( <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod21">expression</link> )* )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod39" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod2">id</link> <EQ> ( <GT> )? <link linkend="prod17">expression</link> ( <COMMA> <link linkend="prod2">id</link> <EQ> ( <GT> )? <link linkend="prod17">expression</link> )* )</para></entry></row>
+( <link linkend="prod2">id</link> <EQ> ( <GT> )? <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod2">id</link> <EQ> ( <GT> )? <link linkend="prod21">expression</link> )* )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod9" xreflabel="insert"/>insert</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod12" xreflabel="insert"/>insert</para></entry>
<entry align="left" valign="top"><para>::=
-<INSERT> <INTO> <link linkend="prod2">id</link> ( <link linkend="prod40">columnList</link> )? ( ( <VALUES> <link linkend="prod41">rowValues</link> ) | ( <link linkend="prod7">queryExpression</link> ) ) ( <link linkend="prod38">option</link> )?</para></entry></row>
+<INSERT> <INTO> <link linkend="prod2">id</link> ( <link linkend="prod44">columnList</link> )? ( ( <VALUES> <link linkend="prod45">rowValues</link> ) | ( <link linkend="prod10">queryExpression</link> ) ) ( <link linkend="prod42">option</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod40" xreflabel="columnList"/>columnList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="columnList"/>columnList</para></entry>
<entry align="left" valign="top"><para>::=
<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="prod41" xreflabel="rowValues"/>rowValues</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod45" xreflabel="rowValues"/>rowValues</para></entry>
<entry align="left" valign="top"><para>::=
-<LPAREN> <link linkend="prod17">expression</link> ( <COMMA> <link linkend="prod17">expression</link> )* <RPAREN></para></entry></row>
+<LPAREN> <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod21">expression</link> )* <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod10" xreflabel="update"/>update</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod13" xreflabel="update"/>update</para></entry>
<entry align="left" valign="top"><para>::=
-<UPDATE> <link linkend="prod2">id</link> <SET> <link linkend="prod36">setClauseList</link> ( <link linkend="prod42">where</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
+<UPDATE> <link linkend="prod2">id</link> <SET> <link linkend="prod40">setClauseList</link> ( <link linkend="prod46">where</link> )? ( <link linkend="prod42">option</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod11" xreflabel="delete"/>delete</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod14" xreflabel="delete"/>delete</para></entry>
<entry align="left" valign="top"><para>::=
-<DELETE> <FROM> <link linkend="prod2">id</link> ( <link linkend="prod42">where</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
+<DELETE> <FROM> <link linkend="prod2">id</link> ( <link linkend="prod46">where</link> )? ( <link linkend="prod42">option</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod7" xreflabel="queryExpression"/>queryExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod10" xreflabel="queryExpression"/>queryExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <WITH> <link linkend="prod43">withListElement</link> ( <COMMA> <link linkend="prod43">withListElement</link> )* )? <link linkend="prod44">queryExpressionBody</link></para></entry></row>
+( <WITH> <link linkend="prod47">withListElement</link> ( <COMMA> <link linkend="prod47">withListElement</link> )* )? <link linkend="prod48">queryExpressionBody</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="withListElement"/>withListElement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod47" xreflabel="withListElement"/>withListElement</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> ( <link linkend="prod40">columnList</link> )? <AS> <LPAREN> <link linkend="prod7">queryExpression</link> <RPAREN></para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod44">columnList</link> )? <AS> <LPAREN> <link linkend="prod10">queryExpression</link> <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod48" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod45">queryTerm</link> ( ( <UNION> | <EXCEPT> ) ( <ALL> | <DISTINCT> )? <link linkend="prod45">queryTerm</link> )* ( <link linkend="prod46">orderby</link> )? ( <link linkend="prod47">limit</link> )? ( <link linkend="prod38">option</link> )?</para></entry></row>
+<link linkend="prod49">queryTerm</link> ( ( <UNION> | <EXCEPT> ) ( <ALL> | <DISTINCT> )? <link linkend="prod49">queryTerm</link> )* ( <link linkend="prod50">orderby</link> )? ( <link linkend="prod51">limit</link> )? ( <link linkend="prod42">option</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod45" xreflabel="queryTerm"/>queryTerm</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod49" xreflabel="queryTerm"/>queryTerm</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod48">queryPrimary</link> ( <INTERSECT> ( <ALL> | <DISTINCT> )? <link linkend="prod48">queryPrimary</link> )*</para></entry></row>
+<link linkend="prod52">queryPrimary</link> ( <INTERSECT> ( <ALL> | <DISTINCT> )? <link linkend="prod52">queryPrimary</link> )*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod48" xreflabel="queryPrimary"/>queryPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="queryPrimary"/>queryPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod49">query</link> | ( <TABLE> <link linkend="prod2">id</link> ) | ( <LPAREN> <link linkend="prod44">queryExpressionBody</link> <RPAREN> ) )</para></entry></row>
+( <link linkend="prod53">query</link> | ( <TABLE> <link linkend="prod2">id</link> ) | ( <LPAREN> <link linkend="prod48">queryExpressionBody</link> <RPAREN> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod49" xreflabel="query"/>query</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="query"/>query</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod50">select</link> ( <link linkend="prod51">into</link> )? ( <link linkend="prod52">from</link> ( <link linkend="prod42">where</link> )? ( <link linkend="prod53">groupBy</link> )? ( <link linkend="prod54">having</link> )? )?</para></entry></row>
+<link linkend="prod54">select</link> ( <link linkend="prod55">into</link> )? ( <link linkend="prod56">from</link> ( <link linkend="prod46">where</link> )? ( <link linkend="prod57">groupBy</link> )? ( <link linkend="prod58">having</link> )? )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="into"/>into</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod55" xreflabel="into"/>into</para></entry>
<entry align="left" valign="top"><para>::=
<INTO> ( <link linkend="prod2">id</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="select"/>select</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="select"/>select</para></entry>
<entry align="left" valign="top"><para>::=
-<SELECT> ( <ALL> | ( <DISTINCT> ) )? ( <STAR> | ( <link linkend="prod55">selectSymbol</link> ( <COMMA> <link linkend="prod55">selectSymbol</link> )* ) )</para></entry></row>
+<SELECT> ( <ALL> | ( <DISTINCT> ) )? ( <STAR> | ( <link linkend="prod59">selectSymbol</link> ( <COMMA> <link linkend="prod59">selectSymbol</link> )* ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod55" xreflabel="selectSymbol"/>selectSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod59" xreflabel="selectSymbol"/>selectSymbol</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod56">selectExpression</link> | <link linkend="prod57">allInGroupSymbol</link> )</para></entry></row>
+( <link linkend="prod60">selectExpression</link> | <link linkend="prod61">allInGroupSymbol</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod56" xreflabel="selectExpression"/>selectExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod60" xreflabel="selectExpression"/>selectExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod17">expression</link> ( ( <AS> )? <link linkend="prod2">id</link> )? )</para></entry></row>
+( <link linkend="prod21">expression</link> ( ( <AS> )? <link linkend="prod2">id</link> )? )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="derivedColumn"/>derivedColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod62" xreflabel="derivedColumn"/>derivedColumn</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod17">expression</link> ( <AS> <link linkend="prod2">id</link> )? )</para></entry></row>
+( <link linkend="prod21">expression</link> ( <AS> <link linkend="prod2">id</link> )? )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod61" xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
<entry align="left" valign="top"><para>::=
<ALL_IN_GROUP></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod59" xreflabel="xmlAgg"/>xmlAgg</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod63" xreflabel="xmlAgg"/>xmlAgg</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLAGG> <LPAREN> <link linkend="prod17">expression</link> ( <link linkend="prod46">orderby</link> )? <RPAREN></para></entry></row>
+<XMLAGG> <LPAREN> <link linkend="prod21">expression</link> ( <link linkend="prod50">orderby</link> )? <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod60" xreflabel="textAgg"/>textAgg</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod64" xreflabel="textAgg"/>textAgg</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod15">nonReserved</link> <LPAREN> <FOR> <link linkend="prod58">derivedColumn</link> ( <COMMA> <link linkend="prod58">derivedColumn</link> )* ( <ID> <link linkend="prod61">charVal</link> )? ( ( <ID> <link linkend="prod61">charVal</link> ) )? ( <ID> )? ( ( <ID> <link linkend="prod2">id</link> ) )? ( <link linkend="prod46">orderby</link> )? <RPAREN></para></entry></row>
+<link linkend="prod18">nonReserved</link> <LPAREN> <FOR> <link linkend="prod62">derivedColumn</link> ( <COMMA> <link linkend="prod62">derivedColumn</link> )* ( <ID> <link linkend="prod65">charVal</link> )? ( ( <ID> <link linkend="prod65">charVal</link> ) )? ( <ID> )? ( ( <ID> <link linkend="prod2">id</link> ) )? ( <link linkend="prod50">orderby</link> )? <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod62" xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod66" xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <link linkend="prod15">nonReserved</link> <LPAREN> <STAR> <RPAREN> ) | ( ( <link linkend="prod15">nonReserved</link> | <ANY> | <SOME> ) <LPAREN> ( <DISTINCT> | <ALL> )? <link linkend="prod17">expression</link> <RPAREN> ) )</para></entry></row>
+( ( <link linkend="prod18">nonReserved</link> <LPAREN> <STAR> <RPAREN> ) | ( ( <link linkend="prod18">nonReserved</link> | <ANY> | <SOME> ) <LPAREN> ( <DISTINCT> | <ALL> )? <link linkend="prod21">expression</link> <RPAREN> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="from"/>from</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod56" xreflabel="from"/>from</para></entry>
<entry align="left" valign="top"><para>::=
-<FROM> ( <link linkend="prod63">tableReference</link> ( <COMMA> <link linkend="prod63">tableReference</link> )* )</para></entry></row>
+<FROM> ( <link linkend="prod67">tableReference</link> ( <COMMA> <link linkend="prod67">tableReference</link> )* )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod63" xreflabel="tableReference"/>tableReference</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod67" xreflabel="tableReference"/>tableReference</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <LBRACE> <link linkend="prod15">nonReserved</link> <link linkend="prod64">joinedTable</link> <RBRACE> ) | <link linkend="prod64">joinedTable</link> )</para></entry></row>
+( ( <LBRACE> <link linkend="prod18">nonReserved</link> <link linkend="prod68">joinedTable</link> <RBRACE> ) | <link linkend="prod68">joinedTable</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod64" xreflabel="joinedTable"/>joinedTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod68" xreflabel="joinedTable"/>joinedTable</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod65">tablePrimary</link> ( ( <link linkend="prod66">crossJoin</link> | <link linkend="prod67">qualifiedJoin</link> ) )*</para></entry></row>
+<link linkend="prod69">tablePrimary</link> ( ( <link linkend="prod70">crossJoin</link> | <link linkend="prod71">qualifiedJoin</link> ) )*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod66" xreflabel="crossJoin"/>crossJoin</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod70" xreflabel="crossJoin"/>crossJoin</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <CROSS> | <UNION> ) <JOIN> <link linkend="prod65">tablePrimary</link> )</para></entry></row>
+( ( <CROSS> | <UNION> ) <JOIN> <link linkend="prod69">tablePrimary</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod67" xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod71" xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
<entry align="left" valign="top"><para>::=
-( ( ( <RIGHT> ( <OUTER> )? ) | ( <LEFT> ( <OUTER> )? ) | ( <FULL> ( <OUTER> )? ) | <INNER> )? <JOIN> <link linkend="prod63">tableReference</link> <ON> <link linkend="prod29">criteria</link> )</para></entry></row>
+( ( ( <RIGHT> ( <OUTER> )? ) | ( <LEFT> ( <OUTER> )? ) | ( <FULL> ( <OUTER> )? ) | <INNER> )? <JOIN> <link linkend="prod67">tableReference</link> <ON> <link linkend="prod32">criteria</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod65" xreflabel="tablePrimary"/>tablePrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod69" xreflabel="tablePrimary"/>tablePrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod68">textTable</link> | <link linkend="prod69">xmlTable</link> | <link linkend="prod70">unaryFromClause</link> | <link linkend="prod71">subqueryFromClause</link> | ( <LPAREN> <link linkend="prod64">joinedTable</link> <RPAREN> ) ) ( ( <MAKEDEP> ) | ( <MAKENOTDEP> ) )?</para></entry></row>
+( <link linkend="prod72">textTable</link> | <link linkend="prod73">xmlTable</link> | <link linkend="prod74">unaryFromClause</link> | <link linkend="prod75">subqueryFromClause</link> | ( <LPAREN> <link linkend="prod68">joinedTable</link> <RPAREN> ) ) ( ( <MAKEDEP> ) | ( <MAKENOTDEP> ) )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod72" xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLSERIALIZE> <LPAREN> ( <link linkend="prod15">nonReserved</link> )? <link linkend="prod17">expression</link> ( <AS> ( <STRING> | <VARCHAR> | <CLOB> ) )? <RPAREN></para></entry></row>
+<XMLSERIALIZE> <LPAREN> ( <link linkend="prod18">nonReserved</link> )? <link linkend="prod21">expression</link> ( <AS> ( <STRING> | <VARCHAR> | <CLOB> ) )? <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod15" xreflabel="nonReserved"/>nonReserved</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod18" xreflabel="nonReserved"/>nonReserved</para></entry>
<entry align="left" valign="top"><para>::=
<ID></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod68" xreflabel="textTable"/>textTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod72" xreflabel="textTable"/>textTable</para></entry>
<entry align="left" valign="top"><para>::=
-<ID> <LPAREN> <link linkend="prod17">expression</link> <link linkend="prod15">nonReserved</link> <link linkend="prod73">textColumn</link> ( <COMMA> <link linkend="prod73">textColumn</link> )* ( <ID> <link linkend="prod61">charVal</link> )? ( ( <ESCAPE> <link linkend="prod61">charVal</link> ) | ( <ID> <link linkend="prod61">charVal</link> ) )? ( <ID> ( <link linkend="prod74">intVal</link> )? )? ( <ID> <link linkend="prod74">intVal</link> )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
+<ID> <LPAREN> <link linkend="prod21">expression</link> <link linkend="prod18">nonReserved</link> <link linkend="prod77">textColumn</link> ( <COMMA> <link linkend="prod77">textColumn</link> )* ( <ID> <link linkend="prod65">charVal</link> )? ( ( <ESCAPE> <link linkend="prod65">charVal</link> ) | ( <ID> <link linkend="prod65">charVal</link> ) )? ( <ID> ( <link linkend="prod78">intVal</link> )? )? ( <ID> <link linkend="prod78">intVal</link> )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod73" xreflabel="textColumn"/>textColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod77" xreflabel="textColumn"/>textColumn</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> <link linkend="prod32">dataType</link> ( <ID> <link linkend="prod74">intVal</link> )?</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod35">dataType</link> ( <ID> <link linkend="prod78">intVal</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod75" xreflabel="xmlQuery"/>xmlQuery</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod79" xreflabel="xmlQuery"/>xmlQuery</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLQUERY> <LPAREN> ( <link linkend="prod76">xmlNamespaces</link> <COMMA> )? <link linkend="prod1">stringVal</link> ( <ID> <link linkend="prod58">derivedColumn</link> ( <COMMA> <link linkend="prod58">derivedColumn</link> )* )? ( ( <NULL> | <link linkend="prod15">nonReserved</link> ) <ON> <link linkend="prod15">nonReserved</link> )? <RPAREN></para></entry></row>
+<XMLQUERY> <LPAREN> ( <link linkend="prod80">xmlNamespaces</link> <COMMA> )? <link linkend="prod1">stringVal</link> ( <ID> <link linkend="prod62">derivedColumn</link> ( <COMMA> <link linkend="prod62">derivedColumn</link> )* )? ( ( <NULL> | <link linkend="prod18">nonReserved</link> ) <ON> <link linkend="prod18">nonReserved</link> )? <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod69" xreflabel="xmlTable"/>xmlTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod73" xreflabel="xmlTable"/>xmlTable</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLTABLE> <LPAREN> ( <link linkend="prod76">xmlNamespaces</link> <COMMA> )? <link linkend="prod1">stringVal</link> ( <ID> <link linkend="prod58">derivedColumn</link> ( <COMMA> <link linkend="prod58">derivedColumn</link> )* )? ( <ID> <link linkend="prod77">xmlColumn</link> ( <COMMA> <link linkend="prod77">xmlColumn</link> )* )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
+<XMLTABLE> <LPAREN> ( <link linkend="prod80">xmlNamespaces</link> <COMMA> )? <link linkend="prod1">stringVal</link> ( <ID> <link linkend="prod62">derivedColumn</link> ( <COMMA> <link linkend="prod62">derivedColumn</link> )* )? ( <ID> <link linkend="prod81">xmlColumn</link> ( <COMMA> <link linkend="prod81">xmlColumn</link> )* )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod77" xreflabel="xmlColumn"/>xmlColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod81" xreflabel="xmlColumn"/>xmlColumn</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> ( ( <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>
+<link linkend="prod2">id</link> ( ( <FOR> <link linkend="prod18">nonReserved</link> ) | ( <link linkend="prod35">dataType</link> ( <DEFAULT_KEYWORD> <link linkend="prod21">expression</link> )? ( <link linkend="prod18">nonReserved</link> <link linkend="prod1">stringVal</link> )? ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod74" xreflabel="intVal"/>intVal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod78" xreflabel="intVal"/>intVal</para></entry>
<entry align="left" valign="top"><para>::=
<INTEGERVAL></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod71" xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod75" xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
<entry align="left" valign="top"><para>::=
-( <TABLE> )? <LPAREN> ( <link linkend="prod7">queryExpression</link> | <link linkend="prod8">storedProcedure</link> ) <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
+( <TABLE> )? <LPAREN> ( <link linkend="prod10">queryExpression</link> | <link linkend="prod11">storedProcedure</link> ) <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod70" xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod74" xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
<entry align="left" valign="top"><para>::=
( <ID> ( ( <AS> )? <link linkend="prod2">id</link> )? )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="where"/>where</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="where"/>where</para></entry>
<entry align="left" valign="top"><para>::=
-<WHERE> <link linkend="prod29">criteria</link></para></entry></row>
+<WHERE> <link linkend="prod32">criteria</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod29" xreflabel="criteria"/>criteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod32" xreflabel="criteria"/>criteria</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod78">compoundCritOr</link></para></entry></row>
+<link linkend="prod82">compoundCritOr</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod78" xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod79">compoundCritAnd</link> ( <OR> <link linkend="prod79">compoundCritAnd</link> )*</para></entry></row>
+<link linkend="prod83">compoundCritAnd</link> ( <OR> <link linkend="prod83">compoundCritAnd</link> )*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod79" xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod83" xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod80">notCrit</link> ( <AND> <link linkend="prod80">notCrit</link> )*</para></entry></row>
+<link linkend="prod84">notCrit</link> ( <AND> <link linkend="prod84">notCrit</link> )*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod80" xreflabel="notCrit"/>notCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="notCrit"/>notCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <link linkend="prod81">booleanPrimary</link></para></entry></row>
+( <NOT> )? <link linkend="prod85">booleanPrimary</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod81" xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod85" xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod35">translateCriteria</link> | ( <link linkend="prod82">commonValueExpression</link> ( ( <link linkend="prod83">betweenCrit</link> | <link linkend="prod84">matchCrit</link> | <link linkend="prod85">setCrit</link> | <link linkend="prod86">isNullCrit</link> | <link linkend="prod87">subqueryCompareCriteria</link> | <link linkend="prod88">compareCrit</link> ) )? ) | <link linkend="prod89">existsCriteria</link> | <link linkend="prod31">hasCriteria</link> )</para></entry></row>
+( <link linkend="prod38">translateCriteria</link> | ( <link linkend="prod86">commonValueExpression</link> ( ( <link linkend="prod87">betweenCrit</link> | <link linkend="prod88">matchCrit</link> | <link linkend="prod89">setCrit</link> | <link linkend="prod90">isNullCrit</link> | <link linkend="prod91">subqueryCompareCriteria</link> | <link linkend="prod92">compareCrit</link> ) )? ) | <link linkend="prod93">existsCriteria</link> | <link linkend="prod34">hasCriteria</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod90" xreflabel="operator"/>operator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod94" xreflabel="operator"/>operator</para></entry>
<entry align="left" valign="top"><para>::=
( <EQ> | <NE> | <NE2> | <LT> | <LE> | <GT> | <GE> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod88" xreflabel="compareCrit"/>compareCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod92" xreflabel="compareCrit"/>compareCrit</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod90">operator</link> <link linkend="prod82">commonValueExpression</link></para></entry></row>
+<link linkend="prod94">operator</link> <link linkend="prod86">commonValueExpression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod91" xreflabel="subquery"/>subquery</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod95" xreflabel="subquery"/>subquery</para></entry>
<entry align="left" valign="top"><para>::=
-<LPAREN> ( <link linkend="prod7">queryExpression</link> | ( <link linkend="prod8">storedProcedure</link> ) ) <RPAREN></para></entry></row>
+<LPAREN> ( <link linkend="prod10">queryExpression</link> | ( <link linkend="prod11">storedProcedure</link> ) ) <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod87" xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod91" xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod90">operator</link> ( <ANY> | <SOME> | <ALL> ) <link linkend="prod91">subquery</link></para></entry></row>
+<link linkend="prod94">operator</link> ( <ANY> | <SOME> | <ALL> ) <link linkend="prod95">subquery</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="matchCrit"/>matchCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod88" xreflabel="matchCrit"/>matchCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <LIKE> <link linkend="prod82">commonValueExpression</link> ( <ESCAPE> <link linkend="prod61">charVal</link> | ( <LBRACE> <ESCAPE> <link linkend="prod61">charVal</link> <RBRACE> ) )?</para></entry></row>
+( <NOT> )? <LIKE> <link linkend="prod86">commonValueExpression</link> ( <ESCAPE> <link linkend="prod65">charVal</link> | ( <LBRACE> <ESCAPE> <link linkend="prod65">charVal</link> <RBRACE> ) )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod61" xreflabel="charVal"/>charVal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod65" xreflabel="charVal"/>charVal</para></entry>
<entry align="left" valign="top"><para>::=
<link linkend="prod1">stringVal</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod83" xreflabel="betweenCrit"/>betweenCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod87" xreflabel="betweenCrit"/>betweenCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <BETWEEN> <link linkend="prod82">commonValueExpression</link> <AND> <link linkend="prod82">commonValueExpression</link></para></entry></row>
+( <NOT> )? <BETWEEN> <link linkend="prod86">commonValueExpression</link> <AND> <link linkend="prod86">commonValueExpression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod86" xreflabel="isNullCrit"/>isNullCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod90" xreflabel="isNullCrit"/>isNullCrit</para></entry>
<entry align="left" valign="top"><para>::=
<IS> ( <NOT> )? <NULL></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod85" xreflabel="setCrit"/>setCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod89" xreflabel="setCrit"/>setCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <IN> ( ( <link linkend="prod91">subquery</link> ) | ( <LPAREN> <link linkend="prod82">commonValueExpression</link> ( <COMMA> <link linkend="prod82">commonValueExpression</link> )* <RPAREN> ) )</para></entry></row>
+( <NOT> )? <IN> ( ( <link linkend="prod95">subquery</link> ) | ( <LPAREN> <link linkend="prod86">commonValueExpression</link> ( <COMMA> <link linkend="prod86">commonValueExpression</link> )* <RPAREN> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod89" xreflabel="existsCriteria"/>existsCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod93" xreflabel="existsCriteria"/>existsCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<EXISTS> <link linkend="prod91">subquery</link></para></entry></row>
+<EXISTS> <link linkend="prod95">subquery</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="groupBy"/>groupBy</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="groupBy"/>groupBy</para></entry>
<entry align="left" valign="top"><para>::=
-<GROUP> <BY> ( <link linkend="prod92">groupByItem</link> ( <COMMA> <link linkend="prod92">groupByItem</link> )* )</para></entry></row>
+<GROUP> <BY> ( <link linkend="prod96">groupByItem</link> ( <COMMA> <link linkend="prod96">groupByItem</link> )* )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod92" xreflabel="groupByItem"/>groupByItem</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod96" xreflabel="groupByItem"/>groupByItem</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod17">expression</link></para></entry></row>
+<link linkend="prod21">expression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="having"/>having</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="having"/>having</para></entry>
<entry align="left" valign="top"><para>::=
-<HAVING> <link linkend="prod29">criteria</link></para></entry></row>
+<HAVING> <link linkend="prod32">criteria</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="orderby"/>orderby</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="orderby"/>orderby</para></entry>
<entry align="left" valign="top"><para>::=
-<ORDER> <BY> <link linkend="prod93">sortSpecification</link> ( <COMMA> <link linkend="prod93">sortSpecification</link> )*</para></entry></row>
+<ORDER> <BY> <link linkend="prod97">sortSpecification</link> ( <COMMA> <link linkend="prod97">sortSpecification</link> )*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod93" xreflabel="sortSpecification"/>sortSpecification</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod97" xreflabel="sortSpecification"/>sortSpecification</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod94">sortKey</link> ( <ASC> | <DESC> )? ( <link linkend="prod15">nonReserved</link> <link linkend="prod15">nonReserved</link> )?</para></entry></row>
+<link linkend="prod98">sortKey</link> ( <ASC> | <DESC> )? ( <link linkend="prod18">nonReserved</link> <link linkend="prod18">nonReserved</link> )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod94" xreflabel="sortKey"/>sortKey</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod98" xreflabel="sortKey"/>sortKey</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod17">expression</link></para></entry></row>
+<link linkend="prod21">expression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod47" xreflabel="limit"/>limit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="limit"/>limit</para></entry>
<entry align="left" valign="top"><para>::=
<LIMIT> ( <INTEGERVAL> | <QMARK> ) ( <COMMA> ( <INTEGERVAL> | <QMARK> ) )?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod38" xreflabel="option"/>option</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="option"/>option</para></entry>
<entry align="left" valign="top"><para>::=
<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="prod17" xreflabel="expression"/>expression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod21" xreflabel="expression"/>expression</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod29">criteria</link></para></entry></row>
+<link linkend="prod32">criteria</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod86" xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod95">plusExpression</link> ( <CONCAT_OP> <link linkend="prod95">plusExpression</link> )* )</para></entry></row>
+( <link linkend="prod99">plusExpression</link> ( <CONCAT_OP> <link linkend="prod99">plusExpression</link> )* )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod95" xreflabel="plusExpression"/>plusExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod99" xreflabel="plusExpression"/>plusExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod96">timesExpression</link> ( <link linkend="prod97">plusOperator</link> <link linkend="prod96">timesExpression</link> )* )</para></entry></row>
+( <link linkend="prod100">timesExpression</link> ( <link linkend="prod101">plusOperator</link> <link linkend="prod100">timesExpression</link> )* )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod97" xreflabel="plusOperator"/>plusOperator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod101" xreflabel="plusOperator"/>plusOperator</para></entry>
<entry align="left" valign="top"><para>::=
( <PLUS> | <MINUS> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod96" xreflabel="timesExpression"/>timesExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod100" xreflabel="timesExpression"/>timesExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod98">valueExpressionPrimary</link> ( <link linkend="prod99">timesOperator</link> <link linkend="prod98">valueExpressionPrimary</link> )* )</para></entry></row>
+( <link linkend="prod102">valueExpressionPrimary</link> ( <link linkend="prod103">timesOperator</link> <link linkend="prod102">valueExpressionPrimary</link> )* )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod99" xreflabel="timesOperator"/>timesOperator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod103" xreflabel="timesOperator"/>timesOperator</para></entry>
<entry align="left" valign="top"><para>::=
( <STAR> | <SLASH> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod98" xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod102" xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <QMARK> | <link linkend="prod100">literal</link> | ( <LBRACE> <link linkend="prod15">nonReserved</link> <link linkend="prod101">function</link> <RBRACE> ) | ( <link linkend="prod60">textAgg</link> ) | ( <link linkend="prod62">aggregateSymbol</link> ) | ( <link linkend="prod62">aggregateSymbol</link> ) | ( <link linkend="prod62">aggregateSymbol</link> ) | ( <link linkend="prod59">xmlAgg</link> ) | ( <link linkend="prod101">function</link> ) | ( <ID> ) | <link linkend="prod91">subquery</link> | ( <LPAREN> <link linkend="prod17">expression</link> <RPAREN> ) | <link linkend="prod102">searchedCaseExpression</link> | <link linkend="prod103">caseExpression</link> )</para></entry></row>
+( <QMARK> | <link linkend="prod104">literal</link> | ( <LBRACE> <link linkend="prod18">nonReserved</link> <link linkend="prod105">function</link> <RBRACE> ) | ( <link linkend="prod64">textAgg</link> ) | ( <link linkend="prod66">aggregateSymbol</link> ) | ( <link linkend="prod66">aggregateSymbol</link> ) | ( <link linkend="prod66">aggregateSymbol</link> ) | ( <link linkend="prod63">xmlAgg</link> ) | ( <link linkend="prod105">function</link> ) | ( <ID> ) | <link linkend="prod95">subquery</link> | ( <LPAREN> <link linkend="prod21">expression</link> <RPAREN> ) | <link linkend="prod106">searchedCaseExpression</link> | <link linkend="prod107">caseExpression</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod103" xreflabel="caseExpression"/>caseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod107" xreflabel="caseExpression"/>caseExpression</para></entry>
<entry align="left" valign="top"><para>::=
-<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>
+<CASE> <link linkend="prod21">expression</link> ( <WHEN> <link linkend="prod21">expression</link> <THEN> <link linkend="prod21">expression</link> )+ ( <ELSE> <link linkend="prod21">expression</link> )? <END></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod102" xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod106" xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
<entry align="left" valign="top"><para>::=
-<CASE> ( <WHEN> <link linkend="prod29">criteria</link> <THEN> <link linkend="prod17">expression</link> )+ ( <ELSE> <link linkend="prod17">expression</link> )? <END></para></entry></row>
+<CASE> ( <WHEN> <link linkend="prod32">criteria</link> <THEN> <link linkend="prod21">expression</link> )+ ( <ELSE> <link linkend="prod21">expression</link> )? <END></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod101" xreflabel="function"/>function</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod105" xreflabel="function"/>function</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <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="prod104">stringConstant</link> <RPAREN> ) | ( <link linkend="prod15">nonReserved</link> <LPAREN> <link linkend="prod105">intervalType</link> <COMMA> <link linkend="prod17">expression</link> <COMMA> <link linkend="prod17">expression</link> <RPAREN> ) | <link linkend="prod106">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="prod107">xmlParse</link> | <link linkend="prod108">xmlElement</link> | ( <XMLPI> <LPAREN> ( <ID> <link linkend="prod109">idExpression</link> | <link linkend="prod109">idExpression</link> ) ( <COMMA> <link linkend="prod17">expression</link> )? <RPAREN> ) | <link linkend="prod110">xmlForest</link> | <link linkend="prod72">xmlSerialize</link> | <link linkend="prod75">xmlQuery</link> | ( <link linkend="prod2">id</link> <LPAREN> ( <link linkend="prod17">expression</link> ( <COMMA> <link linkend="prod17">expression</link> )*!
)? <RPAREN> ) )</para></entry></row>
+( ( <CONVERT> <LPAREN> <link linkend="prod21">expression</link> <COMMA> <link linkend="prod35">dataType</link> <RPAREN> ) | ( <CAST> <LPAREN> <link linkend="prod21">expression</link> <AS> <link linkend="prod35">dataType</link> <RPAREN> ) | ( <link linkend="prod18">nonReserved</link> <LPAREN> <link linkend="prod21">expression</link> <COMMA> <link linkend="prod108">stringConstant</link> <RPAREN> ) | ( <link linkend="prod18">nonReserved</link> <LPAREN> <link linkend="prod109">intervalType</link> <COMMA> <link linkend="prod21">expression</link> <COMMA> <link linkend="prod21">expression</link> <RPAREN> ) | <link linkend="prod110">queryString</link> | ( ( <LEFT> | <RIGHT> | <CHAR> | <USER> | <YEAR> | <MONTH> | <HOUR> | <MINUTE> | <SECOND> | <XMLCONCAT> | <XMLCOMMENT> ) <LPAREN> ( <link linkend="prod21">expression</link> !
( <COMMA> <link linkend="prod21">expression</link> )* )? <RPAREN> ) | ( ( <INSERT> ) <LPAREN> ( <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod21">expression</link> )* )? <RPAREN> ) | ( ( <TRANSLATE> ) <LPAREN> ( <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod21">expression</link> )* )? <RPAREN> ) | <link linkend="prod111">xmlParse</link> | <link linkend="prod112">xmlElement</link> | ( <XMLPI> <LPAREN> ( <ID> <link linkend="prod113">idExpression</link> | <link linkend="prod113">idExpression</link> ) ( <COMMA> <link linkend="prod21">expression</link> )? <RPAREN> ) | <link linkend="prod114">xmlForest</link> | <link linkend="prod76">xmlSerialize</link> | <link linkend="prod79">xmlQuery</link> | ( <link linkend="prod2">id</link> <LPAREN> ( <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod21">expression</link> )*!
)? <RPAREN> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod104" xreflabel="stringConstant"/>stringConstant</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod108" xreflabel="stringConstant"/>stringConstant</para></entry>
<entry align="left" valign="top"><para>::=
<link linkend="prod1">stringVal</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod107" xreflabel="xmlParse"/>xmlParse</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod111" xreflabel="xmlParse"/>xmlParse</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLPARSE> <LPAREN> <link linkend="prod15">nonReserved</link> <link linkend="prod17">expression</link> ( <link linkend="prod15">nonReserved</link> )? <RPAREN></para></entry></row>
+<XMLPARSE> <LPAREN> <link linkend="prod18">nonReserved</link> <link linkend="prod21">expression</link> ( <link linkend="prod18">nonReserved</link> )? <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod106" xreflabel="queryString"/>queryString</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod110" xreflabel="queryString"/>queryString</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod15">nonReserved</link> <LPAREN> <link linkend="prod17">expression</link> ( <COMMA> <link linkend="prod58">derivedColumn</link> )* <RPAREN></para></entry></row>
+<link linkend="prod18">nonReserved</link> <LPAREN> <link linkend="prod21">expression</link> ( <COMMA> <link linkend="prod62">derivedColumn</link> )* <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod108" xreflabel="xmlElement"/>xmlElement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod112" xreflabel="xmlElement"/>xmlElement</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLELEMENT> <LPAREN> ( <ID> <link linkend="prod2">id</link> | <link linkend="prod2">id</link> ) ( <COMMA> <link linkend="prod76">xmlNamespaces</link> )? ( <COMMA> <link linkend="prod111">xmlAttributes</link> )? ( <COMMA> <link linkend="prod17">expression</link> )* <RPAREN></para></entry></row>
+<XMLELEMENT> <LPAREN> ( <ID> <link linkend="prod2">id</link> | <link linkend="prod2">id</link> ) ( <COMMA> <link linkend="prod80">xmlNamespaces</link> )? ( <COMMA> <link linkend="prod115">xmlAttributes</link> )? ( <COMMA> <link linkend="prod21">expression</link> )* <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod111" xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod115" xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLATTRIBUTES> <LPAREN> <link linkend="prod58">derivedColumn</link> ( <COMMA> <link linkend="prod58">derivedColumn</link> )* <RPAREN></para></entry></row>
+<XMLATTRIBUTES> <LPAREN> <link linkend="prod62">derivedColumn</link> ( <COMMA> <link linkend="prod62">derivedColumn</link> )* <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod110" xreflabel="xmlForest"/>xmlForest</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod114" xreflabel="xmlForest"/>xmlForest</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLFOREST> <LPAREN> ( <link linkend="prod76">xmlNamespaces</link> <COMMA> )? <link linkend="prod58">derivedColumn</link> ( <COMMA> <link linkend="prod58">derivedColumn</link> )* <RPAREN></para></entry></row>
+<XMLFOREST> <LPAREN> ( <link linkend="prod80">xmlNamespaces</link> <COMMA> )? <link linkend="prod62">derivedColumn</link> ( <COMMA> <link linkend="prod62">derivedColumn</link> )* <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod80" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLNAMESPACES> <LPAREN> <link linkend="prod112">namespaceItem</link> ( <COMMA> <link linkend="prod112">namespaceItem</link> )* <RPAREN></para></entry></row>
+<XMLNAMESPACES> <LPAREN> <link linkend="prod116">namespaceItem</link> ( <COMMA> <link linkend="prod116">namespaceItem</link> )* <RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod112" xreflabel="namespaceItem"/>namespaceItem</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod116" xreflabel="namespaceItem"/>namespaceItem</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod1">stringVal</link> <AS> <link linkend="prod2">id</link> )</para></entry></row>
<row>
@@ -833,20 +846,24 @@
<entry align="left" valign="top"><para>::=
( <DEFAULT_KEYWORD> <link linkend="prod1">stringVal</link> )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod109" xreflabel="idExpression"/>idExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod113" xreflabel="idExpression"/>idExpression</para></entry>
<entry align="left" valign="top"><para>::=
<link linkend="prod2">id</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod32" xreflabel="dataType"/>dataType</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod19" xreflabel="dataTypeString"/>dataTypeString</para></entry>
<entry align="left" valign="top"><para>::=
( <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="prod105" xreflabel="intervalType"/>intervalType</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="dataType"/>dataType</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod15">nonReserved</link> )</para></entry></row>
+<link linkend="prod19">dataTypeString</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor id="prod100" xreflabel="literal"/>literal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod109" xreflabel="intervalType"/>intervalType</para></entry>
<entry align="left" valign="top"><para>::=
+( <link linkend="prod18">nonReserved</link> )</para></entry></row>
+<row>
+<entry align="right" valign="top"><para><anchor id="prod104" xreflabel="literal"/>literal</para></entry>
+<entry align="left" valign="top"><para>::=
( <link linkend="prod1">stringVal</link> | <INTEGERVAL> | <FLOATVAL> | <FALSE> | <TRUE> | <UNKNOWN> | <NULL> | ( ( <BOOLEANTYPE> | <TIMESTAMPTYPE> | <DATETYPE> | <TIMETYPE> ) <link linkend="prod1">stringVal</link> <RBRACE> ) )</para></entry></row>
</tbody>
</tgroup>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml 2011-01-17 20:08:09 UTC (rev 2845)
@@ -665,7 +665,7 @@
<para>Creation syntax:
</para>
<listitem>
- <para>Explicit: CREATE LOCAL TEMPORARY TABLE x (column type, ... [PRIMARY KEY (column, ...)])
+ <para>Explicit: CREATE LOCAL TEMPORARY TABLE x (column type [NOT NULL], ... [PRIMARY KEY (column, ...)])
</para>
</listitem>
<listitem>
@@ -680,6 +680,9 @@
<para>If #x doesn't exist, it will be defined using the target column names (in not supplied, the column names will match the derived column names from the query), and the types from the query derived columns.
</para>
</listitem>
+ <listitem>
+ <para>Use the SERIAL data type to specify a NOT NULL and auto-incrementing INTEGER column. The starting value of a SERIAL column is 1.</para>
+ </listitem>
</itemizedlist>
<itemizedlist>
<para>Drop syntax:
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -337,6 +337,13 @@
case SupportConstants.Element.SEARCHABLE_LIKE: return true;
case SupportConstants.Element.SEARCHABLE_COMPARE:return true;
case SupportConstants.Element.SELECT: return true;
+ case SupportConstants.Element.NULL: {
+ if (id.isNotNull()) {
+ return false;
+ }
+ break;
+ }
+ case SupportConstants.Element.AUTO_INCREMENT: return id.isAutoIncrement();
}
// If this is a temp table column or real metadata is unknown, return hard-coded values
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataID.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -44,6 +44,7 @@
*/
public class TempMetadataID implements Serializable {
+ private static final long serialVersionUID = -1879211827339120135L;
private static final int LOCAL_CACHE_SIZE = 8;
static class TableData {
@@ -75,6 +76,8 @@
//Column metadata
private int position;
private Class<?> type; // type of this element, only for element
+ private boolean autoIncrement;
+ private boolean notNull;
/**
* Constructor for group form of metadata ID.
@@ -331,5 +334,21 @@
}
return data;
}
+
+ public boolean isAutoIncrement() {
+ return autoIncrement;
+ }
+
+ public void setAutoIncrement(boolean autoIncrement) {
+ this.autoIncrement = autoIncrement;
+ }
+
+ public boolean isNotNull() {
+ return notNull;
+ }
+
+ public void setNotNull(boolean notNull) {
+ this.notNull = notNull;
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataStore.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -25,7 +25,6 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -71,7 +70,7 @@
* Get all temp group and element metadata
* @param data Map of upper case group name to group TempMetadataID object
*/
- public Map getData() {
+ public Map<String, TempMetadataID> getData() {
return this.tempGroups;
}
@@ -107,7 +106,7 @@
// Add the temporary group
String tempName = tempGroup.toUpperCase();
- List elementIDs = new ArrayList(tempSymbols.size());
+ List<TempMetadataID> elementIDs = new ArrayList<TempMetadataID>(tempSymbols.size());
for (SingleElementSymbol symbol : tempSymbols) {
TempMetadataID elementID = createElementSymbol(tempName, symbol, isTempTable);
@@ -178,23 +177,6 @@
}
/**
- * Add a bunch of temp groups all at once. This map should contain temp
- * group names (Strings) as keys and the TempMetadataID for the group as the
- * value.
- * @param tempGroupMap (tempGroupName (String) --> TempMetadataID)
- */
- public void addTempGroups(Map tempGroupMap) {
- if(tempGroupMap != null && tempGroupMap.size() > 0) {
- Iterator keyIter = tempGroupMap.keySet().iterator();
- while(keyIter.hasNext()) {
- String tempGroupName = (String) keyIter.next();
- TempMetadataID groupID = (TempMetadataID) tempGroupMap.get(tempGroupName);
- this.tempGroups.put(tempGroupName, groupID);
- }
- }
- }
-
- /**
* Get temporary group ID based on group name
* @param tempGroup Group name
* @return Metadata ID or null if not found
@@ -217,9 +199,7 @@
TempMetadataID groupID = tempGroups.get(groupName.toUpperCase());
if(groupID != null) {
- Iterator elementIter = groupID.getElements().iterator();
- while(elementIter.hasNext()) {
- TempMetadataID elementID = (TempMetadataID) elementIter.next();
+ for (TempMetadataID elementID : groupID.getElements()) {
if(elementID.getID().equalsIgnoreCase(tempElement)) {
return elementID;
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -531,9 +531,8 @@
if(command instanceof StoredProcedure){
modelID = ((StoredProcedure)command).getModelID();
}else{
- Collection groups = GroupCollectorVisitor.getGroups(command, true);
- Iterator groupIter = groups.iterator();
- GroupSymbol group = (GroupSymbol) groupIter.next();
+ Collection<GroupSymbol> groups = GroupCollectorVisitor.getGroups(command, true);
+ GroupSymbol group = groups.iterator().next();
modelID = metadata.getModelID(group.getMetadataID());
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -78,6 +78,7 @@
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.Delete;
+import org.teiid.query.sql.lang.ExistsCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.FromClause;
import org.teiid.query.sql.lang.GroupBy;
@@ -108,6 +109,7 @@
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.Reference;
+import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SelectSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.util.SymbolMap;
@@ -594,8 +596,10 @@
//skip the rewrite here, we'll do that in the optimizer
//so that we know what the determinism level is.
addNestedCommand(sourceNode, container.getGroup(), container, c, false);
- } else if (container instanceof TranslatableProcedureContainer && !container.getGroup().isTempGroupSymbol() &&
- !CriteriaCapabilityValidatorVisitor.canPushLanguageObject(container, metadata.getModelID(container.getGroup().getMetadataID()), metadata, capFinder, analysisRecord)) {
+ } else if (!container.getGroup().isTempTable() && //we hope for the best, and do a specific validation for subqueries below
+ container instanceof TranslatableProcedureContainer //we force the evaluation of procedure params - TODO: inserts are fine except for nonpushdown functions on columns
+ && !CriteriaCapabilityValidatorVisitor.canPushLanguageObject(container, metadata.getModelID(container.getGroup().getMetadataID()), metadata, capFinder, analysisRecord)) {
+ //do a workaround of row-by-row processing for update/delete
if (metadata.getUniqueKeysInGroup(container.getGroup().getMetadataID()).isEmpty()
|| !CapabilitiesUtil.supports(Capability.CRITERIA_COMPARE_EQ, metadata.getModelID(container.getGroup().getMetadataID()), metadata, capFinder)) {
throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
@@ -612,8 +616,21 @@
}
//plan any subqueries in criteria/parameters/values
- for (SubqueryContainer subqueryContainer : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(container)) {
- ProcessorPlan plan = QueryOptimizer.optimizePlan(subqueryContainer.getCommand(), metadata, null, capFinder, analysisRecord, context);
+ for (SubqueryContainer<?> subqueryContainer : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(container)) {
+ if (c == null && container.getGroup().isTempTable()) {
+ if (subqueryContainer.getCommand().getCorrelatedReferences() == null) {
+ if (subqueryContainer instanceof ScalarSubquery) {
+ ((ScalarSubquery) subqueryContainer).setShouldEvaluate(true);
+ } else if (subqueryContainer instanceof ExistsCriteria) {
+ ((ExistsCriteria) subqueryContainer).setShouldEvaluate(true);
+ } else {
+ throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
+ }
+ } else {
+ throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
+ }
+ }
+ ProcessorPlan plan = QueryOptimizer.optimizePlan(subqueryContainer.getCommand(), metadata, null, capFinder, analysisRecord, context);
subqueryContainer.getCommand().setProcessorPlan(plan);
if (c == null) {
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -57,7 +57,7 @@
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryContainer;
import org.teiid.query.sql.lang.SubquerySetCriteria;
-import org.teiid.query.sql.navigator.PreOrderNavigator;
+import org.teiid.query.sql.navigator.PostOrderNavigator;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Function;
@@ -498,12 +498,12 @@
QueryCommand queryCommand) throws TeiidComponentException {
// Check that query in access node is for the same model as current node
try {
- Collection subQueryGroups = GroupCollectorVisitor.getGroupsIgnoreInlineViews(queryCommand, false);
+ Collection<GroupSymbol> subQueryGroups = GroupCollectorVisitor.getGroupsIgnoreInlineViews(queryCommand, false);
if(subQueryGroups.size() == 0) {
// No FROM?
return null;
}
- GroupSymbol subQueryGroup = (GroupSymbol)subQueryGroups.iterator().next();
+ GroupSymbol subQueryGroup = subQueryGroups.iterator().next();
Object modelID = subQueryGroup.getModelMetadataId();
if (modelID == null) {
@@ -583,7 +583,7 @@
}
CriteriaCapabilityValidatorVisitor visitor = new CriteriaCapabilityValidatorVisitor(modelID, metadata, capFinder, caps);
- PreOrderNavigator.doVisit(obj, visitor);
+ PostOrderNavigator.doVisit(obj, visitor);
if(visitor.getException() != null) {
throw visitor.getException();
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -131,7 +131,7 @@
ProcessorPlan plan = withCommand.getCommand().getProcessorPlan();
withProcessor = new QueryProcessor(plan, getContext(), this.root.getBufferManager(), this.root.getDataManager());
Create create = new Create();
- create.setColumns(withCommand.getColumns());
+ create.setElementSymbolsAsColumns(withCommand.getColumns());
create.setTable(withCommand.getGroupSymbol());
this.root.getDataManager().registerRequest(getContext(), create, TempMetadataAdapter.TEMP_MODEL.getID(), null, 0);
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -306,6 +306,9 @@
externalGroups.addGroup(variables);
TempMetadataID tid = metadata.addTempGroup(name, symbols);
tid.setMetadataType(Type.SCALAR);
+ for (TempMetadataID cid : tid.getElements()) {
+ cid.setMetadataType(Type.SCALAR);
+ }
variables.setMetadataID(tid);
return variables;
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -282,7 +282,7 @@
if (externalGroups != null) {
container.getCommand().pushNewResolvingContext(externalGroups);
}
- QueryResolver.resolveCommand(container.getCommand(), metadata.getMetadata());
+ QueryResolver.resolveCommand(container.getCommand(), metadata.getMetadata(), false);
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -30,6 +30,8 @@
import org.teiid.api.exception.query.QueryMetadataException;
import org.teiid.api.exception.query.QueryResolverException;
import org.teiid.core.TeiidComponentException;
+import org.teiid.metadata.Column;
+import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.query.QueryPlugin;
import org.teiid.query.metadata.TempMetadataAdapter;
import org.teiid.query.metadata.TempMetadataID;
@@ -77,18 +79,18 @@
//if we get here then either the group does not exist or has already been defined as a temp table
//if it has been defined as a temp table, that's ok we'll use this as the new definition and throw an
//exception at runtime if the user has not dropped the previous table yet
- TempMetadataID tempTable = ResolverUtil.addTempTable(metadata, group, create.getColumns());
+ TempMetadataID tempTable = ResolverUtil.addTempTable(metadata, group, create.getColumnSymbols());
ResolverUtil.resolveGroup(create.getTable(), metadata);
Set<GroupSymbol> groups = new HashSet<GroupSymbol>();
groups.add(create.getTable());
ResolverVisitor.resolveLanguageObject(command, groups, metadata);
- addPrimaryKey(create, tempTable);
+ addAdditionalMetadata(create, tempTable);
} else if(command.getType() == Command.TYPE_DROP) {
ResolverUtil.resolveGroup(((Drop)command).getTable(), metadata);
}
}
- public static void addPrimaryKey(Create create, TempMetadataID tempTable) {
+ public static void addAdditionalMetadata(Create create, TempMetadataID tempTable) {
if (!create.getPrimaryKey().isEmpty()) {
ArrayList<TempMetadataID> primaryKey = new ArrayList<TempMetadataID>(create.getPrimaryKey().size());
for (ElementSymbol symbol : create.getPrimaryKey()) {
@@ -96,6 +98,16 @@
}
tempTable.setPrimaryKey(primaryKey);
}
+ for (int i = 0; i < create.getColumns().size(); i++) {
+ Column column = create.getColumns().get(i);
+ TempMetadataID tid = tempTable.getElements().get(i);
+ if (column.isAutoIncremented()) {
+ tid.setAutoIncrement(true);
+ }
+ if (column.getNullType() == NullType.No_Nulls) {
+ tid.setNotNull(true);
+ }
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -595,10 +595,9 @@
public static TempMetadataID addTempGroup(TempMetadataAdapter metadata,
GroupSymbol symbol,
- List symbols, boolean tempTable) throws QueryResolverException {
+ List<? extends SingleElementSymbol> symbols, boolean tempTable) throws QueryResolverException {
HashSet<String> names = new HashSet<String>();
- for (Iterator i = symbols.iterator(); i.hasNext();) {
- SingleElementSymbol ses = (SingleElementSymbol)i.next();
+ for (SingleElementSymbol ses : symbols) {
if (!names.add(ses.getShortCanonicalName())) {
throw new QueryResolverException(QueryPlugin.Util.getString("ResolverUtil.duplicateName", symbol, ses.getShortName())); //$NON-NLS-1$
}
@@ -613,7 +612,7 @@
public static TempMetadataID addTempTable(TempMetadataAdapter metadata,
GroupSymbol symbol,
- List symbols) throws QueryResolverException {
+ List<? extends SingleElementSymbol> symbols) throws QueryResolverException {
return addTempGroup(metadata, symbol, symbols, true);
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Create.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -25,8 +25,10 @@
import java.util.ArrayList;
import java.util.List;
+import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.EquivalenceUtil;
-import org.teiid.core.util.HashCodeUtil;
+import org.teiid.metadata.Column;
+import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -40,10 +42,9 @@
public class Create extends Command {
/** Identifies the table to be created. */
private GroupSymbol table;
-
- private List<ElementSymbol> columns = new ArrayList<ElementSymbol>();
-
private List<ElementSymbol> primaryKey = new ArrayList<ElementSymbol>();
+ private List<Column> columns = new ArrayList<Column>();
+ private List<ElementSymbol> columnSymbols;
public GroupSymbol getTable() {
return table;
@@ -53,7 +54,7 @@
this.table = table;
}
- public List<ElementSymbol> getColumns() {
+ public List<Column> getColumns() {
return columns;
}
@@ -61,6 +62,22 @@
return primaryKey;
}
+ /**
+ * Derived ElementSymbol list. Do not modify without also modifying the columns.
+ * @return
+ */
+ public List<ElementSymbol> getColumnSymbols() {
+ if (columnSymbols == null) {
+ columnSymbols = new ArrayList<ElementSymbol>(columns.size());
+ for (Column column : columns) {
+ ElementSymbol es = new ElementSymbol(column.getName());
+ es.setType(DataTypeManager.getDataTypeClass(column.getRuntimeType()));
+ columnSymbols.add(es);
+ }
+ }
+ return columnSymbols;
+ }
+
/**
* @see org.teiid.query.sql.lang.Command#getType()
* @since 5.5
@@ -75,9 +92,17 @@
*/
public Object clone() {
Create copy = new Create();
- GroupSymbol copyTable = (GroupSymbol) table.clone();
+ GroupSymbol copyTable = table.clone();
copy.setTable(copyTable);
- copy.setColumns(LanguageObject.Util.deepClone(columns, ElementSymbol.class));
+ copy.columns = new ArrayList<Column>(columns.size());
+ for (Column column : columns) {
+ Column copyColumn = new Column();
+ copyColumn.setName(column.getName());
+ copyColumn.setRuntimeType(column.getRuntimeType());
+ copyColumn.setAutoIncremented(column.isAutoIncremented());
+ copyColumn.setNullType(column.getNullType());
+ copy.columns.add(copyColumn);
+ }
copy.primaryKey = LanguageObject.Util.deepClone(primaryKey, ElementSymbol.class);
copyMetadataState(copy);
return copy;
@@ -107,15 +132,19 @@
visitor.visit(this);
}
- public void setColumns(List<ElementSymbol> columns) {
- this.columns = columns;
+ public void setElementSymbolsAsColumns(List<ElementSymbol> columns) {
+ this.columns.clear();
+ for (ElementSymbol elementSymbol : columns) {
+ Column c = new Column();
+ c.setName(elementSymbol.getName());
+ c.setRuntimeType(DataTypeManager.getDataTypeName(elementSymbol.getType()));
+ c.setNullType(NullType.Nullable);
+ this.columns.add(c);
+ }
}
public int hashCode() {
- int myHash = 0;
- myHash = HashCodeUtil.hashCode(myHash, this.table);
- myHash = HashCodeUtil.hashCode(myHash, this.columns);
- return myHash;
+ return this.table.hashCode();
}
public String toString() {
@@ -135,8 +164,22 @@
Create other = (Create) obj;
+ if (other.columns.size() != this.columns.size()) {
+ return false;
+ }
+
+ for (int i = 0; i < this.columns.size(); i++) {
+ Column c = this.columns.get(i);
+ Column o = other.columns.get(i);
+ if (!c.getName().equalsIgnoreCase(o.getName())
+ || DataTypeManager.getDataTypeClass(c.getRuntimeType().toLowerCase()) != DataTypeManager.getDataTypeClass(o.getRuntimeType().toLowerCase())
+ || c.isAutoIncremented() != o.isAutoIncremented()
+ || c.getNullType() != o.getNullType()) {
+ return false;
+ }
+ }
+
return EquivalenceUtil.areEqual(getTable(), other.getTable()) &&
- EquivalenceUtil.areEqual(getColumns(), other.getColumns()) &&
EquivalenceUtil.areEqual(getPrimaryKey(), other.getPrimaryKey());
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/AbstractNavigator.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -23,7 +23,6 @@
package org.teiid.query.sql.navigator;
import java.util.Collection;
-import java.util.Iterator;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
@@ -63,15 +62,15 @@
}
}
- protected void visitNodes(Collection nodes) {
+ protected void visitNodes(Collection<? extends LanguageObject> nodes) {
if(this.visitor.shouldAbort()) {
return;
}
if (nodes != null && nodes.size() > 0) {
- for (Iterator i = nodes.iterator(); i.hasNext();) {
- visitNode((LanguageObject)i.next());
- }
+ for (LanguageObject languageObject : nodes) {
+ visitNode(languageObject);
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -305,7 +305,7 @@
visitNode(obj.getGroup());
visitNodes(obj.getVariables());
visitNodes(obj.getValues());
- if(obj.getQueryExpression()!=null) {
+ if(deep && obj.getQueryExpression()!=null) {
visitNode(obj.getQueryExpression());
}
visitNode(obj.getOption());
@@ -314,7 +314,7 @@
public void visit(Create obj) {
preVisitVisitor(obj);
visitNode(obj.getTable());
- visitNodes(obj.getColumns());
+ visitNodes(obj.getColumnSymbols());
visitNodes(obj.getPrimaryKey());
postVisitVisitor(obj);
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -30,7 +30,6 @@
import org.teiid.query.sql.lang.BatchedUpdateCommand;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.ExistsCriteria;
-import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.SetQuery;
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryFromClause;
@@ -124,7 +123,7 @@
*/
public static final List<Command> getCommands(Command command) {
CommandCollectorVisitor visitor = new CommandCollectorVisitor();
- final boolean visitCommands = command instanceof SetQuery || command instanceof Insert;
+ final boolean visitCommands = command instanceof SetQuery;
PreOrderNavigator navigator = new PreOrderNavigator(visitor) {
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -34,6 +34,8 @@
import org.teiid.language.SQLConstants;
import org.teiid.language.SQLConstants.NonReserved;
import org.teiid.language.SQLConstants.Tokens;
+import org.teiid.metadata.Column;
+import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.lang.AtomicCriteria;
@@ -379,14 +381,23 @@
append(SPACE);
// Columns clause
- List<ElementSymbol> columns = obj.getColumns();
+ List<Column> columns = obj.getColumns();
append("("); //$NON-NLS-1$
- Iterator<ElementSymbol> iter = columns.iterator();
+ Iterator<Column> iter = columns.iterator();
while (iter.hasNext()) {
- ElementSymbol element = iter.next();
- outputShortName(element);
+ Column element = iter.next();
+ outputDisplayName(element.getName());
append(SPACE);
- append(DataTypeManager.getDataTypeName(element.getType()));
+ if (element.isAutoIncremented()) {
+ append(NonReserved.SERIAL);
+ } else {
+ append(element.getRuntimeType());
+ if (element.getNullType() == NullType.No_Nulls) {
+ append(NOT);
+ append(SPACE);
+ append(NULL);
+ }
+ }
if (iter.hasNext()) {
append(", "); //$NON-NLS-1$
}
@@ -397,10 +408,10 @@
append(" "); //$NON-NLS-1$
append(NonReserved.KEY);
append(Tokens.LPAREN);
- iter = obj.getPrimaryKey().iterator();
- while (iter.hasNext()) {
- outputShortName(iter.next());
- if (iter.hasNext()) {
+ Iterator<ElementSymbol> pkiter = obj.getPrimaryKey().iterator();
+ while (pkiter.hasNext()) {
+ outputShortName(pkiter.next());
+ if (pkiter.hasNext()) {
append(", "); //$NON-NLS-1$
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -25,8 +25,10 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -94,7 +96,12 @@
}
for (int i = 0; i < indexes.length; i++) {
if (indexes[i] == -1) {
- newTuple.add(null);
+ AtomicInteger sequence = sequences.get(i);
+ if (sequence != null) {
+ newTuple.add(sequence.getAndIncrement());
+ } else {
+ newTuple.add(null);
+ }
} else {
newTuple.add(tuple.get(indexes[i]));
}
@@ -105,6 +112,11 @@
tuple.add(0, rowId.getAndIncrement());
}
currentTuple = tuple;
+ for (int i : notNull) {
+ if (tuple.get(i) == null) {
+ throw new TeiidProcessingException(QueryPlugin.Util.getString("TempTable.not_null", columns.get(i)));
+ }
+ }
insertTuple(tuple, addRowId);
}
@@ -266,11 +278,16 @@
private int keyBatchSize;
private int leafBatchSize;
private Map columnMap;
+
+ private List<Integer> notNull = new LinkedList<Integer>();
+ private Map<Integer, AtomicInteger> sequences;
TempTable(TempMetadataID tid, BufferManager bm, List<ElementSymbol> columns, int primaryKeyLength, String sessionID) {
this.tid = tid;
this.bm = bm;
+ int startIndex = 0;
if (primaryKeyLength == 0) {
+ startIndex = 1;
ElementSymbol id = new ElementSymbol("rowId"); //$NON-NLS-1$
id.setType(DataTypeManager.DefaultDataClasses.INTEGER);
columns.add(0, id);
@@ -281,6 +298,24 @@
}
this.columnMap = RelationalNode.createLookupMap(columns);
this.columns = columns;
+ if (!tid.getElements().isEmpty()) {
+ //not relevant for indexes
+ for (int i = startIndex; i < columns.size(); i++) {
+ TempMetadataID col = tid.getElements().get(i - startIndex);
+ if (col.isAutoIncrement()) {
+ if (this.sequences == null) {
+ this.sequences = new HashMap<Integer, AtomicInteger>();
+ }
+ sequences.put(i, new AtomicInteger(1));
+ }
+ if (col.isNotNull()) {
+ notNull.add(i);
+ }
+ }
+ }
+ if (this.sequences == null) {
+ this.sequences = Collections.emptyMap();
+ }
this.sessionID = sessionID;
this.keyBatchSize = bm.getSchemaSize(columns);
this.leafBatchSize = bm.getSchemaSize(columns.subList(0, primaryKeyLength));
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -460,7 +460,7 @@
Create create = new Create();
create.setTable(group);
List<ElementSymbol> allColumns = ResolverUtil.resolveElementsInGroup(group, metadata);
- create.setColumns(allColumns);
+ create.setElementSymbolsAsColumns(allColumns);
Object pk = metadata.getPrimaryKey(group.getMetadataID());
if (pk != null) {
List<ElementSymbol> pkColumns = resolveIndex(metadata, allColumns, pk);
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -153,14 +153,14 @@
}
TempTable addTempTable(String tempTableName, Create create, BufferManager buffer, boolean add) {
- List<ElementSymbol> columns = create.getColumns();
+ List<ElementSymbol> columns = create.getColumnSymbols();
TempMetadataID id = tempMetadataStore.getTempGroupID(tempTableName);
if (id == null) {
//add metadata
id = tempMetadataStore.addTempGroup(tempTableName, columns, false, true);
- TempTableResolver.addPrimaryKey(create, id);
+ TempTableResolver.addAdditionalMetadata(create, id);
}
- columns = new ArrayList<ElementSymbol>(create.getColumns());
+ columns = new ArrayList<ElementSymbol>(create.getColumnSymbols());
if (!create.getPrimaryKey().isEmpty()) {
//reorder the columns to put the key in front
List<ElementSymbol> primaryKey = create.getPrimaryKey();
@@ -228,7 +228,7 @@
}
Create create = new Create();
create.setTable(new GroupSymbol(tempTableID));
- create.setColumns(columns);
+ create.setElementSymbolsAsColumns(columns);
return addTempTable(tempTableID, create, buffer, true);
}
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-01-17 20:08:09 UTC (rev 2845)
@@ -21,6 +21,8 @@
import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.proc.*;
import org.teiid.query.sql.symbol.*;
+import org.teiid.metadata.*;
+import org.teiid.metadata.BaseColumn.NullType;
/**
* <p>The SQLParser is a JavaCC-generated parser that reads a SQL string and produces a
@@ -525,8 +527,8 @@
{
Create create = new Create();
String table = null;
- List columns = null;
String pkId = null;
+ Column col = null;
}
{
<CREATE> <LOCAL> <TEMPORARY> <TABLE>
@@ -535,10 +537,16 @@
{
create.setTable(new GroupSymbol(table));
}
- columns = createElementsWithTypes(info)
- {
- create.setColumns(columns);
- }
+ col = tableElement(info)
+ {
+ create.getColumns().add(col);
+ }
+ (LOOKAHEAD(2) <COMMA>
+ col = tableElement(info)
+ {
+ create.getColumns().add(col);
+ }
+ )*
[<COMMA> <PRIMARY> nonReserved("KEY") <LPAREN>
pkId = id()
{
@@ -557,6 +565,36 @@
}
}
+Column tableElement(ParseInfo info) :
+{
+ String element = null;
+ String type = null;
+ boolean autoIncrement = false;
+ boolean notNull = false;
+}
+{
+ element = id()
+ (
+ type = dataTypeString()
+ |
+ nonReserved("SERIAL")
+ {
+ type = "INTEGER";
+ autoIncrement = true;
+ notNull = true;
+ }
+ )
+ [<NOT> <NULL> { notNull = true; }]
+ {
+ Column c = new Column();
+ c.setName(validateElementName(element));
+ c.setRuntimeType(type);
+ c.setAutoIncremented(autoIncrement);
+ c.setNullType(notNull?NullType.No_Nulls:NullType.Nullable);
+ return c;
+ }
+}
+
/**
* Parse error statement
* @throws ParseException if parsing failed
@@ -3769,13 +3807,7 @@
}
}
-
-/**
- * Parse a data type name - used only in conversion.
- * @return Data type parsed into a constant string object
- * @throws ParseException if parsing failed
- */
-Constant dataType() :
+String dataTypeString() :
{
Token typeToken = null;
}
@@ -3809,10 +3841,22 @@
)
{
- return new Constant(typeToken.image);
+ return typeToken.image;
}
}
+
+Constant dataType() :
+{
+ String type = null;
+}
+{
+ type = dataTypeString()
+ {
+ return new Constant(type);
+ }
+}
+
/**
* Parse an interval type name - used only in TIMESTAMPADD and TIMESTAMPDIFF functions.
* @return Interval type parsed into a constant string object
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-01-17 20:08:09 UTC (rev 2845)
@@ -739,6 +739,7 @@
TempTable.duplicate_key=Duplicate key
+TempTable.not_null=Null value is not allowed for column {0}
ValidationVisitor.group_in_both_dep=Table specified in both dependent and independent queries '{0}'
XMLQuery.resolvingError=Failed to resolve the query '{0}'
SQLParser.non_position_constant=Invalid order by at {0}
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -6492,7 +6492,7 @@
column = new ElementSymbol("c2");//$NON-NLS-1$
column.setType(DataTypeManager.DefaultDataClasses.BYTE);
columns.add(column);
- create.setColumns(columns);
+ create.setElementSymbolsAsColumns(columns);
helpTest("Create local TEMPORARY table tempTable (c1 boolean, c2 byte)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 boolean, c2 byte)", create); //$NON-NLS-1$ //$NON-NLS-2$
}
@@ -6506,7 +6506,7 @@
column = new ElementSymbol("c2");//$NON-NLS-1$
column.setType(DataTypeManager.DefaultDataClasses.BYTE);
columns.add(column);
- create.setColumns(columns);
+ create.setElementSymbolsAsColumns(columns);
helpTest("Create local TEMPORARY table tempTable(c1 boolean, c2 byte)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 boolean, c2 byte)", create); //$NON-NLS-1$ //$NON-NLS-2$
}
@@ -6536,7 +6536,7 @@
column = new ElementSymbol("c2");//$NON-NLS-1$
column.setType(DataTypeManager.DefaultDataClasses.BYTE);
columns.add(column);
- create.setColumns(columns);
+ create.setElementSymbolsAsColumns(columns);
create.getPrimaryKey().add(column);
helpTest("Create local TEMPORARY table tempTable(c1 boolean, c2 byte, primary key (c2))", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 boolean, c2 byte, PRIMARY KEY(c2))", create); //$NON-NLS-1$ //$NON-NLS-2$
}
@@ -6678,8 +6678,8 @@
column = new ElementSymbol("c5");//$NON-NLS-1$
column.setType(DataTypeManager.DefaultDataClasses.BIG_DECIMAL);
columns.add(column);
- create.setColumns(columns);
- helpTest("Create local TEMPORARY table tempTable (c1 varchar, c2 tinyint, c3 smallint, c4 real, c5 decimal)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 string, c2 byte, c3 short, c4 float, c5 bigdecimal)", create); //$NON-NLS-1$
+ create.setElementSymbolsAsColumns(columns);
+ helpTest("Create local TEMPORARY table tempTable (c1 varchar, c2 tinyint, c3 smallint, c4 real, c5 decimal)", "CREATE LOCAL TEMPORARY TABLE tempTable (c1 varchar, c2 tinyint, c3 smallint, c4 real, c5 decimal)", create); //$NON-NLS-1$
}
@Test public void testXmlElement() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -57,6 +57,7 @@
private void execute(ProcessorPlan processorPlan, List[] expectedResults) throws Exception {
CommandContext cc = TestProcessor.createCommandContext();
+ cc.setMetadata(metadata);
cc.setTempTableStore(tempStore);
TestProcessor.doProcess(processorPlan, dataManager, expectedResults, cc);
assertTrue(Determinism.SESSION_DETERMINISTIC.compareTo(cc.getDeterminismLevel()) <= 0);
@@ -268,6 +269,23 @@
execute("select count(*) a from x", new List[] {Arrays.asList(4)});
execute("select count(*) a from x where e2 = 1 order by a", new List[] {Arrays.asList(2)});
}
+
+ @Test public void testAutoIncrement() throws Exception {
+ execute("create local temporary table x (e1 serial, e2 integer, primary key (e1))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
+ execute("insert into x (e2) values (1)", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+ execute("insert into x (e2) values (3)", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+ execute("select * from x", new List[] {Arrays.asList(1, 1), Arrays.asList(2, 3)});
+ }
+
+ @Test(expected=TeiidProcessingException.class) public void testNotNull() throws Exception {
+ execute("create local temporary table x (e1 serial, e2 integer not null, primary key (e1))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
+ execute("insert into x (e1, e2) values ((select null), 1)", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+ }
+
+ @Test(expected=TeiidProcessingException.class) public void testNotNull1() throws Exception {
+ execute("create local temporary table x (e1 serial, e2 integer not null, primary key (e1))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
+ execute("insert into x (e2) values ((select null))", new List[] {Arrays.asList(1)}); //$NON-NLS-1$
+ }
private void sampleTable() throws Exception {
execute("create local temporary table x (e1 string, e2 integer, primary key (e1, e2))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java 2011-01-17 19:00:01 UTC (rev 2844)
+++ trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCreate.java 2011-01-17 20:08:09 UTC (rev 2845)
@@ -52,7 +52,7 @@
elements.add(new ElementSymbol("a")); //$NON-NLS-1$
elements.add(new ElementSymbol("b")); //$NON-NLS-1$
- create.setColumns(elements);
+ create.setElementSymbolsAsColumns(elements);
return create;
}
@@ -64,7 +64,7 @@
elements.add(new ElementSymbol("a")); //$NON-NLS-1$
elements.add(new ElementSymbol("b")); //$NON-NLS-1$
- create.setColumns(elements);
+ create.setElementSymbolsAsColumns(elements);
return create; }
// ################################## ACTUAL TESTS ################################
15 years, 2 months
teiid SVN: r2844 - in branches/7.1.x/engine/src/main/java/org/teiid/query: optimizer/relational/rules and 2 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-17 14:00:01 -0500 (Mon, 17 Jan 2011)
New Revision: 2844
Modified:
branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPostOrderNavigator.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPreOrderNavigator.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
Log:
TEIID-1438 correcting the validation that is performed on non-query commands to detect pushdown errors.
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-01-17 17:45:40 UTC (rev 2843)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-01-17 19:00:01 UTC (rev 2844)
@@ -92,11 +92,13 @@
import org.teiid.query.sql.lang.SubqueryContainer;
import org.teiid.query.sql.lang.SubqueryFromClause;
import org.teiid.query.sql.lang.TableFunctionReference;
+import org.teiid.query.sql.lang.TranslatableProcedureContainer;
import org.teiid.query.sql.lang.UnaryFromClause;
import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
import org.teiid.query.sql.symbol.AllSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.Reference;
+import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SelectSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.util.SymbolMap;
@@ -499,7 +501,19 @@
}
//plan any subqueries in criteria/parameters/values
for (SubqueryContainer subqueryContainer : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(container)) {
- ProcessorPlan plan = QueryOptimizer.optimizePlan(subqueryContainer.getCommand(), metadata, null, capFinder, analysisRecord, context);
+ if (c == null && container.getGroup().isTempTable()) {
+ if (subqueryContainer.getCommand().getCorrelatedReferences() == null) {
+ if (subqueryContainer instanceof ScalarSubquery) {
+ ((ScalarSubquery) subqueryContainer).setShouldEvaluate(true);
+ } else {
+ throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
+ }
+ } else {
+ throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
+ }
+ }
+
+ ProcessorPlan plan = QueryOptimizer.optimizePlan(subqueryContainer.getCommand(), metadata, null, capFinder, analysisRecord, context);
subqueryContainer.getCommand().setProcessorPlan(plan);
if (c == null) {
@@ -507,7 +521,7 @@
}
}
- if (c == null && !(container instanceof Insert) && !container.getGroup().isTempGroupSymbol() &&
+ if (c == null && container instanceof TranslatableProcedureContainer && !container.getGroup().isTempTable() &&
!CriteriaCapabilityValidatorVisitor.canPushLanguageObject(container, metadata.getModelID(container.getGroup().getMetadataID()), metadata, capFinder, analysisRecord)) {
throw new QueryPlannerException(QueryPlugin.Util.getString("RelationalPlanner.nonpushdown_command", container)); //$NON-NLS-1$
}
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java 2011-01-17 17:45:40 UTC (rev 2843)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java 2011-01-17 19:00:01 UTC (rev 2844)
@@ -56,7 +56,7 @@
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryContainer;
import org.teiid.query.sql.lang.SubquerySetCriteria;
-import org.teiid.query.sql.navigator.PreOrderNavigator;
+import org.teiid.query.sql.navigator.PostOrderNavigator;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Function;
@@ -550,7 +550,7 @@
}
CriteriaCapabilityValidatorVisitor visitor = new CriteriaCapabilityValidatorVisitor(modelID, metadata, capFinder, caps);
- PreOrderNavigator.doVisit(obj, visitor);
+ PostOrderNavigator.doVisit(obj, visitor);
if(visitor.getException() != null) {
throw visitor.getException();
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2011-01-17 17:45:40 UTC (rev 2843)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2011-01-17 19:00:01 UTC (rev 2844)
@@ -229,6 +229,9 @@
externalGroups.addGroup(variables);
TempMetadataID tid = metadata.addTempGroup(name, symbols);
tid.setScalarGroup();
+ for (TempMetadataID cid : tid.getElements()) {
+ cid.setScalarGroup();
+ }
variables.setMetadataID(tid);
return variables;
}
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPostOrderNavigator.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPostOrderNavigator.java 2011-01-17 17:45:40 UTC (rev 2843)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPostOrderNavigator.java 2011-01-17 19:00:01 UTC (rev 2844)
@@ -25,6 +25,7 @@
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.lang.ExistsCriteria;
+import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryFromClause;
import org.teiid.query.sql.lang.SubquerySetCriteria;
@@ -63,6 +64,16 @@
visitNode(obj.getExpression());
visitVisitor(obj);
}
+ public void visit(Insert obj) {
+ visitNode(obj.getGroup());
+ visitNodes(obj.getVariables());
+ visitNodes(obj.getValues());
+ if(obj.getQueryExpression()!=null) {
+ visitNode(obj.getQueryExpression());
+ }
+ visitNode(obj.getOption());
+ visitVisitor(obj);
+ }
public static void doVisit(LanguageObject object, LanguageVisitor visitor) {
DeepPostOrderNavigator nav = new DeepPostOrderNavigator(visitor);
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPreOrderNavigator.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPreOrderNavigator.java 2011-01-17 17:45:40 UTC (rev 2843)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/DeepPreOrderNavigator.java 2011-01-17 19:00:01 UTC (rev 2844)
@@ -25,6 +25,7 @@
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.lang.ExistsCriteria;
+import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryFromClause;
import org.teiid.query.sql.lang.SubquerySetCriteria;
@@ -75,7 +76,6 @@
public void visit(CommandStatement obj) {
visitVisitor(obj);
visitNode(obj.getCommand());
- visitVisitor(obj);
}
@Override
@@ -83,7 +83,17 @@
visitVisitor(obj);
visitNode(obj.getCommand());
visitNode(obj.getBlock());
+ }
+
+ public void visit(Insert obj) {
visitVisitor(obj);
+ visitNode(obj.getGroup());
+ visitNodes(obj.getVariables());
+ visitNodes(obj.getValues());
+ if(obj.getQueryExpression()!=null) {
+ visitNode(obj.getQueryExpression());
+ }
+ visitNode(obj.getOption());
}
public static void doVisit(LanguageObject object, LanguageVisitor visitor) {
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-01-17 17:45:40 UTC (rev 2843)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-01-17 19:00:01 UTC (rev 2844)
@@ -295,9 +295,6 @@
visitNode(obj.getGroup());
visitNodes(obj.getVariables());
visitNodes(obj.getValues());
- if(obj.getQueryExpression()!=null) {
- visitNode(obj.getQueryExpression());
- }
visitNode(obj.getOption());
postVisitVisitor(obj);
}
15 years, 2 months
teiid SVN: r2843 - in trunk: connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-17 12:45:40 -0500 (Mon, 17 Jan 2011)
New Revision: 2843
Modified:
trunk/common-core/src/main/java/org/teiid/core/types/JDBCSQLTypeInfo.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCQueryExecution.java
Log:
TEIID-1435 adding a type mapping for boolean (used by h2)
Modified: trunk/common-core/src/main/java/org/teiid/core/types/JDBCSQLTypeInfo.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/types/JDBCSQLTypeInfo.java 2011-01-17 16:37:04 UTC (rev 2842)
+++ trunk/common-core/src/main/java/org/teiid/core/types/JDBCSQLTypeInfo.java 2011-01-17 17:45:40 UTC (rev 2843)
@@ -91,7 +91,7 @@
static {
addTypeMapping(STRING, STRING_CLASS, Types.VARCHAR, Types.LONGVARCHAR, Types.CHAR);
addTypeMapping(CHAR, CHAR_CLASS, Types.CHAR, false);
- addTypeMapping(BOOLEAN, BOOLEAN_CLASS, Types.BIT);
+ addTypeMapping(BOOLEAN, BOOLEAN_CLASS, Types.BIT, Types.BOOLEAN);
addTypeMapping(TIME, TIME_CLASS, Types.TIME);
addTypeMapping(DATE, DATE_CLASS, Types.DATE);
addTypeMapping(TIMESTAMP, TIMESTAMP_CLASS, Types.TIMESTAMP);
Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCQueryExecution.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCQueryExecution.java 2011-01-17 16:37:04 UTC (rev 2842)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCQueryExecution.java 2011-01-17 17:45:40 UTC (rev 2843)
@@ -73,6 +73,8 @@
TranslatedCommand translatedComm = translateCommand(command);
String sql = translatedComm.getSql();
+
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Source sql", sql); //$NON-NLS-1$
try {
15 years, 2 months
teiid SVN: r2842 - trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-17 11:37:04 -0500 (Mon, 17 Jan 2011)
New Revision: 2842
Modified:
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/AbstractUpdateExecution.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedObject.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedResult.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetDeletedExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetUpdatedExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParent.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParentImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/SalesforceProcedureExecution.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/UpdatedResult.java
Log:
adding missing headers and minor cleanups
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/AbstractUpdateExecution.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/AbstractUpdateExecution.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/AbstractUpdateExecution.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -28,12 +28,10 @@
import org.teiid.language.Command;
import org.teiid.language.Comparison;
import org.teiid.language.Condition;
-import org.teiid.logging.LogConstants;
-import org.teiid.logging.LogManager;
import org.teiid.metadata.RuntimeMetadata;
-import org.teiid.translator.TranslatorException;
import org.teiid.translator.DataNotAvailableException;
import org.teiid.translator.ExecutionContext;
+import org.teiid.translator.TranslatorException;
import org.teiid.translator.UpdateExecution;
import org.teiid.translator.salesforce.SalesforceConnection;
import org.teiid.translator.salesforce.Util;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedObject.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedObject.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedObject.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import java.util.Calendar;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedResult.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedResult.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/DeletedResult.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import java.util.Calendar;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetDeletedExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetDeletedExecutionImpl.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetDeletedExecutionImpl.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import java.sql.Timestamp;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetUpdatedExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetUpdatedExecutionImpl.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/GetUpdatedExecutionImpl.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import java.sql.Timestamp;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParent.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParent.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParent.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import org.teiid.language.Call;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParentImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParentImpl.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/ProcedureExecutionParentImpl.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import java.util.List;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -288,18 +288,7 @@
Map<String,Integer> fieldToIndexMap = sObjectToResponseField.get(sObject.getType());
for (int j = 0; j < visitor.getSelectSymbolCount(); j++) {
Column element = visitor.getSelectSymbolMetadata(j);
- AbstractMetadataRecord parent = element.getParent();
- Table table;
- if(parent instanceof Table) {
- table = (Table)parent;
- } else {
- parent = parent.getParent();
- if(parent instanceof Table) {
- table = (Table)parent;
- } else {
- throw new TranslatorException("Could not resolve Table for column " + element.getName()); //$NON-NLS-1$
- }
- }
+ Table table = (Table)element.getParent();
if(table.getNameInSource().equals(sObject.getType())) {
Integer index = fieldToIndexMap.get(element.getNameInSource());
// id gets dropped from the result if it is not the
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/SalesforceProcedureExecution.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/SalesforceProcedureExecution.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/SalesforceProcedureExecution.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import java.util.List;
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/UpdatedResult.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/UpdatedResult.java 2011-01-17 12:58:20 UTC (rev 2841)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/UpdatedResult.java 2011-01-17 16:37:04 UTC (rev 2842)
@@ -1,3 +1,25 @@
+/*
+ * 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.translator.salesforce.execution;
import java.util.Calendar;
15 years, 2 months
teiid SVN: r2841 - branches/7.1.x/cache-jbosscache/src/main/java/org/teiid/cache/jboss.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2011-01-17 07:58:20 -0500 (Mon, 17 Jan 2011)
New Revision: 2841
Modified:
branches/7.1.x/cache-jbosscache/src/main/java/org/teiid/cache/jboss/ExpirationAwareCache.java
Log:
TEIID-1439: When the keys are read back back expiration cache, the "expiration" key should be transparent to the user so as to not to mistake this as the actual cache key. To have a separate key is side effect of using the JBC, and should be contained here in this class.
Modified: branches/7.1.x/cache-jbosscache/src/main/java/org/teiid/cache/jboss/ExpirationAwareCache.java
===================================================================
--- branches/7.1.x/cache-jbosscache/src/main/java/org/teiid/cache/jboss/ExpirationAwareCache.java 2011-01-13 01:40:52 UTC (rev 2840)
+++ branches/7.1.x/cache-jbosscache/src/main/java/org/teiid/cache/jboss/ExpirationAwareCache.java 2011-01-17 12:58:20 UTC (rev 2841)
@@ -21,6 +21,9 @@
*/
package org.teiid.cache.jboss;
+import java.util.HashSet;
+import java.util.Set;
+
import org.jboss.cache.Cache;
import org.jboss.cache.Fqn;
import org.jboss.cache.Node;
@@ -47,4 +50,20 @@
child.put(ExpirationAlgorithmConfig.EXPIRATION_KEY, future);
return (V)child.put(key, value);
}
+
+ @Override
+ public Set<K> keys() {
+ HashSet keys = new HashSet();
+ Node<K, V> node = getRootNode();
+ Set<Node<K, V>> children = node.getChildren();
+ for (Node<K, V> child:children) {
+ for (K key:child.getData().keySet()) {
+ if ((key instanceof String) && (key.equals(ExpirationAlgorithmConfig.EXPIRATION_KEY))) {
+ continue;
+ }
+ keys.add(key);
+ }
+ }
+ return keys;
+ }
}
15 years, 2 months
teiid SVN: r2840 - in trunk/engine/src: main/java/org/teiid/query/tempdata and 1 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-12 20:40:52 -0500 (Wed, 12 Jan 2011)
New Revision: 2840
Modified:
trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
Log:
TEIID-1433 adding direct count(*) support
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java 2011-01-12 23:13:09 UTC (rev 2839)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempCapabilitiesFinder.java 2011-01-13 01:40:52 UTC (rev 2840)
@@ -52,6 +52,7 @@
tempCaps.setCapabilitySupport(Capability.CRITERIA_ISNULL, true);
tempCaps.setCapabilitySupport(Capability.CRITERIA_LIKE, true);
tempCaps.setCapabilitySupport(Capability.CRITERIA_LIKE_ESCAPE, true);
+ tempCaps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
}
return tempCaps;
}
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java 2011-01-12 23:13:09 UTC (rev 2839)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTable.java 2011-01-13 01:40:52 UTC (rev 2840)
@@ -23,6 +23,7 @@
package org.teiid.query.tempdata;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -59,6 +60,7 @@
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.SetClauseList;
+import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.SingleElementSymbol;
@@ -312,6 +314,21 @@
}
public TupleSource createTupleSource(final List<? extends SingleElementSymbol> projectedCols, final Criteria condition, OrderBy orderBy) throws TeiidComponentException, TeiidProcessingException {
+ //special handling for count(*)
+ boolean agg = false;
+ for (SingleElementSymbol singleElementSymbol : projectedCols) {
+ if (singleElementSymbol instanceof AggregateSymbol) {
+ agg = true;
+ break;
+ }
+ }
+ if (agg) {
+ if (condition == null) {
+ int count = this.getRowCount();
+ return new CollectionTupleSource(Arrays.asList(Collections.nCopies(projectedCols.size(), count)).iterator());
+ }
+ orderBy = null;
+ }
IndexInfo primary = new IndexInfo(this, projectedCols, condition, orderBy, true);
IndexInfo ii = primary;
if (indexTables != null && (condition != null || orderBy != null) && ii.valueSet.size() != 1) {
@@ -328,15 +345,15 @@
}
LogManager.logDetail(LogConstants.CTX_DQP, "Choose index", ii.table, "covering:", ii.coveredCriteria,"ordering:", ii.ordering); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (ii.covering) {
- return ii.table.createTupleSource(projectedCols, condition, orderBy, ii);
+ return ii.table.createTupleSource(projectedCols, condition, orderBy, ii, agg);
}
List<ElementSymbol> pkColumns = this.columns.subList(0, this.tree.getKeyLength());
if (ii.ordering != null) {
//use order and join
primary.valueTs = ii.table.createTupleSource(pkColumns,
- Criteria.combineCriteria(ii.coveredCriteria), orderBy, ii);
+ Criteria.combineCriteria(ii.coveredCriteria), orderBy, ii, agg);
primary.ordering = null;
- return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), null, primary);
+ return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), null, primary, agg);
}
//order by pk to localize lookup costs, then join
OrderBy pkOrderBy = new OrderBy();
@@ -344,18 +361,18 @@
pkOrderBy.addVariable(elementSymbol);
}
primary.valueTs = ii.table.createTupleSource(pkColumns,
- Criteria.combineCriteria(ii.coveredCriteria), pkOrderBy, ii);
- return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), orderBy, primary);
+ Criteria.combineCriteria(ii.coveredCriteria), pkOrderBy, ii, agg);
+ return createTupleSource(projectedCols, Criteria.combineCriteria(ii.nonCoveredCriteria), orderBy, primary, agg);
}
- return createTupleSource(projectedCols, condition, orderBy, ii);
+ return createTupleSource(projectedCols, condition, orderBy, ii, agg);
}
private TupleSource createTupleSource(
final List<? extends SingleElementSymbol> projectedCols,
- final Criteria condition, OrderBy orderBy, IndexInfo ii)
+ final Criteria condition, OrderBy orderBy, IndexInfo ii, boolean agg)
throws TeiidComponentException, TeiidProcessingException {
TupleBrowser browser = ii.createTupleBrowser();
- TupleSource ts = new QueryTupleSource(browser, columnMap, projectedCols, condition);
+ TupleSource ts = new QueryTupleSource(browser, columnMap, agg?getColumns():projectedCols, condition);
boolean usingQueryTupleSource = false;
try {
@@ -363,6 +380,12 @@
if (ii.ordering == null && orderBy != null) {
SortUtility sort = new SortUtility(ts, orderBy.getOrderByItems(), Mode.SORT, bm, sessionID, projectedCols);
tb = sort.sort();
+ } else if (agg) {
+ int count = 0;
+ while (ts.nextTuple() != null) {
+ count++;
+ }
+ return new CollectionTupleSource(Arrays.asList(Collections.nCopies(projectedCols.size(), count)).iterator());
} else if (updatable) {
tb = bm.createTupleBuffer(projectedCols, sessionID, TupleSourceType.PROCESSOR);
List<?> next = null;
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java 2011-01-12 23:13:09 UTC (rev 2839)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java 2011-01-13 01:40:52 UTC (rev 2840)
@@ -262,6 +262,12 @@
execute("create local temporary table x (e1 string, e2 integer, primary key (e1, e2))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
execute("select * from x where e1 in ('a', 'b') order by e1 desc", new List[0]); //$NON-NLS-1$
}
+
+ @Test public void testCountStar() throws Exception {
+ sampleTable();
+ execute("select count(*) a from x", new List[] {Arrays.asList(4)});
+ execute("select count(*) a from x where e2 = 1 order by a", new List[] {Arrays.asList(2)});
+ }
private void sampleTable() throws Exception {
execute("create local temporary table x (e1 string, e2 integer, primary key (e1, e2))", new List[] {Arrays.asList(0)}); //$NON-NLS-1$
15 years, 2 months
teiid SVN: r2839 - in branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin: deployer and 1 other directory.
by teiid-commits@lists.jboss.org
Author: tejones
Date: 2011-01-12 18:13:09 -0500 (Wed, 12 Jan 2011)
New Revision: 2839
Added:
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/AbstractDeployer.java
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/Deployer.java
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/RemoteDeployer.java
Modified:
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/Facet.java
Log:
TEIID-1430 - Updated VDB deployment process to work properly in JON and Embedded Jopr
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/Facet.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/Facet.java 2011-01-12 21:38:28 UTC (rev 2838)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/Facet.java 2011-01-12 23:13:09 UTC (rev 2839)
@@ -80,6 +80,8 @@
import org.rhq.plugins.jbossas5.ProfileServiceComponent;
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
import org.teiid.rhq.admin.DQPManagementView;
+import org.teiid.rhq.plugin.deployer.Deployer;
+import org.teiid.rhq.plugin.deployer.RemoteDeployer;
import org.teiid.rhq.plugin.objects.ExecutedOperationResultImpl;
import org.teiid.rhq.plugin.objects.ExecutedResult;
import org.teiid.rhq.plugin.util.DeploymentUtils;
@@ -792,44 +794,15 @@
protected void createContentBasedResource(
CreateResourceReport createResourceReport) {
+
+ getDeployer().deploy(createResourceReport, createResourceReport.getResourceType());
- ResourcePackageDetails details = createResourceReport
- .getPackageDetails();
- PackageDetailsKey key = details.getKey();
- // This is the full path to a temporary file which was written by the UI
- // layer.
- String archivePath = key.getName();
-
- try {
- File archiveFile = new File(archivePath);
-
- if (!DeploymentUtils.hasCorrectExtension(archiveFile.getName(),
- resourceContext.getResourceType())) {
- createResourceReport.setStatus(CreateResourceStatus.FAILURE);
- createResourceReport
- .setErrorMessage("Incorrect extension specified on filename [" //$NON-NLS-1$
- + archivePath + "]"); //$NON-NLS-1$
-
- }
-
- DeploymentManager deploymentManager = getConnection()
- .getDeploymentManager();
- DeploymentUtils
- .deployArchive(deploymentManager, archiveFile, false);
-
- deploymentName = archivePath;
- createResourceReport.setResourceName(archivePath);
- createResourceReport.setResourceKey(archivePath);
- createResourceReport.setStatus(CreateResourceStatus.SUCCESS);
-
- } catch (Throwable t) {
- log.error("Error deploying application for report: " //$NON-NLS-1$
- + createResourceReport, t);
- createResourceReport.setStatus(CreateResourceStatus.FAILURE);
- createResourceReport.setException(t);
- }
-
}
+
+ private Deployer getDeployer() {
+ ProfileServiceConnection profileServiceConnection = getConnection();
+ return new RemoteDeployer(profileServiceConnection, this.resourceContext);
+ }
private static String getResourceName(Configuration pluginConfig,
Configuration resourceConfig) {
Added: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/AbstractDeployer.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/AbstractDeployer.java (rev 0)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/AbstractDeployer.java 2011-01-12 23:13:09 UTC (rev 2839)
@@ -0,0 +1,126 @@
+/*
+ * 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.rhq.plugin.deployer;
+
+import java.io.File;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.deployers.spi.management.deploy.DeploymentManager;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.content.PackageDetailsKey;
+import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
+import org.rhq.core.domain.resource.CreateResourceStatus;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.inventory.CreateResourceReport;
+import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
+import org.teiid.rhq.plugin.util.DeploymentUtils;
+
+/**
+ * Abstract base class capturing the common deploy functionality for embedded
+ * and remote scenarios.
+ *
+ */
+public abstract class AbstractDeployer implements Deployer {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ private ProfileServiceConnection profileServiceConnection;
+
+ protected AbstractDeployer(ProfileServiceConnection profileService) {
+ this.profileServiceConnection = profileService;
+ }
+
+ public void deploy(CreateResourceReport createResourceReport, ResourceType resourceType) {
+ File archiveFile = null;
+ try {
+ ResourcePackageDetails details = createResourceReport.getPackageDetails();
+ PackageDetailsKey key = details.getKey();
+
+ archiveFile = prepareArchive(key, resourceType);
+
+ String archiveName = key.getName();
+
+ if (!DeploymentUtils.hasCorrectExtension(archiveName, resourceType)) {
+ createResourceReport.setStatus(CreateResourceStatus.FAILURE);
+ createResourceReport.setErrorMessage("Incorrect extension specified on filename [" + archiveName + "]");
+ return;
+ }
+
+ // abortIfApplicationAlreadyDeployed(resourceType, archiveFile);
+
+ Configuration deployTimeConfig = details.getDeploymentTimeConfiguration();
+ @SuppressWarnings( { "ConstantConditions" })
+
+ DeploymentManager deploymentManager = this.profileServiceConnection.getDeploymentManager();
+
+ DeploymentUtils.deployArchive(deploymentManager, archiveFile, false);
+
+ // Deployment was successful!
+ createResourceReport.setResourceName(archiveName);
+ createResourceReport.setResourceKey(archiveName);
+ createResourceReport.setStatus(CreateResourceStatus.SUCCESS);
+
+ } catch (Throwable t) {
+ log.error("Error deploying application for request [" + createResourceReport + "].", t);
+ createResourceReport.setStatus(CreateResourceStatus.FAILURE);
+ createResourceReport.setException(t);
+ } finally {
+ if (archiveFile != null) {
+ destroyArchive(archiveFile);
+ }
+ }
+
+ }
+
+ protected Log getLog() {
+ return log;
+ }
+
+ protected ProfileServiceConnection getProfileServiceConnection() {
+ return profileServiceConnection;
+ }
+
+ protected abstract File prepareArchive(PackageDetailsKey key,
+ ResourceType resourceType);
+
+ protected abstract void destroyArchive(File archive);
+
+ // private void abortIfApplicationAlreadyDeployed(ResourceType resourceType,
+ // File archiveFile) throws Exception {
+ // String archiveFileName = archiveFile.getName();
+ // KnownDeploymentTypes deploymentType =
+ // ConversionUtils.getDeploymentType(resourceType);
+ // String deploymentTypeString = deploymentType.getType();
+ // ManagementView managementView =
+ // profileServiceConnection.getManagementView();
+ // managementView.load();
+ // Set<ManagedDeployment> managedDeployments =
+ // managementView.getDeploymentsForType(deploymentTypeString);
+ // for (ManagedDeployment managedDeployment : managedDeployments) {
+ // if (managedDeployment.getSimpleName().equals(archiveFileName))
+ // throw new IllegalArgumentException("An application named '" +
+ // archiveFileName
+ // + "' is already deployed.");
+ // }
+ // }
+}
Property changes on: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/AbstractDeployer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/Deployer.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/Deployer.java (rev 0)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/Deployer.java 2011-01-12 23:13:09 UTC (rev 2839)
@@ -0,0 +1,41 @@
+/*
+ * 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.rhq.plugin.deployer;
+
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.inventory.CreateResourceReport;
+
+/**
+ * An abstraction of the deployment process.
+ *
+ */
+public interface Deployer {
+
+ /**
+ * Handles the deployment process end to end and updates the createResourceReport with
+ * appropriate results.
+ *
+ * @param createResourceReport the report to get the deployment from
+ * @param resourceType the target resource type
+ */
+ void deploy(CreateResourceReport createResourceReport, ResourceType resourceType);
+}
Property changes on: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/Deployer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/RemoteDeployer.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/RemoteDeployer.java (rev 0)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/RemoteDeployer.java 2011-01-12 23:13:09 UTC (rev 2839)
@@ -0,0 +1,140 @@
+/*
+ * 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.rhq.plugin.deployer;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.jboss.deployers.spi.management.ManagementView;
+import org.jboss.managed.api.ComponentType;
+import org.jboss.managed.api.ManagedComponent;
+import org.rhq.core.domain.content.PackageDetailsKey;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.content.ContentContext;
+import org.rhq.core.pluginapi.content.ContentServices;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
+import org.rhq.plugins.jbossas5.util.ManagedComponentUtils;
+
+/**
+ *
+ */
+public class RemoteDeployer extends AbstractDeployer {
+
+ private ResourceContext<?> resourceContext;
+
+ /**
+ * @param profileServiceConnection
+ */
+ public RemoteDeployer(ProfileServiceConnection profileServiceConnection, ResourceContext<?> resourceContext) {
+ super(profileServiceConnection);
+ this.resourceContext = resourceContext;
+ }
+
+ @Override
+ protected void destroyArchive(File archive) {
+ File tempDir = archive.getParentFile();
+ archive.delete();
+ tempDir.delete();
+ }
+
+ @Override
+ protected File prepareArchive(PackageDetailsKey key, ResourceType resourceType) {
+ //we're running in the agent. During the development of this functionality, there was
+ //a time when the deployment only worked from within the JBossAS server home.
+ //Further investigation never confirmed the problem again but since we have access to
+ //server home directory anyway, why not stay on the safe side... ;)
+ OutputStream os = null;
+
+ try {
+ File tempDir = createTempDirectory("teiid-deploy-content", null, getServerTempDirectory());
+
+ File archiveFile = new File(key.getName());
+
+ //this is to ensure that we only get the filename part no matter whether the key contains
+ //full path or not.
+ File contentCopy = new File(tempDir, archiveFile.getName());
+
+ os = new BufferedOutputStream(new FileOutputStream(contentCopy));
+ ContentContext contentContext = resourceContext.getContentContext();
+ ContentServices contentServices = contentContext.getContentServices();
+ contentServices.downloadPackageBitsForChildResource(contentContext, resourceType.getName(), key, os);
+
+ return contentCopy;
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to copy the deployed archive to destination.", e);
+ } finally {
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ getLog().warn("Failed to close the stream when copying deployment to destination.");
+ }
+ }
+ }
+ }
+
+ private File getServerTempDirectory() {
+ ManagementView managementView = getProfileServiceConnection().getManagementView();
+ ManagedComponent serverConfigComponent = ManagedComponentUtils.getSingletonManagedComponent(managementView,
+ new ComponentType("MCBean", "ServerConfig"));
+ String serverTempDir = (String) ManagedComponentUtils.getSimplePropertyValue(serverConfigComponent,
+ "serverTempDir");
+
+ return new File(serverTempDir);
+ }
+
+ /**
+ * TODO this should go somewhere nice...
+ *
+ * Creates a temporary directory in a given directory.
+ * Reuses the logic of {@link File#createTempFile(String, String, File)} but the returned
+ * file is a directory instead of a regular file.
+ *
+ * @param prefix the unique name prefix
+ * @param suffix the unique name suffix
+ * @param parentDirectory the parent directory to create the temp dir in
+ *
+ * @return the temporary directory
+ *
+ * @throws IOException on error
+ */
+ private static File createTempDirectory(String prefix, String suffix, File parentDirectory) throws IOException {
+ // Let's reuse the algorithm the JDK uses to determine a unique name:
+ // 1) create a temp file to get a unique name using JDK createTempFile
+ // 2) then quickly delete the file and...
+ // 3) convert it to a directory
+
+ File tmpDir = File.createTempFile(prefix, suffix, parentDirectory); // create file with unique name
+ boolean deleteOk = tmpDir.delete(); // delete the tmp file and...
+ boolean mkdirsOk = tmpDir.mkdirs(); // ...convert it to a directory
+
+ if (!deleteOk || !mkdirsOk) {
+ throw new IOException("Failed to create temp directory named [" + tmpDir + "]");
+ }
+
+ return tmpDir;
+ }
+}
Property changes on: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/deployer/RemoteDeployer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
15 years, 2 months
teiid SVN: r2838 - trunk/build/kits/jboss-container/teiid-examples/simpleclient.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-12 16:38:28 -0500 (Wed, 12 Jan 2011)
New Revision: 2838
Added:
trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
Log:
updating to the new default credentials
Added: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
===================================================================
(Binary files differ)
Property changes on: trunk/build/kits/jboss-container/teiid-examples/simpleclient/JDBCClient.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
15 years, 3 months