[teiid-commits] teiid SVN: r2338 - in trunk: build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather and 17 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Jul 13 14:07:51 EDT 2010


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/wsdl/ndfdXML.wsdl#LatLonListZipCode', 
-		endpoint='http://www.weather.gov/forecasts/xml/SOAP_server/ndfdXMLserver.php',
-		binding='SOAP11',
-		request='
+	(call weather.invoke(action=>'http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl#LatLonListZipCode', 
+		endpoint=>'http://www.weather.gov/forecasts/xml/SOAP_server/ndfdXMLserver.php',
+		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.wsdl">

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</a> 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> &lt;EQ&gt; <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod16">expression</link> )* )</para></entry></row>
+( <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod16">expression</link> )* )</para></entry></row>
 <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> | ( &lt;LPAREN&gt; <link linkend="prod28">criteria</link> &lt;RPAREN&gt; ) )</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>::= 
 ( &lt;EQ&gt; | &lt;NE&gt; | &lt;NE2&gt; | &lt;LT&gt; | &lt;LE&gt; | &lt;GT&gt; | &lt;GE&gt; )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="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>::= 
 &lt;LPAREN&gt; ( <link linkend="prod7">queryExpression</link> | <link linkend="prod8">storedProcedure</link> ) &lt;RPAREN&gt;</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> ( &lt;ANY&gt; | &lt;SOME&gt; | &lt;ALL&gt; ) <link linkend="prod89">subquery</link></para></entry></row>
+<link linkend="prod87">operator</link> ( &lt;ANY&gt; | &lt;SOME&gt; | &lt;ALL&gt; ) <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>::= 
-( &lt;NOT&gt; )? &lt;LIKE&gt; <link linkend="prod80">commonValueExpression</link> ( &lt;ESCAPE&gt; <link linkend="prod70">charVal</link> | ( &lt;LBRACE&gt; &lt;ESCAPE&gt; <link linkend="prod70">charVal</link> &lt;RBRACE&gt; ) )?</para></entry></row>
+( &lt;NOT&gt; )? &lt;LIKE&gt; <link linkend="prod79">commonValueExpression</link> ( &lt;ESCAPE&gt; <link linkend="prod70">charVal</link> | ( &lt;LBRACE&gt; &lt;ESCAPE&gt; <link linkend="prod70">charVal</link> &lt;RBRACE&gt; ) )?</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>::= 
-( &lt;NOT&gt; )? &lt;BETWEEN&gt; <link linkend="prod80">commonValueExpression</link> &lt;AND&gt; <link linkend="prod80">commonValueExpression</link></para></entry></row>
+( &lt;NOT&gt; )? &lt;BETWEEN&gt; <link linkend="prod79">commonValueExpression</link> &lt;AND&gt; <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>::= 
 &lt;IS&gt; ( &lt;NOT&gt; )? &lt;NULL&gt;</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>::= 
-( &lt;NOT&gt; )? &lt;IN&gt; ( ( <link linkend="prod89">subquery</link> ) | ( &lt;LPAREN&gt; <link linkend="prod80">commonValueExpression</link> ( &lt;COMMA&gt; <link linkend="prod80">commonValueExpression</link> )* &lt;RPAREN&gt; ) )</para></entry></row>
+( &lt;NOT&gt; )? &lt;IN&gt; ( ( <link linkend="prod88">subquery</link> ) | ( &lt;LPAREN&gt; <link linkend="prod79">commonValueExpression</link> ( &lt;COMMA&gt; <link linkend="prod79">commonValueExpression</link> )* &lt;RPAREN&gt; ) )</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>::= 
-&lt;EXISTS&gt; <link linkend="prod89">subquery</link></para></entry></row>
+&lt;EXISTS&gt; <link linkend="prod88">subquery</link></para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod50" xreflabel="groupBy"/>groupBy</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;GROUP&gt; &lt;BY&gt; ( <link linkend="prod90">groupByItem</link> ( &lt;COMMA&gt; <link linkend="prod90">groupByItem</link> )* )</para></entry></row>
+&lt;GROUP&gt; &lt;BY&gt; ( <link linkend="prod89">groupByItem</link> ( &lt;COMMA&gt; <link linkend="prod89">groupByItem</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="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>::= 
-&lt;ORDER&gt; &lt;BY&gt; <link linkend="prod91">sortSpecification</link> ( &lt;COMMA&gt; <link linkend="prod91">sortSpecification</link> )*</para></entry></row>
+&lt;ORDER&gt; &lt;BY&gt; <link linkend="prod90">sortSpecification</link> ( &lt;COMMA&gt; <link linkend="prod90">sortSpecification</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="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> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="prod58">nonReserved</link> <link linkend="prod58">nonReserved</link> )?</para></entry></row>
+<link linkend="prod91">sortKey</link> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="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> ( &lt;CONCAT_OP&gt; <link linkend="prod93">plusExpression</link> )* )</para></entry></row>
+( <link linkend="prod92">plusExpression</link> ( &lt;CONCAT_OP&gt; <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>::= 
 ( &lt;PLUS&gt; | &lt;MINUS&gt; )</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>::= 
 ( &lt;STAR&gt; | &lt;SLASH&gt; )</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>::= 
-( &lt;QMARK&gt; | <link linkend="prod98">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod58">nonReserved</link> <link linkend="prod99">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod56">xmlAgg</link> ) | ( <link linkend="prod99">function</link> ) | ( &lt;ID&gt; ) | ( &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod89">subquery</link> | <link linkend="prod100">searchedCaseExpression</link> | <link linkend="prod101">caseExpression</link> )</para></entry></row>
+( &lt;QMARK&gt; | <link linkend="prod97">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod58">nonReserved</link> <link linkend="prod98">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod57">aggregateSymbol</link> ) | ( <link linkend="prod56">xmlAgg</link> ) | ( <link linkend="prod98">function</link> ) | ( &lt;ID&gt; ) | <link linkend="prod88">subquery</link> | ( &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod99">searchedCaseExpression</link> | <link linkend="prod100">caseExpression</link> )</para></entry></row>
 <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>::= 
 &lt;CASE&gt; <link linkend="prod16">expression</link> ( &lt;WHEN&gt; <link linkend="prod16">expression</link> &lt;THEN&gt; <link linkend="prod16">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod16">expression</link> )? &lt;END&gt;</para></entry></row>
 <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>::= 
 &lt;CASE&gt; ( &lt;WHEN&gt; <link linkend="prod28">criteria</link> &lt;THEN&gt; <link linkend="prod16">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod16">expression</link> )? &lt;END&gt;</para></entry></row>
 <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>::= 
-( ( &lt;CONVERT&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod31">dataType</link> &lt;RPAREN&gt; ) | ( &lt;CAST&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;AS&gt; <link linkend="prod31">dataType</link> &lt;RPAREN&gt; ) | ( <link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod102">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod103">intervalType</link> &lt;COMMA&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod16">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod104">queryString</link> | ( ( &lt;LEFT&gt; | &lt;RIGHT&gt; | &lt;CHAR&gt; | &lt;USER&gt; | &lt;YEAR&gt; | &lt;MONTH&gt; | &lt;HOUR&gt; | &lt;MINUTE&gt; | &lt;SECOND&gt; | &lt;XMLCONCAT&gt; | &lt;XMLCOMMENT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> !
 ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;INSERT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;TRANSLATE&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | <link linkend="prod105">xmlParse</link> | <link linkend="prod106">xmlElement</link> | ( &lt;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod107">idExpression</link> | <link linkend="prod107">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod108">xmlForest</link> | <link linkend="prod68">xmlSerialize</link> | <link linkend="prod72">xmlQuery</link> | ( <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )*!
  )? &lt;RPAREN&gt; ) )</para></entry></row>
+( ( &lt;CONVERT&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod31">dataType</link> &lt;RPAREN&gt; ) | ( &lt;CAST&gt; &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;AS&gt; <link linkend="prod31">dataType</link> &lt;RPAREN&gt; ) | ( <link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod101">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod58">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod102">intervalType</link> &lt;COMMA&gt; <link linkend="prod16">expression</link> &lt;COMMA&gt; <link linkend="prod16">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod103">queryString</link> | ( ( &lt;LEFT&gt; | &lt;RIGHT&gt; | &lt;CHAR&gt; | &lt;USER&gt; | &lt;YEAR&gt; | &lt;MONTH&gt; | &lt;HOUR&gt; | &lt;MINUTE&gt; | &lt;SECOND&gt; | &lt;XMLCONCAT&gt; | &lt;XMLCOMMENT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> !
 ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;INSERT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | ( ( &lt;TRANSLATE&gt; ) &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* )? &lt;RPAREN&gt; ) | <link linkend="prod104">xmlParse</link> | <link linkend="prod105">xmlElement</link> | ( &lt;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod106">idExpression</link> | <link linkend="prod106">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod107">xmlForest</link> | <link linkend="prod68">xmlSerialize</link> | <link linkend="prod72">xmlQuery</link> | ( <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )*!
  )? &lt;RPAREN&gt; ) )</para></entry></row>
 <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>::= 
 &lt;XMLPARSE&gt; &lt;LPAREN&gt; <link linkend="prod58">nonReserved</link> <link linkend="prod16">expression</link> ( <link linkend="prod58">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
 <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> &lt;LPAREN&gt; <link linkend="prod16">expression</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* &lt;RPAREN&gt;</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>::= 
-&lt;XMLELEMENT&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod2">id</link> | <link linkend="prod2">id</link> ) ( &lt;COMMA&gt; <link linkend="prod73">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod109">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLELEMENT&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod2">id</link> | <link linkend="prod2">id</link> ) ( &lt;COMMA&gt; <link linkend="prod73">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod108">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod16">expression</link> )* &lt;RPAREN&gt;</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>::= 
 &lt;XMLATTRIBUTES&gt; &lt;LPAREN&gt; <link linkend="prod55">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <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>::= 
 &lt;XMLFOREST&gt; &lt;LPAREN&gt; ( <link linkend="prod73">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod55">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod55">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod73" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLNAMESPACES&gt; &lt;LPAREN&gt; <link linkend="prod110">namespaceItem</link> ( &lt;COMMA&gt; <link linkend="prod110">namespaceItem</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLNAMESPACES&gt; &lt;LPAREN&gt; <link linkend="prod109">namespaceItem</link> ( &lt;COMMA&gt; <link linkend="prod109">namespaceItem</link> )* &lt;RPAREN&gt;</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> &lt;AS&gt; <link linkend="prod2">id</link> )</para></entry></row>
 <row>
@@ -825,7 +821,7 @@
 <entry align="left" valign="top"><para>::= 
 ( &lt;DEFAULT_KEYWORD&gt; <link linkend="prod1">stringVal</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="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>::= 
 ( &lt;STRING&gt; | &lt;VARCHAR&gt; | &lt;BOOLEAN&gt; | &lt;BYTE&gt; | &lt;TINYINT&gt; | &lt;SHORT&gt; | &lt;SMALLINT&gt; | &lt;CHAR&gt; | &lt;INTEGER&gt; | &lt;LONG&gt; | &lt;BIGINT&gt; | &lt;BIGINTEGER&gt; | &lt;FLOAT&gt; | &lt;REAL&gt; | &lt;DOUBLE&gt; | &lt;BIGDECIMAL&gt; | &lt;DECIMAL&gt; | &lt;DATE&gt; | &lt;TIME&gt; | &lt;TIMESTAMP&gt; | &lt;OBJECT&gt; | &lt;BLOB&gt; | &lt;CLOB&gt; | &lt;XML&gt; )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="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> | &lt;INTEGERVAL&gt; | &lt;FLOATVAL&gt; | &lt;FALSE&gt; | &lt;TRUE&gt; | &lt;UNKNOWN&gt; | &lt;NULL&gt; | ( ( &lt;BOOLEANTYPE&gt; | &lt;TIMESTAMPTYPE&gt; | &lt;DATETYPE&gt; | &lt;TIMETYPE&gt; ) <link linkend="prod1">stringVal</link> &lt;RBRACE&gt; ) )</para></entry></row>
 </tbody>

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);



More information about the teiid-commits mailing list