[teiid-commits] teiid SVN: r3323 - in trunk: documentation/developer-guide/src/main/docbook/en-US/content and 22 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Thu Jul 21 15:28:45 EDT 2011


Author: shawkins
Date: 2011-07-21 15:28:44 -0400 (Thu, 21 Jul 2011)
New Revision: 3323

Removed:
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java
   trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java
Modified:
   trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
   trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java
   trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java
   trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
   trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java
   trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java
   trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
   trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
Log:
TEIID-1667 refining agg and window function validation and also continuing to refine the language object model to move beyond the symbol base class

Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -725,8 +725,6 @@
     /**
      * <p>Support indicates that the connector supports functions in GROUP BY, such as:
      *  <code>SELECT dayofmonth(theDate), COUNT(*) FROM table GROUP BY dayofmonth(theDate)</code></p>
-     *  
-     * <br>NOT CURRENTLY USED - group by expressions create an inline view for pushdown
      * @since 5.0
      */
     public boolean supportsFunctionsInGroupBy() {

Modified: trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml
===================================================================
--- trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/documentation/developer-guide/src/main/docbook/en-US/content/translator-api.xml	2011-07-21 19:28:44 UTC (rev 3323)
@@ -1229,7 +1229,7 @@
                   <para>GroupBy</para>
                 </entry>
                 <entry>
-                  <para>Not currently used - non-element expressions in the group by create an inline view.</para>
+                  <para>Translator can support non-column reference grouping expressions.</para>
                 </entry>
               </row>
               <row>
@@ -1287,6 +1287,28 @@
                   <para>Translator supports the WITH clause.</para>
                 </entry>
               </row>
+              <row>
+                <entry>
+                  <para>ElementaryOlapOperations</para>
+                </entry>
+                <entry>
+                  <para/>
+                </entry>
+                <entry>
+                  <para>Translator supports window functions and analytic functions RANK, DENSE_RANK, and ROW_NUMBER.</para>
+                </entry>
+              </row>
+              <row>
+                <entry>
+                  <para>AdvancedOlapOperations</para>
+                </entry>
+                <entry>
+                  <para/>
+                </entry>
+                <entry>
+                  <para>Translator supports aggregate conditions.</para>
+                </entry>
+              </row>
             </tbody>
           </tgroup>
         </table>

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -180,12 +180,12 @@
             this.metadata = tempFacade; 
         }
         
-        List projectedSymbols = originalCommand.getProjectedSymbols();
+        List<SingleElementSymbol> projectedSymbols = originalCommand.getProjectedSymbols();
         columnMetadata = new Map[projectedSymbols.size()];
         
-        Iterator symbolIter = projectedSymbols.iterator();
+        Iterator<SingleElementSymbol> symbolIter = projectedSymbols.iterator();
         for(int i=0; symbolIter.hasNext(); i++) {
-            SingleElementSymbol symbol = (SingleElementSymbol) symbolIter.next();
+            SingleElementSymbol symbol = symbolIter.next();
             String shortColumnName = SingleElementSymbol.getShortName(symbol.getOutputName());
             if(symbol instanceof AliasSymbol) {
                 symbol = ((AliasSymbol)symbol).getSymbol();

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -112,7 +112,7 @@
 import org.teiid.query.sql.proc.TriggerAction;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
@@ -744,7 +744,7 @@
     		Collection<AggregateSymbol> aggs = AggregateSymbolCollectorVisitor.getAggregates(query.getSelect(), true);
     		boolean hasGrouping = !aggs.isEmpty();
     		if (query.getHaving() != null) {
-    			AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), aggs, null);
+    			aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), true));
     			hasGrouping = true;
     		}
     		if (query.getGroupBy() != null) {
@@ -1224,7 +1224,7 @@
         	}else{
             	this.context.accessedPlanningObject(matMetadataId);
         		qnode = new QueryNode(null);
-        		Query query = createMatViewQuery(matMetadataId, matTableName, Arrays.asList(new AllSymbol()), isImplicitGlobal);
+        		Query query = createMatViewQuery(matMetadataId, matTableName, Arrays.asList(new MultipleElementSymbol()), isImplicitGlobal);
         		query.setCacheHint(hint);
         		qnode.setCommand(query);
                 cacheString = "matview"; //$NON-NLS-1$

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -24,11 +24,9 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.core.TeiidComponentException;
@@ -169,22 +167,14 @@
         }
 	}
     
-    private static AtomicInteger EXPRESSION_INDEX = new AtomicInteger(0);
-    
     public static List<SingleElementSymbol> createExpressionSymbols(List<? extends Expression> expressions) {
-        HashMap<Expression, ExpressionSymbol> uniqueExpressions = new HashMap<Expression, ExpressionSymbol>();
         List<SingleElementSymbol> result = new ArrayList<SingleElementSymbol>();
         for (Expression expression : expressions) {
             if (expression instanceof SingleElementSymbol) {
                 result.add((SingleElementSymbol)expression);
                 continue;
             } 
-            ExpressionSymbol expressionSymbol = uniqueExpressions.get(expression);
-            if (expressionSymbol == null) {
-                expressionSymbol = new ExpressionSymbol("$" + EXPRESSION_INDEX.getAndIncrement(), expression); //$NON-NLS-1$
-                uniqueExpressions.put(expression, expressionSymbol);
-            }
-            result.add(expressionSymbol);
+            result.add(new ExpressionSymbol("expr", expression)); //$NON-NLS-1$
         }
         return result;
     }

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -68,10 +68,10 @@
 import org.teiid.query.sql.lang.SubquerySetCriteria;
 import org.teiid.query.sql.navigator.DeepPostOrderNavigator;
 import org.teiid.query.sql.symbol.AggregateSymbol;
