Author: shawkins
Date: 2010-07-13 14:07:49 -0400 (Tue, 13 Jul 2010)
New Revision: 2338
Added:
trunk/engine/src/main/java/org/teiid/query/sql/lang/ExpressionCriteria.java
Modified:
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/README.txt
trunk/build/kits/jboss-container/teiid-releasenotes.html
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/dqp/internal/datamgr/language/LanguageBridgeFactory.java
trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java
trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidationVisitor.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestCaseExpression.java
trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestSearchedCaseExpression.java
trunk/engine/src/test/java/org/teiid/query/sql/util/TestUpdateProcedureGenerator.java
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
Log:
TEIID-1050 TEIID-1055 adding the ability to support criteria as expressions. also adding
alternative stored procedure syntax to remove its ambiguity with comparison criteria.
minor tweaks to validity checks for generating update procedures and group by expressions
Modified:
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/README.txt
===================================================================
---
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/README.txt 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/README.txt 2010-07-13
18:07:49 UTC (rev 2338)
@@ -26,8 +26,8 @@
to HTTP, which is the proper setting for REST.
select t.* from
- (call weather.invoke(action='GET',
- endpoint=querystring('', '38.99,-77.02 39.70,-104.80 47.6,-122.30' as
listLatLon,
+ (call weather.invoke(action=>'GET',
+ endpoint=>querystring('', '38.99,-77.02 39.70,-104.80 47.6,-122.30'
as listLatLon,
'time-series' as product, '2004-01-01T00:00:00' as "begin",
'2013-04-20T00:00:00' as "end", 'maxt' as maxt,
'mint' as mint)
)) w,
@@ -41,10 +41,10 @@
on the datasource.
select xmlserialize(document w.result as string) from
- (call
weather.invoke(action='http://www.weather.gov/forecasts/xml/DWMLgen/w...;,
-
endpoint='http://www.weather.gov/forecasts/xml/SOAP_server/ndfdXMLser...;,
- binding='SOAP11',
- request='
+ (call
weather.invoke(action=>'http://www.weather.gov/forecasts/xml/DWMLg...;,
+
endpoint=>'http://www.weather.gov/forecasts/xml/SOAP_server/ndfdXM...;,
+ binding=>'SOAP11',
+ request=>'
<ns1:LatLonListZipCode
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML...
Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html 2010-07-13 17:56:20 UTC (rev
2337)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html 2010-07-13 18:07:49 UTC (rev
2338)
@@ -26,11 +26,21 @@
</UL>
<H2><A NAME="Highlights"></A>Highlights</H2>
<UL>
- <LI><B>SQL Support</B> - added NULLS FIST/LAST handling - including
pushdown support and enhanced numeric stat aggregate functions STDDEV_POP, STDDEV_SAMP,
VAR_POP, VAR_SAMP. Added support for the boolean aggregate functions ANY, SOME, EVERY.
+ <LI><B>SQL Support</B>
+ <ul>
+ <li>Added NULLS FIST/LAST handling - including pushdown support.
+ <li>Added enhanced numeric stat aggregate functions STDDEV_POP,
STDDEV_SAMP, VAR_POP, VAR_SAMP, with pushdown and aggregate decomposition.
+ <li>Added support for the boolean aggregate functions ANY, SOME, EVERY.
+ <li>Added support for using boolean value expression as both criteria
and expressions, e.g. "... where boolean_value" or "select x = 1 as
boolean_value ...".
+ <li>Changed named procedure syntax to accept param=>value, rather
than param=value.
+ </ul>
<LI><B>Parallel Source Queries</B> - reestablished parallel
execution of source queries within a query plan along with a prioritized work system to
help prevent resource contention.
</UL>
<h2><a name="Compatibility">Compatibility
Issues</a></h2>
+<ul>
+ <li>Support for named parameter syntax using param=value has been deprecated,
since it is ambiguous with a comparison predicate boolean value expression.
param<b>=></b>value should be used instead.
+</ul>
<h4>from 6.2</h4>
<ul>
<li>The connector API has changed substantially. Custom connectors need to be
retargeted to the new Translator API. See <a
href="https://jira.jboss.org/browse/TEIID-1003">TEIID-1003&l... and the
<a href="teiid-docs/teiid_developers_guide.pdf">Developer's
Guide</a> for more information.
@@ -65,6 +75,10 @@
</ul>
<h2><a name="Other">Other Issues</a></h2>
+<ul>
+ <li>For compatability with the 7.0 release if a stored procedure parameter list
begins with identifier=, then it will be parsed as a named parameter invocation even if
the intent was to use a comparison predicate
+ as the first parameter value. The workaround is to use nesting parens, e.g. call
proc((identifier=value), ...), which clarifies that this is positional value. This
workaround will not be needed in later releases.
+</ul>
<h4>from 7.0</h4>
<ul>
<li>Fixed xsd type handling for SQL/XML and XML document models. xsd:date,
xsd:dateTime, and xsd:time types will now all be displayed using the GMT timezone (Z).
SQL types, such as timestamp, used for an XMLTABLE column will now expect their values to
be in the form of the corresponding xsd type.
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2010-07-13
17:56:20 UTC (rev 2337)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2010-07-13
18:07:49 UTC (rev 2338)
@@ -511,7 +511,7 @@
<row>
<entry align="right" valign="top"><para><anchor
id="prod38"
xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod2">id</link> <EQ> <link
linkend="prod16">expression</link> ( <COMMA> <link
linkend="prod2">id</link> <EQ> <link
linkend="prod16">expression</link> )*
)</para></entry></row>
+( <link linkend="prod2">id</link> <EQ> (
<GT> )? <link linkend="prod16">expression</link> (
<COMMA> <link linkend="prod2">id</link>
<EQ> ( <GT> )? <link
linkend="prod16">expression</link> )*
)</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod9" xreflabel="insert"/>insert</para></entry>
<entry align="left" valign="top"><para>::=
@@ -667,57 +667,53 @@
<row>
<entry align="right" valign="top"><para><anchor
id="prod78"
xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod79">predicate</link> | (
<LPAREN> <link linkend="prod28">criteria</link>
<RPAREN> ) )</para></entry></row>
+( <link linkend="prod34">translateCriteria</link> | ( <link
linkend="prod79">commonValueExpression</link> ( ( <link
linkend="prod80">betweenCrit</link> | <link
linkend="prod81">matchCrit</link> | <link
linkend="prod82">setCrit</link> | <link
linkend="prod83">isNullCrit</link> | <link
linkend="prod84">subqueryCompareCriteria</link> | <link
linkend="prod85">compareCrit</link> ) )? ) | <link
linkend="prod86">existsCriteria</link> | <link
linkend="prod30">hasCriteria</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod79"
xreflabel="predicate"/>predicate</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod87"
xreflabel="operator"/>operator</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod34">translateCriteria</link> | ( <link
linkend="prod80">commonValueExpression</link> ( <link
linkend="prod81">betweenCrit</link> | <link
linkend="prod82">matchCrit</link> | <link
linkend="prod83">setCrit</link> | <link
linkend="prod84">isNullCrit</link> | <link
linkend="prod85">compareCrit</link> | <link
linkend="prod86">subqueryCompareCriteria</link> ) ) | <link
linkend="prod87">existsCriteria</link> | <link
linkend="prod30">hasCriteria</link>
)</para></entry></row>
-<row>
-<entry align="right" valign="top"><para><anchor
id="prod88"
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="prod85"
xreflabel="compareCrit"/>compareCrit</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod88">operator</link> <link
linkend="prod80">commonValueExpression</link></para></entry></row>
+<link linkend="prod87">operator</link> <link
linkend="prod79">commonValueExpression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod89"
xreflabel="subquery"/>subquery</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod88"
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>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod86"
xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod84"
xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod88">operator</link> ( <ANY> |
<SOME> | <ALL> ) <link
linkend="prod89">subquery</link></para></entry></row>
+<link linkend="prod87">operator</link> ( <ANY> |
<SOME> | <ALL> ) <link
linkend="prod88">subquery</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod82"
xreflabel="matchCrit"/>matchCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod81"
xreflabel="matchCrit"/>matchCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <LIKE> <link
linkend="prod80">commonValueExpression</link> ( <ESCAPE>
<link linkend="prod70">charVal</link> | ( <LBRACE>
<ESCAPE> <link linkend="prod70">charVal</link>
<RBRACE> ) )?</para></entry></row>
+( <NOT> )? <LIKE> <link
linkend="prod79">commonValueExpression</link> ( <ESCAPE>
<link linkend="prod70">charVal</link> | ( <LBRACE>
<ESCAPE> <link linkend="prod70">charVal</link>
<RBRACE> ) )?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod70"
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="prod81"
xreflabel="betweenCrit"/>betweenCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod80"
xreflabel="betweenCrit"/>betweenCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <BETWEEN> <link
linkend="prod80">commonValueExpression</link> <AND>
<link
linkend="prod80">commonValueExpression</link></para></entry></row>
+( <NOT> )? <BETWEEN> <link
linkend="prod79">commonValueExpression</link> <AND>
<link
linkend="prod79">commonValueExpression</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod84"
xreflabel="isNullCrit"/>isNullCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod83"
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="prod83"
xreflabel="setCrit"/>setCrit</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod82"
xreflabel="setCrit"/>setCrit</para></entry>
<entry align="left" valign="top"><para>::=
-( <NOT> )? <IN> ( ( <link
linkend="prod89">subquery</link> ) | ( <LPAREN> <link
linkend="prod80">commonValueExpression</link> ( <COMMA>
<link linkend="prod80">commonValueExpression</link> )*
<RPAREN> ) )</para></entry></row>
+( <NOT> )? <IN> ( ( <link
linkend="prod88">subquery</link> ) | ( <LPAREN> <link
linkend="prod79">commonValueExpression</link> ( <COMMA>
<link linkend="prod79">commonValueExpression</link> )*
<RPAREN> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod87"
xreflabel="existsCriteria"/>existsCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod86"
xreflabel="existsCriteria"/>existsCriteria</para></entry>
<entry align="left" valign="top"><para>::=
-<EXISTS> <link
linkend="prod89">subquery</link></para></entry></row>
+<EXISTS> <link
linkend="prod88">subquery</link></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod50"
xreflabel="groupBy"/>groupBy</para></entry>
<entry align="left" valign="top"><para>::=
-<GROUP> <BY> ( <link
linkend="prod90">groupByItem</link> ( <COMMA> <link
linkend="prod90">groupByItem</link> )*
)</para></entry></row>
+<GROUP> <BY> ( <link
linkend="prod89">groupByItem</link> ( <COMMA> <link
linkend="prod89">groupByItem</link> )*
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod90"
xreflabel="groupByItem"/>groupByItem</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod89"
xreflabel="groupByItem"/>groupByItem</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod16">expression</link></para></entry></row>
<row>
@@ -727,13 +723,13 @@
<row>
<entry align="right" valign="top"><para><anchor
id="prod43"
xreflabel="orderby"/>orderby</para></entry>
<entry align="left" valign="top"><para>::=
-<ORDER> <BY> <link
linkend="prod91">sortSpecification</link> ( <COMMA>
<link linkend="prod91">sortSpecification</link>
)*</para></entry></row>
+<ORDER> <BY> <link
linkend="prod90">sortSpecification</link> ( <COMMA>
<link linkend="prod90">sortSpecification</link>
)*</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod91"
xreflabel="sortSpecification"/>sortSpecification</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod90"
xreflabel="sortSpecification"/>sortSpecification</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod92">sortKey</link> ( <ASC> |
<DESC> )? ( <link linkend="prod58">nonReserved</link>
<link linkend="prod58">nonReserved</link>
)?</para></entry></row>
+<link linkend="prod91">sortKey</link> ( <ASC> |
<DESC> )? ( <link linkend="prod58">nonReserved</link>
<link linkend="prod58">nonReserved</link>
)?</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod92"
xreflabel="sortKey"/>sortKey</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod91"
xreflabel="sortKey"/>sortKey</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod16">expression</link></para></entry></row>
<row>
@@ -747,73 +743,73 @@
<row>
<entry align="right" valign="top"><para><anchor
id="prod16"
xreflabel="expression"/>expression</para></entry>
<entry align="left" valign="top"><para>::=
-<link
linkend="prod80">commonValueExpression</link></para></entry></row>
+<link
linkend="prod28">criteria</link></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod80"
xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod79"
xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod93">plusExpression</link> (
<CONCAT_OP> <link
linkend="prod93">plusExpression</link> )*
)</para></entry></row>
+( <link linkend="prod92">plusExpression</link> (
<CONCAT_OP> <link
linkend="prod92">plusExpression</link> )*
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod93"
xreflabel="plusExpression"/>plusExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod92"
xreflabel="plusExpression"/>plusExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod94">timesExpression</link> ( <link
linkend="prod95">plusOperator</link> <link
linkend="prod94">timesExpression</link> )*
)</para></entry></row>
+( <link linkend="prod93">timesExpression</link> ( <link
linkend="prod94">plusOperator</link> <link
linkend="prod93">timesExpression</link> )*
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod95"
xreflabel="plusOperator"/>plusOperator</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod94"
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="prod94"
xreflabel="timesExpression"/>timesExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod93"
xreflabel="timesExpression"/>timesExpression</para></entry>
<entry align="left" valign="top"><para>::=
-( <link linkend="prod96">valueExpressionPrimary</link> ( <link
linkend="prod97">timesOperator</link> <link
linkend="prod96">valueExpressionPrimary</link> )*
)</para></entry></row>
+( <link linkend="prod95">valueExpressionPrimary</link> ( <link
linkend="prod96">timesOperator</link> <link
linkend="prod95">valueExpressionPrimary</link> )*
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod97"
xreflabel="timesOperator"/>timesOperator</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod96"
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="prod96"
xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod95"
xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
<entry align="left" valign="top"><para>::=
-( <QMARK> | <link linkend="prod98">literal</link> | (
<LBRACE> <link linkend="prod58">nonReserved</link>
<link linkend="prod99">function</link> <RBRACE> ) | (
<link linkend="prod57">aggregateSymbol</link> ) | ( <link
linkend="prod57">aggregateSymbol</link> ) | ( <link
linkend="prod57">aggregateSymbol</link> ) | ( <link
linkend="prod56">xmlAgg</link> ) | ( <link
linkend="prod99">function</link> ) | ( <ID> ) | (
<LPAREN> <link linkend="prod16">expression</link>
<RPAREN> ) | <link linkend="prod89">subquery</link> |
<link linkend="prod100">searchedCaseExpression</link> | <link
linkend="prod101">caseExpression</link>
)</para></entry></row>
+( <QMARK> | <link linkend="prod97">literal</link> | (
<LBRACE> <link linkend="prod58">nonReserved</link>
<link linkend="prod98">function</link> <RBRACE> ) | (
<link linkend="prod57">aggregateSymbol</link> ) | ( <link
linkend="prod57">aggregateSymbol</link> ) | ( <link
linkend="prod57">aggregateSymbol</link> ) | ( <link
linkend="prod56">xmlAgg</link> ) | ( <link
linkend="prod98">function</link> ) | ( <ID> ) | <link
linkend="prod88">subquery</link> | ( <LPAREN> <link
linkend="prod16">expression</link> <RPAREN> ) | <link
linkend="prod99">searchedCaseExpression</link> | <link
linkend="prod100">caseExpression</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod101"
xreflabel="caseExpression"/>caseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod100"
xreflabel="caseExpression"/>caseExpression</para></entry>
<entry align="left" valign="top"><para>::=
<CASE> <link linkend="prod16">expression</link> (
<WHEN> <link linkend="prod16">expression</link>
<THEN> <link linkend="prod16">expression</link> )+ (
<ELSE> <link linkend="prod16">expression</link> )?
<END></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod100"
xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod99"
xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
<entry align="left" valign="top"><para>::=
<CASE> ( <WHEN> <link
linkend="prod28">criteria</link> <THEN> <link
linkend="prod16">expression</link> )+ ( <ELSE> <link
linkend="prod16">expression</link> )?
<END></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod99"
xreflabel="function"/>function</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod98"
xreflabel="function"/>function</para></entry>
<entry align="left" valign="top"><para>::=
-( ( <CONVERT> <LPAREN> <link
linkend="prod16">expression</link> <COMMA> <link
linkend="prod31">dataType</link> <RPAREN> ) | (
<CAST> <LPAREN> <link
linkend="prod16">expression</link> <AS> <link
linkend="prod31">dataType</link> <RPAREN> ) | ( <link
linkend="prod58">nonReserved</link> <LPAREN> <link
linkend="prod16">expression</link> <COMMA> <link
linkend="prod102">stringConstant</link> <RPAREN> ) | (
<link linkend="prod58">nonReserved</link> <LPAREN>
<link linkend="prod103">intervalType</link> <COMMA>
<link linkend="prod16">expression</link> <COMMA>
<link linkend="prod16">expression</link> <RPAREN> ) |
<link linkend="prod104">queryString</link> | ( (
<LEFT> | <RIGHT> | <CHAR> | <USER>
| <YEAR> | <MONTH> | <HOUR> |
<MINUTE> | <SECOND> | <XMLCONCAT> |
<XMLCOMMENT> ) <LPAREN> ( <link
linkend="prod16">expression</link> !
( <COMMA> <link linkend="prod16">expression</link> )*
)? <RPAREN> ) | ( ( <INSERT> ) <LPAREN> (
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod16">expression</link> )* )?
<RPAREN> ) | ( ( <TRANSLATE> ) <LPAREN> (
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod16">expression</link> )* )?
<RPAREN> ) | <link linkend="prod105">xmlParse</link> |
<link linkend="prod106">xmlElement</link> | ( <XMLPI>
<LPAREN> ( <ID> <link
linkend="prod107">idExpression</link> | <link
linkend="prod107">idExpression</link> ) ( <COMMA>
<link linkend="prod16">expression</link> )? <RPAREN> )
| <link linkend="prod108">xmlForest</link> | <link
linkend="prod68">xmlSerialize</link> | <link
linkend="prod72">xmlQuery</link> | ( <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod16">expression</link> ( <COMMA> <link
linkend="prod16">expression</link> )*!
)? <RPAREN> ) )</para></entry></row>
+( ( <CONVERT> <LPAREN> <link
linkend="prod16">expression</link> <COMMA> <link
linkend="prod31">dataType</link> <RPAREN> ) | (
<CAST> <LPAREN> <link
linkend="prod16">expression</link> <AS> <link
linkend="prod31">dataType</link> <RPAREN> ) | ( <link
linkend="prod58">nonReserved</link> <LPAREN> <link
linkend="prod16">expression</link> <COMMA> <link
linkend="prod101">stringConstant</link> <RPAREN> ) | (
<link linkend="prod58">nonReserved</link> <LPAREN>
<link linkend="prod102">intervalType</link> <COMMA>
<link linkend="prod16">expression</link> <COMMA>
<link linkend="prod16">expression</link> <RPAREN> ) |
<link linkend="prod103">queryString</link> | ( (
<LEFT> | <RIGHT> | <CHAR> | <USER>
| <YEAR> | <MONTH> | <HOUR> |
<MINUTE> | <SECOND> | <XMLCONCAT> |
<XMLCOMMENT> ) <LPAREN> ( <link
linkend="prod16">expression</link> !
( <COMMA> <link linkend="prod16">expression</link> )*
)? <RPAREN> ) | ( ( <INSERT> ) <LPAREN> (
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod16">expression</link> )* )?
<RPAREN> ) | ( ( <TRANSLATE> ) <LPAREN> (
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod16">expression</link> )* )?
<RPAREN> ) | <link linkend="prod104">xmlParse</link> |
<link linkend="prod105">xmlElement</link> | ( <XMLPI>
<LPAREN> ( <ID> <link
linkend="prod106">idExpression</link> | <link
linkend="prod106">idExpression</link> ) ( <COMMA>
<link linkend="prod16">expression</link> )? <RPAREN> )
| <link linkend="prod107">xmlForest</link> | <link
linkend="prod68">xmlSerialize</link> | <link
linkend="prod72">xmlQuery</link> | ( <link
linkend="prod2">id</link> <LPAREN> ( <link
linkend="prod16">expression</link> ( <COMMA> <link
linkend="prod16">expression</link> )*!
)? <RPAREN> ) )</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod102"
xreflabel="stringConstant"/>stringConstant</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod101"
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="prod105"
xreflabel="xmlParse"/>xmlParse</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod104"
xreflabel="xmlParse"/>xmlParse</para></entry>
<entry align="left" valign="top"><para>::=
<XMLPARSE> <LPAREN> <link
linkend="prod58">nonReserved</link> <link
linkend="prod16">expression</link> ( <link
linkend="prod58">nonReserved</link> )?
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod104"
xreflabel="queryString"/>queryString</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod103"
xreflabel="queryString"/>queryString</para></entry>
<entry align="left" valign="top"><para>::=
<link linkend="prod58">nonReserved</link> <LPAREN>
<link linkend="prod16">expression</link> ( <COMMA>
<link linkend="prod55">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod106"
xreflabel="xmlElement"/>xmlElement</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod105"
xreflabel="xmlElement"/>xmlElement</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLELEMENT> <LPAREN> ( <ID> <link
linkend="prod2">id</link> | <link
linkend="prod2">id</link> ) ( <COMMA> <link
linkend="prod73">xmlNamespaces</link> )? ( <COMMA>
<link linkend="prod109">xmlAttributes</link> )? (
<COMMA> <link linkend="prod16">expression</link> )*
<RPAREN></para></entry></row>
+<XMLELEMENT> <LPAREN> ( <ID> <link
linkend="prod2">id</link> | <link
linkend="prod2">id</link> ) ( <COMMA> <link
linkend="prod73">xmlNamespaces</link> )? ( <COMMA>
<link linkend="prod108">xmlAttributes</link> )? (
<COMMA> <link linkend="prod16">expression</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod109"
xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod108"
xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
<entry align="left" valign="top"><para>::=
<XMLATTRIBUTES> <LPAREN> <link
linkend="prod55">derivedColumn</link> ( <COMMA> <link
linkend="prod55">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod108"
xreflabel="xmlForest"/>xmlForest</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod107"
xreflabel="xmlForest"/>xmlForest</para></entry>
<entry align="left" valign="top"><para>::=
<XMLFOREST> <LPAREN> ( <link
linkend="prod73">xmlNamespaces</link> <COMMA> )? <link
linkend="prod55">derivedColumn</link> ( <COMMA> <link
linkend="prod55">derivedColumn</link> )*
<RPAREN></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor
id="prod73"
xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
<entry align="left" valign="top"><para>::=
-<XMLNAMESPACES> <LPAREN> <link
linkend="prod110">namespaceItem</link> ( <COMMA> <link
linkend="prod110">namespaceItem</link> )*
<RPAREN></para></entry></row>
+<XMLNAMESPACES> <LPAREN> <link
linkend="prod109">namespaceItem</link> ( <COMMA> <link
linkend="prod109">namespaceItem</link> )*
<RPAREN></para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod110"
xreflabel="namespaceItem"/>namespaceItem</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod109"
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>
@@ -825,7 +821,7 @@
<entry align="left" valign="top"><para>::=
( <DEFAULT_KEYWORD> <link
linkend="prod1">stringVal</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod107"
xreflabel="idExpression"/>idExpression</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod106"
xreflabel="idExpression"/>idExpression</para></entry>
<entry align="left" valign="top"><para>::=
<link
linkend="prod2">id</link></para></entry></row>
<row>
@@ -833,11 +829,11 @@
<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="prod103"
xreflabel="intervalType"/>intervalType</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod102"
xreflabel="intervalType"/>intervalType</para></entry>
<entry align="left" valign="top"><para>::=
( <link linkend="prod58">nonReserved</link>
)</para></entry></row>
<row>
-<entry align="right" valign="top"><para><anchor
id="prod98"
xreflabel="literal"/>literal</para></entry>
+<entry align="right" valign="top"><para><anchor
id="prod97"
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>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml 2010-07-13
18:07:49 UTC (rev 2338)
@@ -311,16 +311,20 @@
<sect1 id="criteria">
<title>Criteria</title>
<itemizedlist>
- <para>Criteria are of two basic forms:
+ <para>Criteria may be:
</para>
<listitem>
<para>Predicates that evaluate to true or false
</para>
</listitem>
<listitem>
- <para>Logical criteria that combine predicates (AND, OR, NOT)
+ <para>Logical criteria that combines criteria (AND, OR, NOT)
</para>
</listitem>
+ <listitem>
+ <para>A value expression with type boolean
+ </para>
+ </listitem>
</itemizedlist>
<itemizedlist>
<para>Syntax Rules:
@@ -358,6 +362,10 @@
</para>
</listitem>
<listitem>
+ <para>expression
+ </para>
+ </listitem>
+ <listitem>
<para>Criteria may be nested using parenthesis.
</para>
</listitem>
@@ -527,7 +535,7 @@
</para>
</listitem>
<listitem>
- <para>EXECUTE proc(name1=value1,name4=param4, ...) - named parameter
syntax
+ <para>EXECUTE proc(name1=>value1,name4=>param4, ...) - named
parameter syntax
</para>
</listitem>
</itemizedlist>
Modified:
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -449,6 +449,8 @@
return translate((SearchedCaseExpression)expr);
} else if (expr instanceof SingleElementSymbol) {
return translate((SingleElementSymbol)expr);
+ } else if (expr instanceof Criteria) {
+ return translate((Criteria)expr);
}
throw new AssertionError();
}
Modified: trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2010-07-13 17:56:20 UTC
(rev 2337)
+++ trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2010-07-13 18:07:49 UTC
(rev 2338)
@@ -77,6 +77,7 @@
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.DependentSetCriteria;
import org.teiid.query.sql.lang.ExistsCriteria;
+import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.IsNullCriteria;
import org.teiid.query.sql.lang.MatchCriteria;
import org.teiid.query.sql.lang.NotCriteria;
@@ -220,6 +221,8 @@
return evaluate((SubqueryCompareCriteria)criteria, tuple);
} else if(criteria instanceof ExistsCriteria) {
return Boolean.valueOf(evaluate((ExistsCriteria)criteria, tuple));
+ } else if (criteria instanceof ExpressionCriteria) {
+ return (Boolean)evaluate(((ExpressionCriteria)criteria).getExpression(),
tuple);
} else {
throw new ExpressionEvaluationException(ErrorMessageKeys.PROCESSOR_0010,
QueryPlugin.Util.getString(ErrorMessageKeys.PROCESSOR_0010, criteria));
}
@@ -643,6 +646,8 @@
return
getContext(ref).getVariableContext().getGlobalValue(ref.getContextSymbol());
}
return internalEvaluate(ref.getExpression(), tuple);
+ } else if(expression instanceof Criteria) {
+ return evaluate((Criteria) expression, tuple);
} else if(expression instanceof ScalarSubquery) {
return evaluate((ScalarSubquery) expression, tuple);
} else if (expression instanceof Criteria) {
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -48,6 +48,7 @@
import org.teiid.query.sql.ProcedureReservedWords;
import org.teiid.query.sql.lang.BetweenCriteria;
import org.teiid.query.sql.lang.CompareCriteria;
+import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.GroupContext;
import org.teiid.query.sql.lang.IsNullCriteria;
import org.teiid.query.sql.lang.MatchCriteria;
@@ -362,6 +363,15 @@
handleException(new QueryResolverException(e,
QueryPlugin.Util.getString("XMLQuery.resolvingError", obj))); //$NON-NLS-1$
}
}
+
+ @Override
+ public void visit(ExpressionCriteria obj) {
+ try {
+ obj.setExpression(ResolverUtil.convertExpression(obj.getExpression(),
DataTypeManager.DefaultDataTypes.BOOLEAN, metadata));
+ } catch (QueryResolverException e) {
+ handleException(e);
+ }
+ }
public TeiidComponentException getComponentException() {
return this.componentException;
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2010-07-13
17:56:20 UTC (rev 2337)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -80,6 +80,7 @@
import org.teiid.query.sql.lang.Delete;
import org.teiid.query.sql.lang.DependentSetCriteria;
import org.teiid.query.sql.lang.ExistsCriteria;
+import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.FromClause;
import org.teiid.query.sql.lang.GroupBy;
@@ -1033,6 +1034,8 @@
rewriteSubqueryContainer((SubqueryContainer)criteria, true);
} else if (criteria instanceof DependentSetCriteria) {
criteria = rewriteDependentSetCriteria((DependentSetCriteria)criteria);
+ } else if (criteria instanceof ExpressionCriteria) {
+ return new CompareCriteria(((ExpressionCriteria) criteria).getExpression(),
CompareCriteria.EQ, new Constant(Boolean.TRUE));
}
return evaluateCriteria(criteria);
@@ -1921,6 +1924,8 @@
} else {
expression =
rewriteExpressionDirect(((ExpressionSymbol)expression).getExpression());
}
+ } else if (expression instanceof Criteria) {
+ expression = rewriteCriteria((Criteria)expression);
} else {
rewriteExpressions(expression);
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java 2010-07-13
17:56:20 UTC (rev 2337)
+++ trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -136,4 +136,5 @@
public void visit(XMLQuery obj) {}
public void visit(QueryString obj) {}
public void visit(XMLParse obj) {}
+ public void visit(ExpressionCriteria obj) {}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java 2010-07-13 17:56:20
UTC (rev 2337)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java 2010-07-13 18:07:49
UTC (rev 2338)
@@ -29,7 +29,8 @@
import java.util.LinkedList;
import java.util.List;
-import org.teiid.query.sql.LanguageObject;
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.visitor.SQLStringVisitor;
@@ -38,7 +39,7 @@
* constraints on the data values to be retrieved for each parameter in the
* select clause. <p>
*/
-public abstract class Criteria implements LanguageObject {
+public abstract class Criteria implements Expression {
/**
* Constructs a default instance of this class.
@@ -249,5 +250,15 @@
return new CompoundCriteria(!dnf?CompoundCriteria.AND:CompoundCriteria.OR,
newCrits);
}
+
+ @Override
+ public Class getType() {
+ return DataTypeManager.DefaultDataClasses.BOOLEAN;
+ }
+
+ @Override
+ public boolean isResolved() {
+ return true;
+ }
} // END CLASS
Added: trunk/engine/src/main/java/org/teiid/query/sql/lang/ExpressionCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/ExpressionCriteria.java
(rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/ExpressionCriteria.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -0,0 +1,70 @@
+/*
+ * 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.query.sql.lang;
+
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.symbol.Expression;
+
+public class ExpressionCriteria extends Criteria {
+
+ private Expression expression;
+
+ public ExpressionCriteria(Expression expression) {
+ this.expression = expression;
+ }
+
+ public Object clone() {
+ return new ExpressionCriteria((Expression) expression.clone());
+ }
+
+ @Override
+ public void acceptVisitor(LanguageVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return expression.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof ExpressionCriteria)) {
+ return false;
+ }
+ ExpressionCriteria other = (ExpressionCriteria) obj;
+ return expression.equals(other.expression);
+ }
+
+ public Expression getExpression() {
+ return expression;
+ }
+
+ public void setExpression(Expression expression) {
+ this.expression = expression;
+ }
+
+}
Property changes on:
trunk/engine/src/main/java/org/teiid/query/sql/lang/ExpressionCriteria.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
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 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -37,6 +37,7 @@
import org.teiid.query.sql.lang.Drop;
import org.teiid.query.sql.lang.DynamicCommand;
import org.teiid.query.sql.lang.ExistsCriteria;
+import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.GroupBy;
import org.teiid.query.sql.lang.Insert;
@@ -601,6 +602,13 @@
postVisitVisitor(obj);
}
+ @Override
+ public void visit(ExpressionCriteria obj) {
+ preVisitVisitor(obj);
+ visitNode(obj.getExpression());
+ postVisitVisitor(obj);
+ }
+
public static void doVisit(LanguageObject object, LanguageVisitor visitor, boolean
order) {
PreOrPostOrderNavigator nav = new PreOrPostOrderNavigator(visitor, order);
object.acceptVisitor(nav);
Modified:
trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -36,6 +36,7 @@
import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.DependentSetCriteria;
import org.teiid.query.sql.lang.DynamicCommand;
+import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.GroupBy;
import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.IsNullCriteria;
@@ -339,6 +340,11 @@
obj.setPath(replaceExpression(obj.getPath()));
}
+ @Override
+ public void visit(ExpressionCriteria obj) {
+ obj.setExpression(replaceExpression(obj.getExpression()));
+ }
+
/**
* The object is modified in place, so is not returned.
* @param obj Language object
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 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -50,6 +50,7 @@
import org.teiid.query.sql.lang.Drop;
import org.teiid.query.sql.lang.DynamicCommand;
import org.teiid.query.sql.lang.ExistsCriteria;
+import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.FromClause;
import org.teiid.query.sql.lang.GroupBy;
@@ -989,7 +990,7 @@
if (obj.displayNamedParameters()) {
parts.add(escapeSinglePart(ElementSymbol.getShortName(param.getParameterSymbol().getOutputName())));
- parts.add(" = "); //$NON-NLS-1$
+ parts.add(" => "); //$NON-NLS-1$
}
if(param.getExpression() == null) {
@@ -999,7 +1000,14 @@
parts.add("?"); //$NON-NLS-1$
}
} else {
+ boolean addParens = !obj.displayNamedParameters() &&
param.getExpression() instanceof CompareCriteria;
+ if (addParens) {
+ parts.add(Tokens.LPAREN);
+ }
parts.add(registerNode(param.getExpression()));
+ if (addParens) {
+ parts.add(Tokens.RPAREN);
+ }
}
if(iter.hasNext()) {
parts.add(", "); //$NON-NLS-1$
@@ -1845,6 +1853,11 @@
}
parts.add(Tokens.RPAREN);
}
+
+ @Override
+ public void visit(ExpressionCriteria obj) {
+ obj.getExpression().acceptVisitor(this);
+ }
public static String escapeSinglePart(String part) {
if(isReservedWord(part)) {
Modified:
trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidationVisitor.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidationVisitor.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidationVisitor.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -33,6 +33,7 @@
import org.teiid.query.metadata.TempMetadataID;
import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.symbol.*;
+import org.teiid.query.sql.util.SymbolMap;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
import org.teiid.query.util.ErrorMessageKeys;
@@ -144,14 +145,11 @@
if(symbol instanceof AliasSymbol) {
symbol = ((AliasSymbol)symbol).getSymbol();
}
-
- if(symbol instanceof AggregateSymbol) {
+
+ Expression ex = SymbolMap.getExpression(symbol);
+
+ if (!(ex instanceof ElementSymbol || ex instanceof Constant)) {
handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0007,
symbol));
- } else if(symbol instanceof ExpressionSymbol) {
- Expression expr = ((ExpressionSymbol)symbol).getExpression();
- if(expr == null || expr instanceof Function) {
-
handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0008,
symbol));
- }
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2010-07-13
17:56:20 UTC (rev 2337)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -95,7 +95,6 @@
import org.teiid.query.sql.proc.IfStatement;
import org.teiid.query.sql.proc.TranslateCriteria;
import org.teiid.query.sql.proc.WhileStatement;
-import org.teiid.query.sql.symbol.AbstractCaseExpression;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.DerivedColumn;
@@ -197,8 +196,8 @@
if(symbol instanceof ExpressionSymbol) {
ExpressionSymbol exprSymbol = (ExpressionSymbol) symbol;
Expression expr = exprSymbol.getExpression();
- if(! (expr instanceof Function || expr instanceof
AbstractCaseExpression)) {
-
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.Expr_in_GROUP_BY_must_be_elem_func_case",
expr), expr); //$NON-NLS-1$
+ if
(!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(expr).isEmpty() || expr
instanceof Constant || expr instanceof Reference) {
+
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.groupby_subquery",
expr), expr); //$NON-NLS-1$
}
}
}
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2010-07-13 17:56:20
UTC (rev 2337)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2010-07-13 18:07:49
UTC (rev 2338)
@@ -1240,7 +1240,7 @@
storedProcedure.setDisplayNamedParameters(true);
}
(name=id()
- <EQ>
+ <EQ> [<GT>]
value = expression(info)
{
parameter = new SPParameter(parameterIndex++, value);
@@ -1251,7 +1251,7 @@
}
( <COMMA>
name=id()
- <EQ>
+ <EQ> [<GT>]
value = expression(info)
{
parameter = new SPParameter(parameterIndex++, value);
@@ -2344,56 +2344,43 @@
}
}
-/**
- * <p>Parses the basic atomic criteria - either a predicate criteria or
- * a criteria wrapped in ( ).</p>
- * @return Parsed primary criteria
+/**
+ * <p>Parse a boolean primary.</p>
+ * @return criteria
* @throws ParseException if parsing failed
*/
Criteria booleanPrimary(ParseInfo info) :
{
+ Expression ex = null;
Criteria crit = null;
}
{
- ( LOOKAHEAD(predicate(info)) crit = predicate(info) |
- (<LPAREN> crit=criteria(info) <RPAREN>)
- )
-
- {
- return crit;
- }
-}
-
-/**
- * <p>Parse a predicate criteria.</p>
- * @return Parsed predicate criteria
- * @throws ParseException if parsing failed
- */
-PredicateCriteria predicate(ParseInfo info) :
-{
- PredicateCriteria pdCrit = null;
- Expression ex = null;
-}
-{
(
- LOOKAHEAD(2) pdCrit = translateCriteria(info)
+ LOOKAHEAD(2) crit = translateCriteria(info)
|
(ex = commonValueExpression(info)
- (
- LOOKAHEAD(2) pdCrit=betweenCrit(info, ex) |
- LOOKAHEAD(2) pdCrit=matchCrit(info, ex) |
- pdCrit=setCrit(info, ex) |
- pdCrit = isNullCrit(info, ex) |
- LOOKAHEAD(operator() expression(info)) pdCrit=compareCrit(info, ex) |
- pdCrit=subqueryCompareCriteria(info, ex)
- )
+ {
+ if (ex instanceof Criteria) {
+ crit = (Criteria)ex;
+ } else {
+ crit = new ExpressionCriteria(ex);
+ }
+ }
+ [(
+ LOOKAHEAD(2) crit=betweenCrit(info, ex) |
+ LOOKAHEAD(2) crit=matchCrit(info, ex) |
+ crit=setCrit(info, ex) |
+ crit=isNullCrit(info, ex) |
+ LOOKAHEAD(operator() (<ANY>|<SOME>|<ALL>) subquery(info))
crit=subqueryCompareCriteria(info, ex) |
+ crit=compareCrit(info, ex)
+ )]
)
|
- pdCrit=existsCriteria(info) |
- pdCrit = hasCriteria()
+ crit=existsCriteria(info) |
+ crit = hasCriteria()
)
{
- return pdCrit;
+ return crit;
}
}
@@ -2908,8 +2895,11 @@
Expression expression = null;
}
{
- expression = commonValueExpression(info)
+ expression = criteria(info)
{
+ if (expression instanceof ExpressionCriteria) {
+ return ((ExpressionCriteria)expression).getExpression();
+ }
return expression;
}
}
@@ -3082,15 +3072,13 @@
}
)
|
- // Grouped expression
- LOOKAHEAD(<LPAREN> expression(info))
+ LOOKAHEAD(subquery(info)) subquery = subquery(info)
+ |
( <LPAREN>
expression = expression(info)
<RPAREN>
)
|
- subquery = subquery(info)
- |
// Searched CASE expressions
LOOKAHEAD(2) expression = searchedCaseExpression(info)
|
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2010-07-13 17:56:20
UTC (rev 2337)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2010-07-13 18:07:49
UTC (rev 2338)
@@ -261,8 +261,7 @@
ERR.015.012.0004 = The query defining an updatable virtual group cannot be an UPDATE
ERR.015.012.0005 = The query defining an updatable virtual group cannot be a DELETE
ERR.015.012.0006 = The query defining an updatable virtual group should not use GROUP BY
or HAVING.
-ERR.015.012.0007 = The query defining an updatable virtual group cannot use an aggregate
function: {0}
-ERR.015.012.0008 = The query defining an updatable virtual group cannot use functions in
its SELECT clause {0}
+ERR.015.012.0007 = The query defining an updatable virtual group cannot use a
non-constant, non-column reference expressions in its SELECT clause {0}.
ERR.015.012.0009 = The query defining an updatable virtual group cannot have more than
one group in its FROM clause {0}
ERR.015.012.0010 = The query defining an updatable simple virtual group should select all
the required elements in its FROM clause {0}
ERR.015.012.0011 = There must be exactly one projected symbol in the subcommand of an IN
clause.
@@ -863,7 +862,7 @@
SimpleQueryResolver.materialized_table_not_used=The query against {0} did not use
materialization table {1} due to the use of OPTION NOCACHE.
ValidationVisitor.input_variable_data_type_not_match=The expression "{0}"
assigned to input variable "{1}" is of type "{2}" which cannot be
implicitly converted to the expected type "{3}".
ValidationVisitor.input_variable_can_not_in_function=Input variable "{0}"
cannot be an argument of a function in the criteria.
-ValidationVisitor.Expr_in_GROUP_BY_must_be_elem_func_case=Expressions used in a GROUP BY
must be elements, functions, or CASE expressions: "{0}".
+ValidationVisitor.groupby_subquery=Expressions used in a GROUP BY cannot be constant and
must not contain subqueries: "{0}".
ValidationVisitor.Procedure_should_have_query=Procedure must execute at least one command
to define the procedure result set.
ValidationVisitor.Procedure_has_group_self_reference=Procedure cannot have a Group
reference to itself.
ExpressionEvaluator.Expected_props_for_payload_function=Unable to evaluate {0}: expected
Properties for command payload but got object of type {1}
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2010-07-13 17:56:20
UTC (rev 2337)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2010-07-13 18:07:49
UTC (rev 2338)
@@ -50,6 +50,7 @@
import org.teiid.query.sql.lang.Drop;
import org.teiid.query.sql.lang.DynamicCommand;
import org.teiid.query.sql.lang.ExistsCriteria;
+import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.FromClause;
import org.teiid.query.sql.lang.GroupBy;
@@ -2852,8 +2853,10 @@
}
/** SELECT a or b from g */
- @Test public void testFailsOrInSelect(){
- helpException("SELECT a or b from g"); //$NON-NLS-1$
+ @Test public void testOrInSelect(){
+ Query query = new Query();
+ query.setSelect(new Select(Arrays.asList(new ExpressionSymbol("foo", new
CompoundCriteria(CompoundCriteria.OR, Arrays.asList(new ExpressionCriteria(new
ElementSymbol("a")), new ExpressionCriteria(new
ElementSymbol("b"))))))));
+ helpTest("select a or b", "SELECT (a) OR (b)", query);
}
/** SELECT a FROM g WHERE a LIKE x*/
@@ -6405,8 +6408,8 @@
parameter.setName("param1"); //$NON-NLS-1$
parameter.setParameterType(ParameterInfo.IN);
storedQuery.setParameter(parameter);
- helpTest("Exec proc1(param1 = 'paramValue1')", "EXEC
proc1(param1 = 'paramValue1')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
- helpTest("execute proc1(param1 = 'paramValue1')", "EXEC
proc1(param1 = 'paramValue1')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTest("Exec proc1(param1 = 'paramValue1')", "EXEC
proc1(param1 => 'paramValue1')", storedQuery); //$NON-NLS-1$
//$NON-NLS-2$
+ helpTest("execute proc1(param1 = 'paramValue1')", "EXEC
proc1(param1 => 'paramValue1')", storedQuery); //$NON-NLS-1$
//$NON-NLS-2$
}
@Test public void testCase3281NamedVariables() {
@@ -6421,19 +6424,17 @@
param2.setName("param2"); //$NON-NLS-1$
param2.setParameterType(ParameterInfo.IN);
storedQuery.setParameter(param2);
- helpTest("Exec proc1(param1 = 'paramValue1', param2 =
'paramValue2')", "EXEC proc1(param1 = 'paramValue1', param2 =
'paramValue2')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
- helpTest("execute proc1(param1 = 'paramValue1', param2 =
'paramValue2')", "EXEC proc1(param1 = 'paramValue1', param2 =
'paramValue2')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTest("Exec proc1(param1 = 'paramValue1', param2 =
'paramValue2')", "EXEC proc1(param1 => 'paramValue1', param2
=> 'paramValue2')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTest("execute proc1(param1 = 'paramValue1', param2 =
'paramValue2')", "EXEC proc1(param1 => 'paramValue1', param2
=> 'paramValue2')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
}
@Test public void testCase3281QuotedNamedVariableFails2() {
- try {
- QueryParser.getQueryParser().parseCommand("Exec proc1('param1' =
'paramValue1')"); //$NON-NLS-1$
- fail("Named parameter name cannot be quoted"); //$NON-NLS-1$
- }catch(QueryParserException e) {
- // this is expected.
- //e.printStackTrace();
- //assertEquals("Unable to parse named parameter name:
'param1'", e.getMessage()); //$NON-NLS-1$
- }
+ StoredProcedure storedQuery = new StoredProcedure();
+ storedQuery.setProcedureName("proc1"); //$NON-NLS-1$
+ SPParameter param1 = new SPParameter(1, new CompareCriteria(new
Constant("a"), CompareCriteria.EQ, new Constant("b"))); //$NON-NLS-1$
+ param1.setParameterType(ParameterInfo.IN);
+ storedQuery.setParameter(param1);
+ helpTest("Exec proc1('a' = 'b')", "EXEC
proc1(('a' = 'b'))", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
}
/** Test what happens if the name of a parameter is a reserved word. It must be
quoted (double-ticks). */
@@ -6449,8 +6450,8 @@
param2.setName("in2"); //$NON-NLS-1$
param2.setParameterType(ParameterInfo.IN);
storedQuery.setParameter(param2);
- helpTest("Exec proc1(\"in\" = 'paramValue1', in2 =
'paramValue2')", "EXEC proc1(\"in\" = 'paramValue1',
in2 = 'paramValue2')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
- helpTest("execute proc1(\"in\" = 'paramValue1', in2 =
'paramValue2')", "EXEC proc1(\"in\" = 'paramValue1',
in2 = 'paramValue2')", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTest("Exec proc1(\"in\" = 'paramValue1', in2 =
'paramValue2')", "EXEC proc1(\"in\" =>
'paramValue1', in2 => 'paramValue2')", storedQuery); //$NON-NLS-1$
//$NON-NLS-2$
+ helpTest("execute proc1(\"in\" = 'paramValue1', in2 =
'paramValue2')", "EXEC proc1(\"in\" =>
'paramValue1', in2 => 'paramValue2')", storedQuery); //$NON-NLS-1$
//$NON-NLS-2$
}
@Test public void testExceptionMessageWithLocation() {
@@ -6831,5 +6832,15 @@
f.setTypeString("CLOB");
helpTestExpression("xmlserialize(x as CLOB)", "XMLSERIALIZE(x AS
CLOB)", f);
}
+
+ @Test public void testExpressionCriteria() throws Exception {
+ SearchedCaseExpression sce = new SearchedCaseExpression(Arrays.asList(new
ExpressionCriteria(new ElementSymbol("x"))), Arrays.asList(new
ElementSymbol("y")));
+ helpTestExpression("case when x then y end", "CASE WHEN x THEN y
END", sce);
+ }
+
+ @Test public void testExpressionCriteria1() throws Exception {
+ SearchedCaseExpression sce = new SearchedCaseExpression(Arrays.asList(new
NotCriteria(new ExpressionCriteria(new ElementSymbol("x")))), Arrays.asList(new
ElementSymbol("y")));
+ helpTestExpression("case when not x then y end", "CASE WHEN NOT (x)
THEN y END", sce);
+ }
}
Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2010-07-13
17:56:20 UTC (rev 2337)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -2296,5 +2296,9 @@
QueryMetadataInterface metadata = FakeMetadataFactory.exampleBQTCached();
helpTestRewriteExpression(original,
"'path?%26x=value&y=%20%26%20'", metadata);
}
+
+ @Test public void testRewriteExpressionCriteria() throws Exception {
+ helpTestRewriteCriteria("pm1.g1.e3", "pm1.g1.e3 = true");
+ }
}
Modified: trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestCaseExpression.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestCaseExpression.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestCaseExpression.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -248,22 +248,8 @@
helpTestWhenExpressions(caseExpr, 4);
helpTestThenExpressions(caseExpr, 4);
}
- try {
- caseExpr.setWhen(TestSearchedCaseExpression.getWhenCriteria(3),
getThenExpressions(3));
- fail("Setting WHEN non Expression types should have failed.");
//$NON-NLS-1$
- } catch (IllegalArgumentException e) {
- // There should be no side-effects of an illegal argument
- helpTestWhenExpressions(caseExpr, 4);
- helpTestThenExpressions(caseExpr, 4);
- }
- try {
- caseExpr.setWhen(getWhenExpressions(3),
TestSearchedCaseExpression.getWhenCriteria(3));
- fail("Setting THEN non Expression types should have failed.");
//$NON-NLS-1$
- } catch (IllegalArgumentException e) {
- // There should be no side-effects of an illegal argument
- helpTestWhenExpressions(caseExpr, 4);
- helpTestThenExpressions(caseExpr, 4);
- }
+ caseExpr.setWhen(TestSearchedCaseExpression.getWhenCriteria(3),
getThenExpressions(3));
+ caseExpr.setWhen(getWhenExpressions(3),
TestSearchedCaseExpression.getWhenCriteria(3));
ArrayList whens = new ArrayList();
whens.add(new Constant("abc")); //$NON-NLS-1$
whens.add(new Constant("xyz")); //$NON-NLS-1$
Modified:
trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestSearchedCaseExpression.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestSearchedCaseExpression.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestSearchedCaseExpression.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -202,14 +202,7 @@
helpTestWhenCriteria(caseExpr, 4);
TestCaseExpression.helpTestThenExpressions(caseExpr, 4);
}
- try {
- caseExpr.setWhen(getWhenCriteria(3), getWhenCriteria(3));
- fail("Setting THEN non Expression types should have failed.");
//$NON-NLS-1$
- } catch (IllegalArgumentException e) {
- // There should be no side-effects of an illegal argument
- helpTestWhenCriteria(caseExpr, 4);
- TestCaseExpression.helpTestThenExpressions(caseExpr, 4);
- }
+ caseExpr.setWhen(getWhenCriteria(3), getWhenCriteria(3));
ArrayList whens = new ArrayList();
whens.add(new CompareCriteria(new ElementSymbol("abc"),
CompareCriteria.EQ, new Constant(new Integer(20000)))); //$NON-NLS-1$
whens.add(new CompareCriteria(new ElementSymbol("xyz"),
CompareCriteria.EQ, new Constant(new Integer(30000)))); //$NON-NLS-1$
Modified:
trunk/engine/src/test/java/org/teiid/query/sql/util/TestUpdateProcedureGenerator.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/sql/util/TestUpdateProcedureGenerator.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/test/java/org/teiid/query/sql/util/TestUpdateProcedureGenerator.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -63,6 +63,7 @@
if (expectedProc == null) {
assertNull(actualProc);
} else {
+ assertNotNull(actualProc);
assertEquals("Didn't get expected generated procedure",
expectedProc, actualProc.toString()); //$NON-NLS-1$
QueryParser.getQueryParser().parseCommand(actualProc.toString());
}
Modified:
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2010-07-13
17:56:20 UTC (rev 2337)
+++
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2010-07-13
18:07:49 UTC (rev 2338)
@@ -1348,7 +1348,7 @@
SPParameter param = new SPParameter(1, new Reference(0));
param.setName("p1");//$NON-NLS-1$
proc.setParameter(param);
- helpTest(proc, "EXEC myproc(p1 = ?)"); //$NON-NLS-1$
+ helpTest(proc, "EXEC myproc(p1 => ?)"); //$NON-NLS-1$
}
public void testExecNamedParams() {
@@ -1361,7 +1361,7 @@
SPParameter param2 = new SPParameter(2, new Reference(0));
param2.setName("p2");//$NON-NLS-1$
proc.setParameter(param2);
- helpTest(proc, "EXEC myproc(p1 = ?, p2 = ?)"); //$NON-NLS-1$
+ helpTest(proc, "EXEC myproc(p1 => ?, p2 => ?)"); //$NON-NLS-1$
}
/**
@@ -1381,7 +1381,7 @@
SPParameter param2 = new SPParameter(2, new Reference(0));
param2.setName("in2");//$NON-NLS-1$
proc.setParameter(param2);
- helpTest(proc, "EXEC myproc(\"in\" = ?, in2 = ?)");
//$NON-NLS-1$
+ helpTest(proc, "EXEC myproc(\"in\" => ?, in2 => ?)");
//$NON-NLS-1$
}
// Test methods for Update Procedure Language Objects
@@ -1869,7 +1869,7 @@
public void testNullExpressionInNamedParameter() {
- String expected = "EXEC sp1(PARAM = sp1.PARAM)"; //$NON-NLS-1$
+ String expected = "EXEC sp1(PARAM => sp1.PARAM)"; //$NON-NLS-1$
StoredProcedure sp = new StoredProcedure();
sp.setDisplayNamedParameters(true);