[teiid-commits] teiid SVN: r3372 - in trunk: build/kits/jboss-container and 25 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Aug 10 16:06:05 EDT 2011


Author: shawkins
Date: 2011-08-10 16:06:04 -0400 (Wed, 10 Aug 2011)
New Revision: 3372

Added:
   trunk/engine/src/main/java/org/teiid/query/processor/proc/BranchingInstruction.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/BranchingStatement.java
Removed:
   trunk/engine/src/main/java/org/teiid/query/processor/proc/BreakInstruction.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/ContinueInstruction.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/BreakStatement.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/ContinueStatement.java
   trunk/engine/src/test/java/org/teiid/query/sql/proc/TestContinueStatement.java
Modified:
   trunk/api/src/main/java/org/teiid/language/SQLConstants.java
   trunk/build/kits/jboss-container/teiid-releasenotes.html
   trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java
   trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java
   trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java
   trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
   trunk/documentation/reference/src/main/docbook/en-US/content/procedures.xml
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java
   trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/LoopInstruction.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/Program.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/RepeatedInstruction.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/WhileInstruction.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.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/navigator/PreOrPostOrderNavigator.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/IfStatement.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/LoopStatement.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/Statement.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/TriggerAction.java
   trunk/engine/src/main/java/org/teiid/query/sql/proc/WhileStatement.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
   trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
   trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java
   trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
   trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/java/org/teiid/query/validator/Validator.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/TestParseAlter.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
   trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java
   trunk/engine/src/test/java/org/teiid/query/sql/proc/TestBreakStatement.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
Log:
TEIID-1701 adding procedure enhancements

Modified: trunk/api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -46,6 +46,7 @@
 		public static final String GE = ">="; //$NON-NLS-1$
 		public static final String LPAREN = "("; //$NON-NLS-1$
 		public static final String RPAREN = ")"; //$NON-NLS-1$
+		public static final String COLON = ":"; //$NON-NLS-1$
 	}
 	
 	public interface NonReserved {
@@ -249,6 +250,7 @@
 	    public static final String LARGE = "LARGE"; //$NON-NLS-1$
 	    public static final String LATERAL = "LATERAL"; //$NON-NLS-1$
 	    public static final String LEADING = "LEADING"; //$NON-NLS-1$
+	    public static final String LEAVE = "LEAVE"; //$NON-NLS-1$
 	    public static final String LEFT = "LEFT"; //$NON-NLS-1$
 	    public static final String LIKE = "LIKE"; //$NON-NLS-1$
 	    public static final String LIKE_REGEX = "LIKE_REGEX"; //$NON-NLS-1$

Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-08-10 20:06:04 UTC (rev 3372)
@@ -26,6 +26,7 @@
 </UL>
 <H2><A NAME="Highlights"></A>Highlights</H2>
 <UL>
+  <LI><B>Procedure language features</B> - Added support for compound/block statements, BEGIN [[NOT] ATOMIC], loop/block labels, and the leave statement.  See the reference for more.
 </UL>
 
 <h2><a name="Compatibility">Compatibility Issues</a></h2>
@@ -37,6 +38,11 @@
 
 <h4>from 7.4</h4>
 <ul>
+  <li>Leave was added as a reserved word. 
+</ul>
+
+<h4>from 7.4</h4>
+<ul>
   <li>OFFSET and LIKE_REGEX were added as reserved words. 
   <li>ColumnReference.getName will always return just the element name.  Previously it inconsistently returned the qualified and unqualified form depending upon where the ColumnReference appeared.
   <li>As per JDBC4, ResultSetMetadata.getColumnName will return the unaliased column name if available rather than return the alias.  Set useJDBC4ColumnNameAndLabelSemantics to false to use the alias name as the column name.

Modified: trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java
===================================================================
--- trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -128,11 +128,11 @@
 		ResultsFuture<ResultsMessage> future = new ResultsFuture<ResultsMessage>();
 		Mockito.stub(dqp.executeRequest(Mockito.anyLong(), (RequestMessage) Mockito.anyObject())).toReturn(future);
 		statement.submitExecute("select 'hello world'");
-		Thread.sleep(100);
+		Thread.sleep(300);
 		Mockito.verify(dqp).cancelRequest(0);
 		statement.setQueryTimeoutMS(1);
 		statement.submitExecute("select 'hello world'");
-		Thread.sleep(100);
+		Thread.sleep(300);
 		Mockito.verify(dqp, Mockito.times(2)).cancelRequest(0);
 	}
 	

Modified: trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -1011,7 +1011,7 @@
 	public static String[] getLines(final String value) {
 	    StringReader stringReader = new StringReader(value);
 	    BufferedReader reader = new BufferedReader(stringReader);
-	    ArrayList result = new ArrayList();
+	    ArrayList<String> result = new ArrayList<String>();
 	    try {
 	        String line = reader.readLine();
 	        while (line != null) {
@@ -1021,7 +1021,16 @@
 	    } catch (IOException e) {
 	        throw new TeiidRuntimeException(e);
 	    }
-	    return (String[]) result.toArray(new String[result.size()]);
+	    return result.toArray(new String[result.size()]);
 	}
 	
+	public static boolean equalsIgnoreCase(String s1, String s2) {
+		if (s1 != null) {
+			return s1.equalsIgnoreCase(s2);
+		} else if (s2 != null) {
+			return false;
+		}
+		return true;
+	}
+	
 }

Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -23,21 +23,17 @@
 package org.teiid.translator.salesforce;
 
 import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.*;
-import java.util.ArrayList;
+
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 import javax.resource.cci.ConnectionFactory;
 
-import org.teiid.core.types.DataTypeManager;
 import org.teiid.language.Call;
 import org.teiid.language.Command;
 import org.teiid.language.QueryExpression;
 import org.teiid.logging.LogConstants;
 import org.teiid.logging.LogManager;
-import org.teiid.metadata.FunctionMethod;
-import org.teiid.metadata.FunctionParameter;
 import org.teiid.metadata.MetadataFactory;
 import org.teiid.metadata.RuntimeMetadata;
 import org.teiid.translator.ExecutionContext;

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml	2011-08-10 20:06:04 UTC (rev 3372)
@@ -169,6 +169,7 @@
 | &lt;LANGUAGE: "language"&gt;
 | &lt;LARGE: "large"&gt;
 | &lt;LEADING: "leading"&gt;
+| &lt;LEAVE: "leave"&gt;
 | &lt;LIKE: "like"&gt;
 | &lt;LIKE_REGEX: "like_regex"&gt;
 | &lt;LIMIT: "limit"&gt;
@@ -384,6 +385,7 @@
 | &lt;QMARK: "?"&gt;
 | &lt;DOLLAR: "$"&gt;
 | &lt;SEMICOLON: ";"&gt;
+| &lt;COLON: ":"&gt;
 | &lt;CONCAT_OP: "||"&gt;
 }
 
@@ -426,11 +428,11 @@
 <row>
 <entry align="right" valign="top"><para><anchor id="prod12" xreflabel="alter"/>alter</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ALTER&gt; ( ( <link linkend="prod11">nonReserved</link> <link linkend="prod2">id</link> &lt;AS&gt; <link linkend="prod13">queryExpression</link> ) | ( &lt;PROCEDURE&gt; <link linkend="prod2">id</link> &lt;AS&gt; <link linkend="prod14">block</link> ) | ( &lt;TRIGGER&gt; &lt;ON&gt; <link linkend="prod2">id</link> <link linkend="prod11">nonReserved</link> &lt;OF&gt; ( &lt;INSERT&gt; | &lt;UPDATE&gt; | &lt;DELETE&gt; ) ( ( &lt;AS&gt; <link linkend="prod9">forEachRowTriggerAction</link> ) | <link linkend="prod11">nonReserved</link> ) ) )</para></entry></row>
+&lt;ALTER&gt; ( ( <link linkend="prod11">nonReserved</link> <link linkend="prod2">id</link> &lt;AS&gt; <link linkend="prod13">queryExpression</link> ) | ( &lt;PROCEDURE&gt; <link linkend="prod2">id</link> &lt;AS&gt; <link linkend="prod14">statement</link> ) | ( &lt;TRIGGER&gt; &lt;ON&gt; <link linkend="prod2">id</link> <link linkend="prod11">nonReserved</link> &lt;OF&gt; ( &lt;INSERT&gt; | &lt;UPDATE&gt; | &lt;DELETE&gt; ) ( ( &lt;AS&gt; <link linkend="prod9">forEachRowTriggerAction</link> ) | <link linkend="prod11">nonReserved</link> ) ) )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod9" xreflabel="forEachRowTriggerAction"/>forEachRowTriggerAction</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;FOR&gt; &lt;EACH&gt; &lt;ROW&gt; <link linkend="prod14">block</link></para></entry></row>
+&lt;FOR&gt; &lt;EACH&gt; &lt;ROW&gt; ( ( &lt;BEGIN&gt; ( &lt;ATOMIC&gt; )? ( <link linkend="prod14">statement</link> )* &lt;END&gt; ) | <link linkend="prod14">statement</link> )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod5" xreflabel="userCommand"/>userCommand</para></entry>
 <entry align="left" valign="top"><para>::= 
@@ -452,207 +454,203 @@
 <entry align="left" valign="top"><para>::= 
 &lt;ERROR&gt; <link linkend="prod24">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod25" xreflabel="statement"/>statement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod14" xreflabel="statement"/>statement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod26">ifStatement</link> | <link linkend="prod27">loopStatement</link> | <link linkend="prod28">whileStatement</link> | <link linkend="prod29">delimitedStatement</link> )</para></entry></row>