-import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -455,7 +455,7 @@
 
 	private boolean isSimpleJoin(Query query) {
 		if (query.getFrom() != null) {
-			for (FromClause clause : (List<FromClause>)query.getFrom().getClauses()) {
+			for (FromClause clause : query.getFrom().getClauses()) {
 				if (RuleCollapseSource.hasOuterJoins(clause)) {
 					return false;
 				}
@@ -479,7 +479,7 @@
 		plannedResult.query.setLimit(null);
 
 		List<GroupSymbol> rightGroups = plannedResult.query.getFrom().getGroups();
-		Set<SingleElementSymbol> requiredExpressions = new LinkedHashSet<SingleElementSymbol>();
+		Set<Expression> requiredExpressions = new LinkedHashSet<Expression>();
 		final SymbolMap refs = plannedResult.query.getCorrelatedReferences();
 		boolean addGroupBy = false;
 		if (refs != null) {
@@ -494,7 +494,7 @@
 				return false;
 			}
 			if (plannedResult.query.getGroupBy() == null) {
-				processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, where, true);
+				processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, where, null, true);
 				if (hasAggregates) {
 					if (!plannedResult.nonEquiJoinCriteria.isEmpty()) {
 						return false;
@@ -502,7 +502,7 @@
 					addGroupBy = true;
 				}
 			}
-			processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, having, false);
+			processCriteria(leftGroups, plannedResult, rightGroups, requiredExpressions, refs, having, plannedResult.query.getGroupBy(), false);
 		}
 				
 		if (plannedResult.additionalCritieria != null) {
@@ -525,29 +525,29 @@
 		}
 
 		if (addGroupBy) {
-			LinkedHashSet<SingleElementSymbol> groupingSymbols = new LinkedHashSet<SingleElementSymbol>();
-			ArrayList<SingleElementSymbol> aggs = new ArrayList<SingleElementSymbol>();
+			LinkedHashSet<Expression> groupingSymbols = new LinkedHashSet<Expression>();
 			for (Expression expr : (List<Expression>)plannedResult.rightExpressions) {
-				AggregateSymbolCollectorVisitor.getAggregates(expr, aggs, groupingSymbols);
+				AggregateSymbolCollectorVisitor.getAggregates(expr, null, groupingSymbols, null, null, null);
 			}
 			if (!groupingSymbols.isEmpty()) {
-				plannedResult.query.setGroupBy((GroupBy) new GroupBy(new ArrayList<SingleElementSymbol>(groupingSymbols)).clone());
+				plannedResult.query.setGroupBy((GroupBy) new GroupBy(new ArrayList<Expression>(groupingSymbols)).clone());
 			}
 		}
-		HashSet<SingleElementSymbol> projectedSymbols = new HashSet<SingleElementSymbol>();
+		HashSet<Expression> projectedSymbols = new HashSet<Expression>();
 		for (SingleElementSymbol ses : plannedResult.query.getProjectedSymbols()) {
-			if (ses instanceof AliasSymbol) {
-				ses = ((AliasSymbol)ses).getSymbol();
-			}
-			projectedSymbols.add(ses);
+			projectedSymbols.add(SymbolMap.getExpression(ses));
 		}
-		for (SingleElementSymbol ses : requiredExpressions) {
+		for (Expression ses : requiredExpressions) {
 			if (projectedSymbols.add(ses)) {
-				plannedResult.query.getSelect().addSymbol((SingleElementSymbol) ses.clone());
+				if (ses instanceof SingleElementSymbol) {
+					plannedResult.query.getSelect().addSymbol((SingleElementSymbol)ses);
+				} else {
+					plannedResult.query.getSelect().addSymbol(new ExpressionSymbol("expr", (Expression) ses.clone())); //$NON-NLS-1$
+				}
 			}
 		}
 		for (SingleElementSymbol ses : (List<SingleElementSymbol>)plannedResult.rightExpressions) {
-			if (projectedSymbols.add(ses)) {
+			if (projectedSymbols.add(SymbolMap.getExpression(ses))) {
 				plannedResult.query.getSelect().addSymbol((SingleElementSymbol)ses.clone());
 			}
 		}
@@ -556,8 +556,8 @@
 
 	private void processCriteria(Collection<GroupSymbol> leftGroups,
 			PlannedResult plannedResult, List<GroupSymbol> rightGroups,
-			Set<SingleElementSymbol> requiredExpressions, final SymbolMap refs,
-			Criteria joinCriteria, boolean where) {
+			Set<Expression> requiredExpressions, final SymbolMap refs,
+			Criteria joinCriteria, GroupBy groupBy, boolean where) {
 		if (joinCriteria == null) {
 			return;
 		}
@@ -565,9 +565,8 @@
 
 		for (Iterator<Criteria> critIter = crits.iterator(); critIter.hasNext();) {
 			Criteria conjunct = critIter.next();
-			List<SingleElementSymbol> aggregates = new LinkedList<SingleElementSymbol>();
-			List<SingleElementSymbol> elements = new LinkedList<SingleElementSymbol>();
-			AggregateSymbolCollectorVisitor.getAggregates(conjunct, aggregates, elements);
+			List<Expression> additionalRequired = new LinkedList<Expression>();
+			AggregateSymbolCollectorVisitor.getAggregates(conjunct, additionalRequired, additionalRequired, additionalRequired, null, groupBy!=null?groupBy.getSymbols():null);
 			ReferenceReplacementVisitor emv = new ReferenceReplacementVisitor(refs);
 			DeepPostOrderNavigator.doVisit(conjunct, emv);
 			if (!emv.replacedAny) {
@@ -579,8 +578,7 @@
 					plannedResult.query.setHaving(Criteria.combineCriteria(plannedResult.query.getHaving(), conjunct));
 				}
 			} else {
-				requiredExpressions.addAll(aggregates);
-				requiredExpressions.addAll(elements);
+				requiredExpressions.addAll(additionalRequired);
 			}
 		}
 		RuleChooseJoinStrategy.separateCriteria(leftGroups, rightGroups, plannedResult.leftExpressions, plannedResult.rightExpressions, crits, plannedResult.nonEquiJoinCriteria);

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -277,7 +277,7 @@
 			if (ex instanceof AggregateSymbol) {
 				compositeAggs.add((AggregateSymbol) ex);
 			} else {
-				AggregateSymbolCollectorVisitor.getAggregates(ex, compositeAggs, null);
+				compositeAggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(ex, false));
 				hasExpressionMapping = true;
 			}
 		}

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -51,10 +51,10 @@
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.Select;
 import org.teiid.query.sql.navigator.DeepPreOrderNavigator;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.visitor.ElementCollectorVisitor;
 import org.teiid.query.sql.visitor.ReferenceCollectorVisitor;
@@ -135,7 +135,7 @@
     
     static Query wrapQuery(FromClause fromClause, String groupName) {
         Select select = new Select();
-        select.addSymbol(new AllInGroupSymbol(groupName + ".*")); //$NON-NLS-1$
+        select.addSymbol(new MultipleElementSymbol(groupName));
         Query query = new Query();
         query.setSelect(select);
         From from = new From();

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -53,9 +53,9 @@
 import org.teiid.query.sql.lang.OrderBy;
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.Select;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.SelectSymbol;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.visitor.ElementCollectorVisitor;
@@ -247,7 +247,7 @@
         SelectSymbol firstSymbol = select.getSymbol(0);
 
         // 0. mark the nodes to be excluded
-        if(firstSymbol instanceof AllSymbol) {
+        if(firstSymbol instanceof MultipleElementSymbol && ((MultipleElementSymbol)firstSymbol).getGroup() == null) {
             return doc;
         }
         

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -76,12 +76,11 @@
 import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.navigator.PostOrderNavigator;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
@@ -89,8 +88,6 @@
 
 public class SimpleQueryResolver implements CommandResolver {
 
-    private static final String ALL_IN_GROUP_SUFFIX = ".*"; //$NON-NLS-1$
-
     /** 
      * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, boolean)
      */
@@ -107,14 +104,14 @@
             ResolverVisitor visitor = (ResolverVisitor)qrv.getVisitor();
 			visitor.throwException(true);
         } catch (TeiidRuntimeException e) {
-            if (e.getChild() instanceof QueryMetadataException) {
-                throw (QueryMetadataException)e.getChild();
+            if (e.getCause() instanceof QueryMetadataException) {
+                throw (QueryMetadataException)e.getCause();
             }
-            if (e.getChild() instanceof QueryResolverException) {
-                throw (QueryResolverException)e.getChild();
+            if (e.getCause() instanceof QueryResolverException) {
+                throw (QueryResolverException)e.getCause();
             }
-            if (e.getChild() instanceof TeiidComponentException) {
-                throw (TeiidComponentException)e.getChild();
+            if (e.getCause() instanceof TeiidComponentException) {
+                throw (TeiidComponentException)e.getCause();
             }
             throw e;
         }
@@ -185,18 +182,18 @@
         }
 	}
 
-    private static GroupSymbol resolveAllInGroup(AllInGroupSymbol allInGroupSymbol, Set<GroupSymbol> groups, QueryMetadataInterface metadata) throws QueryResolverException, QueryMetadataException, TeiidComponentException {       
-        String name = allInGroupSymbol.getName();
-        int index = name.lastIndexOf(ALL_IN_GROUP_SUFFIX);
-        String groupAlias = name.substring(0, index);
-        List<GroupSymbol> groupSymbols = ResolverUtil.findMatchingGroups(groupAlias.toUpperCase(), groups, metadata);
+    private static GroupSymbol resolveAllInGroup(MultipleElementSymbol allInGroupSymbol, Set<GroupSymbol> groups, QueryMetadataInterface metadata) throws QueryResolverException, QueryMetadataException, TeiidComponentException {       
+        String groupAlias = allInGroupSymbol.getGroup().getCanonicalName();
+        List<GroupSymbol> groupSymbols = ResolverUtil.findMatchingGroups(groupAlias, groups, metadata);
         if(groupSymbols.isEmpty() || groupSymbols.size() > 1) {
             String msg = QueryPlugin.Util.getString(groupSymbols.isEmpty()?"ERR.015.008.0047":"SimpleQueryResolver.ambiguous_all_in_group", allInGroupSymbol);  //$NON-NLS-1$ //$NON-NLS-2$
             QueryResolverException qre = new QueryResolverException(msg);
             qre.addUnresolvedSymbol(new UnresolvedSymbolDescription(allInGroupSymbol.toString(), msg));
             throw qre;
         }
-
+        GroupSymbol gs = allInGroupSymbol.getGroup();
+        allInGroupSymbol.setGroup(groupSymbols.get(0).clone());
+        allInGroupSymbol.getGroup().setOutputName(gs.getOutputName());
         return groupSymbols.get(0);
     }
     
@@ -260,14 +257,19 @@
             }
         }
         
-        public void visit(AllSymbol obj) {
+        public void visit(MultipleElementSymbol obj) {
+        	// Determine group that this symbol is for
             try {
                 List<ElementSymbol> elementSymbols = new ArrayList<ElementSymbol>();
-                for (GroupSymbol group : currentGroups) {
+                Collection<GroupSymbol> groups = currentGroups;
+                if (obj.getGroup() != null) {
+                	groups = Arrays.asList(resolveAllInGroup(obj, currentGroups, metadata));
+                }
+                for (GroupSymbol group : groups) {
                     elementSymbols.addAll(resolveSelectableElements(group));
                 }
                 obj.setElementSymbols(elementSymbols);
-            } catch (TeiidComponentException err) {
+            } catch (TeiidException err) {
                 throw new TeiidRuntimeException(err);
             } 
         }
@@ -289,19 +291,6 @@
             return result;
         }
         
-        public void visit(AllInGroupSymbol obj) {
-            // Determine group that this symbol is for
-            try {
-                GroupSymbol group = resolveAllInGroup(obj, currentGroups, metadata);
-                
-                List<ElementSymbol> elements = resolveSelectableElements(group);
-                
-                obj.setElementSymbols(elements);
-            } catch (TeiidException err) {
-                throw new TeiidRuntimeException(err);
-            } 
-        }
-        
         public void visit(ScalarSubquery obj) {
             resolveSubQuery(obj, this.currentGroups);
         }
@@ -471,7 +460,7 @@
 			from.addClause(new SubqueryFromClause("X", storedProcedureCommand)); //$NON-NLS-1$
 			procQuery.setFrom(from);
 			Select select = new Select();
-			select.addSymbol(new AllInGroupSymbol("X.*")); //$NON-NLS-1$
+			select.addSymbol(new MultipleElementSymbol("X")); //$NON-NLS-1$
 			procQuery.setSelect(select);
 			
 			List<String> accessPatternElementNames = new LinkedList<String>();

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -58,11 +58,10 @@
 import org.teiid.query.sql.lang.Select;
 import org.teiid.query.sql.lang.SubqueryContainer;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.SelectSymbol;
 import org.teiid.query.sql.visitor.ElementCollectorVisitor;
 import org.teiid.query.sql.visitor.GroupCollectorVisitor;
@@ -337,47 +336,38 @@
 
 				// There are other cases of "xml", such as, element name = "xml",
 				// but those are ok because those will be resolved later as normal elements
-				String symbolName = ss.getName();
+				ElementSymbol es = (ElementSymbol)ss;
+				String symbolName = es.getName();
 				if(!subquery && (symbolName.equalsIgnoreCase("xml") || symbolName.equalsIgnoreCase(group.getName() + ".xml"))) { //$NON-NLS-1$ //$NON-NLS-2$
 					if(elements.size() != 1) {
 						throw new QueryResolverException(QueryPlugin.Util.getString("XMLQueryResolver.xml_only_valid_alone")); //$NON-NLS-1$
 					}
 					select.clearSymbols();
-                    AllSymbol all = new AllSymbol();
+                    MultipleElementSymbol all = new MultipleElementSymbol();
                     all.setElementSymbols(validElements.values());
 					select.addSymbol(all);
 					query.setSelect(select);
 					return;
 				}
                 // normal elements
-				resolveElement((ElementSymbol)ss, validElements, externalGroups, metadata);
-			} else if (ss instanceof AllInGroupSymbol) {
+				resolveElement(es, validElements, externalGroups, metadata);
+			} else if (ss instanceof MultipleElementSymbol) {
 				// Resolve the element with "*" case. such as "A.*"
 				// by stripping off the ".*" part,
-				String symbolName = ss.getName();
-				int index = symbolName.indexOf("*"); //$NON-NLS-1$
-				String elementPart = symbolName.substring(0, index-1);
+                MultipleElementSymbol all =  (MultipleElementSymbol)ss;
 
                 // Check for case where we have model.doc.*
-                if(elementPart.equalsIgnoreCase(group.getName())) {
-                    select.clearSymbols();
-                    AllSymbol all = new AllSymbol();
+                if(all.getGroup() == null || all.getGroup().getName().equalsIgnoreCase(group.getName())) {
                     all.setElementSymbols(validElements.values());
-                    select.addSymbol(all);
-                    query.setSelect(select);
-                } else {
-                    // resovlve the node which is specified
-                    ElementSymbol elementSymbol = new ElementSymbol(elementPart);
-                    resolveElement(elementSymbol, validElements, externalGroups, metadata);
-
-                    // now find all the elements under this node and set as elements.
-                    List<ElementSymbol> elementsInNode = getElementsUnderNode(elementSymbol.getMetadataID(), validElements.values(), metadata);
-                    ((AllInGroupSymbol)ss).setElementSymbols(elementsInNode);
+    				return;
                 }
-			} else if (ss instanceof AllSymbol) {
-                AllSymbol all =  (AllSymbol)ss;
-                all.setElementSymbols(validElements.values());
-				return;
+                // resovlve the node which is specified
+                ElementSymbol elementSymbol = new ElementSymbol(all.getGroup().getName());
+                resolveElement(elementSymbol, validElements, externalGroups, metadata);
+
+                // now find all the elements under this node and set as elements.
+                List<ElementSymbol> elementsInNode = getElementsUnderNode(elementSymbol.getMetadataID(), validElements.values(), metadata);
+                all.setElementSymbols(elementsInNode);
 			} else if (ss instanceof ExpressionSymbol) {
                 throw new QueryResolverException(QueryPlugin.Util.getString("XMLQueryResolver.no_expressions_in_select")); //$NON-NLS-1$
             } else if (ss instanceof AliasSymbol) {

Modified: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -83,8 +83,6 @@
 import org.teiid.query.sql.proc.WhileStatement;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.DerivedColumn;
@@ -92,6 +90,7 @@
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.QueryString;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -172,8 +171,7 @@
     // Visitor methods for symbol objects
     public void visit(AggregateSymbol obj) {}
     public void visit(AliasSymbol obj) {}
-    public void visit(AllInGroupSymbol obj) {}
-    public void visit(AllSymbol obj) {}
+    public void visit(MultipleElementSymbol obj) {}
     public void visit(Constant obj) {}
     public void visit(ElementSymbol obj) {}
     public void visit(ExpressionSymbol obj) {}

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Select.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -30,7 +30,6 @@
 import org.teiid.core.util.HashCodeUtil;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.SelectSymbol;
@@ -85,7 +84,7 @@
 	 * @return True if Select * is used
 	 */
     public boolean isStar() {
-		return (symbols.size() == 1 && symbols.get(0) instanceof AllSymbol);
+		return (symbols.size() == 1 && symbols.get(0) instanceof MultipleElementSymbol && ((MultipleElementSymbol)symbols.get(0)).getGroup() == null);
     }
 
     /**

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-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -87,8 +87,6 @@
 import org.teiid.query.sql.proc.WhileStatement;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.DerivedColumn;
@@ -97,6 +95,7 @@
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.QueryString;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -154,14 +153,10 @@
         visitNode(obj.getSymbol());
         postVisitVisitor(obj);
     }
-    public void visit(AllInGroupSymbol obj) {
+    public void visit(MultipleElementSymbol obj) {
         preVisitVisitor(obj);
         postVisitVisitor(obj);
     }
-    public void visit(AllSymbol obj) {
-        preVisitVisitor(obj);
-        postVisitVisitor(obj);
-    }
     public void visit(AssignmentStatement obj) {
         preVisitVisitor(obj);
         visitNode(obj.getVariable());

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -72,6 +72,7 @@
 	private boolean distinct;
 	private OrderBy orderBy;
 	private Expression condition;
+	private boolean isWindowed;
 
 	private static final Class<Integer> COUNT_TYPE = DataTypeManager.DefaultDataClasses.INTEGER;
 	private static final Map<Class<?>, Class<?>> SUM_TYPES;
@@ -224,6 +225,7 @@
 		if (condition != null) {
 			copy.setCondition((Expression) condition.clone());
 		}
+		copy.isWindowed = this.isWindowed;
 		return copy;
 	}
     
@@ -247,6 +249,7 @@
         
         return this.aggregate.equals(other.aggregate)
                && this.distinct == other.distinct
+               && this.isWindowed == other.isWindowed
                && EquivalenceUtil.areEqual(this.getExpression(), other.getExpression())
                && EquivalenceUtil.areEqual(this.condition, other.condition)
         	   && EquivalenceUtil.areEqual(this.getOrderBy(), other.getOrderBy());
@@ -302,5 +305,13 @@
 		}
 		return true;
 	}
+	
+	public boolean isWindowed() {
+		return isWindowed;
+	}
+	
+	public void setWindowed(boolean isWindowed) {
+		this.isWindowed = isWindowed;
+	}
 
 }

Deleted: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllInGroupSymbol.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -1,72 +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.symbol;
-
-import java.util.List;
-
-import org.teiid.query.sql.LanguageObject;
-import org.teiid.query.sql.LanguageVisitor;
-
-/**
- * <p>This is a subclass of Symbol representing <group>.*, which contains all of
- * the elements from a single group in the query.  The name of this symbol is "group.*",
- * when resolved it contains a single Group Symbols and a set of Element Symbols</p>
- */
-public class AllInGroupSymbol extends MultipleElementSymbol {
-
-    /**
-     * Constructor used for cloning 
-     * @param name
-     * @param canonicalName
-     * @since 4.3
-     */
-    protected AllInGroupSymbol(String name, String canonicalName) {
-        super(name, canonicalName);
-    }
-    
-    /**
-     * Default constructor
-     */
-    public AllInGroupSymbol(String name) {
-        super(name);
-    }
-    
-    public void acceptVisitor(LanguageVisitor visitor) {
-        visitor.visit(this);
-    }
-
-	/**
-	 * Return a deep copy of this object
-	 * @return Deep copy of this object
-	 */
-	public Object clone() {
-		AllInGroupSymbol copy = new AllInGroupSymbol(getName(), getCanonical());
-		
-		List<ElementSymbol> elements = getElementSymbols();
-		if(elements != null && elements.size() > 0) {
-			copy.setElementSymbols(LanguageObject.Util.deepClone(elements, ElementSymbol.class));				
-		}	
-
-		return copy;
-	}
-}

Deleted: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AllSymbol.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -1,75 +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.symbol;
-
-import java.util.List;
-
-import org.teiid.query.sql.LanguageObject;
-import org.teiid.query.sql.LanguageVisitor;
-
-/**
- * <p>This is a subclass of Symbol representing *, which contains all of
- * the elements from all groups in the query.  The name of this symbol is always "*",
- * when resolved it contains a set of Element Symbols referred to by the AllSymbol</p>
- */
-public class AllSymbol extends MultipleElementSymbol {
-
-    private static final String ALL_SYMBOL_NAME = "*"; //$NON-NLS-1$
-
-    /**
-     * Constructor used for cloning 
-     * @param name
-     * @param canonicalName
-     * @since 4.3
-     */
-    protected AllSymbol(String name, String canonicalName) {
-        super(name, canonicalName);
-    }
-    
-    /**
-     * Default constructor
-     */
-    public AllSymbol(){
-        this(ALL_SYMBOL_NAME, ALL_SYMBOL_NAME);
-    }
-
-    public void acceptVisitor(LanguageVisitor visitor) {
-        visitor.visit(this);
-    }
-
-	/**
-	 * Return a deep copy of this object
-	 * @return Deep copy of this object
-	 */
-	public Object clone() {
-		AllSymbol copy = new AllSymbol(ALL_SYMBOL_NAME, ALL_SYMBOL_NAME);
-
-		List<ElementSymbol> elements = getElementSymbols();
-		if(elements != null && elements.size() > 0) {
-			copy.setElementSymbols(LanguageObject.Util.deepClone(elements, ElementSymbol.class));				
-		}	
-
-		return copy;
-	}
-	
-}

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -24,7 +24,6 @@
 
 import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.core.util.HashCodeUtil;
-import org.teiid.query.function.source.XMLSystemFunctions;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.visitor.SQLStringVisitor;

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/MultipleElementSymbol.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -22,22 +22,23 @@
 
 package org.teiid.query.sql.symbol;
 
-import java.util.*;
+import java.util.LinkedList;
+import java.util.List;
 
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.query.sql.LanguageObject;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.visitor.SQLStringVisitor;
+
 /**
  * <p>This is a subclass of Symbol representing multiple output columns.</p>
  */
-public abstract class MultipleElementSymbol extends SelectSymbol {
+public class MultipleElementSymbol implements SelectSymbol {
     private List<ElementSymbol> elementSymbols;
+    private GroupSymbol group;
 
-    /**
-     * Passthrough constructor used for cloning 
-     * @param name
-     * @param canonicalName
-     * @since 4.3
-     */
-    protected MultipleElementSymbol(String name, String canonicalName) {
-        super(name, canonicalName);
+    public MultipleElementSymbol() {
     }
     
     /**
@@ -45,7 +46,7 @@
      * @param name Name of the symbol
      */
     public MultipleElementSymbol(String name){
-        super(name);
+        this.group = new GroupSymbol(name);
     }
 
     /**
@@ -83,5 +84,60 @@
     public boolean isResolved() {
         return(elementSymbols != null);
     }
+    
+    public void acceptVisitor(LanguageVisitor visitor) {
+        visitor.visit(this);
+    }
 
+	/**
+	 * Return a deep copy of this object
+	 * @return Deep copy of this object
+	 */
+	public Object clone() {
+		MultipleElementSymbol copy = new MultipleElementSymbol();
+		if (group != null) {
+			copy.group = group.clone();
+		}
+
+		List<ElementSymbol> elements = getElementSymbols();
+		if(elements != null && elements.size() > 0) {
+			copy.setElementSymbols(LanguageObject.Util.deepClone(elements, ElementSymbol.class));				
+		}	
+
+		return copy;
+	}
+	
+	/**
+	 * @return null if selecting all groups, otherwise the specific group
+	 */
+	public GroupSymbol getGroup() {
+		return group;
+	}
+	
+	public void setGroup(GroupSymbol group) {
+		this.group = group;
+	}
+	
+	@Override
+	public String toString() {
+		return SQLStringVisitor.getSQLString(this);
+	}
+	
+	@Override
+	public int hashCode() {
+		return HashCodeUtil.hashCode(0, group);
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == this) {
+			return true;
+		}
+		if (!(obj instanceof MultipleElementSymbol)) {
+			return false;
+		}
+		MultipleElementSymbol other = (MultipleElementSymbol)obj;
+		return EquivalenceUtil.areEqual(this.group, other.group);
+	}
+
 }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/SelectSymbol.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -22,29 +22,14 @@
 
 package org.teiid.query.sql.symbol;
 
+import org.teiid.query.sql.LanguageObject;
+
 /** 
  * This is the server's representation of a metadata symbol that can be used
  * in a SELECT statement.  It exists as a typing mechanism and to provide a single
  * additional method to get an ordered list of elements from each symbol.
  */
-public abstract class SelectSymbol extends Symbol {
+public interface SelectSymbol extends LanguageObject {
+	
 
-    /**
-     * Passthrough constructor used for cloning 
-     * @param name
-     * @param canonicalName
-     * @since 4.3
-     */
-    protected SelectSymbol(String name, String canonicalName) {
-        super(name, canonicalName);
-    }
-    
-	/**
-	 * Construct a symbol with a name
-	 * @param name Name of symbol
-	 */
-	public SelectSymbol(String name) {
-		super(name);
-	}
-				
 }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/SingleElementSymbol.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -27,7 +27,7 @@
 /**
  * <p>This is a subclass of Symbol representing a single output column.</p>
  */
-public abstract class SingleElementSymbol extends SelectSymbol implements Expression {
+public abstract class SingleElementSymbol extends Symbol implements Expression, SelectSymbol {
 
 	/**
      * Character used to delimit name components in a symbol

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -29,6 +29,7 @@
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.lang.OrderBy;
+import org.teiid.query.sql.visitor.SQLStringVisitor;
 
 public class WindowFunction implements Expression {
 	
@@ -46,6 +47,7 @@
 	
 	public void setFunction(AggregateSymbol expression) {
 		this.function = expression;
+		this.function.setWindowed(true);
 	}
 	
 	public List<Expression> getPartition() {
@@ -111,4 +113,9 @@
 		return clone;
 	}
 	
+	@Override
+	public String toString() {
+		return SQLStringVisitor.getSQLString(this);
+	}
+	
 }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/AbstractSymbolMappingVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -33,11 +33,10 @@
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.Update;
 import org.teiid.query.sql.proc.CriteriaSelector;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Symbol;
 
 
@@ -124,70 +123,28 @@
 	 * Swap each ElementSymbol referenced by AllInGroupSymbol
 	 * @param obj Object to remap
 	 */
-    public void visit(AllInGroupSymbol obj) {   
-        // Discover new group name during course of mapping
-        String newGroupName = null;
-                     
-		List oldSymbols = obj.getElementSymbols();
+    public void visit(MultipleElementSymbol obj) {   
+		List<ElementSymbol> oldSymbols = obj.getElementSymbols();
 		if(oldSymbols != null && oldSymbols.size() > 0) {
-			List newSymbols = new ArrayList(oldSymbols.size());
+			List<ElementSymbol> newSymbols = new ArrayList<ElementSymbol>(oldSymbols.size());
 			
-			Iterator iter = oldSymbols.iterator();
+			Iterator<ElementSymbol> iter = oldSymbols.iterator();
 			while(iter.hasNext()) {
-				ElementSymbol es = (ElementSymbol) iter.next();    
+				ElementSymbol es = iter.next();    
 				ElementSymbol mappedSymbol = getMappedElement(es);
-				
-				// Save group name on first valid mapped element
-				if(newGroupName == null && mappedSymbol != null) { 
-				    GroupSymbol newGroup = mappedSymbol.getGroupSymbol();
-				    if(newGroup != null) { 
-					    newGroupName = newGroup.getName();
-				    }
-				}
-				
 				newSymbols.add( mappedSymbol );
 			}
 			obj.setElementSymbols(newSymbols);
 		} 	
-
-		// If haven't discovered group name yet (if, for instance, stuff isn't resolved),
-		// then fake up a group symbol, map it, and use the name of the mapped group symbol
-		if(newGroupName == null) {
-			String symbolName = obj.getName();
-			String oldGroupName = symbolName.substring(0, symbolName.length()-2);	// cut .* off
-			
-			GroupSymbol fakeSymbol = new GroupSymbol(oldGroupName);
-			GroupSymbol mappedSymbol = getMappedGroup(fakeSymbol);
-			
-			newGroupName = mappedSymbol.getName();
+		
+		if (obj.getGroup() == null) {
+			return;
 		}
 		
-		// Finally, swap name of group, which should be the name of the group
-		// for all of the element symbols
-		obj.setShortName(newGroupName + ".*"); //$NON-NLS-1$
-			
+		obj.setGroup(getMappedGroup(obj.getGroup()));
     }
 
 	/**
-	 * Swap each ElementSymbol referenced by AllSymbol
-	 * @param obj Object to remap
-	 */
-    public void visit(AllSymbol obj) {
-		List oldSymbols = obj.getElementSymbols();
-		if(oldSymbols != null && oldSymbols.size() > 0) {
-			List newSymbols = new ArrayList(oldSymbols.size());
-			
-			Iterator iter = oldSymbols.iterator();
-			while(iter.hasNext()) {
-				ElementSymbol es = (ElementSymbol) iter.next();    
-				newSymbols.add( getMappedElement(es) );
-			}
-
-			obj.setElementSymbols(newSymbols);
-		}		
-    }
-    
-	/**
 	 * Swap group in unary from clause.
 	 * @param obj Object to remap
 	 */

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -32,15 +32,21 @@
 import org.teiid.query.sql.navigator.PreOrPostOrderNavigator;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
-import org.teiid.query.sql.symbol.SingleElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.WindowFunction;
 
 
 public class AggregateSymbolCollectorVisitor extends LanguageVisitor {
     
     public static class AggregateStopNavigator extends PreOrPostOrderNavigator {
-        
-        public AggregateStopNavigator(LanguageVisitor visitor) {
-            super(visitor, PreOrPostOrderNavigator.POST_ORDER, false);
+    	
+    	private Collection<? extends Expression> groupingCols;
+    	private Collection<? super Expression> groupingColsUsed;
+    	
+        public AggregateStopNavigator(LanguageVisitor visitor, Collection<? super Expression> groupingColsUsed, Collection<? extends Expression> groupingCols) {
+            super(visitor, PreOrPostOrderNavigator.PRE_ORDER, false);
+            this.groupingCols = groupingCols;
+            this.groupingColsUsed = groupingColsUsed;
         }
         
         public void visit(AggregateSymbol obj) {
@@ -49,32 +55,56 @@
             postVisitVisitor(obj);
         }
         
+        @Override
+        protected void visitNode(LanguageObject obj) {
+        	if (groupingCols != null && obj instanceof Expression && groupingCols.contains(obj)) {
+        		if (groupingColsUsed != null) {
+        			groupingColsUsed.add((Expression)obj);
+        		}
+        		return;
+        	}
+        	super.visitNode(obj);
+        }
+        
     }
 
     private Collection<? super AggregateSymbol> aggregates;
-    private Collection<? super SingleElementSymbol> groupingSymbols;
+    private Collection<? super ElementSymbol> otherElements;
+    private Collection<? super WindowFunction> windowFunctions;
     
-	public AggregateSymbolCollectorVisitor(Collection<? super AggregateSymbol> aggregates, Collection<? super SingleElementSymbol> elements) { 
+	public AggregateSymbolCollectorVisitor(Collection<? super AggregateSymbol> aggregates, Collection<? super ElementSymbol> elements) { 
         this.aggregates = aggregates;
-        this.groupingSymbols = elements;
+        this.otherElements = elements;
 	}	
     
     public void visit(AggregateSymbol obj) {
-        if (aggregates != null) {
+        if (aggregates != null && !obj.isWindowed()) {
             this.aggregates.add(obj);
         }
     }
     
+    public void visit(WindowFunction windowFunction) {
+    	if (this.windowFunctions != null) {
+    		this.windowFunctions.add(windowFunction);
+    	}
+    }
+    
     public void visit(ElementSymbol obj) {
-        if (this.groupingSymbols != null) {
-            this.groupingSymbols.add(obj);  
+        if (this.otherElements != null && !obj.isExternalReference()) {
+            this.otherElements.add(obj);  
         }
     }
 
-    public static final void getAggregates(LanguageObject obj, Collection<? super AggregateSymbol> aggregates, Collection<SingleElementSymbol> elements) {
-        AggregateSymbolCollectorVisitor visitor = new AggregateSymbolCollectorVisitor(aggregates, elements);
-        AggregateStopNavigator asn = new AggregateStopNavigator(visitor);
-        obj.acceptVisitor(asn);
+    public static final void getAggregates(LanguageObject obj, 
+    		Collection<? super AggregateSymbol> aggregates, 
+    		Collection<? super ElementSymbol> otherElements, 
+    		Collection<? super Expression> groupingColsUsed, 
+    		Collection<? super Expression> windowFunctions, 
+    		Collection<? extends Expression> groupingCols) {
+        AggregateSymbolCollectorVisitor visitor = new AggregateSymbolCollectorVisitor(aggregates, otherElements);
+        visitor.windowFunctions = windowFunctions;
+        AggregateStopNavigator asn = new AggregateStopNavigator(visitor, groupingColsUsed, groupingCols);
+        asn.visitNode(obj);
     }
 
     public static final Collection<AggregateSymbol> getAggregates(LanguageObject obj, boolean removeDuplicates) {
@@ -88,7 +118,7 @@
             aggregates = new ArrayList<AggregateSymbol>();    
         }
         AggregateSymbolCollectorVisitor visitor = new AggregateSymbolCollectorVisitor(aggregates, null);
-        AggregateStopNavigator asn = new AggregateStopNavigator(visitor);
+        AggregateStopNavigator asn = new AggregateStopNavigator(visitor, null, null);
         obj.acceptVisitor(asn);
         return aggregates;
     }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/ElementCollectorVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -32,9 +32,8 @@
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.navigator.DeepPreOrderNavigator;
 import org.teiid.query.sql.navigator.PreOrderNavigator;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 
 
 /**
@@ -81,24 +80,13 @@
      * called directly.
      * @param obj Language object
      */
-    public void visit(AllInGroupSymbol obj) {
+    public void visit(MultipleElementSymbol obj) {
         if(obj.getElementSymbols() != null) {
 	        this.elements.addAll(obj.getElementSymbols());
         }
     }
 
     /**
-     * Visit a language object and collect symbols.  This method should <b>NOT</b> be
-     * called directly.
-     * @param obj Language object
-     */
-    public void visit(AllSymbol obj) {
-        if(obj.getElementSymbols() != null) {
-	        this.elements.addAll(obj.getElementSymbols());
-        }
-    }
-
-    /**
      * Helper to quickly get the elements from obj in the elements collection
      * @param obj Language object
      * @param elements Collection to collect elements in

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-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -109,8 +109,6 @@
 import org.teiid.query.sql.proc.WhileStatement;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.DerivedColumn;
@@ -119,6 +117,7 @@
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.QueryString;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
@@ -1157,14 +1156,16 @@
         append(escapeSinglePart(obj.getOutputName()));
     }
 
-    public void visit( AllInGroupSymbol obj ) {
-        append(obj.getName());
+    public void visit( MultipleElementSymbol obj ) {
+    	if (obj.getGroup() == null) {
+    		append(Tokens.ALL_COLS);
+    	} else {
+    		visitNode(obj.getGroup());
+    		append(Tokens.DOT);
+    		append(Tokens.ALL_COLS);
+    	}
     }
 
-    public void visit( AllSymbol obj ) {
-        append(obj.getName());
-    }
-
     public void visit( Constant obj ) {
         Class<?> type = obj.getType();
         String[] constantParts = null;

Deleted: trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -1,163 +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.validator;
-
-import java.util.Collection;
-import java.util.Set;
-
-import org.teiid.core.types.DataTypeManager;
-import org.teiid.query.QueryPlugin;
-import org.teiid.query.sql.LanguageObject;
-import org.teiid.query.sql.navigator.PreOrderNavigator;
-import org.teiid.query.sql.symbol.AggregateSymbol;
-import org.teiid.query.sql.symbol.CaseExpression;
-import org.teiid.query.sql.symbol.ElementSymbol;
-import org.teiid.query.sql.symbol.Expression;
-import org.teiid.query.sql.symbol.ExpressionSymbol;
-import org.teiid.query.sql.symbol.Function;
-import org.teiid.query.sql.symbol.SearchedCaseExpression;
-import org.teiid.query.sql.symbol.AggregateSymbol.Type;
-import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
-import org.teiid.query.sql.visitor.ElementCollectorVisitor;
-
-/** 
- * Validate that all ElementSymbol and ExpressionSymbols used in the HAVING 
- * and SELECT clauses are based on symbols used in the GROUP BY clause.
- * @since 4.2
- */
-public class AggregateValidationVisitor extends AbstractValidationVisitor {
-    
-    private boolean validateBelow = true;
-
-    // Symbols from GROUP BY - may be null if no group symbols
-    private Set<Expression> groupExpressions;
-    
-    public AggregateValidationVisitor(Set<Expression> groupExpressions) {
-        this.groupExpressions = groupExpressions;
-    }
-    
-    public void visit(AggregateSymbol obj) {
-        Expression aggExp = obj.getExpression();
-
-        validateNoNestedAggs(aggExp);
-        validateNoNestedAggs(obj.getOrderBy());
-        validateNoNestedAggs(obj.getCondition());
-        
-        // Verify data type of aggregate expression
-        Type aggregateFunction = obj.getAggregateFunction();
-        if((aggregateFunction == Type.SUM || aggregateFunction == Type.AVG) && obj.getType() == null) {
-            handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
-        } else if (obj.getType() != DataTypeManager.DefaultDataClasses.NULL) {
-        	if (aggregateFunction == Type.XMLAGG && aggExp.getType() != DataTypeManager.DefaultDataClasses.XML) {
-        		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_xml", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
-        	} else if (obj.isBoolean() && aggExp.getType() != DataTypeManager.DefaultDataClasses.BOOLEAN) {
-        		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_boolean", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
-        	}
-        }
-        if((obj.isDistinct() || aggregateFunction == Type.MIN || aggregateFunction == Type.MAX) && DataTypeManager.isNonComparable(DataTypeManager.getDataTypeName(aggExp.getType()))) {
-    		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_comparable", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
-        }
-        if(obj.isEnhancedNumeric()) {
-        	if (!Number.class.isAssignableFrom(aggExp.getType())) {
-        		handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
-        	}
-        	if (obj.isDistinct()) {
-        		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.invalid_distinct", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
-        	}
-        }
-        validateBelow = false;
-    }
-
-	private void validateNoNestedAggs(LanguageObject aggExp) {
-		// Check for any nested aggregates (which are not allowed)
-        if(aggExp != null) {
-            Collection<AggregateSymbol> nestedAggs = AggregateSymbolCollectorVisitor.getAggregates(aggExp, true);
-            if(nestedAggs.size() > 0) {
-                handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0039", nestedAggs), nestedAggs); //$NON-NLS-1$
-            }
-        }
-	}
-    
-    public void visit(ElementSymbol obj) {
-        validateExpression(obj);
-    }
-    
-    public void visit(ExpressionSymbol obj) {
-        validateExpression(obj);
-    }
-    
-    public void visit(CaseExpression obj) {
-        validateExpression(obj);
-    }
-    
-    public void visit(SearchedCaseExpression obj) {
-        validateExpression(obj);
-    }
-    
-    public void visit(Function obj) {
-        validateExpression(obj);
-    }
-    
-    private void validateExpression(Expression symbol) {
-        if (ElementCollectorVisitor.getElements(symbol, false).isEmpty()) {
-            validateBelow = false;
-            return;
-        }
-        
-        if(groupExpressions == null) {
-            if (symbol instanceof ElementSymbol && !((ElementSymbol)symbol).isExternalReference()) {
-                handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0037", symbol), symbol); //$NON-NLS-1$
-            }
-        } else if(! groupExpressions.contains(symbol)) {
-            if (symbol instanceof ElementSymbol && !((ElementSymbol)symbol).isExternalReference()) {
-                handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0038", symbol), symbol); //$NON-NLS-1$
-            }
-        } else {
-            validateBelow = false;
-        }
-    }
-    
-    public static void validate(LanguageObject obj, final AggregateValidationVisitor visitor) {
-    	visitor.validateBelow = true;
-        PreOrderNavigator nav = new PreOrderNavigator(visitor) {
-            private boolean validateBelow;
-
-            protected void visitNode(LanguageObject obj) {
-                if (validateBelow) {
-                    super.visitNode(obj);
-                }
-            }
-            
-            protected void preVisitVisitor(LanguageObject obj) {
-                super.preVisitVisitor(obj);
-                this.validateBelow = visitor.validateBelow;
-            }
-            
-            protected void postVisitVisitor(LanguageObject obj) {
-                this.validateBelow = true;
-            }
-        };
-        obj.acceptVisitor(nav);
-    }
-    
-}

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -27,6 +27,7 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -121,6 +122,7 @@
 import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.symbol.TextLine;
+import org.teiid.query.sql.symbol.WindowFunction;
 import org.teiid.query.sql.symbol.XMLAttributes;
 import org.teiid.query.sql.symbol.XMLElement;
 import org.teiid.query.sql.symbol.XMLForest;
@@ -752,42 +754,38 @@
         validateNoAggsInClause(groupBy);
         validateNoAggsInClause(query.getCriteria());
         validateNoAggsInClause(query.getFrom());
-        if(groupBy != null || having != null || !AggregateSymbolCollectorVisitor.getAggregates(select, false).isEmpty()) {
-            Set<Expression> groupSymbols = null;
-            if(groupBy != null) {
-                groupSymbols = new HashSet<Expression>();
-                for (final Iterator<Expression> iterator = groupBy.getSymbols().iterator(); iterator.hasNext();) {
-                    final Expression element = iterator.next();
-                    groupSymbols.add(element);
-                }
-            }
-            
-            // Validate HAVING, if it exists
-            AggregateValidationVisitor visitor = new AggregateValidationVisitor(groupSymbols);
-            if(having != null) {
-                AggregateValidationVisitor.validate(having, visitor);
-            }
-            
-            // Validate SELECT
-            List<SingleElementSymbol> projectedSymbols = select.getProjectedSymbols();
-            for (SingleElementSymbol symbol : projectedSymbols) {
-                AggregateValidationVisitor.validate(symbol, visitor);                                            
-            }
-            
-            // Move items to this report
-            ValidatorReport report = visitor.getReport();
-            Collection<ValidatorFailure> items = report.getItems();
-            super.getReport().addItems(items);        
+        Set<Expression> groupSymbols = null;
+        boolean hasAgg = false;
+        if (groupBy != null) {
+            groupSymbols = new HashSet<Expression>(groupBy.getSymbols());
+            hasAgg = true;
         }
+        LinkedHashSet<Expression> invalid = new LinkedHashSet<Expression>();
+        LinkedHashSet<Expression> invalidWindowFunctions = new LinkedHashSet<Expression>();
+        LinkedList<AggregateSymbol> aggs = new LinkedList<AggregateSymbol>();
+        if (having != null) {
+        	AggregateSymbolCollectorVisitor.getAggregates(having, aggs, invalid, null, invalidWindowFunctions, groupSymbols);
+        	hasAgg = true;
+        }
+        for (SingleElementSymbol symbol : select.getProjectedSymbols()) {
+        	AggregateSymbolCollectorVisitor.getAggregates(symbol, aggs, invalid, null, null, groupSymbols);                                            
+        }
+        if ((!aggs.isEmpty() || hasAgg) && !invalid.isEmpty()) {
+    		handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0037", invalid), invalid); //$NON-NLS-1$
+        }
+        if (!invalidWindowFunctions.isEmpty()) {
+        	handleValidationError(QueryPlugin.Util.getString("SQLParser.window_only_top_level", invalidWindowFunctions), invalidWindowFunctions); //$NON-NLS-1$
+        }
     }
 
 	private void validateNoAggsInClause(LanguageObject clause) {
 		if (clause == null) {
         	return;
         }
-		Collection<AggregateSymbol> aggs = AggregateSymbolCollectorVisitor.getAggregates(clause, false);
+		LinkedHashSet<Expression> aggs = new LinkedHashSet<Expression>();
+		AggregateSymbolCollectorVisitor.getAggregates(clause, aggs, null, null, aggs, null);
 		if (!aggs.isEmpty()) {
-			handleValidationError(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level", aggs), aggs);
+			handleValidationError(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level", aggs), aggs); //$NON-NLS-1$
 		}
 	}
     
@@ -1204,18 +1202,56 @@
     }
     
     @Override
+    public void visit(WindowFunction windowFunction) {
+    	AggregateSymbol.Type type = windowFunction.getFunction().getAggregateFunction();
+    	switch (type) {
+    	case RANK:
+    	case DENSE_RANK:
+    	case ROW_NUMBER:
+    		if (windowFunction.getOrderBy() == null) {
+    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.analytical_requires_order_by", windowFunction), windowFunction); //$NON-NLS-1$
+    		}
+    	}
+    	validateNoSubqueriesOrOuterReferences(windowFunction);
+    }
+    
+    @Override
     public void visit(AggregateSymbol obj) {
     	if (obj.getCondition() != null) {
     		Expression condition = obj.getCondition();
-    		if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(condition).isEmpty()) {
-    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", condition), condition); //$NON-NLS-1$
-    		}
-    		for (ElementSymbol es : ElementCollectorVisitor.getElements(condition, false)) {
-    			if (es.isExternalReference()) {
-    				handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", es), es); //$NON-NLS-1$
-    			}
-    		}
+    		validateNoSubqueriesOrOuterReferences(condition);
     	}
+        Expression aggExp = obj.getExpression();
+
+        validateNoNestedAggs(aggExp);
+        validateNoNestedAggs(obj.getOrderBy());
+        validateNoNestedAggs(obj.getCondition());
+        
+        // Verify data type of aggregate expression
+        Type aggregateFunction = obj.getAggregateFunction();
+        if((aggregateFunction == Type.SUM || aggregateFunction == Type.AVG) && obj.getType() == null) {
+            handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+        } else if (obj.getType() != DataTypeManager.DefaultDataClasses.NULL) {
+        	if (aggregateFunction == Type.XMLAGG && aggExp.getType() != DataTypeManager.DefaultDataClasses.XML) {
+        		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_xml", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+        	} else if (obj.isBoolean() && aggExp.getType() != DataTypeManager.DefaultDataClasses.BOOLEAN) {
+        		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_boolean", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+        	}
+        }
+        if((obj.isDistinct() || aggregateFunction == Type.MIN || aggregateFunction == Type.MAX) && DataTypeManager.isNonComparable(DataTypeManager.getDataTypeName(aggExp.getType()))) {
+    		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_comparable", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+        }
+        if(obj.isEnhancedNumeric()) {
+        	if (!Number.class.isAssignableFrom(aggExp.getType())) {
+        		handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+        	}
+        	if (obj.isDistinct()) {
+        		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.invalid_distinct", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+        	}
+        }
+        if (obj.isWindowed() && obj.getOrderBy() != null) {
+        	handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0042", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
+        }
     	if (obj.getAggregateFunction() != Type.TEXTAGG) {
     		return;
     	}
@@ -1235,7 +1271,29 @@
     		}
     	}
     }
+
+	private void validateNoSubqueriesOrOuterReferences(Expression expr) {
+		if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(expr).isEmpty()) {
+			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", expr), expr); //$NON-NLS-1$
+		}
+		for (ElementSymbol es : ElementCollectorVisitor.getElements(expr, false)) {
+			if (es.isExternalReference()) {
+				handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.filter_subquery", es), es); //$NON-NLS-1$
+			}
+		}
+	}
     
+	private void validateNoNestedAggs(LanguageObject aggExp) {
+		// Check for any nested aggregates (which are not allowed)
+        if(aggExp != null) {
+        	HashSet<Expression> nestedAggs = new LinkedHashSet<Expression>();
+            AggregateSymbolCollectorVisitor.getAggregates(aggExp, nestedAggs, null, null, nestedAggs, null);
+            if(!nestedAggs.isEmpty()) {
+                handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0039", nestedAggs), nestedAggs); //$NON-NLS-1$
+            }
+        }
+	}
+    
 	private String[] validateQName(LanguageObject obj, String name) {
 		try {
 			return Name11Checker.getInstance().getQNameParts(name);

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-07-21 19:28:44 UTC (rev 3323)
@@ -1740,7 +1740,7 @@
         query=query(info) | 
         (<TABLE> name=id() {
            Query q = new Query();
-           q.setSelect(new Select(Arrays.asList(new AllSymbol())));
+           q.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
            q.setFrom(new From(Arrays.asList(new UnaryFromClause(new GroupSymbol(name)))));
            query = q;
         }) |
@@ -1826,7 +1826,7 @@
 	[<ALL> | (<DISTINCT> {isDistinct=true;})]
 	(<STAR>
 		{
-			select.addSymbol(new AllSymbol());
+			select.addSymbol(new MultipleElementSymbol());
 		}
 	|
 		(	symbol=selectSymbol(info)      { select.addSymbol(symbol); }
@@ -1908,7 +1908,7 @@
 	}
 }
 
-AllInGroupSymbol allInGroupSymbol() :
+MultipleElementSymbol allInGroupSymbol() :
 {
 	Token allInGroupToken = null;
 	
@@ -1916,7 +1916,7 @@
 {
    	allInGroupToken = <ALL_IN_GROUP>    
     {
-		return new AllInGroupSymbol(normalizeId(allInGroupToken.image));
+		return new MultipleElementSymbol(normalizeId(allInGroupToken.image.substring(0, allInGroupToken.image.length() - 2)));
 	}
 }
 
@@ -2773,7 +2773,7 @@
 		proc = storedProcedure(info, new StoredProcedure()) //deprecated	  
 	 )
 	 {
-	    subquery = new Query(new Select(Arrays.asList(new AllSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", proc))), null, null, null);
+	    subquery = new Query(new Select(Arrays.asList(new MultipleElementSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", proc))), null, null, null);
 	 }
 	)
 	<RPAREN>

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-07-21 19:28:44 UTC (rev 3323)
@@ -204,10 +204,10 @@
 ERR.015.012.0033 = Metadata does not allow updates on the group: {0}
 ERR.015.012.0034 = Queries involving UNIONs, INTERSECTs and EXCEPTs not allowed on XML documents
 ERR.015.012.0035 = Queries combined with the set operator {0} must have the same number of output elements.
-ERR.015.012.0037 = Invalid symbol: {0}. When an aggregate function is used in the SELECT clause and no GROUP BY clause is specified, the SELECT clause may contain only aggregate functions and constants.
-ERR.015.012.0038 = Invalid symbol: {0}. When a GROUP BY clause is used, all elements in the SELECT clause must be declared in the GROUP BY clause.
+ERR.015.012.0037 = {0} cannot be used outside of aggregate functions since they are not present in a GROUP BY clause.
 ERR.015.012.0039 = Nested aggregate expressions are not allowed: {0}
 ERR.015.012.0041 = The aggregate function {0} cannot be used with non-numeric expressions: {1}
+ERR.015.012.0042 = The aggregate function {0} cannot use its own order by clause when windowed: {1}
 AggregateValidationVisitor.non_comparable = The aggregate function {0} cannot be used with non-comparable expressions: {1}
 AggregateValidationVisitor.non_xml = The XMLAGG aggregate function {0} requires an expression of type XML: {1}
 AggregateValidationVisitor.non_boolean=The boolean aggregate functions ANY, SOME, EVERY require a boolean expression.
@@ -259,7 +259,8 @@
 
 
 SQLParser.Unknown_join_type=Unknown join type: {0}
-SQLParser.Aggregate_only_top_level=Aggregate functions are not allowed in the FROM/WHERE/GROUP BY clauses: {0}
+SQLParser.Aggregate_only_top_level=Aggregate and window functions are not allowed in the FROM/WHERE/GROUP BY clauses: {0}
+SQLParser.window_only_top_level=Window functions are not allowed in the HAVING clause: {0}
 SQLParser.Unknown_agg_func=Unknown aggregate function: {0}
 SQLParser.Invalid_func=Invalid function name: [{0}]
 SQLParser.Integer_parse=Unable to parse integer literal: {0}
@@ -678,7 +679,8 @@
 SimpleQueryResolver.procedure_cache_not_usable=Procedure caching will not be used for {0} since the result set cache is disabled or the results/parameters cannot be cached.
 SimpleQueryResolver.procedure_cache_not_used=Procedure caching will not be used for {0} due to the use of OPTION NOCACHE.
 ValidationVisitor.groupby_subquery=Expressions used in a GROUP BY clause cannot be constant and must not contain subqueries: "{0}".
-ValidationVisitor.filter_subquery=Expressions used in a FILTER clause must not contain subqueries nor outer references: "{0}".
+ValidationVisitor.filter_subquery=Expressions used in a FILTER clause or a window function must not contain subqueries nor outer references: "{0}".
+ValidationVisitor.analytical_requires_order_by=The window analytical functions RANK, DENSE_RANK, and ROW_NUMBER require the use of an ORDER BY clause in the window specification: {0}.
 ValidationVisitor.Procedure_has_group_self_reference=Procedure cannot have a Group reference to itself.
 ExpressionEvaluator.Expected_props_for_payload_function=Unable to evaluate {0}: expected Properties for command payload but got object of type {1}
 ValidationVisitor.The_rowlimit_function_cannot_be_used_in_a_non-XML_command=The ''rowlimit'' and ''rowlimitexception'' functions cannot be used in a non-XML command

Modified: trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -38,7 +38,7 @@
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.Select;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 
 
 /**
@@ -90,8 +90,8 @@
             List expandedSymbols = new ArrayList();
             for (Iterator i = originalSymbols.iterator(); i.hasNext(); ) {
                 Object next = i.next();
-                if (next instanceof AllSymbol) {
-                    AllSymbol allSymbol = (AllSymbol) next;
+                if (next instanceof MultipleElementSymbol) {
+                    MultipleElementSymbol allSymbol = (MultipleElementSymbol) next;
                     expandedSymbols.addAll(allSymbol.getElementSymbols());
                 } else {
                     expandedSymbols.add(next);

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -823,6 +823,11 @@
     	System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
         TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e2 < (select max(e2) FROM pm1.g1 WHERE pm3.g1.e1 = e1 HAVING min(e3) < pm3.g1.e3)", "SELECT e1 FROM pm3.g1, (SELECT MAX(e2) AS MAX, e1, MIN(e3) AS MIN FROM pm1.g1 GROUP BY e1) AS X__1 WHERE (X__1.MIN < pm3.g1.e3) AND (pm3.g1.e2 < X__1.MAX) AND (pm3.g1.e1 = X__1.e1)", RealMetadataFactory.example4());
     }
+    
+    @Test public void testSubqueryRewriteToJoinWithGroupingExpression() throws Exception {
+    	System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
+        TestQueryRewriter.helpTestRewriteCommand("Select distinct e1 from pm3.g1 where exists (select 1 FROM pm1.g1 group by e4 || 'x' HAVING min(e3) || (e4 || 'x') = pm3.g1.e3)", "SELECT DISTINCT e1 FROM pm3.g1, (SELECT 1 AS EXPR, MIN(e3) AS MIN, concat(e4, 'x') AS EXPR_0, concat(MIN(e3), concat(e4, 'x')) AS EXPR_1 FROM pm1.g1 GROUP BY concat(e4, 'x')) AS X__1 WHERE pm3.g1.e3 = X__1.EXPR_1", RealMetadataFactory.example4());
+    }
 
     /**
      * A join will not be used here because of the not

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestRulePlaceAccess.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -32,7 +32,7 @@
 import org.teiid.query.sql.lang.From;
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.Select;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.unittest.RealMetadataFactory;
 
@@ -67,7 +67,7 @@
         query.setFrom(from);
         
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
 
         group.setMetadataID(METADATA.getGroupID("pm4.g2")); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestLimitParsing.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -34,7 +34,7 @@
 import org.teiid.query.sql.lang.SetQuery;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.SetQuery.Operation;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
@@ -43,7 +43,7 @@
 	
     @Test public void testLimit() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -53,7 +53,7 @@
     
     @Test public void testLimitWithOffset() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -63,7 +63,7 @@
     
     @Test public void testLimitWithReferences1() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -73,7 +73,7 @@
     
     @Test public void testLimitWithReferences2() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -83,7 +83,7 @@
     
     @Test public void testLimitWithReferences3() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -93,7 +93,7 @@
     
     @Test public void testSetQueryLimit() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -104,7 +104,7 @@
     
     @Test public void testOffset() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -114,7 +114,7 @@
     
     @Test public void testFetchFirst() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -124,7 +124,7 @@
     
     @Test public void testFetchFirstRow() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -134,7 +134,7 @@
     
     @Test public void testOffsetFetch() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -57,7 +57,7 @@
 import org.teiid.query.sql.proc.HasCriteria;
 import org.teiid.query.sql.proc.IfStatement;
 import org.teiid.query.sql.proc.Statement;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
@@ -434,7 +434,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -452,7 +452,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -470,7 +470,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -488,7 +488,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -506,7 +506,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -524,7 +524,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -542,7 +542,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
@@ -560,7 +560,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -578,7 +578,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
@@ -596,13 +596,13 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         
         Query query2 = new Query();
         select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query2.setSelect(select);
         From from2 = new From();
         from2.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
@@ -623,7 +623,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         
@@ -692,7 +692,7 @@
         
         Query query2 = new Query();
         select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         From from2 = new From();
         from2.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
         from2.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
@@ -1042,7 +1042,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -1058,7 +1058,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -1087,7 +1087,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -1106,7 +1106,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         UnaryFromClause ufc = new UnaryFromClause();
@@ -1116,7 +1116,7 @@
         
         Query query1 = new Query();
         select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query1.setSelect(select);
         from = new From();
         ufc = new UnaryFromClause();

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -101,8 +101,6 @@
 import org.teiid.query.sql.proc.WhileStatement;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.DerivedColumn;
@@ -111,6 +109,7 @@
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
@@ -217,7 +216,7 @@
 		From from = new From();
 		from.addClause(jp);
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -237,7 +236,7 @@
 		From from = new From();
 		from.addClause(jp);	
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -259,7 +258,7 @@
 		from.addClause(jp);	
 		from.addClause(new UnaryFromClause(new GroupSymbol("g3"))); //$NON-NLS-1$
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -286,7 +285,7 @@
 		From from = new From();
 		from.addClause(jp2);	
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -311,7 +310,7 @@
 		From from = new From();
 		from.addClause(jp3);	
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -334,7 +333,7 @@
 		From from = new From();
 		from.addClause(jp2);	
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -358,7 +357,7 @@
 		from.addClause(jp2);
 		from.addClause(new UnaryFromClause(new GroupSymbol("g4")));	 //$NON-NLS-1$
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -387,7 +386,7 @@
 		from.addClause(g4);
 		from.addClause(jp3);	
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -416,7 +415,7 @@
 		from.addClause(g1);
 		from.addClause(jp);
 
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		Select select = new Select();
 		select.addSymbol(all);
 
@@ -1918,7 +1917,7 @@
 		from.addGroup(h);
 
 		Select select = new Select();
-		AllInGroupSymbol myG = new AllInGroupSymbol("myG.*"); //$NON-NLS-1$
+		MultipleElementSymbol myG = new MultipleElementSymbol("myG"); //$NON-NLS-1$
 		select.addSymbol(myG);
 		select.addSymbol(new ElementSymbol("myH.b")); //$NON-NLS-1$
 
@@ -1939,7 +1938,7 @@
 		from.addGroup(h);
 
 		Select select = new Select();
-		AllInGroupSymbol myG = new AllInGroupSymbol("myG.*"); //$NON-NLS-1$
+		MultipleElementSymbol myG = new MultipleElementSymbol("myG"); //$NON-NLS-1$
 		select.addSymbol(myG);
 		select.addSymbol(new ElementSymbol("myH.b")); //$NON-NLS-1$
 
@@ -2309,7 +2308,7 @@
         from.addGroup(g);
 
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
 
         Query query = new Query();
         query.setSelect(select);
@@ -2327,7 +2326,7 @@
         from.addGroup(g);
 
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
 
         Query query = new Query();
         query.setSelect(select);
@@ -2345,7 +2344,7 @@
         from.addGroup(g);
 
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
 
         Query query = new Query();
         query.setSelect(select);
@@ -2676,10 +2675,10 @@
 
 	/** SELECT a FROM db.g WHERE b = aString order by c desc,d desc*/
 	@Test public void testOrderBysDesc(){
-		ArrayList elements = new ArrayList();
+		ArrayList<ElementSymbol> elements = new ArrayList<ElementSymbol>();
 		elements.add(new ElementSymbol("c")); //$NON-NLS-1$
 		elements.add(new ElementSymbol("d")); //$NON-NLS-1$
-		ArrayList orderTypes = new ArrayList();
+		ArrayList<Boolean> orderTypes = new ArrayList<Boolean>();
 		orderTypes.add(Boolean.FALSE);
 		orderTypes.add(Boolean.FALSE);
 		OrderBy orderBy = new OrderBy(elements, orderTypes);
@@ -2692,10 +2691,10 @@
 	
 	/** SELECT a FROM db.g WHERE b = aString order by c desc,d*/
 	@Test public void testMixedOrderBys(){
-		ArrayList elements = new ArrayList();
+		ArrayList<ElementSymbol> elements = new ArrayList<ElementSymbol>();
 		elements.add(new ElementSymbol("c")); //$NON-NLS-1$
 		elements.add(new ElementSymbol("d")); //$NON-NLS-1$
-		ArrayList orderTypes = new ArrayList();
+		ArrayList<Boolean> orderTypes = new ArrayList<Boolean>();
 		orderTypes.add(Boolean.FALSE);
 		orderTypes.add(Boolean.TRUE);
 		OrderBy orderBy = new OrderBy(elements, orderTypes);
@@ -3358,7 +3357,7 @@
             
     @Test public void testHasEQCriteria() throws Exception {
         ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
-        List elements = new ArrayList();
+        List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
         elements.add(a);
         
         CriteriaSelector critSelector = new CriteriaSelector();
@@ -3391,7 +3390,7 @@
     /**HAS IN CRITERIA ON (a)*/    
     @Test public void testHasInCriteria() throws Exception {
         ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
-        List elements = new ArrayList();
+        List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
         elements.add(a);
         
         CriteriaSelector critSelector = new CriteriaSelector();
@@ -3408,7 +3407,7 @@
     /**HAS COMPARE_LT CRITERIA ON (a)*/    
     @Test public void testHasLTCriteria() throws Exception {
         ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
-        List elements = new ArrayList();
+        List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
         elements.add(a);
         
         CriteriaSelector critSelector = new CriteriaSelector();
@@ -3425,7 +3424,7 @@
     /**HAS COMPARE_LE CRITERIA ON (a)*/    
     @Test public void testHasLECriteria() throws Exception {
         ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
-        List elements = new ArrayList();
+        List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
         elements.add(a);
         
         CriteriaSelector critSelector = new CriteriaSelector();
@@ -3604,7 +3603,7 @@
      * @return
      */
     private Query sampleQuery() {
-        List symbols = new ArrayList();
+        List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
         symbols.add(new ElementSymbol("a1"));  //$NON-NLS-1$
         Select select = new Select(symbols);
            
@@ -3645,7 +3644,7 @@
     
     //sql is a variable, also uses the as, into, and update clauses
     @Test public void testDynamicCommandStatement1() throws Exception {
-        List symbols = new ArrayList();
+        List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
         
         ElementSymbol a1 = new ElementSymbol("a1"); //$NON-NLS-1$
         a1.setType(DataTypeManager.DefaultDataClasses.STRING);
@@ -3737,7 +3736,7 @@
         Statement declStmt = new DeclareStatement(var1, shortType);
         
         //ifblock
-        List symbols = new ArrayList();
+        List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
         symbols.add(new ElementSymbol("a1"));  //$NON-NLS-1$
         Select select = new Select(symbols);       
         
@@ -3761,7 +3760,7 @@
         ElementSymbol var2 = new ElementSymbol("var2"); //$NON-NLS-1$
         Statement elseDeclStmt = new DeclareStatement(var2, shortType);     
         
-        List elseSymbols = new ArrayList();
+        List<ElementSymbol> elseSymbols = new ArrayList<ElementSymbol>();
         elseSymbols.add(new ElementSymbol("b1"));  //$NON-NLS-1$
         Select elseSelect = new Select(elseSymbols); 
     
@@ -3770,7 +3769,6 @@
         elseQuery.setFrom(from);
         elseQuery.setCriteria(criteria);
         
-        Command elseQueryCmd = elseQuery;
         AssignmentStatement elseQueryStmt = new AssignmentStatement(var2, elseQuery);
         
         Block elseBlock = new Block();
@@ -3867,7 +3865,7 @@
         ElementSymbol var2 = new ElementSymbol("var2"); //$NON-NLS-1$
         Statement elseDeclStmt = new DeclareStatement(var2, shortType);     
         
-        List elseSymbols = new ArrayList();
+        List<ElementSymbol> elseSymbols = new ArrayList<ElementSymbol>();
         elseSymbols.add(new ElementSymbol("b1"));  //$NON-NLS-1$
         Select elseSelect = new Select(elseSymbols); 
 
@@ -5011,7 +5009,7 @@
               
         StoredProcedure exec = new StoredProcedure();
         exec.setProcedureName("m.sq1");               //$NON-NLS-1$
-        Query query = new Query(new Select(Arrays.asList(new AllSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", exec))), null, null, null);
+        Query query = new Query(new Select(Arrays.asList(new MultipleElementSymbol())), new From(Arrays.asList(new SubqueryFromClause("x", exec))), null, null, null);
         SubquerySetCriteria subCrit = new SubquerySetCriteria(expr, query);
        
         Query outer = new Query();
@@ -5079,7 +5077,7 @@
     @Test public void testExecSubquery(){
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addClause(new UnaryFromClause(new GroupSymbol("newModel2.Table1")));         //$NON-NLS-1$
@@ -5102,7 +5100,7 @@
 
             Query query = new Query();
             Select select = new Select();
-            select.addSymbol(new AllSymbol());
+            select.addSymbol(new MultipleElementSymbol());
             query.setSelect(select);
             From from = new From();
             from.addGroup(new GroupSymbol("TestDocument.TestDocument")); //$NON-NLS-1$
@@ -5122,7 +5120,7 @@
 
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addGroup(new GroupSymbol("TestDocument.TestDocument")); //$NON-NLS-1$
@@ -5165,7 +5163,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5184,7 +5182,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5203,7 +5201,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5220,7 +5218,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         from.addGroup(new GroupSymbol("a.thing")); //$NON-NLS-1$
@@ -5265,7 +5263,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         
@@ -5307,7 +5305,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         
@@ -5353,7 +5351,7 @@
         
         Query query = new Query();
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         query.setSelect(select);
         From from = new From();
         
@@ -5998,7 +5996,7 @@
 
     @Test public void testAndOrPrecedence_1575() {
         Select s = new Select();
-        s.addSymbol(new AllSymbol());
+        s.addSymbol(new MultipleElementSymbol());
         From f = new From();
         f.addGroup(new GroupSymbol("m.g1")); //$NON-NLS-1$
         CompareCriteria c1 = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(0))); //$NON-NLS-1$
@@ -6017,7 +6015,7 @@
 
     @Test public void testAndOrPrecedence2_1575() {
         Select s = new Select();
-        s.addSymbol(new AllSymbol());
+        s.addSymbol(new MultipleElementSymbol());
         From f = new From();
         f.addGroup(new GroupSymbol("m.g1")); //$NON-NLS-1$
         CompareCriteria c1 = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(0))); //$NON-NLS-1$
@@ -6040,7 +6038,7 @@
      */
     private void helpTestCompoundNonJoinCriteria(String sqlPred, PredicateCriteria predCrit) {
         Select s = new Select();
-        s.addSymbol(new AllSymbol());
+        s.addSymbol(new MultipleElementSymbol());
         From f = new From();
         
         CompareCriteria c1 = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(0))); //$NON-NLS-1$
@@ -6486,7 +6484,7 @@
         Query query = new Query();
         Select select = new Select();
         query.setSelect(select);
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         From from = new From();
         query.setFrom(from);
         Criteria compareCriteria = new CompareCriteria(new ElementSymbol("A.x"), CompareCriteria.EQ, new ElementSymbol("B.x")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -6522,7 +6520,7 @@
         String expected = "SELECT * FROM pm1.g1 UNION JOIN pm1.g2 WHERE g1.e1 = 1"; //$NON-NLS-1$
         
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         
         From from = new From();
         from.addClause(new JoinPredicate(new UnaryFromClause(new GroupSymbol("pm1.g1")), new UnaryFromClause(new GroupSymbol("pm1.g2")), JoinType.JOIN_UNION)); //$NON-NLS-1$ //$NON-NLS-2$
@@ -6696,7 +6694,7 @@
     @Test public void testNestedTable() throws Exception {
         String sql = "SELECT * from TABLE(exec foo()) as x"; //$NON-NLS-1$
         Query query = new Query();
-        query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+        query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
         StoredProcedure sp = new StoredProcedure();
         sp.setProcedureName("foo");
         SubqueryFromClause sfc = new SubqueryFromClause("x", sp);
@@ -6708,7 +6706,7 @@
     @Test public void testTextTable() throws Exception {
     	String sql = "SELECT * from texttable(file columns x string WIDTH 1, y date width 10 skip 10) as x"; //$NON-NLS-1$
         Query query = new Query();
-        query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+        query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
         TextTable tt = new TextTable();
         tt.setFile(new ElementSymbol("file"));
         List<TextTable.TextColumn> columns = new ArrayList<TextTable.TextColumn>();
@@ -6738,7 +6736,7 @@
     @Test public void testXMLTable() throws Exception {
     	String sql = "SELECT * from xmltable(xmlnamespaces(no default), '/' columns x for ordinality, y date default {d'2000-01-01'} path '@date') as x"; //$NON-NLS-1$
         Query query = new Query();
-        query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+        query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
         XMLTable xt = new XMLTable();
         xt.setName("x");
         xt.setNamespaces(new XMLNamespaces(Arrays.asList(new XMLNamespaces.NamespaceItem())));
@@ -6802,7 +6800,7 @@
     	Query query = new Query();
         Select select = new Select();
         query.setSelect(select);
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("X"))));
         query.setFrom(from);
     	helpTest("TABLE X", "SELECT * FROM X", query);
@@ -6811,7 +6809,7 @@
     @Test public void testArrayTable() throws Exception {
     	String sql = "SELECT * from arraytable(null columns x string, y date) as x"; //$NON-NLS-1$
         Query query = new Query();
-        query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+        query.setSelect(new Select(Arrays.asList(new MultipleElementSymbol())));
         ArrayTable tt = new ArrayTable();
         tt.setArrayValue(new Constant(null, DataTypeManager.DefaultDataClasses.OBJECT));
         List<TableFunctionReference.ProjectedColumn> columns = new ArrayList<TableFunctionReference.ProjectedColumn>();

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestSetQueryParsing.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -28,7 +28,7 @@
 import org.teiid.query.sql.lang.Select;
 import org.teiid.query.sql.lang.SetQuery;
 import org.teiid.query.sql.lang.SetQuery.Operation;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
@@ -81,7 +81,7 @@
         from.addGroup(g);
 
         Select select = new Select();
-        select.addSymbol(new AllSymbol());
+        select.addSymbol(new MultipleElementSymbol());
         
         Query query1 = new Query();
         query1.setSelect(select);

Modified: trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -7846,7 +7846,7 @@
             "</Catalogs>\r\n\r\n"; //$NON-NLS-1$
         
         
-        helpTestProcess("SELECT Catalogs.Catalog.Items.Item.ItemID, Order.* " + //$NON-NLS-1$
+        helpTestProcess("SELECT Catalogs.Catalog.Items.Item.ItemID, \"Order\".* " + //$NON-NLS-1$
             " FROM xmltest.doc9c " + //$NON-NLS-1$
             " WHERE SupplierID > '54' " + //$NON-NLS-1$
             " ORDER BY ItemID DESC, OrderID DESC", //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -93,7 +93,6 @@
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
-import org.teiid.query.sql.symbol.SelectSymbol;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.visitor.CommandCollectorVisitor;
 import org.teiid.query.sql.visitor.ElementCollectorVisitor;
@@ -293,11 +292,11 @@
 	
 	private void helpCheckSelect(Query query, String[] elementNames) {
 		Select select = query.getSelect();
-		List elements = select.getSymbols();
+		List<SingleElementSymbol> elements = select.getProjectedSymbols();
 		assertEquals("Wrong number of select symbols: ", elementNames.length, elements.size()); //$NON-NLS-1$
 
 		for(int i=0; i<elements.size(); i++) {
-			SelectSymbol symbol = (SelectSymbol) elements.get(i);
+			SingleElementSymbol symbol = elements.get(i);
 			assertEquals("Element name does not match: ", elementNames[i].toUpperCase(), symbol.getName().toUpperCase()); //$NON-NLS-1$
 		}
 	}
@@ -594,7 +593,6 @@
 	@Test public void testSelectStar() {
 		Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g1"); //$NON-NLS-1$
 		helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
-		helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
 		helpCheckElements(resolvedQuery.getSelect(),
 			new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 			new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
@@ -603,7 +601,6 @@
 	@Test public void testSelectStarFromAliasedGroup() {
 		Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g1 as x"); //$NON-NLS-1$
 		helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
-		helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
 		helpCheckElements(resolvedQuery.getSelect(),
 			new String[] { "x.e1", "x.e2", "x.e3", "x.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 			new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
@@ -612,7 +609,6 @@
 	@Test public void testSelectStarFromMultipleAliasedGroups() {
 		Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g1 as x, pm1.g1 as y"); //$NON-NLS-1$
 		helpCheckFrom(resolvedQuery, new String[] { "pm1.g1", "pm1.g1" }); //$NON-NLS-1$ //$NON-NLS-2$
-		helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
 		helpCheckElements(resolvedQuery.getSelect(),
 			new String[] { "x.e1", "x.e2", "x.e3", "x.e4", "y.e1", "y.e2", "y.e3", "y.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
 			new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4", "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
@@ -621,7 +617,6 @@
     @Test public void testSelectStarWhereSomeElementsAreNotSelectable() {
         Query resolvedQuery = (Query) helpResolve("SELECT * FROM pm1.g4"); //$NON-NLS-1$
         helpCheckFrom(resolvedQuery, new String[] { "pm1.g4" }); //$NON-NLS-1$
-        helpCheckSelect(resolvedQuery, new String[] { "*" }); //$NON-NLS-1$
         helpCheckElements(resolvedQuery.getSelect(),
             new String[] { "pm1.g4.e1", "pm1.g4.e3" }, //$NON-NLS-1$ //$NON-NLS-2$
             new String[] { "pm1.g4.e1", "pm1.g4.e3" } ); //$NON-NLS-1$ //$NON-NLS-2$
@@ -630,7 +625,6 @@
     @Test public void testSelectGroupStarWhereSomeElementsAreNotSelectable() {
         Query resolvedQuery = (Query) helpResolve("SELECT pm1.g4.* FROM pm1.g4"); //$NON-NLS-1$
         helpCheckFrom(resolvedQuery, new String[] { "pm1.g4" }); //$NON-NLS-1$
-        helpCheckSelect(resolvedQuery, new String[] { "pm1.g4.*" }); //$NON-NLS-1$
         helpCheckElements(resolvedQuery.getSelect(),
             new String[] { "pm1.g4.e1", "pm1.g4.e3" }, //$NON-NLS-1$ //$NON-NLS-2$
             new String[] { "pm1.g4.e1", "pm1.g4.e3" } ); //$NON-NLS-1$ //$NON-NLS-2$
@@ -639,7 +633,6 @@
 	@Test public void testFullyQualifiedSelectStar() {
 		Query resolvedQuery = (Query) helpResolve("SELECT pm1.g1.* FROM pm1.g1"); //$NON-NLS-1$
 		helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
-		helpCheckSelect(resolvedQuery, new String[] { "pm1.g1.*" }); //$NON-NLS-1$
 		helpCheckElements(resolvedQuery.getSelect(),
 			new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 			new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
@@ -648,7 +641,6 @@
 	@Test public void testSelectAllInAliasedGroup() {
 		Query resolvedQuery = (Query) helpResolve("SELECT x.* FROM pm1.g1 as x"); //$NON-NLS-1$
 		helpCheckFrom(resolvedQuery, new String[] { "pm1.g1" }); //$NON-NLS-1$
-		helpCheckSelect(resolvedQuery, new String[] { "x.*" }); //$NON-NLS-1$
 		helpCheckElements(resolvedQuery.getSelect(),
 			new String[] { "x.e1", "x.e2", "x.e3", "x.e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 			new String[] { "pm1.g1.e1", "pm1.g1.e2", "pm1.g1.e3", "pm1.g1.e4" } ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

Modified: trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/lang/TestSelect.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -28,7 +28,7 @@
 import org.teiid.core.util.UnitTestUtil;
 import org.teiid.query.sql.lang.Select;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
 
 import junit.framework.TestCase;
@@ -50,7 +50,7 @@
 		symbols.add(new ElementSymbol("b")); //$NON-NLS-1$
 
 	    Select select = new Select();
-	    AllSymbol all = new AllSymbol();
+	    MultipleElementSymbol all = new MultipleElementSymbol();
 	    all.setElementSymbols(symbols);
 	    select.addSymbol(all);
 	    return select;	
@@ -69,7 +69,7 @@
 	
 	public void testGetProjectedNoElements() {    
 	    Select select = new Select();
-	    select.addSymbol(new AllSymbol());
+	    select.addSymbol(new MultipleElementSymbol());
 	    
 	    List projectedSymbols = select.getProjectedSymbols();
 	    assertEquals("Did not get empty list for select * with no elements: ", new ArrayList(), projectedSymbols); //$NON-NLS-1$
@@ -81,7 +81,7 @@
 		symbols.add(new ElementSymbol("b")); //$NON-NLS-1$
 
 	    Select select = new Select();
-	    AllSymbol all = new AllSymbol();
+	    MultipleElementSymbol all = new MultipleElementSymbol();
 	    all.setElementSymbols(symbols);
 	    select.addSymbol(all);
 	    

Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestAggregateSymbolCollectorVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -25,16 +25,15 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import junit.framework.TestCase;
+
 import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.sql.lang.Command;
-import org.teiid.query.sql.symbol.SingleElementSymbol;
-import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
+import org.teiid.query.sql.symbol.Expression;
 
-import junit.framework.TestCase;
 
 
-
 public class TestAggregateSymbolCollectorVisitor extends TestCase {
 
     public TestAggregateSymbolCollectorVisitor(String name) {
@@ -46,9 +45,9 @@
         Command command = QueryParser.getQueryParser().parseCommand(sql);
         
         // Find aggregates
-        List<SingleElementSymbol> foundAggs = new ArrayList<SingleElementSymbol>();
-        List<SingleElementSymbol> foundElements = new ArrayList<SingleElementSymbol>();
-        AggregateSymbolCollectorVisitor.getAggregates(command, foundAggs, foundElements);
+        List<Expression> foundAggs = new ArrayList<Expression>();
+        List<Expression> foundElements = new ArrayList<Expression>();
+        AggregateSymbolCollectorVisitor.getAggregates(command, foundAggs, foundElements, null, null, null);
         
         // Compare
         assertEquals("Incorrect number of aggregates: " + foundAggs, aggs.length, foundAggs.size()); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -77,8 +77,6 @@
 import org.teiid.query.sql.proc.RaiseErrorStatement;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
@@ -86,6 +84,7 @@
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
@@ -571,7 +570,7 @@
 
 	public void testQuery1() {
 		Select select = new Select();
-		select.addSymbol(new AllSymbol());
+		select.addSymbol(new MultipleElementSymbol());
 		From from = new From();
 		from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
 		Query query = new Query();
@@ -583,7 +582,7 @@
 
 	public void testQuery2() {
 		Select select = new Select();
-		select.addSymbol(new AllSymbol());
+		select.addSymbol(new MultipleElementSymbol());
 		From from = new From();
 		from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
 		CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -606,7 +605,7 @@
 
 	public void testQuery3() {
 		Select select = new Select();
-		select.addSymbol(new AllSymbol());
+		select.addSymbol(new MultipleElementSymbol());
 		From from = new From();
 		from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
 		GroupBy groupBy = new GroupBy();
@@ -627,7 +626,7 @@
 
 	public void testQuery4() {
 		Select select = new Select();
-		select.addSymbol(new AllSymbol());
+		select.addSymbol(new MultipleElementSymbol());
 		From from = new From();
 		from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
 		CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -647,7 +646,7 @@
 
 	public void testQuery5() {
 		Select select = new Select();
-		select.addSymbol(new AllSymbol());
+		select.addSymbol(new MultipleElementSymbol());
 		From from = new From();
 		from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
 		CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -668,7 +667,7 @@
 
 	public void testQuery6() {
 		Select select = new Select();
-		select.addSymbol(new AllSymbol());
+		select.addSymbol(new MultipleElementSymbol());
 		From from = new From();
 		from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
 		CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -688,7 +687,7 @@
 
 	public void testQuery7() {
 		Select select = new Select();
-		select.addSymbol(new AllSymbol());
+		select.addSymbol(new MultipleElementSymbol());
 		From from = new From();
 		from.addGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
 		CompareCriteria cc = new CompareCriteria(new ElementSymbol("e1"), CompareCriteria.EQ, new Constant(new Integer(5))); //$NON-NLS-1$
@@ -1042,11 +1041,11 @@
 	}
 
 	public void testAllSymbol() {
-		helpTest(new AllSymbol(), "*");     //$NON-NLS-1$
+		helpTest(new MultipleElementSymbol(), "*");     //$NON-NLS-1$
 	}
 	
 	public void testAllInGroupSymbol() {
-	    helpTest(new AllInGroupSymbol("m.g.*"), "m.g.*"); //$NON-NLS-1$ //$NON-NLS-2$
+	    helpTest(new MultipleElementSymbol("m.g"), "m.g.*"); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 	
     public void testConstantNull() { 
@@ -1851,7 +1850,7 @@
 
     public void testLimit() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);
@@ -1861,7 +1860,7 @@
     
     public void testLimitWithOffset() {
         Query query = new Query();
-        Select select = new Select(Arrays.asList(new AllSymbol()));
+        Select select = new Select(Arrays.asList(new MultipleElementSymbol()));
         From from = new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("a")))); //$NON-NLS-1$
         query.setSelect(select);
         query.setFrom(from);

Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestStaticSymbolMappingVisitor.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -28,6 +28,8 @@
 import java.util.List;
 import java.util.Map;
 
+import junit.framework.TestCase;
+
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.BetweenCriteria;
 import org.teiid.query.sql.lang.CompareCriteria;
@@ -48,23 +50,17 @@
 import org.teiid.query.sql.proc.CriteriaSelector;
 import org.teiid.query.sql.proc.TranslateCriteria;
 import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.AllInGroupSymbol;
-import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
 import org.teiid.query.sql.symbol.Symbol;
-import org.teiid.query.sql.visitor.ElementCollectorVisitor;
-import org.teiid.query.sql.visitor.GroupCollectorVisitor;
-import org.teiid.query.sql.visitor.StaticSymbolMappingVisitor;
 
-import junit.framework.TestCase;
 
 
-
 public class TestStaticSymbolMappingVisitor extends TestCase {
 
 	// ################################## FRAMEWORK ################################
@@ -209,14 +205,14 @@
 
 	public void testVisitSelect2() { 
 		Select select = new Select();
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		select.addSymbol(all);
 		helpTest(select, getSymbolMap());   
 	}
 
 	public void testVisitSelect3() { 
 		Select select = new Select();
-		AllSymbol all = new AllSymbol();
+		MultipleElementSymbol all = new MultipleElementSymbol();
 		all.addElementSymbol(exampleElement(true, 0));
 		select.addSymbol(all);
 		helpTest(select, getSymbolMap());   
@@ -226,7 +222,7 @@
 		Select select = new Select();
 		select.addSymbol( new ExpressionSymbol(
 			"x", new Function("length", new Expression[] {exampleElement(true, 0)})) );    //$NON-NLS-1$ //$NON-NLS-2$
-		select.addSymbol( new AllInGroupSymbol("abc.*") ); //$NON-NLS-1$
+		select.addSymbol( new MultipleElementSymbol("abc.*") ); //$NON-NLS-1$
 		select.addSymbol( exampleElement(true, 1) );
 		helpTest(select,getSymbolMap());
 	}
@@ -266,7 +262,7 @@
 	}
 	
  	public void testVisitAllSymbol() {
- 		AllSymbol as = new AllSymbol();
+ 		MultipleElementSymbol as = new MultipleElementSymbol();
  		ArrayList elements = new ArrayList();
  		elements.add(exampleElement(true, 0));    
  		elements.add(exampleElement(true, 1));     		
@@ -274,8 +270,8 @@
  		helpTest(as, getSymbolMap());
  	}
  	
- 	public void testVisitAllInGroupSymbol() {
- 		AllInGroupSymbol aigs = new AllInGroupSymbol("OLDG0.*"); //$NON-NLS-1$
+ 	public void testVisitMultipleElementSymbol() {
+ 		MultipleElementSymbol aigs = new MultipleElementSymbol("OLDG0.*"); //$NON-NLS-1$
  		ArrayList elements = new ArrayList();
  		elements.add(exampleElement(true, 0));    
  		elements.add(exampleElement(true, 1));     		
@@ -299,9 +295,9 @@
 		helpTest(f2, getSymbolMap()); 	    
  	} 	
 
- 	public void testMapAllInGroupSymbolName() {
- 		AllInGroupSymbol aigs = new AllInGroupSymbol("OLDG0.*"); //$NON-NLS-1$
- 		ArrayList elements = new ArrayList();
+ 	public void testMapMultipleElementSymbolName() {
+ 		MultipleElementSymbol aigs = new MultipleElementSymbol("OLDG0"); //$NON-NLS-1$
+ 		ArrayList<ElementSymbol> elements = new ArrayList<ElementSymbol>();
  		elements.add(exampleElement(true, 0));    
  		elements.add(exampleElement(true, 1));     		
  		aigs.setElementSymbols(elements);
@@ -311,7 +307,7 @@
         DeepPreOrderNavigator.doVisit(aigs, visitor);
 
 		// Check name of all in group symbol
-		assertEquals("AllInGroupSymbol name did not get mapped correctly: ", "NEWG0.*", aigs.getName()); //$NON-NLS-1$ //$NON-NLS-2$
+		assertEquals("MultipleElementSymbol name did not get mapped correctly: ", "NEWG0.*", aigs.toString()); //$NON-NLS-1$ //$NON-NLS-2$
  	}
     
     public void testExecName() {

Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2011-07-21 16:29:29 UTC (rev 3322)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2011-07-21 19:28:44 UTC (rev 3323)
@@ -1859,5 +1859,21 @@
 	@Test public void testNestedAgg() {
 		helpValidate("SELECT min(g1.e1) filter (where max(e2) = 1) from pm1.g1", new String[] {"MAX(e2)"}, RealMetadataFactory.example1Cached());		
 	}
+	
+	@Test public void testWindowFunction() {
+		helpValidate("SELECT e1 from pm1.g1 where row_number() over (order by e2) = 1", new String[] {"ROW_NUMBER() OVER (ORDER BY e2)"}, RealMetadataFactory.example1Cached());		
+	}
+	
+	@Test public void testWindowFunction1() {
+		helpValidate("SELECT 1 from pm1.g1 having row_number() over (order by e2) = 1", new String[] {"e2", "ROW_NUMBER() OVER (ORDER BY e2)"}, RealMetadataFactory.example1Cached());		
+	}
+	
+	@Test public void testWindowFunctionWithoutOrdering() {
+		helpValidate("SELECT row_number() over () from pm1.g1", new String[] {"ROW_NUMBER() OVER ()"}, RealMetadataFactory.example1Cached());		
+	}
 
+	@Test public void testWindowFunctionWithNestedOrdering() {
+		helpValidate("SELECT xmlagg(xmlelement(name x, e1) order by e2) over () from pm1.g1", new String[] {"XMLAGG(XMLELEMENT(NAME x, e1) ORDER BY e2)"}, RealMetadataFactory.example1Cached());		
+	}
+
 }



More information about the teiid-commits mailing list