+( ( ( <link linkend="prod2">id</link> &lt;COLON&gt; )? ( <link linkend="prod25">loopStatement</link> | <link linkend="prod26">whileStatement</link> | <link linkend="prod27">compoundStatement</link> ) ) | ( <link linkend="prod28">ifStatement</link> | <link linkend="prod29">delimitedStatement</link> ) )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod29" xreflabel="delimitedStatement"/>delimitedStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod30">assignStatement</link> | <link linkend="prod31">sqlStatement</link> | <link linkend="prod23">errorStatement</link> | <link linkend="prod32">declareStatement</link> | <link linkend="prod33">continueStatement</link> | <link linkend="prod34">breakStatement</link> ) &lt;SEMICOLON&gt;</para></entry></row>
+( <link linkend="prod30">assignStatement</link> | <link linkend="prod31">sqlStatement</link> | <link linkend="prod23">errorStatement</link> | <link linkend="prod32">declareStatement</link> | <link linkend="prod33">branchingStatement</link> ) &lt;SEMICOLON&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod14" xreflabel="block"/>block</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod27" xreflabel="compoundStatement"/>compoundStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod25">statement</link> | ( &lt;BEGIN&gt; ( <link linkend="prod25">statement</link> )* &lt;END&gt; ) )</para></entry></row>
+&lt;BEGIN&gt; ( ( &lt;NOT&gt; )? &lt;ATOMIC&gt; )? ( <link linkend="prod14">statement</link> )* &lt;END&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="breakStatement"/>breakStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod33" xreflabel="branchingStatement"/>branchingStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;BREAK&gt;</para></entry></row>
+( ( ( &lt;BREAK&gt; | &lt;CONTINUE&gt; ) ( <link linkend="prod2">id</link> )? ) | ( &lt;LEAVE&gt; <link linkend="prod2">id</link> ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod33" xreflabel="continueStatement"/>continueStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod26" xreflabel="whileStatement"/>whileStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CONTINUE&gt;</para></entry></row>
+&lt;WHILE&gt; &lt;LPAREN&gt; <link linkend="prod34">criteria</link> &lt;RPAREN&gt; <link linkend="prod14">statement</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="whileStatement"/>whileStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod25" xreflabel="loopStatement"/>loopStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;WHILE&gt; &lt;LPAREN&gt; <link linkend="prod35">criteria</link> &lt;RPAREN&gt; <link linkend="prod14">block</link></para></entry></row>
+&lt;LOOP&gt; &lt;ON&gt; &lt;LPAREN&gt; <link linkend="prod13">queryExpression</link> &lt;RPAREN&gt; &lt;AS&gt; <link linkend="prod2">id</link> <link linkend="prod14">statement</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod27" xreflabel="loopStatement"/>loopStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod28" xreflabel="ifStatement"/>ifStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;LOOP&gt; &lt;ON&gt; &lt;LPAREN&gt; <link linkend="prod13">queryExpression</link> &lt;RPAREN&gt; &lt;AS&gt; <link linkend="prod2">id</link> <link linkend="prod14">block</link></para></entry></row>
+&lt;IF&gt; &lt;LPAREN&gt; <link linkend="prod34">criteria</link> &lt;RPAREN&gt; <link linkend="prod14">statement</link> ( &lt;ELSE&gt; <link linkend="prod14">statement</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod26" xreflabel="ifStatement"/>ifStatement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;IF&gt; &lt;LPAREN&gt; <link linkend="prod35">criteria</link> &lt;RPAREN&gt; <link linkend="prod14">block</link> ( &lt;ELSE&gt; <link linkend="prod14">block</link> )?</para></entry></row>
-<row>
-<entry align="right" valign="top"><para><anchor id="prod36" xreflabel="criteriaSelector"/>criteriaSelector</para></entry>
-<entry align="left" valign="top"><para>::= 
 ( ( &lt;EQ&gt; | &lt;NE&gt; | &lt;NE2&gt; | &lt;LE&gt; | &lt;GE&gt; | &lt;LT&gt; | &lt;GT&gt; | &lt;IN&gt; | &lt;LIKE&gt; | ( &lt;IS&gt; &lt;NULL&gt; ) | &lt;BETWEEN&gt; ) )? &lt;CRITERIA&gt; ( &lt;ON&gt; &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt; )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod37" xreflabel="hasCriteria"/>hasCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod36" xreflabel="hasCriteria"/>hasCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;HAS&gt; <link linkend="prod36">criteriaSelector</link></para></entry></row>
+&lt;HAS&gt; <link linkend="prod35">criteriaSelector</link></para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod32" xreflabel="declareStatement"/>declareStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;DECLARE&gt; <link linkend="prod38">dataType</link> <link linkend="prod2">id</link> ( ( <link linkend="prod11">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod39">assignStatementOperand</link> )?</para></entry></row>
+&lt;DECLARE&gt; <link linkend="prod37">dataType</link> <link linkend="prod2">id</link> ( ( <link linkend="prod11">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod38">assignStatementOperand</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod30" xreflabel="assignStatement"/>assignStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> ( <link linkend="prod11">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod39">assignStatementOperand</link></para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod11">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod38">assignStatementOperand</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod39" xreflabel="assignStatementOperand"/>assignStatementOperand</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod38" xreflabel="assignStatementOperand"/>assignStatementOperand</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( ( <link linkend="prod16">insert</link> ) | <link linkend="prod17">update</link> | <link linkend="prod18">delete</link> | ( <link linkend="prod24">expression</link> ) | <link linkend="prod13">queryExpression</link> )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod31" xreflabel="sqlStatement"/>sqlStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( <link linkend="prod5">userCommand</link> ) | <link linkend="prod40">dynamicCommand</link> | ( <link linkend="prod2">id</link> ( <link linkend="prod11">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod15">storedProcedure</link> ) )</para></entry></row>
+( ( <link linkend="prod5">userCommand</link> ) | <link linkend="prod39">dynamicCommand</link> | ( <link linkend="prod2">id</link> ( <link linkend="prod11">nonReserved</link> | &lt;EQ&gt; ) <link linkend="prod15">storedProcedure</link> ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod41" xreflabel="translateCriteria"/>translateCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod40" xreflabel="translateCriteria"/>translateCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;TRANSLATE&gt; <link linkend="prod36">criteriaSelector</link> ( &lt;WITH&gt; &lt;LPAREN&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod24">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod24">expression</link> )* &lt;RPAREN&gt; )?</para></entry></row>
+&lt;TRANSLATE&gt; <link linkend="prod35">criteriaSelector</link> ( &lt;WITH&gt; &lt;LPAREN&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod24">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; <link linkend="prod24">expression</link> )* &lt;RPAREN&gt; )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod4" xreflabel="createUpdateProcedure"/>createUpdateProcedure</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CREATE&gt; ( &lt;VIRTUAL&gt; )? ( &lt;UPDATE&gt; )? &lt;PROCEDURE&gt; <link linkend="prod14">block</link></para></entry></row>
+&lt;CREATE&gt; ( &lt;VIRTUAL&gt; )? ( &lt;UPDATE&gt; )? &lt;PROCEDURE&gt; <link linkend="prod14">statement</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod40" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod39" xreflabel="dynamicCommand"/>dynamicCommand</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;EXECUTE&gt; | &lt;EXEC&gt; ) ( ( &lt;STRING&gt; | &lt;IMMEDIATE&gt; ) )? <link linkend="prod24">expression</link> ( &lt;AS&gt; <link linkend="prod42">createElementsWithTypes</link> ( &lt;INTO&gt; <link linkend="prod2">id</link> )? )? ( &lt;USING&gt; <link linkend="prod43">setClauseList</link> )? ( &lt;UPDATE&gt; ( ( &lt;INTEGERVAL&gt; ) | ( &lt;STAR&gt; ) ) )?</para></entry></row>
+( &lt;EXECUTE&gt; | &lt;EXEC&gt; ) ( ( &lt;STRING&gt; | &lt;IMMEDIATE&gt; ) )? <link linkend="prod24">expression</link> ( &lt;AS&gt; <link linkend="prod41">createElementsWithTypes</link> ( &lt;INTO&gt; <link linkend="prod2">id</link> )? )? ( &lt;USING&gt; <link linkend="prod42">setClauseList</link> )? ( &lt;UPDATE&gt; ( ( &lt;INTEGERVAL&gt; ) | ( &lt;STAR&gt; ) ) )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="setClauseList"/>setClauseList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="setClauseList"/>setClauseList</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod42" xreflabel="createElementsWithTypes"/>createElementsWithTypes</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod41" xreflabel="createElementsWithTypes"/>createElementsWithTypes</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod2">id</link> <link linkend="prod22">dataTypeString</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> <link linkend="prod22">dataTypeString</link> )*</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod6" xreflabel="callableStatement"/>callableStatement</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;LBRACE&gt; ( &lt;QMARK&gt; &lt;EQ&gt; )? &lt;CALL&gt; <link linkend="prod2">id</link> ( &lt;LPAREN&gt; ( <link linkend="prod44">executeUnnamedParams</link> ) &lt;RPAREN&gt; )? &lt;RBRACE&gt; ( <link linkend="prod45">option</link> )?</para></entry></row>
+&lt;LBRACE&gt; ( &lt;QMARK&gt; &lt;EQ&gt; )? &lt;CALL&gt; <link linkend="prod2">id</link> ( &lt;LPAREN&gt; ( <link linkend="prod43">executeUnnamedParams</link> ) &lt;RPAREN&gt; )? &lt;RBRACE&gt; ( <link linkend="prod44">option</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod15" xreflabel="storedProcedure"/>storedProcedure</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;EXEC&gt; | &lt;EXECUTE&gt; | &lt;CALL&gt; ) <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod46">executeNamedParams</link> | <link linkend="prod44">executeUnnamedParams</link> ) &lt;RPAREN&gt; ) ( <link linkend="prod45">option</link> )?</para></entry></row>
+( ( &lt;EXEC&gt; | &lt;EXECUTE&gt; | &lt;CALL&gt; ) <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod45">executeNamedParams</link> | <link linkend="prod43">executeUnnamedParams</link> ) &lt;RPAREN&gt; ) ( <link linkend="prod44">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod43" xreflabel="executeUnnamedParams"/>executeUnnamedParams</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( <link linkend="prod24">expression</link> ( &lt;COMMA&gt; <link linkend="prod24">expression</link> )* )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod45" xreflabel="executeNamedParams"/>executeNamedParams</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod24">expression</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> &lt;EQ&gt; ( &lt;GT&gt; )? <link linkend="prod24">expression</link> )* )</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod16" xreflabel="insert"/>insert</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;INSERT&gt; &lt;INTO&gt; <link linkend="prod2">id</link> ( <link linkend="prod47">columnList</link> )? ( ( &lt;VALUES&gt; &lt;LPAREN&gt; <link linkend="prod48">expressionList</link> &lt;RPAREN&gt; ) | ( <link linkend="prod13">queryExpression</link> ) ) ( <link linkend="prod45">option</link> )?</para></entry></row>
+&lt;INSERT&gt; &lt;INTO&gt; <link linkend="prod2">id</link> ( <link linkend="prod46">columnList</link> )? ( ( &lt;VALUES&gt; &lt;LPAREN&gt; <link linkend="prod47">expressionList</link> &lt;RPAREN&gt; ) | ( <link linkend="prod13">queryExpression</link> ) ) ( <link linkend="prod44">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod47" xreflabel="columnList"/>columnList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod46" xreflabel="columnList"/>columnList</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;LPAREN&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod48" xreflabel="expressionList"/>expressionList</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod47" xreflabel="expressionList"/>expressionList</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod24">expression</link> ( &lt;COMMA&gt; <link linkend="prod24">expression</link> )*</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod17" xreflabel="update"/>update</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;UPDATE&gt; <link linkend="prod2">id</link> &lt;SET&gt; <link linkend="prod43">setClauseList</link> ( <link linkend="prod49">where</link> )? ( <link linkend="prod45">option</link> )?</para></entry></row>
+&lt;UPDATE&gt; <link linkend="prod2">id</link> &lt;SET&gt; <link linkend="prod42">setClauseList</link> ( <link linkend="prod48">where</link> )? ( <link linkend="prod44">option</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod18" xreflabel="delete"/>delete</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;DELETE&gt; &lt;FROM&gt; <link linkend="prod2">id</link> ( <link linkend="prod49">where</link> )? ( <link linkend="prod45">option</link> )?</para></entry></row>
+&lt;DELETE&gt; &lt;FROM&gt; <link linkend="prod2">id</link> ( <link linkend="prod48">where</link> )? ( <link linkend="prod44">option</link> )?</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod13" xreflabel="queryExpression"/>queryExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;WITH&gt; <link linkend="prod50">withListElement</link> ( &lt;COMMA&gt; <link linkend="prod50">withListElement</link> )* )? <link linkend="prod51">queryExpressionBody</link></para></entry></row>
+( &lt;WITH&gt; <link linkend="prod49">withListElement</link> ( &lt;COMMA&gt; <link linkend="prod49">withListElement</link> )* )? <link linkend="prod50">queryExpressionBody</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="withListElement"/>withListElement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod49" xreflabel="withListElement"/>withListElement</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> ( <link linkend="prod47">columnList</link> )? &lt;AS&gt; &lt;LPAREN&gt; <link linkend="prod13">queryExpression</link> &lt;RPAREN&gt;</para></entry></row>
+<link linkend="prod2">id</link> ( <link linkend="prod46">columnList</link> )? &lt;AS&gt; &lt;LPAREN&gt; <link linkend="prod13">queryExpression</link> &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod50" xreflabel="queryExpressionBody"/>queryExpressionBody</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod52">queryTerm</link> ( ( &lt;UNION&gt; | &lt;EXCEPT&gt; ) ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod52">queryTerm</link> )* ( <link linkend="prod53">orderby</link> )? ( <link linkend="prod54">limit</link> )? ( <link linkend="prod45">option</link> )?</para></entry></row>
+<link linkend="prod51">queryTerm</link> ( ( &lt;UNION&gt; | &lt;EXCEPT&gt; ) ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod51">queryTerm</link> )* ( <link linkend="prod52">orderby</link> )? ( <link linkend="prod53">limit</link> )? ( <link linkend="prod44">option</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="queryTerm"/>queryTerm</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod51" xreflabel="queryTerm"/>queryTerm</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod55">queryPrimary</link> ( &lt;INTERSECT&gt; ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod55">queryPrimary</link> )*</para></entry></row>
+<link linkend="prod54">queryPrimary</link> ( &lt;INTERSECT&gt; ( &lt;ALL&gt; | &lt;DISTINCT&gt; )? <link linkend="prod54">queryPrimary</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod55" xreflabel="queryPrimary"/>queryPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="queryPrimary"/>queryPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod56">query</link> | ( &lt;TABLE&gt; <link linkend="prod2">id</link> ) | ( &lt;LPAREN&gt; <link linkend="prod51">queryExpressionBody</link> &lt;RPAREN&gt; ) )</para></entry></row>
+( <link linkend="prod55">query</link> | ( &lt;TABLE&gt; <link linkend="prod2">id</link> ) | ( &lt;LPAREN&gt; <link linkend="prod50">queryExpressionBody</link> &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod56" xreflabel="query"/>query</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod55" xreflabel="query"/>query</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod57">select</link> ( <link linkend="prod58">into</link> )? ( <link linkend="prod59">from</link> ( <link linkend="prod49">where</link> )? ( <link linkend="prod60">groupBy</link> )? ( <link linkend="prod61">having</link> )? )?</para></entry></row>
+<link linkend="prod56">select</link> ( <link linkend="prod57">into</link> )? ( <link linkend="prod58">from</link> ( <link linkend="prod48">where</link> )? ( <link linkend="prod59">groupBy</link> )? ( <link linkend="prod60">having</link> )? )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="into"/>into</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="into"/>into</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;INTO&gt; ( <link linkend="prod2">id</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod57" xreflabel="select"/>select</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod56" xreflabel="select"/>select</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;SELECT&gt; ( &lt;ALL&gt; | ( &lt;DISTINCT&gt; ) )? ( &lt;STAR&gt; | ( <link linkend="prod62">selectSymbol</link> ( &lt;COMMA&gt; <link linkend="prod62">selectSymbol</link> )* ) )</para></entry></row>
+&lt;SELECT&gt; ( &lt;ALL&gt; | ( &lt;DISTINCT&gt; ) )? ( &lt;STAR&gt; | ( <link linkend="prod61">selectSymbol</link> ( &lt;COMMA&gt; <link linkend="prod61">selectSymbol</link> )* ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod62" xreflabel="selectSymbol"/>selectSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod61" xreflabel="selectSymbol"/>selectSymbol</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod63">selectExpression</link> | <link linkend="prod64">allInGroupSymbol</link> )</para></entry></row>
+( <link linkend="prod62">selectExpression</link> | <link linkend="prod63">allInGroupSymbol</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod63" xreflabel="selectExpression"/>selectExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod62" xreflabel="selectExpression"/>selectExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( <link linkend="prod24">expression</link> ( ( &lt;AS&gt; )? <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod65" xreflabel="derivedColumn"/>derivedColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod64" xreflabel="derivedColumn"/>derivedColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( <link linkend="prod24">expression</link> ( &lt;AS&gt; <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod64" xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod63" xreflabel="allInGroupSymbol"/>allInGroupSymbol</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;ALL_IN_GROUP&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod66" xreflabel="orderedAgg"/>orderedAgg</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod65" xreflabel="orderedAgg"/>orderedAgg</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;XMLAGG&gt; | &lt;ARRAY_AGG&gt; ) &lt;LPAREN&gt; <link linkend="prod24">expression</link> ( <link linkend="prod53">orderby</link> )? &lt;RPAREN&gt; <link linkend="prod67">filterClause</link></para></entry></row>
+( &lt;XMLAGG&gt; | &lt;ARRAY_AGG&gt; ) &lt;LPAREN&gt; <link linkend="prod24">expression</link> ( <link linkend="prod52">orderby</link> )? &lt;RPAREN&gt; <link linkend="prod66">filterClause</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod68" xreflabel="textAgg"/>textAgg</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod67" xreflabel="textAgg"/>textAgg</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; &lt;FOR&gt; <link linkend="prod65">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod65">derivedColumn</link> )* ( &lt;ID&gt; <link linkend="prod69">charVal</link> )? ( ( &lt;ID&gt; <link linkend="prod69">charVal</link> ) )? ( &lt;ID&gt; )? ( ( &lt;ID&gt; <link linkend="prod2">id</link> ) )? ( <link linkend="prod53">orderby</link> )? &lt;RPAREN&gt; <link linkend="prod67">filterClause</link></para></entry></row>
+<link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; &lt;FOR&gt; <link linkend="prod64">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod64">derivedColumn</link> )* ( &lt;ID&gt; <link linkend="prod68">charVal</link> )? ( ( &lt;ID&gt; <link linkend="prod68">charVal</link> ) )? ( &lt;ID&gt; )? ( ( &lt;ID&gt; <link linkend="prod2">id</link> ) )? ( <link linkend="prod52">orderby</link> )? &lt;RPAREN&gt; <link linkend="prod66">filterClause</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod70" xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod69" xreflabel="aggregateSymbol"/>aggregateSymbol</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; &lt;STAR&gt; &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; &lt;RPAREN&gt; ) | ( ( <link linkend="prod11">nonReserved</link> | &lt;ANY&gt; | &lt;SOME&gt; ) &lt;LPAREN&gt; ( &lt;DISTINCT&gt; | &lt;ALL&gt; )? <link linkend="prod24">expression</link> &lt;RPAREN&gt; ) ) <link linkend="prod67">filterClause</link> )</para></entry></row>
+( ( ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; &lt;STAR&gt; &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; &lt;RPAREN&gt; ) | ( ( <link linkend="prod11">nonReserved</link> | &lt;ANY&gt; | &lt;SOME&gt; ) &lt;LPAREN&gt; ( &lt;DISTINCT&gt; | &lt;ALL&gt; )? <link linkend="prod24">expression</link> &lt;RPAREN&gt; ) ) <link linkend="prod66">filterClause</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod67" xreflabel="filterClause"/>filterClause</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod66" xreflabel="filterClause"/>filterClause</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;FILTER&gt; &lt;LPAREN&gt; &lt;WHERE&gt; <link linkend="prod71">booleanPrimary</link> &lt;RPAREN&gt; )?</para></entry></row>
+( &lt;FILTER&gt; &lt;LPAREN&gt; &lt;WHERE&gt; <link linkend="prod70">booleanPrimary</link> &lt;RPAREN&gt; )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod59" xreflabel="from"/>from</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod58" xreflabel="from"/>from</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;FROM&gt; ( <link linkend="prod72">tableReference</link> ( &lt;COMMA&gt; <link linkend="prod72">tableReference</link> )* )</para></entry></row>
+&lt;FROM&gt; ( <link linkend="prod71">tableReference</link> ( &lt;COMMA&gt; <link linkend="prod71">tableReference</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod72" xreflabel="tableReference"/>tableReference</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod71" xreflabel="tableReference"/>tableReference</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;LBRACE&gt; <link linkend="prod11">nonReserved</link> <link linkend="prod73">joinedTable</link> &lt;RBRACE&gt; ) | <link linkend="prod73">joinedTable</link> )</para></entry></row>
+( ( &lt;LBRACE&gt; <link linkend="prod11">nonReserved</link> <link linkend="prod72">joinedTable</link> &lt;RBRACE&gt; ) | <link linkend="prod72">joinedTable</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod73" xreflabel="joinedTable"/>joinedTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod72" xreflabel="joinedTable"/>joinedTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod74">tablePrimary</link> ( ( <link linkend="prod75">crossJoin</link> | <link linkend="prod76">qualifiedJoin</link> ) )*</para></entry></row>
+<link linkend="prod73">tablePrimary</link> ( ( <link linkend="prod74">crossJoin</link> | <link linkend="prod75">qualifiedJoin</link> ) )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod75" xreflabel="crossJoin"/>crossJoin</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod74" xreflabel="crossJoin"/>crossJoin</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;CROSS&gt; | &lt;UNION&gt; ) &lt;JOIN&gt; <link linkend="prod74">tablePrimary</link> )</para></entry></row>
+( ( &lt;CROSS&gt; | &lt;UNION&gt; ) &lt;JOIN&gt; <link linkend="prod73">tablePrimary</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod75" xreflabel="qualifiedJoin"/>qualifiedJoin</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( ( &lt;RIGHT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;LEFT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;FULL&gt; ( &lt;OUTER&gt; )? ) | &lt;INNER&gt; )? &lt;JOIN&gt; <link linkend="prod72">tableReference</link> &lt;ON&gt; <link linkend="prod35">criteria</link> )</para></entry></row>
+( ( ( &lt;RIGHT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;LEFT&gt; ( &lt;OUTER&gt; )? ) | ( &lt;FULL&gt; ( &lt;OUTER&gt; )? ) | &lt;INNER&gt; )? &lt;JOIN&gt; <link linkend="prod71">tableReference</link> &lt;ON&gt; <link linkend="prod34">criteria</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod74" xreflabel="tablePrimary"/>tablePrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod73" xreflabel="tablePrimary"/>tablePrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod77">textTable</link> | <link linkend="prod78">arrayTable</link> | <link linkend="prod79">xmlTable</link> | <link linkend="prod80">unaryFromClause</link> | <link linkend="prod81">subqueryFromClause</link> | ( &lt;LPAREN&gt; <link linkend="prod73">joinedTable</link> &lt;RPAREN&gt; ) ) ( ( &lt;MAKEDEP&gt; ) | ( &lt;MAKENOTDEP&gt; ) )?</para></entry></row>
+( <link linkend="prod76">textTable</link> | <link linkend="prod77">arrayTable</link> | <link linkend="prod78">xmlTable</link> | <link linkend="prod79">unaryFromClause</link> | <link linkend="prod80">subqueryFromClause</link> | ( &lt;LPAREN&gt; <link linkend="prod72">joinedTable</link> &lt;RPAREN&gt; ) ) ( ( &lt;MAKEDEP&gt; ) | ( &lt;MAKENOTDEP&gt; ) )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod81" xreflabel="xmlSerialize"/>xmlSerialize</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;XMLSERIALIZE&gt; &lt;LPAREN&gt; ( <link linkend="prod11">nonReserved</link> )? <link linkend="prod24">expression</link> ( &lt;AS&gt; ( &lt;STRING&gt; | &lt;VARCHAR&gt; | &lt;CLOB&gt; ) )? &lt;RPAREN&gt;</para></entry></row>
 <row>
@@ -660,223 +658,223 @@
 <entry align="left" valign="top"><para>::= 
 &lt;ID&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod78" xreflabel="arrayTable"/>arrayTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod77" xreflabel="arrayTable"/>arrayTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod42">createElementsWithTypes</link> &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod41">createElementsWithTypes</link> &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod77" xreflabel="textTable"/>textTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="textTable"/>textTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod83">textColumn</link> ( &lt;COMMA&gt; <link linkend="prod83">textColumn</link> )* ( &lt;ID&gt; <link linkend="prod69">charVal</link> )? ( ( &lt;ESCAPE&gt; <link linkend="prod69">charVal</link> ) | ( &lt;ID&gt; <link linkend="prod69">charVal</link> ) )? ( &lt;ID&gt; ( <link linkend="prod84">intVal</link> )? )? ( &lt;ID&gt; <link linkend="prod84">intVal</link> )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+&lt;ID&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod82">textColumn</link> ( &lt;COMMA&gt; <link linkend="prod82">textColumn</link> )* ( &lt;ID&gt; <link linkend="prod68">charVal</link> )? ( ( &lt;ESCAPE&gt; <link linkend="prod68">charVal</link> ) | ( &lt;ID&gt; <link linkend="prod68">charVal</link> ) )? ( &lt;ID&gt; ( <link linkend="prod83">intVal</link> )? )? ( &lt;ID&gt; <link linkend="prod83">intVal</link> )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod83" xreflabel="textColumn"/>textColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="textColumn"/>textColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> <link linkend="prod38">dataType</link> ( &lt;ID&gt; <link linkend="prod84">intVal</link> )?</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod37">dataType</link> ( &lt;ID&gt; <link linkend="prod83">intVal</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod85" xreflabel="xmlQuery"/>xmlQuery</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="xmlQuery"/>xmlQuery</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLQUERY&gt; &lt;LPAREN&gt; ( <link linkend="prod86">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod65">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod65">derivedColumn</link> )* )? ( ( &lt;NULL&gt; | <link linkend="prod11">nonReserved</link> ) &lt;ON&gt; <link linkend="prod11">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLQUERY&gt; &lt;LPAREN&gt; ( <link linkend="prod85">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod64">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod64">derivedColumn</link> )* )? ( ( &lt;NULL&gt; | <link linkend="prod11">nonReserved</link> ) &lt;ON&gt; <link linkend="prod11">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod79" xreflabel="xmlTable"/>xmlTable</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod78" xreflabel="xmlTable"/>xmlTable</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLTABLE&gt; &lt;LPAREN&gt; ( <link linkend="prod86">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod65">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod65">derivedColumn</link> )* )? ( &lt;ID&gt; <link linkend="prod87">xmlColumn</link> ( &lt;COMMA&gt; <link linkend="prod87">xmlColumn</link> )* )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
+&lt;XMLTABLE&gt; &lt;LPAREN&gt; ( <link linkend="prod85">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod1">stringVal</link> ( &lt;ID&gt; <link linkend="prod64">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod64">derivedColumn</link> )* )? ( &lt;ID&gt; <link linkend="prod86">xmlColumn</link> ( &lt;COMMA&gt; <link linkend="prod86">xmlColumn</link> )* )? &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod87" xreflabel="xmlColumn"/>xmlColumn</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod86" xreflabel="xmlColumn"/>xmlColumn</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod2">id</link> ( ( &lt;FOR&gt; <link linkend="prod11">nonReserved</link> ) | ( <link linkend="prod38">dataType</link> ( &lt;DEFAULT_KEYWORD&gt; <link linkend="prod24">expression</link> )? ( <link linkend="prod11">nonReserved</link> <link linkend="prod1">stringVal</link> )? ) )</para></entry></row>
+<link linkend="prod2">id</link> ( ( &lt;FOR&gt; <link linkend="prod11">nonReserved</link> ) | ( <link linkend="prod37">dataType</link> ( &lt;DEFAULT_KEYWORD&gt; <link linkend="prod24">expression</link> )? ( <link linkend="prod11">nonReserved</link> <link linkend="prod1">stringVal</link> )? ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="intVal"/>intVal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod83" xreflabel="intVal"/>intVal</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;INTEGERVAL&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod81" xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod80" xreflabel="subqueryFromClause"/>subqueryFromClause</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( &lt;TABLE&gt; )? &lt;LPAREN&gt; ( <link linkend="prod13">queryExpression</link> | <link linkend="prod15">storedProcedure</link> ) &lt;RPAREN&gt; ( &lt;AS&gt; )? <link linkend="prod2">id</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod80" xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod79" xreflabel="unaryFromClause"/>unaryFromClause</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( &lt;ID&gt; ( ( &lt;AS&gt; )? <link linkend="prod2">id</link> )? )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod49" xreflabel="where"/>where</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod48" xreflabel="where"/>where</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;WHERE&gt; <link linkend="prod35">criteria</link></para></entry></row>
+&lt;WHERE&gt; <link linkend="prod34">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod35" xreflabel="criteria"/>criteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod34" xreflabel="criteria"/>criteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod88">compoundCritOr</link></para></entry></row>
+<link linkend="prod87">compoundCritOr</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod88" xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod87" xreflabel="compoundCritOr"/>compoundCritOr</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod89">compoundCritAnd</link> ( &lt;OR&gt; <link linkend="prod89">compoundCritAnd</link> )*</para></entry></row>
+<link linkend="prod88">compoundCritAnd</link> ( &lt;OR&gt; <link linkend="prod88">compoundCritAnd</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod89" xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod88" xreflabel="compoundCritAnd"/>compoundCritAnd</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod90">notCrit</link> ( &lt;AND&gt; <link linkend="prod90">notCrit</link> )*</para></entry></row>
+<link linkend="prod89">notCrit</link> ( &lt;AND&gt; <link linkend="prod89">notCrit</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod90" xreflabel="notCrit"/>notCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod89" xreflabel="notCrit"/>notCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? <link linkend="prod71">booleanPrimary</link></para></entry></row>
+( &lt;NOT&gt; )? <link linkend="prod70">booleanPrimary</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod71" xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod70" xreflabel="booleanPrimary"/>booleanPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod41">translateCriteria</link> | ( <link linkend="prod91">commonValueExpression</link> ( ( <link linkend="prod92">betweenCrit</link> | <link linkend="prod93">matchCrit</link> | <link linkend="prod94">regexMatchCrit</link> | <link linkend="prod95">setCrit</link> | <link linkend="prod96">isNullCrit</link> | <link linkend="prod97">subqueryCompareCriteria</link> | <link linkend="prod98">compareCrit</link> ) )? ) | <link linkend="prod99">existsCriteria</link> | <link linkend="prod37">hasCriteria</link> )</para></entry></row>
+( <link linkend="prod40">translateCriteria</link> | ( <link linkend="prod90">commonValueExpression</link> ( ( <link linkend="prod91">betweenCrit</link> | <link linkend="prod92">matchCrit</link> | <link linkend="prod93">regexMatchCrit</link> | <link linkend="prod94">setCrit</link> | <link linkend="prod95">isNullCrit</link> | <link linkend="prod96">subqueryCompareCriteria</link> | <link linkend="prod97">compareCrit</link> ) )? ) | <link linkend="prod98">existsCriteria</link> | <link linkend="prod36">hasCriteria</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod100" xreflabel="operator"/>operator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod99" 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="prod98" xreflabel="compareCrit"/>compareCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod97" xreflabel="compareCrit"/>compareCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod100">operator</link> <link linkend="prod91">commonValueExpression</link></para></entry></row>
+<link linkend="prod99">operator</link> <link linkend="prod90">commonValueExpression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod101" xreflabel="subquery"/>subquery</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod100" xreflabel="subquery"/>subquery</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;LPAREN&gt; ( <link linkend="prod13">queryExpression</link> | ( <link linkend="prod15">storedProcedure</link> ) ) &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod102" xreflabel="subqueryAndHint"/>subqueryAndHint</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod101" xreflabel="subqueryAndHint"/>subqueryAndHint</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod101">subquery</link></para></entry></row>
+<link linkend="prod100">subquery</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod97" xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod96" xreflabel="subqueryCompareCriteria"/>subqueryCompareCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod100">operator</link> ( &lt;ANY&gt; | &lt;SOME&gt; | &lt;ALL&gt; ) <link linkend="prod101">subquery</link></para></entry></row>
+<link linkend="prod99">operator</link> ( &lt;ANY&gt; | &lt;SOME&gt; | &lt;ALL&gt; ) <link linkend="prod100">subquery</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod93" xreflabel="matchCrit"/>matchCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod92" xreflabel="matchCrit"/>matchCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? ( &lt;LIKE&gt; | ( &lt;SIMILAR&gt; &lt;TO&gt; ) ) <link linkend="prod91">commonValueExpression</link> ( &lt;ESCAPE&gt; <link linkend="prod69">charVal</link> | ( &lt;LBRACE&gt; &lt;ESCAPE&gt; <link linkend="prod69">charVal</link> &lt;RBRACE&gt; ) )?</para></entry></row>
+( &lt;NOT&gt; )? ( &lt;LIKE&gt; | ( &lt;SIMILAR&gt; &lt;TO&gt; ) ) <link linkend="prod90">commonValueExpression</link> ( &lt;ESCAPE&gt; <link linkend="prod68">charVal</link> | ( &lt;LBRACE&gt; &lt;ESCAPE&gt; <link linkend="prod68">charVal</link> &lt;RBRACE&gt; ) )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod94" xreflabel="regexMatchCrit"/>regexMatchCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod93" xreflabel="regexMatchCrit"/>regexMatchCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? &lt;LIKE_REGEX&gt; <link linkend="prod91">commonValueExpression</link></para></entry></row>
+( &lt;NOT&gt; )? &lt;LIKE_REGEX&gt; <link linkend="prod90">commonValueExpression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod69" xreflabel="charVal"/>charVal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod68" 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="prod92" xreflabel="betweenCrit"/>betweenCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod91" xreflabel="betweenCrit"/>betweenCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? &lt;BETWEEN&gt; <link linkend="prod91">commonValueExpression</link> &lt;AND&gt; <link linkend="prod91">commonValueExpression</link></para></entry></row>
+( &lt;NOT&gt; )? &lt;BETWEEN&gt; <link linkend="prod90">commonValueExpression</link> &lt;AND&gt; <link linkend="prod90">commonValueExpression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod96" xreflabel="isNullCrit"/>isNullCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod95" 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="prod95" xreflabel="setCrit"/>setCrit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod94" xreflabel="setCrit"/>setCrit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;NOT&gt; )? &lt;IN&gt; ( ( <link linkend="prod102">subqueryAndHint</link> ) | ( &lt;LPAREN&gt; <link linkend="prod91">commonValueExpression</link> ( &lt;COMMA&gt; <link linkend="prod91">commonValueExpression</link> )* &lt;RPAREN&gt; ) )</para></entry></row>
+( &lt;NOT&gt; )? &lt;IN&gt; ( ( <link linkend="prod101">subqueryAndHint</link> ) | ( &lt;LPAREN&gt; <link linkend="prod90">commonValueExpression</link> ( &lt;COMMA&gt; <link linkend="prod90">commonValueExpression</link> )* &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod99" xreflabel="existsCriteria"/>existsCriteria</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod98" xreflabel="existsCriteria"/>existsCriteria</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;EXISTS&gt; <link linkend="prod102">subqueryAndHint</link></para></entry></row>
+&lt;EXISTS&gt; <link linkend="prod101">subqueryAndHint</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod60" xreflabel="groupBy"/>groupBy</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod59" xreflabel="groupBy"/>groupBy</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;GROUP&gt; &lt;BY&gt; <link linkend="prod48">expressionList</link></para></entry></row>
+&lt;GROUP&gt; &lt;BY&gt; <link linkend="prod47">expressionList</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod61" xreflabel="having"/>having</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod60" xreflabel="having"/>having</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;HAVING&gt; <link linkend="prod35">criteria</link></para></entry></row>
+&lt;HAVING&gt; <link linkend="prod34">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="orderby"/>orderby</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod52" xreflabel="orderby"/>orderby</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;ORDER&gt; &lt;BY&gt; <link linkend="prod103">sortSpecification</link> ( &lt;COMMA&gt; <link linkend="prod103">sortSpecification</link> )*</para></entry></row>
+&lt;ORDER&gt; &lt;BY&gt; <link linkend="prod102">sortSpecification</link> ( &lt;COMMA&gt; <link linkend="prod102">sortSpecification</link> )*</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod103" xreflabel="sortSpecification"/>sortSpecification</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod102" xreflabel="sortSpecification"/>sortSpecification</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod104">sortKey</link> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="prod11">nonReserved</link> <link linkend="prod11">nonReserved</link> )?</para></entry></row>
+<link linkend="prod103">sortKey</link> ( &lt;ASC&gt; | &lt;DESC&gt; )? ( <link linkend="prod11">nonReserved</link> <link linkend="prod11">nonReserved</link> )?</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod104" xreflabel="sortKey"/>sortKey</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod103" xreflabel="sortKey"/>sortKey</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod24">expression</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod105" xreflabel="intParam"/>intParam</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod104" xreflabel="intParam"/>intParam</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod84">intVal</link> | &lt;QMARK&gt; )</para></entry></row>
+( <link linkend="prod83">intVal</link> | &lt;QMARK&gt; )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod54" xreflabel="limit"/>limit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod53" xreflabel="limit"/>limit</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;LIMIT&gt; <link linkend="prod105">intParam</link> ( &lt;COMMA&gt; <link linkend="prod105">intParam</link> )? ) | ( &lt;OFFSET&gt; <link linkend="prod105">intParam</link> ( &lt;ROW&gt; | &lt;ROWS&gt; ) ( <link linkend="prod106">fetchLimit</link> )? ) | ( <link linkend="prod106">fetchLimit</link> ) )</para></entry></row>
+( ( &lt;LIMIT&gt; <link linkend="prod104">intParam</link> ( &lt;COMMA&gt; <link linkend="prod104">intParam</link> )? ) | ( &lt;OFFSET&gt; <link linkend="prod104">intParam</link> ( &lt;ROW&gt; | &lt;ROWS&gt; ) ( <link linkend="prod105">fetchLimit</link> )? ) | ( <link linkend="prod105">fetchLimit</link> ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod106" xreflabel="fetchLimit"/>fetchLimit</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod105" xreflabel="fetchLimit"/>fetchLimit</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;FETCH&gt; <link linkend="prod11">nonReserved</link> ( <link linkend="prod105">intParam</link> )? ( &lt;ROW&gt; | &lt;ROWS&gt; ) &lt;ONLY&gt;</para></entry></row>
+&lt;FETCH&gt; <link linkend="prod11">nonReserved</link> ( <link linkend="prod104">intParam</link> )? ( &lt;ROW&gt; | &lt;ROWS&gt; ) &lt;ONLY&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod45" xreflabel="option"/>option</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod44" xreflabel="option"/>option</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;OPTION&gt; ( &lt;MAKEDEP&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* | &lt;MAKENOTDEP&gt; <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* | &lt;NOCACHE&gt; ( <link linkend="prod2">id</link> ( &lt;COMMA&gt; <link linkend="prod2">id</link> )* )? )*</para></entry></row>
 <row>
 <entry align="right" valign="top"><para><anchor id="prod24" xreflabel="expression"/>expression</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod35">criteria</link></para></entry></row>
+<link linkend="prod34">criteria</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod91" xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod90" xreflabel="commonValueExpression"/>commonValueExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod107">plusExpression</link> ( &lt;CONCAT_OP&gt; <link linkend="prod107">plusExpression</link> )* )</para></entry></row>
+( <link linkend="prod106">plusExpression</link> ( &lt;CONCAT_OP&gt; <link linkend="prod106">plusExpression</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod107" xreflabel="plusExpression"/>plusExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod106" xreflabel="plusExpression"/>plusExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod108">timesExpression</link> ( <link linkend="prod109">plusOperator</link> <link linkend="prod108">timesExpression</link> )* )</para></entry></row>
+( <link linkend="prod107">timesExpression</link> ( <link linkend="prod108">plusOperator</link> <link linkend="prod107">timesExpression</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod109" xreflabel="plusOperator"/>plusOperator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod108" 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="prod108" xreflabel="timesExpression"/>timesExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod107" xreflabel="timesExpression"/>timesExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-( <link linkend="prod110">valueExpressionPrimary</link> ( <link linkend="prod111">timesOperator</link> <link linkend="prod110">valueExpressionPrimary</link> )* )</para></entry></row>
+( <link linkend="prod109">valueExpressionPrimary</link> ( <link linkend="prod110">timesOperator</link> <link linkend="prod109">valueExpressionPrimary</link> )* )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod111" xreflabel="timesOperator"/>timesOperator</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod110" 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="prod110" xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod109" xreflabel="valueExpressionPrimary"/>valueExpressionPrimary</para></entry>
 <entry align="left" valign="top"><para>::= 
-( &lt;QMARK&gt; | &lt;POS_REF&gt; | <link linkend="prod112">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod11">nonReserved</link> <link linkend="prod113">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod68">textAgg</link> ( <link linkend="prod114">windowSpecification</link> )? ) | ( <link linkend="prod70">aggregateSymbol</link> ( <link linkend="prod114">windowSpecification</link> )? ) | ( <link linkend="prod70">aggregateSymbol</link> ( <link linkend="prod114">windowSpecification</link> )? ) | <link linkend="prod66">orderedAgg</link> ( <link linkend="prod114">windowSpecification</link> )? | ( <link linkend="prod70">aggregateSymbol</link> <link linkend="prod114">windowSpecification</link> ) | ( <link linkend="prod113">function</link> ) | ( &lt;ID&gt; ( &lt;LSBRACE&gt; <link linkend="prod84">intVal</link> &lt;RSBRACE&gt; )? ) | <link linkend="prod101">subquery</link> | ( &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;RPAREN&gt; ( &lt;LSBRACE&gt; <link!
  linkend="prod84">intVal</link> &lt;RSBRACE&gt; )? ) | <link linkend="prod115">searchedCaseExpression</link> | <link linkend="prod116">caseExpression</link> )</para></entry></row>
+( &lt;QMARK&gt; | &lt;POS_REF&gt; | <link linkend="prod111">literal</link> | ( &lt;LBRACE&gt; <link linkend="prod11">nonReserved</link> <link linkend="prod112">function</link> &lt;RBRACE&gt; ) | ( <link linkend="prod67">textAgg</link> ( <link linkend="prod113">windowSpecification</link> )? ) | ( <link linkend="prod69">aggregateSymbol</link> ( <link linkend="prod113">windowSpecification</link> )? ) | ( <link linkend="prod69">aggregateSymbol</link> ( <link linkend="prod113">windowSpecification</link> )? ) | <link linkend="prod65">orderedAgg</link> ( <link linkend="prod113">windowSpecification</link> )? | ( <link linkend="prod69">aggregateSymbol</link> <link linkend="prod113">windowSpecification</link> ) | ( <link linkend="prod112">function</link> ) | ( &lt;ID&gt; ( &lt;LSBRACE&gt; <link linkend="prod83">intVal</link> &lt;RSBRACE&gt; )? ) | <link linkend="prod100">subquery</link> | ( &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;RPAREN&gt; ( &lt;LSBRACE&gt; <link!
  linkend="prod83">intVal</link> &lt;RSBRACE&gt; )? ) | <link linkend="prod114">searchedCaseExpression</link> | <link linkend="prod115">caseExpression</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod114" xreflabel="windowSpecification"/>windowSpecification</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod113" xreflabel="windowSpecification"/>windowSpecification</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;OVER&gt; &lt;LPAREN&gt; ( &lt;PARTITION&gt; &lt;BY&gt; <link linkend="prod48">expressionList</link> )? ( <link linkend="prod53">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
+&lt;OVER&gt; &lt;LPAREN&gt; ( &lt;PARTITION&gt; &lt;BY&gt; <link linkend="prod47">expressionList</link> )? ( <link linkend="prod52">orderby</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod116" xreflabel="caseExpression"/>caseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod115" xreflabel="caseExpression"/>caseExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;CASE&gt; <link linkend="prod24">expression</link> ( &lt;WHEN&gt; <link linkend="prod24">expression</link> &lt;THEN&gt; <link linkend="prod24">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod24">expression</link> )? &lt;END&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod115" xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod114" xreflabel="searchedCaseExpression"/>searchedCaseExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;CASE&gt; ( &lt;WHEN&gt; <link linkend="prod35">criteria</link> &lt;THEN&gt; <link linkend="prod24">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod24">expression</link> )? &lt;END&gt;</para></entry></row>
+&lt;CASE&gt; ( &lt;WHEN&gt; <link linkend="prod34">criteria</link> &lt;THEN&gt; <link linkend="prod24">expression</link> )+ ( &lt;ELSE&gt; <link linkend="prod24">expression</link> )? &lt;END&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod113" xreflabel="function"/>function</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod112" xreflabel="function"/>function</para></entry>
 <entry align="left" valign="top"><para>::= 
-( ( &lt;CONVERT&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;COMMA&gt; <link linkend="prod38">dataType</link> &lt;RPAREN&gt; ) | ( &lt;CAST&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;AS&gt; <link linkend="prod38">dataType</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;FROM&gt; <link linkend="prod24">expression</link> ( &lt;FOR&gt; <link linkend="prod24">expression</link> )? &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; ( &lt;YEAR&gt; | &lt;MONTH&gt; | &lt;DAY&gt; | &lt;HOUR&gt; | &lt;MINUTE&gt; | &lt;SECOND&gt; ) &lt;FROM&gt; <link linkend="prod24">expression</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; ( ( ( ( &lt;LEADING&gt; | &lt;TRAILING&gt; | &lt;BOTH&gt; ) ( <link linkend="prod24">expression</link> )? ) | <link linkend="prod24">expression</link> ) &lt;FROM&gt; )? <link linkend!
 ="prod24">expression</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;COMMA&gt; <link linkend="prod117">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod118">intervalType</link> &lt;COMMA&gt; <link linkend="prod24">expression</link> &lt;COMMA&gt; <link linkend="prod24">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod119">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="prod48">expressionList</link> )? &lt;RPAREN&gt; ) | ( ( &lt;TRANSLATE&gt; | &lt;INSERT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod48">expressionList</link> )? &lt;RPAREN&gt; ) | <link linkend="prod120">xmlParse</link> | <link linkend="prod121">xmlElement</link> | ( &l!
 t;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod122!
 ">idExpr
ession</link> | <link linkend="prod122">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod24">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod123">xmlForest</link> | <link linkend="prod82">xmlSerialize</link> | <link linkend="prod85">xmlQuery</link> | ( <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod48">expressionList</link> )? &lt;RPAREN&gt; ) )</para></entry></row>
+( ( &lt;CONVERT&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;COMMA&gt; <link linkend="prod37">dataType</link> &lt;RPAREN&gt; ) | ( &lt;CAST&gt; &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;AS&gt; <link linkend="prod37">dataType</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;FROM&gt; <link linkend="prod24">expression</link> ( &lt;FOR&gt; <link linkend="prod24">expression</link> )? &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; ( &lt;YEAR&gt; | &lt;MONTH&gt; | &lt;DAY&gt; | &lt;HOUR&gt; | &lt;MINUTE&gt; | &lt;SECOND&gt; ) &lt;FROM&gt; <link linkend="prod24">expression</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; ( ( ( ( &lt;LEADING&gt; | &lt;TRAILING&gt; | &lt;BOTH&gt; ) ( <link linkend="prod24">expression</link> )? ) | <link linkend="prod24">expression</link> ) &lt;FROM&gt; )? <link linkend!
 ="prod24">expression</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod24">expression</link> &lt;COMMA&gt; <link linkend="prod116">stringConstant</link> &lt;RPAREN&gt; ) | ( <link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod117">intervalType</link> &lt;COMMA&gt; <link linkend="prod24">expression</link> &lt;COMMA&gt; <link linkend="prod24">expression</link> &lt;RPAREN&gt; ) | <link linkend="prod118">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="prod47">expressionList</link> )? &lt;RPAREN&gt; ) | ( ( &lt;TRANSLATE&gt; | &lt;INSERT&gt; ) &lt;LPAREN&gt; ( <link linkend="prod47">expressionList</link> )? &lt;RPAREN&gt; ) | <link linkend="prod119">xmlParse</link> | <link linkend="prod120">xmlElement</link> | ( &l!
 t;XMLPI&gt; &lt;LPAREN&gt; ( &lt;ID&gt; <link linkend="prod121!
 ">idExpr
ession</link> | <link linkend="prod121">idExpression</link> ) ( &lt;COMMA&gt; <link linkend="prod24">expression</link> )? &lt;RPAREN&gt; ) | <link linkend="prod122">xmlForest</link> | <link linkend="prod81">xmlSerialize</link> | <link linkend="prod84">xmlQuery</link> | ( <link linkend="prod2">id</link> &lt;LPAREN&gt; ( <link linkend="prod47">expressionList</link> )? &lt;RPAREN&gt; ) )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod117" xreflabel="stringConstant"/>stringConstant</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod116" 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="prod120" xreflabel="xmlParse"/>xmlParse</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod119" xreflabel="xmlParse"/>xmlParse</para></entry>
 <entry align="left" valign="top"><para>::= 
 &lt;XMLPARSE&gt; &lt;LPAREN&gt; <link linkend="prod11">nonReserved</link> <link linkend="prod24">expression</link> ( <link linkend="prod11">nonReserved</link> )? &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod119" xreflabel="queryString"/>queryString</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod118" xreflabel="queryString"/>queryString</para></entry>
 <entry align="left" valign="top"><para>::= 
-<link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod24">expression</link> ( &lt;COMMA&gt; <link linkend="prod65">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+<link linkend="prod11">nonReserved</link> &lt;LPAREN&gt; <link linkend="prod24">expression</link> ( &lt;COMMA&gt; <link linkend="prod64">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod121" xreflabel="xmlElement"/>xmlElement</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod120" 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="prod86">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod124">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod24">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="prod85">xmlNamespaces</link> )? ( &lt;COMMA&gt; <link linkend="prod123">xmlAttributes</link> )? ( &lt;COMMA&gt; <link linkend="prod24">expression</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod124" xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod123" xreflabel="xmlAttributes"/>xmlAttributes</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLATTRIBUTES&gt; &lt;LPAREN&gt; <link linkend="prod65">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod65">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLATTRIBUTES&gt; &lt;LPAREN&gt; <link linkend="prod64">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod64">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod123" xreflabel="xmlForest"/>xmlForest</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod122" xreflabel="xmlForest"/>xmlForest</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLFOREST&gt; &lt;LPAREN&gt; ( <link linkend="prod86">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod65">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod65">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLFOREST&gt; &lt;LPAREN&gt; ( <link linkend="prod85">xmlNamespaces</link> &lt;COMMA&gt; )? <link linkend="prod64">derivedColumn</link> ( &lt;COMMA&gt; <link linkend="prod64">derivedColumn</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod86" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod85" xreflabel="xmlNamespaces"/>xmlNamespaces</para></entry>
 <entry align="left" valign="top"><para>::= 
-&lt;XMLNAMESPACES&gt; &lt;LPAREN&gt; <link linkend="prod125">namespaceItem</link> ( &lt;COMMA&gt; <link linkend="prod125">namespaceItem</link> )* &lt;RPAREN&gt;</para></entry></row>
+&lt;XMLNAMESPACES&gt; &lt;LPAREN&gt; <link linkend="prod124">namespaceItem</link> ( &lt;COMMA&gt; <link linkend="prod124">namespaceItem</link> )* &lt;RPAREN&gt;</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod125" xreflabel="namespaceItem"/>namespaceItem</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod124" 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>
@@ -888,7 +886,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="prod122" xreflabel="idExpression"/>idExpression</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod121" xreflabel="idExpression"/>idExpression</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod2">id</link></para></entry></row>
 <row>
@@ -896,15 +894,15 @@
 <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="prod38" xreflabel="dataType"/>dataType</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod37" xreflabel="dataType"/>dataType</para></entry>
 <entry align="left" valign="top"><para>::= 
 <link linkend="prod22">dataTypeString</link></para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod118" xreflabel="intervalType"/>intervalType</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod117" xreflabel="intervalType"/>intervalType</para></entry>
 <entry align="left" valign="top"><para>::= 
 ( <link linkend="prod11">nonReserved</link> )</para></entry></row>
 <row>
-<entry align="right" valign="top"><para><anchor id="prod112" xreflabel="literal"/>literal</para></entry>
+<entry align="right" valign="top"><para><anchor id="prod111" 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/procedures.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/procedures.xml	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/procedures.xml	2011-08-10 20:06:04 UTC (rev 3372)
@@ -218,12 +218,40 @@
   	  </section>
     </section>
     <section>
+      <title>Compound Statement</title>
+      <para>A compound statement or block logically groups a series of statements.  Temporary tables and variables created in a compound statement are local only to that block are destroyed when exiting the block.</para>
+      <para>
+        Usage:
+        <synopsis label="Usage" >[label :] BEGIN [[NOT] ATOMIC]  
+  statement*
+END</synopsis>
+		<note><para>When a block is expected by a IF, LOOP, WHILE, etc. a single statement is also accepted by the parser.  Even though the block BEGIN/END are not expected, the statement will execute as if wrapped in a BEGIN/END pair.</para></note>
+      </para>
+      <itemizedlist>
+	 	<para>Syntax Rules</para>
+	    <listitem><para>IF NOT ATOMIC or no ATOMIC clause is specificed, the block will be executed non-atomically.</para>
+	    </listitem>
+	    <listitem><para>IF ATOMIC the block must execute atomically.  If a transaction is already associated with the thread, no aditional action will be taken - savepoints and/or sub-transactions are not currrently used.  Otherwise a transaction will be associated with the execution of the block.</para>
+	    </listitem>
+	    <listitem><para>The label must not be the same as any other label used in statements containing this one.</para>
+	    </listitem>
+      </itemizedlist>
+    </section>
+    <section>
       <title>If Statement</title>
       <para>An IF statement evaluates a condition and executes either
-        one of two blocks depending on the result. You can nest IF
+        one of two statements depending on the result. You can nest IF
         statements to create complex branching logic. A dependent ELSE
-        statement will execute its block of code only if the IF statement
+        statement will execute its statement only if the IF statement
         evaluates to false.</para>
+      <para>
+        Usage:
+        <synopsis label="Usage" >IF (criteria) 
+  block
+[ELSE
+  block]
+END</synopsis>
+      </para>
       <example>
         <title>Example If Statement</title>
         <programlisting>IF ( var1 = 'North America') 
@@ -234,45 +262,90 @@
   ...statement... 
 END</programlisting>
       </example>
-      <note>
+      <tip>
         <para>
           NULL values should be considered in the criteria of an IF statement.  IS NULL criteria can be used to detect the presense of a NULL value.  
         </para>
-      </note>
+      </tip>
     </section>
     <section>
       <title>Loop Statement</title>
       <para>A LOOP statement is an iterative control construct that is used to cursor through a result set.</para>
       <para>
         Usage:
-        <synopsis label="Usage" >LOOP ON &lt;select statement&gt; AS &lt;cursorname&gt; 
-BEGIN 
-  ...
-END</synopsis>
+        <synopsis label="Usage" >[label :] LOOP ON &lt;select statement&gt; AS &lt;cursorname&gt; 
+  block</synopsis>
       </para>
+      <itemizedlist>
+	 	<para>Syntax Rules</para>
+	    <listitem><para>The label must not be the same as any other label used in statements containing this one.</para>
+	    </listitem>
+      </itemizedlist>
     </section>
     <section>
       <title>While Statement</title>
-      <para>A WHILE statement is an iterative control construct that is used to execute a set of statements repeatedly whenever a specified condition is met.</para>
+      <para>A WHILE statement is an iterative control construct that is used to execute a block repeatedly whenever a specified condition is met.</para>
       <para>
         Usage:
-        <synopsis label="Usage" >WHILE &lt;criteria&gt; 
-BEGIN 
-  ...
-END</synopsis>
+        <synopsis label="Usage" >[label :] WHILE &lt;criteria&gt; 
+  block</synopsis>
       </para>
+      <itemizedlist>
+	 	<para>Syntax Rules</para>
+	    <listitem><para>The label must not be the same as any other label used in statements containing this one.</para>
+	    </listitem>
+      </itemizedlist>
     </section>
     <section>
       <title>Continue Statement</title>
       <para>A CONTINUE statement is used inside a LOOP or WHILE construct to continue with the next loop by skipping over the rest of the statements in the loop. It must be used inside a LOOP or WHILE statement.</para>
+      <para>
+        Usage:
+        <synopsis label="Usage" >CONTINUE [label];</synopsis>
+      </para>
+      <itemizedlist>
+	 	<para>Syntax Rules</para>
+	    <listitem><para>If the label is specified, it must exist on a containing LOOP or WHILE statement.</para>
+	    </listitem>
+	    <listitem><para>If no label is specified, the statement will affect the closest containing LOOP or WHILE statement.</para>
+	    </listitem>
+      </itemizedlist>
     </section>
     <section>
       <title>Break Statement</title>
       <para>A BREAK statement is used inside a LOOP or WHILE construct to break from the loop. It must be used inside a LOOP or WHILE statement.</para>
+      <para>
+        Usage:
+        <synopsis label="Usage" >BREAK [label];</synopsis>
+      </para>
+      <itemizedlist>
+	 	<para>Syntax Rules</para>
+	    <listitem><para>If the label is specified, it must exist on a containing LOOP or WHILE statement.</para>
+	    </listitem>
+	    <listitem><para>If no label is specified, the statement will affect the closest containing LOOP or WHILE statement.</para>
+	    </listitem>
+      </itemizedlist>
     </section>
     <section>
+      <title>Leave Statement</title>
+      <para>A LEAVE statement is used inside a compound, LOOP, or WHILE construct to leave to the specified level.</para>
+      <para>
+        Usage:
+        <synopsis label="Usage" >LEAVE label;</synopsis>
+      </para>
+      <itemizedlist>
+	 	<para>Syntax Rules</para>
+	    <listitem><para>The label must exist on a containing compound statement, LOOP, or WHILE statement.</para>
+	    </listitem>
+      </itemizedlist>
+    </section>
+    <section>
       <title>Error Statement</title>
       <para>An ERROR statement declares that the procedure has entered an error state and should abort. This statement will also roll back the current transaction, if one exists. Any valid expression can be specified after the ERROR keyword.</para>
+      <para>
+        Usage:
+        <synopsis label="Usage" >ERROR message;</synopsis>
+      </para>
       <example>
         <title>Example Error Statement</title>
         <programlisting>ERROR 'Invalid input value: ' || nvl(Acct.GetBalance.AcctID, 'null');</programlisting>
@@ -292,13 +365,10 @@
       <para>
         Usage:
         <synopsis label="Usage" >CREATE VIRTUAL PROCEDURE 
-BEGIN 
-  ...
-END</synopsis>
+block</synopsis>
       </para>
       <para>The CREATE VIRTUAL PROCEDURE line demarcates the beginning of
-        the procedure. The BEGIN and END keywords are used to denote block
-        boundaries. Within the body of the procedure, any valid <link linkend="procedure_language">statement</link> may be used.
+        the procedure. Within the body of the procedure, any valid <link linkend="procedure_language">statement</link> may be used.
       </para>
       <para>There is no explict cursoring or return statement, rather the last command statement executed in the procedure that returns a result set will be
         returned as the result. The output of that statement must match the
@@ -462,7 +532,7 @@
     	There may only be 1 FOR EACH ROW procedure for each INSERT, UPDATE, or DELETE operation against a view.  FOR EACH ROW update procedures can also be used to emulate BEFORE/AFTER each row triggers while still retaining the ability to perform an inherent update.  
     	This BEFORE/AFTER trigger behavior with an inherent update can be achieved by creating an additional updatable view over the target view with update proceudres of the form:
 		<programlisting lang="sql">FOR EACH ROW
-	BEGIN
+	BEGIN ATOMIC
 	--before row logic
 	
 	--default insert/update/delete against the target view
@@ -476,13 +546,16 @@
 	      <para>
 	        Usage:
 	        <synopsis label="Usage" >FOR EACH ROW 
-	BEGIN 
+	BEGIN ATOMIC
 	  ...
 	END</synopsis>
 	      </para>
 	      <para>The BEGIN and END keywords are used to denote block
 	        boundaries. Within the body of the procedure, any valid <link linkend="procedure_language">statement</link> may be used.
 	      </para>
+	      <note>
+	      <para>The use of the atomic keyword is currently optional for backward compatibility, but unlike a normal block, the default for instead of triggers is atomic.</para>
+	      </note>
 	    </section>
 	    <section>
 	      <title>Special Variables</title>

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -106,11 +106,11 @@
         tgtCaps.setCapabilitySupport(Capability.CRITERIA_SIMILAR, srcCaps.supportsSimilarTo());
         tgtCaps.setCapabilitySupport(Capability.CRITERIA_LIKE_REGEX, srcCaps.supportsLikeRegex());
         
-        List functions = srcCaps.getSupportedFunctions();
+        List<String> functions = srcCaps.getSupportedFunctions();
         if(functions != null && functions.size() > 0) {
-            Iterator iter = functions.iterator();
+            Iterator<String> iter = functions.iterator();
             while(iter.hasNext()) {
-                String func = (String) iter.next();
+                String func = iter.next();
                 tgtCaps.setFunctionSupport(func.toLowerCase(), true);
             }
         }

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -253,6 +253,8 @@
         this.context.setSession(workContext.getSession());
         this.context.setRequestId(this.requestId);
         this.context.setDQPWorkContext(this.workContext);
+        this.context.setTransactionService(this.transactionService);
+        this.context.setTransactionContext(this.transactionContext);
     }
     
     @Override

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -36,8 +36,7 @@
 import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
 import org.teiid.query.processor.ProcessorPlan;
 import org.teiid.query.processor.proc.AssignmentInstruction;
-import org.teiid.query.processor.proc.BreakInstruction;
-import org.teiid.query.processor.proc.ContinueInstruction;
+import org.teiid.query.processor.proc.BranchingInstruction;
 import org.teiid.query.processor.proc.CreateCursorResultSetInstruction;
 import org.teiid.query.processor.proc.ErrorInstruction;
 import org.teiid.query.processor.proc.ExecDynamicSqlInstruction;
@@ -53,6 +52,7 @@
 import org.teiid.query.sql.lang.StoredProcedure;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
+import org.teiid.query.sql.proc.BranchingStatement;
 import org.teiid.query.sql.proc.CommandStatement;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
 import org.teiid.query.sql.proc.IfStatement;
@@ -148,7 +148,8 @@
         // Generate program and add instructions
         // this program represents the block on the procedure
         // instruction in the program would correspond to statements in the block
-        Program programBlock = new Program();
+        Program programBlock = new Program(block.isAtomic());
+        programBlock.setLabel(block.getLabel());
 
 		// plan each statement in the block
         for (Statement statement : block.getStatements()) {
@@ -281,19 +282,14 @@
 				break;
             }
             case Statement.TYPE_BREAK:
-            {
-                if(debug) {
-                	analysisRecord.println("\tBREAK STATEMENT:\n" + statement); //$NON-NLS-1$
-                }
-                instruction = new BreakInstruction();
-                break;
-            }
             case Statement.TYPE_CONTINUE:
+            case Statement.TYPE_LEAVE:
             {
+            	BranchingStatement bs = (BranchingStatement)statement;
                 if(debug) {
-                	analysisRecord.println("\tCONTINUE STATEMENT:\n" + statement); //$NON-NLS-1$
+                	analysisRecord.println("\t" + statement); //$NON-NLS-1$
                 }
-                instruction = new ContinueInstruction();
+                instruction = new BranchingInstruction(bs);
                 break;
             }
             case Statement.TYPE_LOOP:
@@ -307,7 +303,7 @@
                 ProcessorPlan commandPlan = loopStmt.getCommand().getProcessorPlan();
 
                 Program loopProgram = planBlock(parentProcCommand, loopStmt.getBlock(), metadata, debug, idGenerator, capFinder, analysisRecord, context);
-                instruction = new LoopInstruction(loopProgram, rsName, commandPlan);
+                instruction = new LoopInstruction(loopProgram, rsName, commandPlan, loopStmt.getLabel());
                 break;
             }
             case Statement.TYPE_WHILE:
@@ -317,7 +313,7 @@
                 if(debug) {
                 	analysisRecord.println("\tWHILE STATEMENT:\n" + statement); //$NON-NLS-1$
                 }
-                instruction = new WhileInstruction(whileProgram, whileStmt.getCondition());
+                instruction = new WhileInstruction(whileProgram, whileStmt.getCondition(), whileStmt.getLabel());
                 break;
             }
 			default:

Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -40,7 +40,9 @@
 import org.teiid.query.sql.lang.QueryCommand;
 import org.teiid.query.sql.lang.SetQuery;
 import org.teiid.query.sql.lang.ExistsCriteria.SubqueryHint;
+import org.teiid.query.sql.proc.Block;
 import org.teiid.query.sql.proc.CriteriaSelector;
+import org.teiid.query.sql.proc.Statement;
 
 public class SQLParserUtil {
 	
@@ -319,4 +321,14 @@
         return setQuery;
     }
     
+    static Block asBlock(Statement stmt) {
+    	if (stmt == null) {
+    		return null;
+    	}
+    	if (stmt instanceof Block) {
+    		return (Block)stmt;
+    	}
+    	return new Block(stmt);
+    }
+    
 }

Added: trunk/engine/src/main/java/org/teiid/query/processor/proc/BranchingInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/BranchingInstruction.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/BranchingInstruction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -0,0 +1,78 @@
+/*
+ * 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.processor.proc;
+
+import org.teiid.client.plan.PlanNode;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.query.sql.proc.BranchingStatement;
+import org.teiid.query.sql.proc.BranchingStatement.BranchingMode;
+
+/**
+ * <p>This {@link ProgramInstruction} continue with the next loop when processed</p>.
+ */
+public class BranchingInstruction extends ProgramInstruction {
+	
+	private BranchingStatement bs;
+	
+    public BranchingInstruction(BranchingStatement bs) {
+    	this.bs = bs;
+	}
+
+	public String toString() {
+        return bs.toString();
+    }
+
+    public void process(ProcedurePlan env) throws TeiidComponentException {
+        Program parentProgram = env.peek();
+        
+        //find the parent program that contains the loop/while instruction
+        while(true){
+        	if (bs.getMode() == BranchingMode.LEAVE && bs.getLabel().equalsIgnoreCase(parentProgram.getLabel())) {
+        		env.pop(true);
+        		break;
+        	}
+            if(parentProgram.getCurrentInstruction() instanceof RepeatedInstruction){
+            	if (bs.getLabel() == null) {
+            		break;
+            	}
+            	RepeatedInstruction ri = (RepeatedInstruction)parentProgram.getCurrentInstruction();
+            	if (bs.getLabel().equalsIgnoreCase(ri.getLabel())) {
+            		break;
+            	}
+            }
+            env.pop(true); 
+            parentProgram = env.peek();
+        } 
+        
+        if (bs.getMode() != BranchingMode.CONTINUE) {
+        	env.incrementProgramCounter();
+        }
+    }
+    
+    public PlanNode getDescriptionProperties() {
+        return new PlanNode(bs.toString());
+    }
+    
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/proc/BranchingInstruction.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Deleted: trunk/engine/src/main/java/org/teiid/query/processor/proc/BreakInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/BreakInstruction.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/BreakInstruction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -1,49 +0,0 @@
-/*
- * 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.processor.proc;
-
-import org.teiid.client.plan.PlanNode;
-import org.teiid.core.TeiidComponentException;
-
-
-/**
- * <p>This {@link ProgramInstruction} break from a loop when processed</p>.
- */
-public class BreakInstruction extends ContinueInstruction {
-
-    public String toString() {
-        return "BREAK INSTRUCTION"; //$NON-NLS-1$
-    }
-
-    public void process(ProcedurePlan env) throws TeiidComponentException {
-        super.process(env);
-        env.incrementProgramCounter();
-    }
-
-    public PlanNode getDescriptionProperties() {
-        return new PlanNode("BREAK"); //$NON-NLS-1$
-    }
-
-}

Deleted: trunk/engine/src/main/java/org/teiid/query/processor/proc/ContinueInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ContinueInstruction.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ContinueInstruction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -1,55 +0,0 @@
-/*
- * 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.processor.proc;
-
-import org.teiid.client.plan.PlanNode;
-import org.teiid.core.TeiidComponentException;
-
-/**
- * <p>This {@link ProgramInstruction} continue with the next loop when processed</p>.
- */
-public class ContinueInstruction extends ProgramInstruction {
-    public String toString() {
-        return "CONTINUE INSTRUCTION"; //$NON-NLS-1$
-    }
-
-    public void process(ProcedurePlan env) throws TeiidComponentException {
-        Program parentProgram = env.peek();
-        
-        //find the parent program that contains the loop/while instruction
-        while(true){            
-            if(parentProgram.getCurrentInstruction() instanceof RepeatedInstruction){
-                break;
-            }
-            env.pop(); 
-            parentProgram = env.peek();
-        } 
-    }
-    
-    public PlanNode getDescriptionProperties() {
-        return new PlanNode("CONTINUE"); //$NON-NLS-1$
-    }
-    
-}

Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -41,9 +41,11 @@
 import org.teiid.dqp.internal.process.Request;
 import org.teiid.language.SQLConstants.Reserved;
 import org.teiid.logging.LogManager;
+import org.teiid.metadata.Column;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataStore;
 import org.teiid.query.optimizer.QueryOptimizer;
 import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
@@ -54,6 +56,7 @@
 import org.teiid.query.rewriter.QueryRewriter;
 import org.teiid.query.sql.ProcedureReservedWords;
 import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.Create;
 import org.teiid.query.sql.lang.DynamicCommand;
 import org.teiid.query.sql.lang.Insert;
 import org.teiid.query.sql.lang.Query;
@@ -202,13 +205,22 @@
 				}
 			};
 
-            dynamicProgram = new Program();
+            dynamicProgram = new Program(false);
             dynamicProgram.addInstruction(inst);
 
             if (dynamicCommand.getIntoGroup() != null) {
                 String groupName = dynamicCommand.getIntoGroup().getCanonicalName();
                 if (!procEnv.getTempTableStore().getAllTempTables().contains(groupName)) {
-                    procEnv.getTempContext().add(groupName);
+                	//create the temp table in the parent scope
+                	Create create = new Create();
+                	create.setTable(new GroupSymbol(groupName));
+                	for (ElementSymbol es : ((Insert)command).getVariables()) {
+                		Column c = new Column();
+                		c.setName(es.getShortName());
+                		c.setRuntimeType(DataTypeManager.getDataTypeName(es.getType()));
+                		create.getColumns().add(c);
+                	}
+                    procEnv.getDataManager().registerRequest(procEnv.getContext(), create, TempMetadataAdapter.TEMP_MODEL.getName(), null, 0, -1);
                 }
             }
 

Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/LoopInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/LoopInstruction.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/LoopInstruction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -45,11 +45,23 @@
     private Program loopProgram;
     
     private List elements;
+    private String label;
     
-    public LoopInstruction(Program loopProgram, String rsName, ProcessorPlan plan) {
+    public LoopInstruction(Program loopProgram, String rsName, ProcessorPlan plan, String label) {
         super(rsName, plan, false);
         this.loopProgram = loopProgram;
+        this.label = label;
     }
+    
+    @Override
+    public String getLabel() {
+    	return label;
+    }
+    
+    @Override
+    public void setLabel(String label) {
+    	this.label = label;
+    }
 
     public void process(ProcedurePlan procEnv) throws TeiidComponentException {
         List currentRow = procEnv.getCurrentRow(rsName); 
@@ -74,7 +86,7 @@
      */
     public LoopInstruction clone(){
         ProcessorPlan clonedPlan = this.plan.clone();
-        return new LoopInstruction((Program)this.loopProgram.clone(), this.rsName, clonedPlan);
+        return new LoopInstruction((Program)this.loopProgram.clone(), this.rsName, clonedPlan, label);
     }
     
     public String toString() {

Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -24,21 +24,21 @@
 
 import static org.teiid.query.analysis.AnalysisRecord.*;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Stack;
 
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.client.plan.PlanNode;
+import org.teiid.client.xa.XATransactionException;
 import org.teiid.common.buffer.BlockedException;
 import org.teiid.common.buffer.BufferManager;
 import org.teiid.common.buffer.IndexedTupleSource;
@@ -50,7 +50,14 @@
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.util.Assertion;
+import org.teiid.dqp.internal.process.DataTierTupleSource;
+import org.teiid.dqp.service.TransactionContext;
+import org.teiid.dqp.service.TransactionService;
+import org.teiid.dqp.service.TransactionContext.Scope;
+import org.teiid.events.EventDistributor;
+import org.teiid.logging.LogConstants;
 import org.teiid.logging.LogManager;
+import org.teiid.metadata.MetadataRepository;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
@@ -62,6 +69,7 @@
 import org.teiid.query.processor.QueryProcessor;
 import org.teiid.query.processor.relational.SubqueryAwareEvaluator;
 import org.teiid.query.sql.ProcedureReservedWords;
+import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
@@ -122,9 +130,6 @@
     
     private List outputElements;
     
-    private TempTableStore tempTableStore;
-    
-    private LinkedList<Set<String>> tempContext = new LinkedList<Set<String>>();
 	private SubqueryAwareEvaluator evaluator;
 	
     // Stack of programs, with current program on top
@@ -133,13 +138,18 @@
     private boolean evaluatedParams;
     
     private boolean requiresTransaction = true;
+    
+    private TransactionContext blockContext;
+    /**
+     * Resources cannot be held open across the txn boundary.  This list is a hack at ensuring the resources are closed.
+     */
+    private LinkedList<WeakReference<DataTierTupleSource>> txnTupleSources = new LinkedList<WeakReference<DataTierTupleSource>>();
 
     /**
      * Constructor for ProcedurePlan.
      */
     public ProcedurePlan(Program originalProgram) {
     	this.originalProgram = originalProgram;
-    	this.programs.add(originalProgram);
     	createVariableContext();
     }
     
@@ -154,7 +164,37 @@
         this.bufferMgr = bufferMgr;
         this.batchSize = bufferMgr.getProcessorBatchSize();
         setContext(context.clone());
-        this.dataMgr = dataMgr;
+        this.dataMgr = new ProcessorDataManager() {
+			
+			@Override
+			public TupleSource registerRequest(CommandContext context, Command command,
+					String modelName, String connectorBindingId, int nodeID, int limit)
+					throws TeiidComponentException, TeiidProcessingException {
+				TupleSource ts = parentDataMrg.registerRequest(context, command, modelName, connectorBindingId, nodeID, limit);
+				if (blockContext != null && ts instanceof DataTierTupleSource) {
+					txnTupleSources.add(new WeakReference<DataTierTupleSource>((DataTierTupleSource)ts));
+				}
+				return ts;
+			}
+			
+			@Override
+			public Object lookupCodeValue(CommandContext context, String codeTableName,
+					String returnElementName, String keyElementName, Object keyValue)
+					throws BlockedException, TeiidComponentException,
+					TeiidProcessingException {
+				return parentDataMrg.lookupCodeValue(context, codeTableName, returnElementName, keyElementName, keyValue);
+			}
+			
+			@Override
+			public MetadataRepository getMetadataRepository() {
+				return parentDataMrg.getMetadataRepository();
+			}
+			
+			@Override
+			public EventDistributor getEventDistributor() {
+				return parentDataMrg.getEventDistributor();
+			}
+		};
         this.parentDataMrg = dataMgr;
         if (evaluator == null) {
         	this.evaluator = new SubqueryAwareEvaluator(Collections.emptyMap(), getDataManager(), getContext(), this.bufferMgr);
@@ -180,10 +220,7 @@
         lastBatch = false;
 
         //reset program stack
-        originalProgram.resetProgramCounter();
-        this.tempContext.clear();
         programs.clear();
-    	programs.push(originalProgram);
 		LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "ProcedurePlan reset"); //$NON-NLS-1$
     }
 
@@ -218,8 +255,7 @@
 		            context.setValue(entry.getKey(), value);
 				}
     		}
-    		tempTableStore = new TempTableStore(getContext().getConnectionID());
-    		getContext().setTempTableStore(tempTableStore);
+    		this.push(originalProgram);
     	}
     	this.evaluatedParams = true;
     }
@@ -236,11 +272,26 @@
 			VariableContext context, Object value) {
 		context.setValue(param, value);
 	}
+	
+	@Override
+	public TupleBatch nextBatch() throws BlockedException,
+			TeiidComponentException, TeiidProcessingException {
+		if (blockContext != null) {
+			this.getContext().getTransactionServer().resume(blockContext);
+		} 
+		try {
+			return nextBatchDirect();
+		} finally {
+			if (blockContext != null) {
+				this.getContext().getTransactionServer().suspend(blockContext);
+			}
+		}
+	}
 
     /**
      * @see ProcessorPlan#nextBatch()
      */
-    public TupleBatch nextBatch()
+    public TupleBatch nextBatchDirect()
         throws TeiidComponentException, TeiidProcessingException, BlockedException {
 
         // Already returned results?
@@ -261,7 +312,7 @@
         // Next, attempt to return batches if processing completed
         while(! isBatchFull()) {
             // May throw BlockedException and exit here
-            List tuple = this.finalTupleSource.nextTuple();
+            List<?> tuple = this.finalTupleSource.nextTuple();
             if(tuple == null) {
             	if (outParams != null) {
             		VariableContext vc = getCurrentVariableContext();
@@ -311,7 +362,7 @@
             inst = program.getCurrentInstruction();
 	        if (inst == null){
 	        	LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "Finished program", program); //$NON-NLS-1$
-                this.pop();
+                this.pop(true);
                 continue;
             }
             if (inst instanceof RepeatedInstruction) {
@@ -350,14 +401,19 @@
     			removeResults(rsName);
 			}
         }
-        if(getTempTableStore()!=null) {
-        	getTempTableStore().removeTempTables();
+        while (!programs.isEmpty()) {
+        	try {
+        		pop(false);
+        	} catch (TeiidComponentException e) {
+        		LogManager.logDetail(LogConstants.CTX_DQP, e, "Error closing program"); //$NON-NLS-1$
+        	}
         }
         if (this.evaluator != null) {
         	this.evaluator.close();
         }
-        this.tempTableStore = null;
         this.dataMgr = parentDataMrg;
+        this.txnTupleSources.clear();
+        this.blockContext = null;
     }
 
     public String toString() {
@@ -475,18 +531,19 @@
 		
 		        CommandContext subContext = getContext().clone();
 		        subContext.setVariableContext(this.currentVarContext);
-		        subContext.setTempTableStore(getTempTableStore());
 		        state = new CursorState();
 		        state.processor = new QueryProcessor(command, subContext, this.bufferMgr, this.dataMgr);
 		        state.ts = new BatchIterator(state.processor);
 		        if (procAssignments != null && state.processor.getOutputElements().size() - procAssignments.size() > 0) {
 		        	state.resultsBuffer = bufferMgr.createTupleBuffer(state.processor.getOutputElements().subList(0, state.processor.getOutputElements().size() - procAssignments.size()), getContext().getConnectionID(), TupleSourceType.PROCESSOR);
+		        } else if (this.blockContext != null) {
+		        	state.resultsBuffer = bufferMgr.createTupleBuffer(state.processor.getOutputElements(), getContext().getConnectionID(), TupleSourceType.PROCESSOR);
 		        }
 	            this.currentState = state;
         	}
         	//force execution to the first batch
         	this.currentState.ts.hasNext();
-            if (procAssignments != null) {
+        	if (procAssignments != null) {
             	while (this.currentState.ts.hasNext()) {
             		if (this.currentState.currentRow != null && this.currentState.resultsBuffer != null) {
             			this.currentState.resultsBuffer.addTuple(this.currentState.currentRow.subList(0, this.currentState.resultsBuffer.getSchema().size()));
@@ -511,6 +568,14 @@
             	}
             	this.currentState.resultsBuffer.close();
             	this.currentState.ts = this.currentState.resultsBuffer.createIndexedTupleSource();
+            } else if (this.blockContext != null) {
+            	//process fully in a block transaction
+            	while (this.currentState.ts.hasNext()) {
+            		List<?> tuple = this.currentState.ts.nextTuple();
+        			this.currentState.resultsBuffer.addTuple(tuple);
+            	}
+            	this.currentState.resultsBuffer.close();
+            	this.currentState.ts = this.currentState.resultsBuffer.createIndexedTupleSource();
             }
 	        this.cursorStates.put(rsName.toUpperCase(), this.currentState);
 	        //keep a reference to the tuple source
@@ -523,43 +588,64 @@
     }
     
     /** 
+     * @param success
      * @throws TeiidComponentException 
+     * @throws XATransactionException 
      */
-    public void pop() throws TeiidComponentException {
+    public void pop(boolean success) throws TeiidComponentException {
     	Program program = this.programs.pop();
         if (this.currentVarContext.getParentContext() != null) {
         	this.currentVarContext = this.currentVarContext.getParentContext();
         }
-        Set<String> current = getTempContext();
-
-        Set<String> tempTables = getLocalTempTables();
-
-        tempTables.addAll(current);
-        
-        if (program != originalProgram) {
-        	for (String table : tempTables) {
-	            this.tempTableStore.removeTempTableByName(table);
-	        }
-        }
-        this.tempContext.removeLast();
+    	program.getTempTableStore().removeTempTables();
+    	if (program.startedTxn() && this.blockContext != null) {
+    		TransactionService ts = this.getContext().getTransactionServer();
+    		TransactionContext tc = this.blockContext;
+    		this.blockContext = null;
+    		for (WeakReference<DataTierTupleSource> ref : txnTupleSources) {
+    			DataTierTupleSource dtts = ref.get();
+    			if (dtts != null) {
+    				dtts.fullyCloseSource();
+    			}
+    		}
+    		this.txnTupleSources.clear();
+    		try {
+	    		if (success) {
+	    			ts.commit(tc);
+	    		} else {
+	    			ts.rollback(tc);
+	    		}
+    		} catch (XATransactionException e) {
+    			throw new TeiidComponentException(e);
+    		}
+    	}
     }
     
-    public void push(Program program) {
-    	program.resetProgramCounter();
+    public void push(Program program) throws XATransactionException {
+    	program.reset(this.getContext().getConnectionID());
+    	TempTableStore tts = getTempTableStore();
+		getContext().setTempTableStore(program.getTempTableStore());
+		program.getTempTableStore().setParentTempTableStore(tts);
         this.programs.push(program);
         VariableContext context = new VariableContext(true);
         context.setParentContext(this.currentVarContext);
         this.currentVarContext = context;
         
-        Set<String> current = getTempContext();
-        
-        Set<String> tempTables = getLocalTempTables();
-        
-        current.addAll(tempTables);
-        this.tempContext.add(new HashSet<String>());
+        if (program.isAtomic()) {
+        	TransactionContext tc = this.getContext().getTransactionContext();
+        	if (tc != null && tc.getTransactionType() == Scope.NONE) {
+        		//start a transaction
+        		this.getContext().getTransactionServer().begin(tc);
+        		this.blockContext = tc;
+        		this.peek().setStartedTxn(true);
+        	}
+        }
     }
     
     public void incrementProgramCounter() throws TeiidComponentException {
+    	if (this.programs.isEmpty()) {
+    		return;
+    	}
         Program program = peek();
         ProgramInstruction instr = program.getCurrentInstruction();
         if (instr instanceof RepeatedInstruction) {
@@ -569,27 +655,7 @@
         peek().incrementProgramCounter();
     }
 
-    /** 
-     * @return
-     */
-    private Set<String> getLocalTempTables() {
-        Set<String> tempTables = this.tempTableStore.getAllTempTables();
-        
-        //determine what was created in this scope
-        for (int i = 0; i < tempContext.size() - 1; i++) {
-            tempTables.removeAll(tempContext.get(i));
-        }
-        return tempTables;
-    }
-
-    public Set<String> getTempContext() {
-        if (this.tempContext.isEmpty()) {
-            tempContext.addLast(new HashSet<String>());
-        }
-        return this.tempContext.getLast();
-    }
-
-    public List getCurrentRow(String rsName) throws TeiidComponentException {
+    public List<?> getCurrentRow(String rsName) throws TeiidComponentException {
         return getCursorState(rsName.toUpperCase()).currentRow;
     }
 
@@ -682,7 +748,10 @@
      * @since 5.5
      */
     public TempTableStore getTempTableStore() {
-        return this.tempTableStore;
+    	if (this.programs.isEmpty()) {
+    		return null;
+    	}
+        return this.peek().getTempTableStore();
     }
 
     boolean evaluateCriteria(Criteria condition) throws BlockedException, TeiidProcessingException, TeiidComponentException {

Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/Program.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/Program.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/Program.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -27,6 +27,8 @@
 
 import org.teiid.client.plan.PlanNode;
 import org.teiid.query.processor.ProcessorPlan;
+import org.teiid.query.sql.proc.Statement.Labeled;
+import org.teiid.query.tempdata.TempTableStore;
 
 
 /**
@@ -34,17 +36,47 @@
  * ProgramInstructions, such as {@link IfInstruction} and {@link WhileInstruction} may 
  * have pointers to sub programs.
  */
-public class Program implements Cloneable {
+public class Program implements Cloneable, Labeled {
 
     private List<ProgramInstruction> programInstructions;
     private int counter = 0;
+    private boolean atomic;
+    private String label;
+    private TempTableStore tempTables;
+    private boolean startedTxn;
 
 	/**
 	 * Constructor for Program.
 	 */
-	public Program() {
-		super();
+	public Program(boolean atomic) {
+		this.atomic = atomic;
 	}
+	
+	public void setStartedTxn(boolean startedTxn) {
+		this.startedTxn = startedTxn;
+	}
+	
+	public boolean startedTxn() {
+		return startedTxn;
+	}
+	
+    @Override
+    public String getLabel() {
+    	return label;
+    }
+    
+    @Override
+    public void setLabel(String label) {
+    	this.label = label;
+    }
+    
+	public boolean isAtomic() {
+		return atomic;
+	}
+	
+	public TempTableStore getTempTableStore() {
+		return tempTables;
+	}
 
     /**
      * Returns the next instruction to be executed, or null if there are
@@ -79,8 +111,10 @@
     /**
      * Resets this program, so it can be run through again.
      */
-    public void resetProgramCounter(){
+    public void reset(String sessionId){
         counter = 0;
+        this.tempTables = new TempTableStore(sessionId);
+        this.startedTxn = false;
     }
 
     int getProgramCounter(){
@@ -115,7 +149,7 @@
      * Produces a deep clone.
      */
     public Object clone(){
-        Program program = new Program();
+        Program program = new Program(atomic);
         program.counter = this.counter;
         
         if (this.programInstructions != null){
@@ -125,7 +159,7 @@
             }
             program.programInstructions = clonedInstructions;
         }
-        
+        program.label = label;
         return program;
     }
 

Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/RepeatedInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/RepeatedInstruction.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/RepeatedInstruction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -24,9 +24,10 @@
 
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
+import org.teiid.query.sql.proc.Statement.Labeled;
 
 
-public interface RepeatedInstruction {
+public interface RepeatedInstruction extends Labeled {
     
     public boolean testCondition(ProcedurePlan procEnv) throws TeiidComponentException, TeiidProcessingException;
     

Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/WhileInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/WhileInstruction.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/WhileInstruction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -43,11 +43,23 @@
 
     // criteria for the while block
     private Criteria condition;
+    private String label;
 
-    public WhileInstruction(Program program, Criteria condition){
+    public WhileInstruction(Program program, Criteria condition, String label){
         this.whileProgram = program;
         this.condition = condition;
+        this.label = label;
     }
+    
+    @Override
+    public String getLabel() {
+    	return label;
+    }
+    
+    @Override
+    public void setLabel(String label) {
+    	this.label = label;
+    }
 
     public void process(ProcedurePlan env) throws TeiidComponentException {
         //do nothing
@@ -61,7 +73,7 @@
      * Returns a deep clone
      */
     public WhileInstruction clone(){
-        return new WhileInstruction((Program)this.whileProgram.clone(), this.condition);
+        return new WhileInstruction((Program)this.whileProgram.clone(), this.condition, this.label);
     }
 
     public String toString() {

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -312,11 +312,6 @@
                 
                 resolveBlock(command, loopStmt.getBlock(), externalGroups, metadata);
                 break;
-            case Statement.TYPE_BREAK:
-            case Statement.TYPE_CONTINUE:
-                break;
-            default:
-                throw new QueryResolverException("ERR.015.008.0015", QueryPlugin.Util.getString("ERR.015.008.0015", statement.getType())); //$NON-NLS-1$ //$NON-NLS-2$
         }
     }
 

Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -326,19 +326,14 @@
 
 	private Block rewriteBlock(Block block)
 								 throws TeiidComponentException, TeiidProcessingException{
-		List statements = block.getStatements();
-        Iterator stmtIter = statements.iterator();
+		List<Statement> statements = block.getStatements();
+        Iterator<Statement> stmtIter = statements.iterator();
 
-		List newStmts = new ArrayList(statements.size());
+		List<Statement> newStmts = new ArrayList<Statement>(statements.size());
 		// plan each statement in the block
         while(stmtIter.hasNext()) {
-			Statement stmnt = (Statement) stmtIter.next();
-			Object newStmt = rewriteStatement(stmnt);
-			if(newStmt instanceof Statement) {
-				newStmts.add(newStmt);
-			} else if (newStmt instanceof List) {
-			    newStmts.addAll((List)newStmt);
-            }
+			Statement stmnt = stmtIter.next();
+			rewriteStatement(stmnt, newStmts);
         }
 
         block.setStatements(newStmts);
@@ -346,7 +341,7 @@
         return block;
 	 }
 
-	private Object rewriteStatement(Statement statement)
+	private void rewriteStatement(Statement statement, List<Statement> newStmts)
 								 throws TeiidComponentException, TeiidProcessingException{
 
         // evaluate the HAS Criteria on the procedure and rewrite
@@ -360,13 +355,15 @@
 				ifStmt.setCondition(evalCrit);
 				if(evalCrit.equals(TRUE_CRITERIA)) {
 					Block ifblock = rewriteBlock(ifStmt.getIfBlock());
-					return ifblock.getStatements();
+					newStmts.addAll(ifblock.getStatements());
+					return;
 				} else if(evalCrit.equals(FALSE_CRITERIA) || evalCrit.equals(UNKNOWN_CRITERIA)) {
 					if(ifStmt.hasElseBlock()) {
 						Block elseBlock = rewriteBlock(ifStmt.getElseBlock());
-						return elseBlock.getStatements();
+						newStmts.addAll(elseBlock.getStatements());
+						return;
 					} 
-                    return null;
+                    return;
 				} else {
 					Block ifblock = rewriteBlock(ifStmt.getIfBlock());
 					ifStmt.setIfBlock(ifblock);
@@ -375,7 +372,7 @@
 						ifStmt.setElseBlock(elseBlock);
 					}
 				}
-				return ifStmt;
+				break;
             case Statement.TYPE_ERROR: 
             case Statement.TYPE_DECLARE:
             case Statement.TYPE_ASSIGNMENT:
@@ -387,7 +384,7 @@
 					expr = rewriteExpressionDirect(expr);
 	                exprStmt.setExpression(expr);
 				}
-				return exprStmt;
+				break;
             case Statement.TYPE_COMMAND:
 				CommandStatement cmdStmt = (CommandStatement) statement;
                 rewriteSubqueryContainer(cmdStmt, false);
@@ -395,10 +392,10 @@
 				if(cmdStmt.getCommand().getType() == Command.TYPE_UPDATE) {
                     Update update = (Update)cmdStmt.getCommand();
                     if (update.getChangeList().isEmpty()) {
-                        return null;
+                        return;
                     }
 				}
-                return statement;
+				break;
             case Statement.TYPE_LOOP: 
                 LoopStatement loop = (LoopStatement)statement; 
                 
@@ -407,10 +404,9 @@
                 rewriteBlock(loop.getBlock());
                 
                 if (loop.getBlock().getStatements().isEmpty()) {
-                    return null;
+                    return;
                 }
-                
-                return loop;
+                break;
             case Statement.TYPE_WHILE:
                 WhileStatement whileStatement = (WhileStatement) statement;
                 Criteria crit = whileStatement.getCondition();
@@ -420,18 +416,16 @@
                 if(crit.equals(TRUE_CRITERIA)) {
                     throw new QueryValidatorException(QueryPlugin.Util.getString("QueryRewriter.infinite_while")); //$NON-NLS-1$
                 } else if(crit.equals(FALSE_CRITERIA) || crit.equals(UNKNOWN_CRITERIA)) {
-                    return null;
+                    return;
                 } 
                 whileStatement.setBlock(rewriteBlock(whileStatement.getBlock()));
                 
                 if (whileStatement.getBlock().getStatements().isEmpty()) {
-                    return null;
+                    return;
                 }
-                
-                return whileStatement;
-			default:
-				return statement;
+                break;
 		}
+		newStmts.add(statement);
 	}
     
     /** 

Modified: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -68,9 +68,8 @@
 import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
-import org.teiid.query.sql.proc.BreakStatement;
+import org.teiid.query.sql.proc.BranchingStatement;
 import org.teiid.query.sql.proc.CommandStatement;
-import org.teiid.query.sql.proc.ContinueStatement;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
 import org.teiid.query.sql.proc.CriteriaSelector;
 import org.teiid.query.sql.proc.DeclareStatement;
@@ -194,8 +193,7 @@
     public void visit(IfStatement obj) {}
     public void visit(RaiseErrorStatement obj) {}
     public void visit(TranslateCriteria obj) {}
-    public void visit(BreakStatement obj) {}
-    public void visit(ContinueStatement obj) {}
+    public void visit(BranchingStatement obj) {}
     public void visit(WhileStatement obj) {}
     public void visit(LoopStatement obj) {}
     public void visit(DynamicCommand obj) {}

Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -72,9 +72,8 @@
 import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
-import org.teiid.query.sql.proc.BreakStatement;
+import org.teiid.query.sql.proc.BranchingStatement;
 import org.teiid.query.sql.proc.CommandStatement;
-import org.teiid.query.sql.proc.ContinueStatement;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
 import org.teiid.query.sql.proc.CriteriaSelector;
 import org.teiid.query.sql.proc.DeclareStatement;
@@ -181,7 +180,7 @@
         visitNodes(obj.getStatements());
         postVisitVisitor(obj);
     }
-    public void visit(BreakStatement obj) {
+    public void visit(BranchingStatement obj) {
         preVisitVisitor(obj);
         postVisitVisitor(obj);
     }
@@ -217,10 +216,6 @@
         preVisitVisitor(obj);
         postVisitVisitor(obj);
     }
-    public void visit(ContinueStatement obj) {
-        preVisitVisitor(obj);
-        postVisitVisitor(obj);
-    }
     public void visit(CreateUpdateProcedureCommand obj) {
         preVisitVisitor(obj);
         visitNode(obj.getBlock());

Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -26,10 +26,11 @@
 import java.util.List;
 
 import org.teiid.core.util.EquivalenceUtil;
-import org.teiid.query.sql.LanguageObject;
+import org.teiid.core.util.StringUtil;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.ProcedureReservedWords;
 import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.proc.Statement.Labeled;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.visitor.SQLStringVisitor;
 
@@ -38,10 +39,12 @@
  * <p> This class represents a group of <code>Statement</code> objects. The
  * statements are stored on this object in the order in which they are added.</p>
  */
-public class Block implements LanguageObject {
+public class Block extends Statement implements Labeled {
 
 	// list of statements on this block
 	private List<Statement> statements;
+	private boolean atomic;
+	private String label;
 
 	/**
 	 * Constructor for Block.
@@ -58,6 +61,14 @@
 		this();
 		statements.add(statement);
 	}
+	
+	public String getLabel() {
+		return label;
+	}
+	
+	public void setLabel(String label) {
+		this.label = label;
+	}
 
 	/**
 	 * Get all the statements contained on this block.
@@ -112,9 +123,11 @@
 	 */
 	public Block clone() {		
 		Block copy = new Block();
+		copy.setAtomic(atomic);
 		for (Statement statement : statements) {
 			copy.addStatement((Statement)statement.clone());
 		}
+		copy.setLabel(label);
 		return copy;
 	}
 	
@@ -134,9 +147,13 @@
     	if(!(obj instanceof Block)) {
     		return false;
 		}
-
+    	
+    	Block other = (Block)obj;
+    	
 		// Compare the statements on the block
-        return EquivalenceUtil.areEqual(getStatements(), ((Block)obj).getStatements());
+        return this.atomic == other.atomic 
+        && StringUtil.equalsIgnoreCase(label, other.label)
+        && EquivalenceUtil.areEqual(getStatements(), other.getStatements());
     }    
 
     /**
@@ -157,5 +174,18 @@
     public String toString() {
     	return SQLStringVisitor.getSQLString(this);
     }
+    
+    public boolean isAtomic() {
+		return atomic;
+	}
+    
+    public void setAtomic(boolean atomic) {
+		this.atomic = atomic;
+	}
+    
+    @Override
+    public int getType() {
+    	return Statement.TYPE_COMPOUND;
+    }
 
 }// END CLASS

Added: trunk/engine/src/main/java/org/teiid/query/sql/proc/BranchingStatement.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/BranchingStatement.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/BranchingStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -0,0 +1,136 @@
+/*
+ * 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.proc;
+
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.core.util.StringUtil;
+import org.teiid.query.sql.LanguageVisitor;
+
+/**
+ * <p> This class represents a break statement in the storedprocedure language.
+ * It extends the <code>Statement</code> that could part of a block.</p>
+ */
+public class BranchingStatement extends Statement {
+	
+	public enum BranchingMode {
+		/**
+		 * Teiid specific - only allowed to target loops
+		 */
+		BREAK,
+		/**
+		 * Teiid specific - only allowed to target loops
+		 */
+		CONTINUE,
+		/**
+		 * ANSI - allowed to leave any block 
+		 */
+		LEAVE
+	}
+	
+	private String label;
+	private BranchingMode mode;
+	
+	public BranchingStatement() {
+		this(BranchingMode.BREAK);
+	}
+	
+	public BranchingStatement(BranchingMode mode) {
+		this.mode = mode;
+	}
+	
+	public String getLabel() {
+		return label;
+	}
+	
+	public void setLabel(String label) {
+		this.label = label;
+	}
+	
+	public void setMode(BranchingMode mode) {
+		this.mode = mode;
+	}
+	
+	public BranchingMode getMode() {
+		return mode;
+	}
+	
+    /**
+     * Return the type for this statement, this is one of the types
+     * defined on the statement object.
+     */
+    public int getType() {
+    	switch (mode) {
+    	case BREAK:
+    		return Statement.TYPE_BREAK;
+    	case CONTINUE:
+    		return Statement.TYPE_CONTINUE;
+    	case LEAVE:
+    		return Statement.TYPE_LEAVE;
+    	}
+    	throw new AssertionError();
+    }       
+
+    // =========================================================================
+    //                  P R O C E S S I N G     M E T H O D S
+    // =========================================================================
+    
+    public void acceptVisitor(LanguageVisitor visitor) {
+        visitor.visit(this);
+    }
+    
+    /**
+     * Deep clone statement to produce a new identical statement.
+     * @return Deep clone 
+     */
+    public BranchingStatement clone() {     
+        BranchingStatement clone = new BranchingStatement();
+        clone.mode = mode;
+        clone.label = label;
+        return clone;
+    }
+    
+    /**
+     * Compare two BreakStatements for equality.
+     * @param obj Other object
+     * @return True if equal
+     */
+    public boolean equals(Object obj) {
+        // Quick same object test
+        if(this == obj) {
+            return true;
+        }
+        if (!(obj instanceof BranchingStatement)) {
+        	return false;
+        }
+        BranchingStatement other = (BranchingStatement)obj;
+        return StringUtil.equalsIgnoreCase(label, other.label) 
+        && mode == other.mode;
+    } 
+    
+    public int hashCode() {
+        return HashCodeUtil.hashCode(mode.hashCode());
+    }
+      
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/proc/BranchingStatement.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Deleted: trunk/engine/src/main/java/org/teiid/query/sql/proc/BreakStatement.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/BreakStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/BreakStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -1,78 +0,0 @@
-/*
- * 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.proc;
-
-import org.teiid.query.sql.LanguageVisitor;
-
-/**
- * <p> This class represents a break statement in the storedprocedure language.
- * It extends the <code>Statement</code> that could part of a block.</p>
- */
-public class BreakStatement extends Statement {
-    
-    /**
-     * Return the type for this statement, this is one of the types
-     * defined on the statement object.
-     */
-    public int getType() {
-        return Statement.TYPE_BREAK;
-    }       
-
-    // =========================================================================
-    //                  P R O C E S S I N G     M E T H O D S
-    // =========================================================================
-    
-    public void acceptVisitor(LanguageVisitor visitor) {
-        visitor.visit(this);
-    }
-    
-    /**
-     * Deep clone statement to produce a new identical statement.
-     * @return Deep clone 
-     */
-    public Object clone() {     
-        return new BreakStatement();
-    }
-    
-    /**
-     * Compare two BreakStatements for equality.
-     * @param obj Other object
-     * @return True if equal
-     */
-    public boolean equals(Object obj) {
-        // Quick same object test
-        if(this == obj) {
-            return true;
-        }
-
-        return obj instanceof BreakStatement;
-    } 
-    
-    public int hashCode() {
-        //the break statement are always equal
-        return 0;
-    }
-      
-}

Deleted: trunk/engine/src/main/java/org/teiid/query/sql/proc/ContinueStatement.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/ContinueStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/ContinueStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -1,84 +0,0 @@
-/*
- * 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.proc;
-
-import org.teiid.query.sql.LanguageVisitor;
-import org.teiid.query.sql.visitor.SQLStringVisitor;
-
-/**
- * <p> This class represents a continue statement in the storedprocedure language.
- * It extends the <code>Statement</code> that could part of a block.</p>
- */
-public class ContinueStatement extends Statement {
-    
-    /**
-     * Return the type for this statement, this is one of the types
-     * defined on the statement object.
-     */
-    public int getType() {
-        return Statement.TYPE_CONTINUE;
-    }       
-
-    // =========================================================================
-    //                  P R O C E S S I N G     M E T H O D S
-    // =========================================================================
-    
-    public void acceptVisitor(LanguageVisitor visitor) {
-        visitor.visit(this);
-    }
-    
-    /**
-     * Deep clone statement to produce a new identical statement.
-     * @return Deep clone 
-     */
-    public Object clone() {     
-        return new ContinueStatement();
-    }
-    
-    /**
-     * Compare two ContinueStatements for equality.
-     * @param obj Other object
-     * @return True if equal
-     */
-    public boolean equals(Object obj) {
-        // Quick same object test
-        if(this == obj) {
-            return true;
-        }
-
-        // Quick fail tests     
-        if(!(obj instanceof ContinueStatement)) {
-            return false;
-        }
-
-        return true;
-    } 
-      
-    public int hashCode() {
-        //the continue statements are always equal
-        return 0;
-    }
-      
-}

Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/IfStatement.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/IfStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/IfStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -151,11 +151,11 @@
 	 * @return Deep clone 
 	 */
 	public Object clone() {
-		Block otherIf = (Block)this.ifBlock.clone();
+		Block otherIf = this.ifBlock.clone();
 		Criteria otherCrit = (Criteria) this.condition.clone();		
 		Block otherElse = null;
 		if(this.hasElseBlock()) {
-			otherElse = (Block) this.elseBlock.clone();	
+			otherElse = this.elseBlock.clone();	
 		}
 
 		return new IfStatement(otherCrit, otherIf, otherElse);

Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/LoopStatement.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/LoopStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/LoopStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -26,10 +26,12 @@
 
 import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.core.util.HashCodeUtil;
+import org.teiid.core.util.StringUtil;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.SubqueryContainer;
+import org.teiid.query.sql.proc.Statement.Labeled;
 
 
 /**
@@ -39,10 +41,11 @@
  * a block, a select statement and a cursor. 
  * determines which block should be executed..</p>
  */
-public class LoopStatement extends Statement implements SubqueryContainer {
+public class LoopStatement extends Statement implements SubqueryContainer, Labeled {
     private String cursorName;
     private Block loopBlock;
     private Command query;
+    private String label;
     
     public LoopStatement(Block block, Command query, String cursorName){
         this.loopBlock = block;
@@ -50,6 +53,14 @@
         this.cursorName = cursorName;
     }    
     
+    public String getLabel() {
+		return label;
+	}
+    
+    public void setLabel(String label) {
+		this.label = label;
+	}
+    
     /**
      * @return
      */
@@ -121,10 +132,12 @@
      * @return Deep clone 
      */
     public Object clone() {
-        Block otherBlock = (Block)this.loopBlock.clone();    
+        Block otherBlock = this.loopBlock.clone();    
         Query otherQuery = (Query)this.query.clone();
 
-        return new LoopStatement(otherBlock, otherQuery, this.cursorName);
+        LoopStatement ls = new LoopStatement(otherBlock, otherQuery, this.cursorName);
+        ls.setLabel(label);
+        return ls;
     }
     
     /**
@@ -152,7 +165,8 @@
             // Compare the if block
             EquivalenceUtil.areEqual(loopBlock, other.loopBlock) &&
             // Compare the else block
-            EquivalenceUtil.areEqual(cursorName, other.cursorName);
+            EquivalenceUtil.areEqual(cursorName, other.cursorName)
+            && StringUtil.equalsIgnoreCase(this.label, other.label);
     } 
 
     /**

Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/Statement.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/Statement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/Statement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -22,7 +22,7 @@
 
 package org.teiid.query.sql.proc;
 
-import org.teiid.query.sql.*;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.visitor.SQLStringVisitor;
 
 /**
@@ -31,6 +31,11 @@
  * <code>IfStatement</code>, <code>AssignmentStatement</code> etc.</p>
  */
 public abstract class Statement implements LanguageObject {
+	
+	public interface Labeled {
+		String getLabel();
+		void setLabel(String label);
+	}
 
 	/** 
 	 * Represents an unknown type of statement 
@@ -84,6 +89,10 @@
     
     public static final int TYPE_UPDATE = 10;
     
+    public static final int TYPE_COMPOUND = 11;
+    
+    public static final int TYPE_LEAVE = 12;
+    
 	/**
 	 * Return type of statement to make it easier to build switch statements by statement type.
 	 * @return Type from TYPE constants

Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/TriggerAction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/TriggerAction.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/TriggerAction.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -36,7 +36,7 @@
 	private Block block;
 	
 	public TriggerAction(Block b) {
-		this.block = b;
+		this.setBlock(b);
 	}
 	
 	public Block getBlock() {
@@ -44,6 +44,7 @@
 	}
 	
 	public void setBlock(Block block) {
+		block.setAtomic(true);
 		this.block = block;
 	}
 	

Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/WhileStatement.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/WhileStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/WhileStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -26,8 +26,10 @@
 
 import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.core.util.HashCodeUtil;
+import org.teiid.core.util.StringUtil;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.lang.Criteria;
+import org.teiid.query.sql.proc.Statement.Labeled;
 
 
 /**
@@ -36,16 +38,16 @@
  * a block and a criteria that
  * determines when to exit the while loop.</p>
  */
-public class WhileStatement extends Statement {
+public class WhileStatement extends Statement implements Labeled {
 
     private Block whileBlock;
-    
+    private String label;
     // criteria on the if block
     private Criteria condition;
 
     /**
      * Constructor for IfStatement.
-     * @param criteria The criteria determining which bleck should be executed
+     * @param criteria The criteria determining which block should be executed
      * @param ifBlock The IF <code>Block</code> object.
      * @param ifBlock The ELSE <code>Block</code> object.
      */
@@ -53,6 +55,14 @@
         this.whileBlock = block;
         this.condition = criteria;
     }
+    
+    public void setLabel(String label) {
+		this.label = label;
+	}
+    
+    public String getLabel() {
+		return label;
+	}
 
     /**
      * Get the condition that determines which block needs to be executed.
@@ -106,10 +116,12 @@
      * @return Deep clone 
      */
     public Object clone() {
-        Block otherBlock = (Block)this.whileBlock.clone();
+        Block otherBlock = this.whileBlock.clone();
         Criteria otherCrit = (Criteria) this.condition.clone();     
 
-        return new WhileStatement(otherCrit, otherBlock);
+        WhileStatement ws = new WhileStatement(otherCrit, otherBlock);
+        ws.setLabel(label);
+        return ws;
     }
     
     /**
@@ -135,7 +147,8 @@
             // Compare the condition
             EquivalenceUtil.areEqual(getCondition(), other.getCondition()) &&
             // Compare the if block
-            EquivalenceUtil.areEqual(whileBlock, other.whileBlock);
+            EquivalenceUtil.areEqual(whileBlock, other.whileBlock)
+            && StringUtil.equalsIgnoreCase(this.label, other.label);
     } 
 
     /**

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -93,9 +93,8 @@
 import org.teiid.query.sql.lang.XMLTable.XMLColumn;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
-import org.teiid.query.sql.proc.BreakStatement;
+import org.teiid.query.sql.proc.BranchingStatement;
 import org.teiid.query.sql.proc.CommandStatement;
-import org.teiid.query.sql.proc.ContinueStatement;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
 import org.teiid.query.sql.proc.CriteriaSelector;
 import org.teiid.query.sql.proc.DeclareStatement;
@@ -107,6 +106,7 @@
 import org.teiid.query.sql.proc.TranslateCriteria;
 import org.teiid.query.sql.proc.TriggerAction;
 import org.teiid.query.sql.proc.WhileStatement;
+import org.teiid.query.sql.proc.Statement.Labeled;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
@@ -1382,21 +1382,35 @@
     // ############ Visitor methods for storedprocedure language objects ####################
 
     public void visit( Block obj ) {
-        List statements = obj.getStatements();
+    	addLabel(obj);
+        List<Statement> statements = obj.getStatements();
         // Add first clause
         append(BEGIN);
+        if (obj.isAtomic()) {
+        	append(SPACE);
+        	append(ATOMIC);
+        }
         append("\n"); //$NON-NLS-1$
-        Iterator stmtIter = statements.iterator();
+        Iterator<Statement> stmtIter = statements.iterator();
         while (stmtIter.hasNext()) {
             // Add each statement
             addTabs(1);
-            visitNode((Statement)stmtIter.next());
+            visitNode(stmtIter.next());
             append("\n"); //$NON-NLS-1$
         }
         addTabs(0);
         append(END);
     }
 
+	private void addLabel(Labeled obj) {
+		if (obj.getLabel() != null) {
+    		outputDisplayName(obj.getLabel());
+    		append(SPACE);
+    		append(Tokens.COLON);
+    		append(SPACE);
+    	}
+	}
+
     protected void addTabs( int level ) {
     }
 
@@ -1557,17 +1571,27 @@
         append(";"); //$NON-NLS-1$
     }
 
-    public void visit( BreakStatement obj ) {
-        append(BREAK);
+    public void visit( BranchingStatement obj ) {
+    	switch (obj.getMode()) {
+    	case CONTINUE:
+    		append(CONTINUE);
+    		break;
+    	case BREAK:
+    		append(BREAK);
+    		break;
+    	case LEAVE:
+    		append(LEAVE);
+    		break;
+    	}
+    	if (obj.getLabel() != null) {
+    		append(SPACE);
+    		outputDisplayName(obj.getLabel());
+    	}
         append(";"); //$NON-NLS-1$
     }
 
-    public void visit( ContinueStatement obj ) {
-        append(CONTINUE);
-        append(";"); //$NON-NLS-1$
-    }
-
     public void visit( LoopStatement obj ) {
+    	addLabel(obj);
         append(LOOP);
         append(" "); //$NON-NLS-1$
         append(ON);
@@ -1583,6 +1607,7 @@
     }
 
     public void visit( WhileStatement obj ) {
+    	addLabel(obj);
         append(WHILE);
         append("("); //$NON-NLS-1$
         visitNode(obj.getCondition());

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -206,7 +206,7 @@
         		return null;
         	}
         	final String groupKey = group.getNonCorrelationName().toUpperCase();
-            final TempTable table = contextStore.getOrCreateTempTable(groupKey, command, bufferManager, false);
+            final TempTable table = contextStore.getOrCreateTempTable(groupKey, command, bufferManager, true);
         	if (command instanceof Insert) {
         		Insert insert = (Insert)command;
         		TupleSource ts = insert.getTupleSource();

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -217,16 +217,10 @@
     }
     
     TempTable getOrCreateTempTable(String tempTableID, Command command, BufferManager buffer, boolean delegate) throws QueryProcessingException{
-    	TempTable tsID = groupToTupleSourceID.get(tempTableID);
-        if(tsID != null) {
-            return tsID;
-        }
-        if(delegate && this.parentTempTableStore != null){
-    		tsID = this.parentTempTableStore.groupToTupleSourceID.get(tempTableID);
-    	    if(tsID != null) {
-    	        return tsID;
-    	    }
-        }
+    	TempTable tempTable = getTempTable(tempTableID, command, buffer, delegate);
+    	if (tempTable != null) {
+    		return tempTable;
+    	}
         //allow implicit temp group definition
         List<ElementSymbol> columns = null;
         if (command instanceof Insert) {
@@ -239,11 +233,25 @@
         if (columns == null) {
         	throw new QueryProcessingException(QueryPlugin.Util.getString("TempTableStore.table_doesnt_exist_error", tempTableID)); //$NON-NLS-1$
         }
+        LogManager.logDetail(LogConstants.CTX_DQP, "Creating temporary table", tempTableID); //$NON-NLS-1$
         Create create = new Create();
         create.setTable(new GroupSymbol(tempTableID));
         create.setElementSymbolsAsColumns(columns);
         return addTempTable(tempTableID, create, buffer, true);       
     }
+
+	private TempTable getTempTable(String tempTableID, Command command,
+			BufferManager buffer, boolean delegate)
+			throws QueryProcessingException {
+		TempTable tsID = groupToTupleSourceID.get(tempTableID);
+        if(tsID != null) {
+            return tsID;
+        }
+        if(delegate && this.parentTempTableStore != null){
+    		return this.parentTempTableStore.getTempTable(tempTableID, command, buffer, delegate);
+        }
+        return null;
+	}
     
     public Set<String> getAllTempTables() {
         return new HashSet<String>(this.groupToTupleSourceID.keySet());

Modified: trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -46,6 +46,8 @@
 import org.teiid.dqp.internal.process.SessionAwareCache;
 import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
 import org.teiid.dqp.message.RequestID;
+import org.teiid.dqp.service.TransactionContext;
+import org.teiid.dqp.service.TransactionService;
 import org.teiid.metadata.FunctionMethod.Determinism;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.eval.SecurityFunctionEvaluator;
@@ -129,6 +131,8 @@
 		private RequestID requestId;
 		
 		private DQPWorkContext dqpWorkContext;
+		private TransactionContext transactionContext;
+		private TransactionService transactionService;
 	}
 	
 	private GlobalState globalState = new GlobalState();
@@ -614,4 +618,20 @@
 		return this.globalState.dqpWorkContext;
 	}
 	
+	public TransactionContext getTransactionContext() {
+		return globalState.transactionContext;
+	}
+	
+	public void setTransactionContext(TransactionContext transactionContext) {
+		globalState.transactionContext = transactionContext;
+	}
+	
+	public TransactionService getTransactionServer() {
+		return globalState.transactionService;
+	}
+	
+	public void setTransactionService(TransactionService transactionService) {
+		globalState.transactionService = transactionService;
+	}
+	
 }

Modified: trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -26,6 +26,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Stack;
 
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.core.TeiidComponentException;
@@ -50,6 +51,7 @@
     private QueryMetadataInterface metadata;
     
     protected Command currentCommand;
+    protected Stack<LanguageObject> stack = new Stack<LanguageObject>();
     
     public AbstractValidationVisitor() {
         this.report = new ValidatorReport();
@@ -69,6 +71,7 @@
      */
     public void reset() {
         this.currentCommand = null;
+        this.stack.clear();
     }
     
     // ######################### Store results info #########################

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -103,6 +103,8 @@
 import org.teiid.query.sql.lang.XMLTable.XMLColumn;
 import org.teiid.query.sql.navigator.PreOrderNavigator;
 import org.teiid.query.sql.proc.AssignmentStatement;
+import org.teiid.query.sql.proc.Block;
+import org.teiid.query.sql.proc.BranchingStatement;
 import org.teiid.query.sql.proc.CommandStatement;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
 import org.teiid.query.sql.proc.CriteriaSelector;
@@ -110,6 +112,9 @@
 import org.teiid.query.sql.proc.HasCriteria;
 import org.teiid.query.sql.proc.LoopStatement;
 import org.teiid.query.sql.proc.TranslateCriteria;
+import org.teiid.query.sql.proc.WhileStatement;
+import org.teiid.query.sql.proc.BranchingStatement.BranchingMode;
+import org.teiid.query.sql.proc.Statement.Labeled;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.DerivedColumn;
@@ -177,6 +182,7 @@
     public void reset() {
         super.reset();
         this.isXML = false;
+        this.inQuery = false;
     }
 
     // ############### Visitor methods for language objects ##################
@@ -805,7 +811,6 @@
         Iterator valIter = values.iterator();
         GroupSymbol insertGroup = obj.getGroup();
 
-
         try {
             // Validate that all elements in variable list are updatable
         	for (ElementSymbol insertElem : vars) {
@@ -1558,7 +1563,47 @@
 		}
     }
     
+    public void visit(Block obj) {
+    	if (obj.getLabel() == null) {
+    		return;
+    	}
+		for (LanguageObject lo : stack) {
+			if (lo instanceof Labeled) {
+				Labeled labeled = (Labeled)lo;
+	    		if (obj.getLabel().equalsIgnoreCase(labeled.getLabel())) {
+	    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.duplicate_block_label", obj.getLabel()), obj); //$NON-NLS-1$
+	    		}
+			}
+		}
+    }
+    
     @Override
+    public void visit(BranchingStatement obj) {
+		boolean matchedLabel = false;
+		boolean inLoop = false;
+		for (LanguageObject lo : stack) {
+			if (lo instanceof LoopStatement || lo instanceof WhileStatement) {
+				inLoop = true;
+				if (obj.getLabel() == null) {
+					break;
+				}
+				matchedLabel |= obj.getLabel().equalsIgnoreCase(((Labeled)lo).getLabel());
+			} else if (obj.getLabel() != null && lo instanceof Block && obj.getLabel().equalsIgnoreCase(((Block)lo).getLabel())) {
+				matchedLabel = true;
+				if (obj.getMode() != BranchingMode.LEAVE) {
+					handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.invalid_label", obj.getLabel()), obj); //$NON-NLS-1$
+				}
+			}
+		}
+		if (obj.getMode() != BranchingMode.LEAVE && !inLoop) {
+			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.no_loop"), obj); //$NON-NLS-1$
+		}
+		if (obj.getLabel() != null && !matchedLabel) {
+			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.unknown_block_label", obj.getLabel()), obj); //$NON-NLS-1$
+		}
+    }
+    
+    @Override
     public void visit(AlterTrigger obj) {
     	validateGroupSupportsUpdate(obj.getTarget());
 		try {

Modified: trunk/engine/src/main/java/org/teiid/query/validator/Validator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/Validator.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/java/org/teiid/query/validator/Validator.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -72,7 +72,7 @@
         setTempMetadata(metadata, visitor, object);
         
         PreOrderNavigator nav = new PreOrderNavigator(visitor) {
-            
+        	
         	protected void visitNode(LanguageObject obj) {
         		QueryMetadataInterface previous = visitor.getMetadata();
         		setTempMetadata(metadata, visitor, obj);
@@ -80,6 +80,17 @@
         		visitor.setMetadata(previous);
         	}
         	
+        	@Override
+        	protected void preVisitVisitor(LanguageObject obj) {
+        		super.preVisitVisitor(obj);
+        		visitor.stack.add(obj);
+        	}
+        	
+        	@Override
+        	protected void postVisitVisitor(LanguageObject obj) {
+        		visitor.stack.pop();
+        	}
+        	
         };
         object.acceptVisitor(nav);        	
         

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-08-10 20:06:04 UTC (rev 3372)
@@ -193,6 +193,7 @@
 |   <LANGUAGE: "language">
 |   <LARGE: "large">
 |   <LEADING: "leading">
+|   <LEAVE: "leave">
 |   <LIKE: "like">
 |   <LIKE_REGEX: "like_regex">
 |   <LIMIT: "limit">
@@ -409,6 +410,7 @@
 |   <QMARK: "?">
 |   <DOLLAR: "$">
 |   <SEMICOLON: ";">
+|   <COLON: ":">
 |	<CONCAT_OP: "||">
 }
 
@@ -513,7 +515,7 @@
 {
   	String target = null;
   	QueryCommand command = null;
-  	Block block = null;
+  	Statement stmt = null;
   	TriggerAction triggerAction = null;
   	Token comment = null;
   	Token event = null;
@@ -532,9 +534,9 @@
 	 		alterView.setDefinition(command);
 	 		return alterView;	
 	 	}
-		| (<PROCEDURE> target = id() <AS> { comment = getToken(1).specialToken; } block = block(info)) 
+		| (<PROCEDURE> target = id() <AS> { comment = getToken(1).specialToken; } stmt = statement(info)) 
 		{
-			CreateUpdateProcedureCommand cup = new CreateUpdateProcedureCommand(block);
+			CreateUpdateProcedureCommand cup = new CreateUpdateProcedureCommand(asBlock(stmt));
 			cup.setUpdateProcedure(false);
 			if (comment != null) {
 		 	    cup.setCacheHint(getQueryCacheOption(comment.image));
@@ -563,11 +565,29 @@
 
 TriggerAction forEachRowTriggerAction(ParseInfo info) :
 {
-	Block b = null;
+	Block b = new Block();
+	b.setAtomic(true);
+	Statement stmt = null;
 }
 {
 	<FOR> <EACH> <ROW>
-	b = block(info)
+	(
+	 LOOKAHEAD(1) (<BEGIN> [<ATOMIC>]
+      (
+	    stmt = statement(info)
+	    {          
+    	    b.addStatement(stmt);            	                	    
+	    }
+      )*
+      <END> 
+     )
+     |
+     stmt = statement(info)
+     {
+       b = asBlock(stmt);
+       b.setAtomic(true);
+     }
+    ) 
 	{
 		return new TriggerAction(b);
 	}
@@ -716,12 +736,25 @@
 Statement statement(ParseInfo info) :
 {
     Statement stmt = null;
+    String label = null;
 }
 {
-    (stmt = ifStatement(info) |
-	 stmt = loopStatement(info) |
-	 stmt = whileStatement(info) |
-	 stmt = delimitedStatement(info)
+    (
+	 LOOKAHEAD(2) ([label = id() <COLON>] 
+	  (
+	   stmt = loopStatement(info) |
+	   stmt = whileStatement(info) |
+	   stmt = compoundStatement(info)
+	  )
+	  {
+	  	((Statement.Labeled)stmt).setLabel(label);
+	  }
+	 )
+	 |
+	 (
+      stmt = ifStatement(info) |
+      stmt = delimitedStatement(info)
+	 )
 	)
     
     {
@@ -738,8 +771,7 @@
 	  stmt = sqlStatement(info) |
       stmt = errorStatement(info) |
 	  stmt = declareStatement(info) |
-	  stmt = continueStatement(info) |
-	  stmt = breakStatement(info)
+	  stmt = branchingStatement(info)
 	 )
 	 <SEMICOLON>
 	 {
@@ -747,32 +779,25 @@
 	 }
 }
 
-/**
- * Parse block
- * @throws ParseException
- */
-Block block(ParseInfo info) :
+Block compoundStatement(ParseInfo info) :
 {
     Statement stmt = null;  
     Block block = new Block();
+    Boolean atomic = null;
 }
 {   
-	(      
-    	stmt = statement(info)
-    	{
-        	block.addStatement(stmt);	
-    	}
-        |
-        (<BEGIN>
-            (
-        	    stmt = statement(info)
-        	    {          
-            	    block.addStatement(stmt);            	                	    
-        	    }
-    	   )*
-        <END>)    
-     )           
+    <BEGIN> [[<NOT> {atomic = Boolean.FALSE;}] <ATOMIC> {if (atomic == null) {atomic = Boolean.TRUE;}}]
+    (
+      stmt = statement(info)
+      {          
+	    block.addStatement(stmt);            	                	    
+	  }
+ 	)*
+    <END>
     {
+        if (atomic != null) {
+        	block.setAtomic(atomic);
+        }
         return block;
     }
 }        
@@ -781,37 +806,28 @@
  * Parse break statement 
  * @throws ParseException if parsing failed
  */
-BreakStatement breakStatement(ParseInfo info) :
+BranchingStatement branchingStatement(ParseInfo info) :
 {
-    BreakStatement breakStmt = null;      
+    BranchingStatement breakStmt = new BranchingStatement();
+    Token mode = null;
+    String label = null;
 }
 {
- 	<BREAK>
+ 	(
+ 	 (
+ 	  (mode = <BREAK> | mode = <CONTINUE>) [label = id()] 
+ 	 )
+ 	 | 
+ 	 (mode = <LEAVE> label = id())
+ 	)
  	{
- 		breakStmt = new BreakStatement();
- 		
+ 	    breakStmt.setMode(BranchingStatement.BranchingMode.valueOf(mode.image.toUpperCase()));
+ 	    breakStmt.setLabel(label);
  		return breakStmt;
  	}
 } 	
 
 /**
- * Parse break statement 
- * @throws ParseException if parsing failed
- */
-ContinueStatement continueStatement(ParseInfo info) :
-{
-    ContinueStatement contStmt = null;      
-}
-{
- 	<CONTINUE>
- 	{
- 		contStmt = new ContinueStatement();
- 		
- 		return contStmt;
- 	}
-} 	
-
-/**
  * Parse while statement 
  * @throws ParseException if parsing failed
  */
@@ -819,18 +835,16 @@
 {
     WhileStatement whileStmt = null;    
     Criteria criteria = null;
-    Block block = null;
+    Statement stmt = null;
 }
 {
     <WHILE>
     <LPAREN>  
     criteria = criteria(info)
     <RPAREN>
-    block = block(info)
-    
+    stmt = statement(info)
     {
-        whileStmt = new WhileStatement(criteria, block);   
-
+        whileStmt = new WhileStatement(criteria, asBlock(stmt));   
         return whileStmt;
     }    
 }    
@@ -844,7 +858,7 @@
     LoopStatement loopStmt = null;    
     String cursor = null;
     QueryCommand query = null;
-    Block block = null;
+    Statement stmt = null;
 }
 {
     <LOOP>
@@ -854,11 +868,9 @@
     <RPAREN>
     <AS>
     cursor = id()
-    block = block(info)
-    
+    stmt = statement(info)
     {
-        loopStmt = new LoopStatement(block, query, cursor);   
-
+        loopStmt = new LoopStatement(asBlock(stmt), query, cursor);   
         return loopStmt;
     }    
 }   
@@ -871,21 +883,20 @@
 {
     IfStatement ifStmt = null;    
     Criteria criteria = null;
-    Block ifBlock = null;
-    Block elseBlock = null;
+    Statement ifStatement = null;
+    Statement elseStatement = null;
 }
 {
     <IF>
     <LPAREN>  
     criteria = criteria(info)
     <RPAREN>
-    ifBlock = block(info)
+    ifStatement = statement(info)
     //else blocks will be associated with the closest if block
-    [LOOKAHEAD(1)<ELSE> elseBlock = block(info)]
-    
+    [LOOKAHEAD(1)<ELSE> elseStatement = statement(info)]
     {
-        ifStmt = new IfStatement(criteria, ifBlock);
-        ifStmt.setElseBlock(elseBlock);
+        ifStmt = new IfStatement(criteria, asBlock(ifStatement));
+        ifStmt.setElseBlock(asBlock(elseStatement));
         return ifStmt;
     }    
 }    
@@ -1163,16 +1174,16 @@
 {
     CreateUpdateProcedureCommand updateProcCmd = 
         new CreateUpdateProcedureCommand();
-    Block block = null;  
+    Statement stmt = null;  
 }
 { 
     <CREATE> [<VIRTUAL> {updateProcCmd.setUpdateProcedure(false);}] 
     [<UPDATE>] 
     <PROCEDURE>
 
-    block = block(info)
+    stmt = statement(info)
     {        
-        updateProcCmd.setBlock(block);
+        updateProcCmd.setBlock(asBlock(stmt));
         return updateProcCmd;        
     }    
 }   

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-08-10 20:06:04 UTC (rev 3372)
@@ -94,7 +94,6 @@
 ERR.015.008.0010= INSERT statement must have the same number of elements and values specified.  This statement has {0} elements and {1} values.
 ERR.015.008.0011= Error parsing query plan transformation for {0}
 ERR.015.008.0013= Error parsing query plan transformation for {0}
-ERR.015.008.0015= Unknown statement type: {0}
 ERR.015.008.0019= Unable to resolve element: {0}
 ERR.015.008.0020= Element is ambiguous and must be qualified: {0}
 ERR.015.008.0022= Failed parsing reference binding: {0}
@@ -197,6 +196,10 @@
 ValidationVisitor.insert_qe_partition = Inserts with query expressions cannot be performed against a partitioned UNION view {0}.
 ValidationVisitor.insert_no_partition = Could not determine INSERT target for a partitioned UNION view {0} with values {1}.
 ValidationVisitor.multisource_constant = The multisource column or parameter {0} requires a literal value.
+ValidationVisitor.duplicate_block_label = Duplicate label {0}.
+ValidationVisitor.no_loop = CONTINUE/BREAK can only be used in a LOOP/WHILE statement.
+ValidationVisitor.invalid_label = CONTINUE/BREAK labels can only target LOOP/WHILE statements. {0} targets a block.
+ValidationVisitor.unknown_block_label = No label found in containing scope with name {0}.
 ERR.015.012.0029 = INSERT, UPDATE, and DELETE not allowed on XML documents
 ERR.015.012.0030 = Commands used in stored procedure language not allowed on XML documents
 ERR.015.012.0031 = Queries against XML documents can not have a GROUP By clause

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -54,7 +54,7 @@
 		alterTrigger.setTarget(new GroupSymbol("x"));
 		alterTrigger.setEvent(TriggerEvent.UPDATE);
 		alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseUpdateProcedure("for each row begin end"));
-		helpTest("alter trigger on x instead of update as for each row begin end", "ALTER TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN\nEND", alterTrigger);
+		helpTest("alter trigger on x instead of update as for each row begin end", "ALTER TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN ATOMIC\nEND", alterTrigger);
 	}
 	
 	@Test public void testAlterDisabled() throws Exception {
@@ -71,7 +71,7 @@
 		alterTrigger.setTarget(new GroupSymbol("x"));
 		alterTrigger.setEvent(TriggerEvent.UPDATE);
 		alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseUpdateProcedure("for each row begin end"));
-		helpTest("create trigger on x instead of update as for each row begin end", "CREATE TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN\nEND", alterTrigger);
+		helpTest("create trigger on x instead of update as for each row begin end", "CREATE TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN ATOMIC\nEND", alterTrigger);
 	}
 	
 }

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -86,9 +86,8 @@
 import org.teiid.query.sql.lang.TextTable.TextColumn;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
-import org.teiid.query.sql.proc.BreakStatement;
+import org.teiid.query.sql.proc.BranchingStatement;
 import org.teiid.query.sql.proc.CommandStatement;
-import org.teiid.query.sql.proc.ContinueStatement;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
 import org.teiid.query.sql.proc.CriteriaSelector;
 import org.teiid.query.sql.proc.DeclareStatement;
@@ -99,6 +98,7 @@
 import org.teiid.query.sql.proc.Statement;
 import org.teiid.query.sql.proc.TranslateCriteria;
 import org.teiid.query.sql.proc.WhileStatement;
+import org.teiid.query.sql.proc.BranchingStatement.BranchingMode;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
@@ -172,7 +172,7 @@
     }
     
     private void helpBlockTest(String block, String expectedString, Block expectedBlock) throws ParseException {
-        Block actualBlock = new SQLParser(new StringReader(block)).block(new ParseInfo());
+        Block actualBlock = SQLParserUtil.asBlock(new SQLParser(new StringReader(block)).statement(new ParseInfo()));
         String actualString = actualBlock.toString();
         assertEquals("Parse string does not match: ", expectedString, actualString); //$NON-NLS-1$
         assertEquals("Block does not match: ", expectedBlock, actualBlock);              //$NON-NLS-1$
@@ -3185,32 +3185,6 @@
              stmt);     
     }    
 
-    /*@Test public void testIfStatement1(){
-        ElementSymbol a = new ElementSymbol("a");
-        String shortType = new String("short");
-        Statement ifStmt = new DeclareStatement(a, shortType);
-
-        ElementSymbol b = new ElementSymbol("b");
-        Statement elseStmt = new DeclareStatement(b, shortType);
-              
-        Block ifBlock = new Block();
-        ifBlock.addStatement(ifStmt); 
-      
-        Block elseBlock = new Block();
-        elseBlock.addStatement(elseStmt);
-    
-        ElementSymbol c = new ElementSymbol("c");    
-        Criteria crit = new CompareCriteria(c, CompareCriteria.EQ, 
-            new Constant(new Integer(5)));
-            
-        IfStatement stmt = new IfStatement(crit, ifBlock, elseBlock);
-                        
-        helpStmtTest("IF(c = 5) BEGIN DECLARE short a; END ELSE ",
-             "IF(c = 5)"+"\n"+ "BEGIN"+"\n"+"DECLARE short a;"+"\n"+"END"+"\n"+
-             "ELSE"+"\n"+"BEGIN"+"\n"+"DECLARE short b;"+"\n"+"END",
-             stmt);     
-    }*/   
-    
     @Test public void testCriteriaSelector0() throws Exception {
         ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
         
@@ -5463,16 +5437,41 @@
                      +"\n"+"END", whileStmt); //$NON-NLS-1$ //$NON-NLS-2$
     }
     
+    @Test public void testWhileStatement1() throws Exception {
+        ElementSymbol x = new ElementSymbol("x", false); //$NON-NLS-1$
+        Function f = new Function("+", new Expression[] { x, new Constant(new Integer(1)) }); //$NON-NLS-1$
+        Statement assignmentStmt = new AssignmentStatement(x, f);
+        Block block = new Block();
+        block.setAtomic(true);
+        block.setLabel("1y");
+        block.addStatement(assignmentStmt);
+        BranchingStatement bs = new BranchingStatement(BranchingMode.CONTINUE);
+        bs.setLabel("1y");
+        block.addStatement(bs);
+        Criteria crit = new CompareCriteria(x, CompareCriteria.LT, 
+                    new Constant(new Integer(100)));
+        WhileStatement whileStmt = new WhileStatement(crit, block);
+        helpStmtTest("WHILE (x < 100) \"1y\": BEGIN ATOMIC x=x+1; CONTINUE \"1y\"; END", //$NON-NLS-1$
+                     "WHILE(x < 100)"+"\n"+ "\"1y\" : BEGIN ATOMIC"+"\n"+"x = (x + 1);\nCONTINUE \"1y\";" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+                     +"\n"+"END", whileStmt); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
     @Test public void testBreakStatement() throws Exception {
-        Statement breakStmt = new BreakStatement();
+        Statement breakStmt = new BranchingStatement();
         helpStmtTest("break;", "BREAK;", breakStmt); //$NON-NLS-1$ //$NON-NLS-2$
     }
     
     @Test public void testContinueStatement() throws Exception {
-        Statement contStmt = new ContinueStatement();
+    	BranchingStatement contStmt = new BranchingStatement(BranchingMode.CONTINUE);
         helpStmtTest("continue;", "CONTINUE;", contStmt); //$NON-NLS-1$ //$NON-NLS-2$
     }
     
+    @Test public void testContinueStatement1() throws Exception {
+    	BranchingStatement contStmt = new BranchingStatement(BranchingMode.CONTINUE);
+	    contStmt.setLabel("x");
+        helpStmtTest("continue x;", "CONTINUE x;", contStmt); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
     @Test public void testVirtualProcedure(){        
         ElementSymbol x = new ElementSymbol("x"); //$NON-NLS-1$
         String intType = new String("integer"); //$NON-NLS-1$
@@ -5498,7 +5497,7 @@
         block.addStatement(assignmentStmt);
         
         Block ifBlock = new Block();
-        Statement continueStmt = new ContinueStatement();
+        Statement continueStmt = new BranchingStatement(BranchingMode.CONTINUE);
         ifBlock.addStatement(continueStmt);
         Criteria crit = new CompareCriteria(x, CompareCriteria.GT, 
         new Constant(new Integer(5)));

Modified: trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -29,12 +29,16 @@
 import java.util.List;
 
 import org.junit.Test;
+import org.mockito.Mockito;
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryProcessingException;
 import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.client.metadata.ParameterInfo;
 import org.teiid.core.TeiidException;
+import org.teiid.core.TeiidProcessingException;
 import org.teiid.core.types.DataTypeManager;
+import org.teiid.dqp.service.TransactionContext;
+import org.teiid.dqp.service.TransactionService;
 import org.teiid.metadata.ColumnSet;
 import org.teiid.metadata.MetadataStore;
 import org.teiid.metadata.Procedure;
@@ -1648,6 +1652,48 @@
         helpTestProcess(plan, expected, dataMgr, metadata);
     }
     
+    @Test public void testLoopsWithLabels() throws Exception {
+        TransformationMetadata metadata = RealMetadataFactory.example1();
+        
+        StringBuffer procedure = new StringBuffer("CREATE VIRTUAL PROCEDURE \n"); //$NON-NLS-1$
+        procedure.append("y: BEGIN\n"); //$NON-NLS-1$
+        procedure.append("declare integer VARIABLES.e2_total=param1;\n"); //$NON-NLS-1$
+        procedure.append("x: loop on (select e2 as x from pm1.g1) as mycursor\n"); //$NON-NLS-1$
+        procedure.append("BEGIN\n"); //$NON-NLS-1$
+        procedure.append("e2_total=e2_total+mycursor.x;\n"); //$NON-NLS-1$
+        procedure.append("loop on (select e2 as x from pm1.g1) as mycursor1\n"); //$NON-NLS-1$
+        procedure.append("BEGIN\n"); //$NON-NLS-1$
+        procedure.append("if (e2_total < 5)\n"); //$NON-NLS-1$
+        procedure.append("break x;\n"); //$NON-NLS-1$
+        procedure.append("else if (e2_total > 50)\n"); //$NON-NLS-1$
+        procedure.append("leave y;\n"); //$NON-NLS-1$
+        procedure.append("e2_total=e2_total+mycursor1.x;"); //$NON-NLS-1$
+        procedure.append("END\n"); //$NON-NLS-1$
+        procedure.append("END\n"); //$NON-NLS-1$
+        procedure.append("SELECT VARIABLES.e2_total;\n"); //$NON-NLS-1$
+        procedure.append("END"); //$NON-NLS-1$
+        
+        addProc(metadata, "sq2", procedure.toString(), new String[] { "e1" }, new String[] { DataTypeManager.DefaultDataTypes.INTEGER }, new String[] {"param1"}, new String[] {DataTypeManager.DefaultDataTypes.INTEGER});
+        
+        String userUpdateStr = "EXEC pm1.sq2(1)"; //$NON-NLS-1$
+        
+        FakeDataManager dataMgr = exampleDataManager(metadata);
+
+        ProcessorPlan plan = getProcedurePlan(userUpdateStr, metadata);
+        
+        //Create expected results
+        List[] expected = new List[] {
+            };           
+        helpTestProcess(plan, expected, dataMgr, metadata);
+        
+        expected = new List[] {
+            Arrays.asList(0),  
+            };           
+        userUpdateStr = "EXEC pm1.sq2(-5)"; //$NON-NLS-1$
+        plan = getProcedurePlan(userUpdateStr, metadata);
+        helpTestProcess(plan, expected, dataMgr, metadata);
+    }
+    
     @Test public void testCreateWithoutDrop() throws Exception {
         
         TransformationMetadata metadata = RealMetadataFactory.example1();
@@ -2433,6 +2479,53 @@
 
         helpTestProcess(plan, expected, dataMgr, metadata);
     }
+    
+    @Test public void testBeginAtomic() throws Exception {
+        String proc = "CREATE VIRTUAL PROCEDURE " + //$NON-NLS-1$
+        		"BEGIN ATOMIC" + //$NON-NLS-1$
+                " select e1, e2, e3, e4 into #t1 from pm1.g1;\n" + //$NON-NLS-1$
+                " update #t1 set e1 = 1 where e4 < 2;\n" + //$NON-NLS-1$
+                " delete from #t1 where e4 > 2;\n" + //$NON-NLS-1$
+                " select e2/\"in\" from #t1;\n" + //$NON-NLS-1$
+        		"END"; //$NON-NLS-1$
+        TransformationMetadata tm = RealMetadataFactory.example1();
+        addProc(tm, "sq1", proc, new String[] { "e1" }, 
+        		new String[] { DataTypeManager.DefaultDataTypes.INTEGER }, new String[] {"in"}, new String[] {DataTypeManager.DefaultDataTypes.INTEGER});
+        FakeDataManager dataMgr = exampleDataManager(tm);
+        CommandContext context = new CommandContext("pID", null, null, null, 1); //$NON-NLS-1$
+    	QueryMetadataInterface metadata = new TempMetadataAdapter(tm, new TempMetadataStore());
+        context.setMetadata(metadata);
 
+        TransactionContext tc = new TransactionContext();
+        TransactionService ts = Mockito.mock(TransactionService.class);
+        context.setTransactionService(ts);
+        context.setTransactionContext(tc);
+        String userQuery = "EXEC pm1.sq1(1)"; //$NON-NLS-1$
+        ProcessorPlan plan = getProcedurePlan(userQuery, tm, TestOptimizer.getGenericFinder());
+        List[] expected = new List[] {
+                Arrays.asList(5), 
+        };
+    	TestProcessor.helpProcess(plan, context, dataMgr, expected);
+    	Mockito.verify(ts, Mockito.times(3)).begin(tc);
+    	Mockito.verify(ts, Mockito.times(3)).commit(tc);
+    	
+    	tc = new TransactionContext();
+        ts = Mockito.mock(TransactionService.class);
+        context.setTransactionService(ts);
+        context.setTransactionContext(tc);
+        userQuery = "EXEC pm1.sq1(0)"; //$NON-NLS-1$
+        plan = getProcedurePlan(userQuery, tm, TestOptimizer.getGenericFinder());
+        expected = null;
+        try {
+        	TestProcessor.helpProcess(plan, context, dataMgr, expected);
+        	fail();
+        } catch (TeiidProcessingException e) {
+        	
+        }
+    	Mockito.verify(ts).begin(tc);
+    	Mockito.verify(ts, Mockito.times(0)).commit(tc);
+    	Mockito.verify(ts).rollback(tc);
+    }
+
     private static final boolean DEBUG = false;
 }

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -49,12 +49,12 @@
 	}
 	
 	@Test public void testAlterTriggerInsert() {
-		AlterTrigger alterTrigger = (AlterTrigger) helpResolve("alter trigger on SmallA_2589 instead of insert as for each row select new.intkey;", RealMetadataFactory.exampleBQTCached());
+		AlterTrigger alterTrigger = (AlterTrigger) helpResolve("alter trigger on SmallA_2589 instead of insert as for each row begin atomic select new.intkey; end", RealMetadataFactory.exampleBQTCached());
 		assertNotNull(alterTrigger.getTarget().getMetadataID());
 	}
 	
 	@Test public void testAlterTriggerInsert_Invalid() {
-		helpResolveException("alter trigger on SmallA_2589 instead of insert as for each row select old.intkey;", RealMetadataFactory.exampleBQTCached());
+		helpResolveException("alter trigger on SmallA_2589 instead of insert as for each row begin atomic select old.intkey; end", RealMetadataFactory.exampleBQTCached());
 	}
 	
 	@Test public void testAlterView_Invalid() {

Modified: trunk/engine/src/test/java/org/teiid/query/sql/proc/TestBreakStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/proc/TestBreakStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/sql/proc/TestBreakStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -24,12 +24,11 @@
  */
 package org.teiid.query.sql.proc;
 
+import junit.framework.TestCase;
+
 import org.teiid.core.util.UnitTestUtil;
-import org.teiid.query.sql.proc.BreakStatement;
-import org.teiid.query.sql.proc.ContinueStatement;
+import org.teiid.query.sql.proc.BranchingStatement.BranchingMode;
 
-import junit.framework.*;
-
 public class TestBreakStatement  extends TestCase{
 
     /**
@@ -41,32 +40,32 @@
     
     // ################################## TEST HELPERS ################################ 
 
-    public static final BreakStatement sample1() { 
-        return new BreakStatement();
+    public static final BranchingStatement sample1() { 
+        return new BranchingStatement();
     }
     
-    public static final BreakStatement sample2() { 
-        return new BreakStatement();
+    public static final BranchingStatement sample2() { 
+        return new BranchingStatement();
     }
     
     // ################################## ACTUAL TESTS ################################ 
     
     public void testSelfEquivalence(){
-        BreakStatement s1 = sample1();
+        BranchingStatement s1 = sample1();
         int equals = 0;
         UnitTestUtil.helpTestEquivalence(equals, s1, s1);
     }
 
     public void testEquivalence(){
-        BreakStatement s1 = sample1();
-        BreakStatement s1a = sample2();
+        BranchingStatement s1 = sample1();
+        BranchingStatement s1a = sample2();
         int equals = 0;
         UnitTestUtil.helpTestEquivalence(equals, s1, s1a);
     }
     
     public void testNonEquivalence(){
-        BreakStatement s1 = sample1();
+        BranchingStatement s1 = sample1();
         int equals = -1;
-        UnitTestUtil.helpTestEquivalence(equals, s1, new ContinueStatement());
+        UnitTestUtil.helpTestEquivalence(equals, s1, new BranchingStatement(BranchingMode.CONTINUE));
     }
 }

Deleted: trunk/engine/src/test/java/org/teiid/query/sql/proc/TestContinueStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/proc/TestContinueStatement.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/sql/proc/TestContinueStatement.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -1,80 +0,0 @@
-/*
- * 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.proc;
-
-import org.teiid.core.util.UnitTestUtil;
-import org.teiid.query.sql.proc.BreakStatement;
-import org.teiid.query.sql.proc.ContinueStatement;
-
-import junit.framework.TestCase;
-
-
-/**
- * @author LLiang
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class TestContinueStatement  extends TestCase{
-
-    /**
-     * Constructor for TestAssignmentStatement.
-     */
-    public TestContinueStatement(String name) { 
-        super(name);
-    }
-    
-    // ################################## TEST HELPERS ################################ 
-
-    public static final ContinueStatement sample1() { 
-        return new ContinueStatement();
-    }
-    
-    public static final ContinueStatement sample2() { 
-        return new ContinueStatement();
-    }
-    
-    // ################################## ACTUAL TESTS ################################ 
-    
-    public void testSelfEquivalence(){
-        ContinueStatement s1 = sample1();
-        int equals = 0;
-        UnitTestUtil.helpTestEquivalence(equals, s1, s1);
-    }
-
-    public void testEquivalence(){
-        ContinueStatement s1 = sample1();
-        ContinueStatement s1a = sample2();
-        int equals = 0;
-        UnitTestUtil.helpTestEquivalence(equals, s1, s1a);
-    }
-    
-    public void testNonEquivalence(){
-        ContinueStatement s1 = sample1();
-        int equals = -1;
-        UnitTestUtil.helpTestEquivalence(equals, s1, new BreakStatement());
-    }
-
-}

Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -41,7 +41,7 @@
 	}
 	
 	@Test public void testValidateAlterTrigger() {
-		TestValidator.helpValidate("alter trigger on SmallA_2589 instead of insert as for each row select 1;", new String[] {"SmallA_2589"}, RealMetadataFactory.exampleBQTCached());
+		TestValidator.helpValidate("alter trigger on SmallA_2589 instead of insert as for each row begin atomic select 1; end", new String[] {"SmallA_2589"}, RealMetadataFactory.exampleBQTCached());
 	}
 	
 	@Test public void testValidateAlterProcedure() {

Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2011-08-10 19:41:34 UTC (rev 3371)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2011-08-10 20:06:04 UTC (rev 3372)
@@ -1516,6 +1516,36 @@
         assertEquals("Expected report to have no validation failures", false, report.hasItems()); //$NON-NLS-1$
     }
     
+    @Test public void testDupLabel() throws Exception{
+        String sql = "CREATE VIRTUAL PROCEDURE BEGIN IF (pm1.vsp42.param1 > 0) x : begin SELECT 1 AS x; x: begin atomic select 2 as x; end end END"; //$NON-NLS-1$
+        
+        QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+        
+        // Validate
+        ValidatorReport report = helpValidateInModeler("pm1.vsp42", sql, metadata);  //$NON-NLS-1$ 
+        examineReport(sql, new String[] {"x : BEGIN ATOMIC\nSELECT 2 AS x;\nEND"}, report);
+    }
+    
+    @Test public void testInvalidContinue() throws Exception{
+        String sql = "CREATE VIRTUAL PROCEDURE BEGIN continue; END"; //$NON-NLS-1$
+        
+        QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+        
+        // Validate
+        ValidatorReport report = helpValidateInModeler("pm1.vsp42", sql, metadata);  //$NON-NLS-1$ 
+        examineReport(sql, new String[] {"CONTINUE;"}, report);
+    }
+    
+    @Test public void testInvalidLabel() throws Exception{
+        String sql = "CREATE VIRTUAL PROCEDURE BEGIN IF (pm1.vsp42.param1 > 0) x : begin continue y; end END"; //$NON-NLS-1$
+        
+        QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+        
+        // Validate
+        ValidatorReport report = helpValidateInModeler("pm1.vsp42", sql, metadata);  //$NON-NLS-1$ 
+        examineReport(sql, new String[] {"CONTINUE y;"}, report);
+    }
+    
     @Test public void testNonQueryAgg() throws Exception{
         String sql = "CREATE VIRTUAL PROCEDURE BEGIN IF (max(pm1.vsp42.param1) > 0) SELECT 1 AS x; ELSE SELECT 0 AS x; END"; //$NON-NLS-1$
         



More information about the teiid-commits mailing list