[teiid-commits] teiid SVN: r2825 - in trunk: connectors/connector-salesforce/src/main/java/org/teiid/resource/adapter/salesforce and 17 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Jan 10 17:09:55 EST 2011


Author: shawkins
Date: 2011-01-10 17:09:53 -0500 (Mon, 10 Jan 2011)
New Revision: 2825

Modified:
   trunk/common-core/src/main/java/org/teiid/core/util/SqlUtil.java
   trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnectionImpl.java
   trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
   trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java
   trunk/engine/src/main/java/org/teiid/query/resolver/CommandResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/DeleteResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/DynamicCommandResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java
   trunk/engine/src/test/java/org/teiid/query/sql/util/TestElementSymbolOptimizer.java
   trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
   trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java
   trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/BaseQueryTest.java
Log:
consolidating view resolving in anticipation of TEIID-1326.  also simplifying resolving arguments and adding a resolving hook for trigger actions for designer integration

Modified: trunk/common-core/src/main/java/org/teiid/core/util/SqlUtil.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/util/SqlUtil.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/common-core/src/main/java/org/teiid/core/util/SqlUtil.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -56,56 +56,6 @@
         return PATTERN.matcher(sql).matches();
     }
     
-    /**
-     * Simple method which normalizes a SQL string by replacing CR characters, new line characters and Tab characters with spaces,
-     * then trimming the string to remove unneeded spaces.
-     * 
-     * @param inputSqlString
-     * @return
-     * @since 5.0
-     */
-    public static String normalize(String inputSqlString) {
-        String normalizedString = inputSqlString;
-        if (inputSqlString != null && inputSqlString.length() > 0) {
-            if (  inputSqlString.indexOf(NL_CHAR) > -1 || 
-                  inputSqlString.indexOf(CR_CHAR) > -1 || 
-                  inputSqlString.indexOf(TAB_CHAR) > -1 ||
-                  inputSqlString.indexOf(StringUtil.Constants.DBL_SPACE) > -1) {
-                normalizedString = normalizedString.replace(NL_CHAR, SPACE_CHAR);
-                normalizedString = normalizedString.replace(CR_CHAR, SPACE_CHAR);
-                normalizedString = normalizedString.replace(TAB_CHAR, SPACE_CHAR);
-                normalizedString = StringUtil.replaceAll(normalizedString,
-                                                         StringUtil.Constants.DBL_SPACE,
-                                                         StringUtil.Constants.SPACE);
-                
-            }
-            normalizedString = StringUtil.collapseWhitespace(normalizedString);
-        }
-        return normalizedString;
-    }
-    
-    /**
-     * determine if the supplied sql Strings are different
-     * @param newSql the new SQL String
-     * @param oldSql the old SQL String
-     * @return 'true' if strings differ, 'false' if same
-     */
-    public static boolean stringsAreDifferent(String newSql, String oldSql) {
-        boolean isDifferent = true;
-        if(newSql==null) {
-            if(oldSql==null) {
-                isDifferent = false;
-            }
-        } else if(oldSql!=null) {
-            String normalizedNewSql = normalize(newSql);
-            String normalizedOldSql = normalize(oldSql);
-            if(normalizedNewSql.equals(normalizedOldSql)) {
-                isDifferent=false;
-            }
-        }
-        return isDifferent;
-    }
-    
     public static SQLException createFeatureNotSupportedException() {
     	return new SQLFeatureNotSupportedException();
     }    

Modified: trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnectionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnectionImpl.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnectionImpl.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -162,7 +162,7 @@
 		QueryOptions qo = partnerFactory.createQueryOptions();
 		qo.setBatchSize(batchSize);
 		try {
-			if(queryAll) {
+			if(queryAll != null && queryAll) {
 				qr = sfSoap.queryAll(queryString, sh);
 			} else {
 				MruHeader mruHeader = partnerFactory.createMruHeader();

Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -65,6 +65,7 @@
 import org.teiid.logging.LogManager;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.processor.relational.ListNestedSortComparator;
+import org.teiid.query.sql.symbol.Expression;
 
 
 /**
@@ -582,7 +583,41 @@
 	
 	@Override
 	public int getSchemaSize(List elements) {
-		return elements.size();
+		int total = 0;
+		//we make a assumption that the average column size under 64bits is approximately 128bytes
+		//this includes alignment, row/array, and reference overhead
+		for (Object element : elements) {
+			Class<?> type = ((Expression)element).getType();
+			if (type == DataTypeManager.DefaultDataClasses.STRING) {
+				total += 256; //assumes an "average" string length of approximately 100 chars
+			} else if (type == DataTypeManager.DefaultDataClasses.DATE 
+					|| type == DataTypeManager.DefaultDataClasses.TIME 
+					|| type == DataTypeManager.DefaultDataClasses.TIMESTAMP) {
+				total += 32;
+			} else if (type == DataTypeManager.DefaultDataClasses.LONG 
+					|| type	 == DataTypeManager.DefaultDataClasses.DOUBLE) {
+				total += 20;
+			} else if (type == DataTypeManager.DefaultDataClasses.INTEGER 
+					|| type == DataTypeManager.DefaultDataClasses.FLOAT) {
+				total += 14;
+			} else if (type == DataTypeManager.DefaultDataClasses.CHAR 
+					|| type == DataTypeManager.DefaultDataClasses.SHORT) {
+				total += 10;
+			} else if (type == DataTypeManager.DefaultDataClasses.BOOLEAN 
+					|| type == DataTypeManager.DefaultDataClasses.BYTE
+					|| type == DataTypeManager.DefaultDataClasses.NULL) {
+				//even if value caching is turned off we don't bother counting 
+				//the additional references that may exist to boolean and byte values
+				total += 8;
+			} else if (type == DataTypeManager.DefaultDataClasses.OBJECT) {
+				total += 1024;
+			} else {
+				total += 512; //assumes buffer overhead in the case of lobs
+				//however the account for lobs is misleading as the lob
+				//references are not actually removed from memory
+			}
+		}
+		return Math.max(1, total/128);
 	}
 	
     public void setMaxReserveBatchColumns(int maxReserve) {

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-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -22,7 +22,6 @@
 
 package org.teiid.dqp.internal.process;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -43,7 +42,6 @@
 import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
 import org.teiid.dqp.internal.process.multisource.MultiSourceMetadataWrapper;
 import org.teiid.dqp.message.RequestID;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.SupportConstants;
 import org.teiid.query.metadata.TempMetadataAdapter;
@@ -213,7 +211,7 @@
             command = plan.getCommand();
         } else {
         	command = QueryParser.getQueryParser().parseCommand(sql, info);
-            QueryResolver.resolveCommand(command, Collections.EMPTY_MAP, this.metadata, AnalysisRecord.createNonRecordingRecord());                        
+            QueryResolver.resolveCommand(command, this.metadata);                        
         }
         return getMetadataForCommand(command);            
     }

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -280,7 +280,7 @@
         }
     	//ensure that the user command is distinct from the processing command
         //rewrite and planning may alter options, symbols, etc.
-    	QueryResolver.resolveCommand(command, metadata, analysisRecord);
+    	QueryResolver.resolveCommand(command, metadata);
     	
     	this.userCommand = (Command)command.clone();
     }

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -180,9 +180,7 @@
             if (tempID.getType() != null) {
                 return DataTypeManager.getDataTypeName( tempID.getType() );
             } 
-            // If type is null, check element ID stored in temp group store.
-            TempMetadataID storedTempID = this.tempStore.getTempElementID(tempID.getID());
-            return DataTypeManager.getDataTypeName( storedTempID.getType() );
+            throw new AssertionError("No type set for element " + elementID); //$NON-NLS-1$
         }
 		return this.actualMetadata.getElementType(elementID);
 	}

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -25,7 +25,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -33,7 +32,6 @@
 import java.util.Set;
 
 import org.teiid.api.exception.query.QueryMetadataException;
-import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.api.exception.query.QueryPlannerException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.api.exception.query.QueryValidatorException;
@@ -66,13 +64,11 @@
 import org.teiid.query.optimizer.relational.rules.RuleCollapseSource;
 import org.teiid.query.optimizer.relational.rules.RuleConstants;
 import org.teiid.query.optimizer.relational.rules.RuleMergeCriteria;
-import org.teiid.query.parser.QueryParser;
 import org.teiid.query.processor.ProcessorPlan;
 import org.teiid.query.processor.relational.RelationalPlan;
 import org.teiid.query.processor.relational.JoinNode.JoinStrategyType;
 import org.teiid.query.resolver.ProcedureContainerResolver;
 import org.teiid.query.resolver.QueryResolver;
-import org.teiid.query.resolver.util.BindVariableVisitor;
 import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.rewriter.QueryRewriter;
 import org.teiid.query.sql.LanguageObject;
@@ -1095,7 +1091,7 @@
             qnode = metadata.getVirtualPlan(metadataID);            
         }
 
-        Command result = getCommand(virtualGroup, qnode, cacheString, metadata, analysisRecord);   
+        Command result = QueryResolver.resolveView(virtualGroup, qnode, cacheString, metadata);   
         return QueryRewriter.rewrite(result, metadata, context);
     }
     
@@ -1136,7 +1132,7 @@
 					for (Object index : indexes) {
 						id.addIndex(resolveIndex(metadata, id, index));
 					}
-					Command c = getCommand(table, metadata.getVirtualPlan(table.getMetadataID()), SQLConstants.Reserved.SELECT, metadata, analysisRecord);
+					Command c = QueryResolver.resolveView(table, metadata.getVirtualPlan(table.getMetadataID()), SQLConstants.Reserved.SELECT, metadata);
 					CacheHint hint = c.getCacheHint();
 					if (hint != null) {
 						recordAnnotation(analysisRecord, Annotation.MATERIALIZED_VIEW, Priority.LOW, "SimpleQueryResolver.cache_hint_used", table, matTableName, id.getCacheHint()); //$NON-NLS-1$
@@ -1162,36 +1158,6 @@
 		return primaryKey;
 	}
 
-	private static Command getCommand(GroupSymbol virtualGroup, QueryNode qnode,
-			String cacheString, QueryMetadataInterface qmi, AnalysisRecord analysisRecord) throws TeiidComponentException,
-			QueryMetadataException, QueryResolverException,
-			QueryValidatorException {
-		Command result = (Command)qmi.getFromMetadataCache(virtualGroup.getMetadataID(), "transformation/" + cacheString); //$NON-NLS-1$
-        if (result != null) {
-        	result = (Command)result.clone();
-        } else {
-        	result = qnode.getCommand();
-            
-            if (result == null) {
-                try {
-                	result = QueryParser.getQueryParser().parseCommand(qnode.getQuery());
-                } catch(QueryParserException e) {
-                    throw new QueryResolverException(e, "ERR.015.008.0011", QueryPlugin.Util.getString("ERR.015.008.0011", qnode.getGroupName())); //$NON-NLS-1$ //$NON-NLS-2$
-                }
-                
-                //Handle bindings and references
-                List bindings = qnode.getBindings();
-                if (bindings != null){
-                    BindVariableVisitor.bindReferences(result, bindings, qmi);
-                }
-            }
-	        QueryResolver.resolveCommand(result, Collections.EMPTY_MAP, qmi, analysisRecord);
-	        Request.validateWithVisitor(new ValidationVisitor(), qmi, result);
-	        qmi.addToMetadataCache(virtualGroup.getMetadataID(), "transformation/" + cacheString, result.clone()); //$NON-NLS-1$
-        }
-		return result;
-	}
-
     public static boolean isNoCacheGroup(QueryMetadataInterface metadata,
                                           Object metadataID,
                                           Option option) throws QueryMetadataException,

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-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -37,7 +37,6 @@
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.mapping.relational.QueryNode;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
@@ -101,7 +100,7 @@
         throws TeiidComponentException, QueryPlannerException {
         // Run resolver
         try {
-            QueryResolver.resolveCommand(query, Collections.EMPTY_MAP, metadata, AnalysisRecord.createNonRecordingRecord());
+            QueryResolver.resolveCommand(query, metadata);
         } catch(QueryResolverException e) {
             throw new QueryPlannerException(e, e.getMessage());
         }

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/CommandResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/CommandResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/CommandResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -25,7 +25,6 @@
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.sql.lang.Command;
 
@@ -40,14 +39,13 @@
      * Resolve the command using the metadata.  
      * @param command The command to resolve
      * @param metadata Metadata
-     * @param analysis
      * @param resolveNullLiterals true if the resolver should consider replacing null literals with more appropriate types 
      * @return the TempMetadataStore containing the metadata defined by this command
      * @throws QueryMetadataException If there is a metadata problem
      * @throws QueryResolverException If the query cannot be resolved
      * @throws TeiidComponentException If there is an internal error     
      */        
-    void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals)
+    void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals)
     throws QueryMetadataException, QueryResolverException, TeiidComponentException;
     
 }

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -23,7 +23,6 @@
 package org.teiid.query.resolver;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 import org.teiid.api.exception.query.QueryMetadataException;
@@ -60,8 +59,7 @@
 public abstract class ProcedureContainerResolver implements CommandResolver {
 
     public abstract void resolveProceduralCommand(Command command,
-                                                  TempMetadataAdapter metadata,
-                                                  AnalysisRecord analysis) throws QueryMetadataException,
+                                                  TempMetadataAdapter metadata) throws QueryMetadataException,
                                                                           QueryResolverException,
                                                                           TeiidComponentException;
     
@@ -114,8 +112,8 @@
         	ta.setView(procCommand.getGroup());
         	TempMetadataAdapter tma = new TempMetadataAdapter(metadata, new TempMetadataStore());
         	ta.setTemporaryMetadata(tma.getMetadataStore().getData());
-            GroupContext externalGroups = procCommand.getExternalGroupContexts();
-            
+            GroupContext externalGroups = ta.getExternalGroupContexts();
+            //TODO: it seems easier to just inline the handling here rather than have each of the resolvers check for trigger actions
             List<ElementSymbol> viewElements = ResolverUtil.resolveElementsInGroup(ta.getView(), metadata);
             if (procCommand instanceof Update || procCommand instanceof Insert) {
             	addChanging(tma.getMetadataStore(), externalGroups, viewElements);
@@ -124,10 +122,9 @@
             if (procCommand instanceof Update || procCommand instanceof Delete) {
             	ProcedureContainerResolver.addScalarGroup(SQLConstants.Reserved.OLD, tma.getMetadataStore(), externalGroups, viewElements);
             }
-            
-            new UpdateProcedureResolver().resolveBlock(new CreateUpdateProcedureCommand(), ta.getBlock(), externalGroups, tma, analysis);
-
-            return subCommand;
+            QueryResolver.setChildMetadata(subCommand, tma.getMetadataStore().getData(), externalGroups);
+            QueryResolver.resolveCommand(subCommand, metadata);
+            return ta;
         }
         
         //find the childMetadata using a clean metadata store
@@ -138,7 +135,7 @@
         
         QueryResolver.setChildMetadata(subCommand, childMetadata.getData(), externalGroups);
         
-        QueryResolver.resolveCommand(subCommand, Collections.EMPTY_MAP, metadata, analysis);
+        QueryResolver.resolveCommand(subCommand, metadata);
         
         return subCommand;
     }
@@ -215,16 +212,16 @@
 	}
         
     /** 
-     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, org.teiid.query.analysis.AnalysisRecord, boolean)
+     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, boolean)
      */
-    public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals) 
+    public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
         
         ProcedureContainer procCommand = (ProcedureContainer)command;
         
         resolveGroup(metadata, procCommand);
         
-        resolveProceduralCommand(procCommand, metadata, analysis);
+        resolveProceduralCommand(procCommand, metadata);
         
         getPlan(metadata, procCommand);
     }

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -25,19 +25,24 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 import org.teiid.api.exception.query.QueryMetadataException;
+import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.api.exception.query.QueryResolverException;
+import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.core.TeiidComponentException;
+import org.teiid.dqp.internal.process.Request;
 import org.teiid.logging.LogManager;
+import org.teiid.query.QueryPlugin;
 import org.teiid.query.analysis.AnalysisRecord;
+import org.teiid.query.mapping.relational.QueryNode;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataID;
 import org.teiid.query.metadata.TempMetadataStore;
+import org.teiid.query.parser.QueryParser;
 import org.teiid.query.resolver.command.BatchedUpdateResolver;
 import org.teiid.query.resolver.command.DeleteResolver;
 import org.teiid.query.resolver.command.DynamicCommandResolver;
@@ -49,6 +54,7 @@
 import org.teiid.query.resolver.command.UpdateProcedureResolver;
 import org.teiid.query.resolver.command.UpdateResolver;
 import org.teiid.query.resolver.command.XMLQueryResolver;
+import org.teiid.query.resolver.util.BindVariableVisitor;
 import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.resolver.util.ResolverVisitor;
 import org.teiid.query.sql.lang.Command;
@@ -60,9 +66,11 @@
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.SubqueryContainer;
 import org.teiid.query.sql.lang.UnaryFromClause;
+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.visitor.ValueIteratorProviderCollectorVisitor;
+import org.teiid.query.validator.ValidationVisitor;
 
 
 /**
@@ -91,67 +99,34 @@
     	return cr.expandCommand(proc, metadata, analysisRecord);
     }
 
-    /**
-     * This implements an algorithm to resolve all the symbols created by the parser into real metadata IDs
-     * @param command Command the SQL command we are running (Select, Update, Insert, Delete)
-     * @param metadata QueryMetadataInterface the metadata
-     * @param analysis The analysis record which can be used to add anotations and debug information.
-     */
-     public static void resolveCommand(Command command, QueryMetadataInterface metadata, AnalysisRecord analysis)
-         throws QueryResolverException, TeiidComponentException {
+	/**
+	 * This implements an algorithm to resolve all the symbols created by the
+	 * parser into real metadata IDs
+	 * 
+	 * @param command
+	 *            Command the SQL command we are running (Select, Update,
+	 *            Insert, Delete)
+	 * @param metadata
+	 *            QueryMetadataInterface the metadata
+	 * @return 
+	 */
+	public static TempMetadataStore resolveCommand(Command command,
+			QueryMetadataInterface metadata) throws QueryResolverException,
+			TeiidComponentException {
 
-         resolveCommand(command, Collections.EMPTY_MAP, metadata, analysis);
-     }
+		return resolveCommand(command, metadata, true);
+	}
 
-     /**
-      * This implements an algorithm to resolve all the symbols created by the parser into real metadata IDs
-      * @param command Command the SQL command we are running (Select, Update, Insert, Delete)
-      * @param metadata QueryMetadataInterface the metadata
-      */
-      public static void resolveCommand(Command command, QueryMetadataInterface metadata)
-          throws QueryResolverException, TeiidComponentException {
-
-          resolveCommand(command, Collections.EMPTY_MAP, metadata, AnalysisRecord.createNonRecordingRecord());
-      }
-
-   /**
-    * This implements an algorithm to resolve all the symbols created by the parser into real metadata IDs
- * @param externalMetadata Map of GroupSymbol to a List of ElementSymbol that identifies
-    * valid external groups that can be resolved against. Any elements resolved against external
-    * groups will be treated as variables
- * @param metadata QueryMetadataInterface the metadata
- * @param analysis The analysis record which can be used to add anotations and debug information.
- * @param command Command the SQL command we are running (Select, Update, Insert, Delete)
-    */
-    public static TempMetadataStore resolveCommand(Command currentCommand, Map externalMetadata, QueryMetadataInterface metadata, 
-                                                     AnalysisRecord analysis)
-                       throws QueryResolverException, TeiidComponentException {
-        return resolveCommand(currentCommand, externalMetadata, metadata, analysis, true);
-    }
-      
-    public static TempMetadataStore resolveCommand(Command currentCommand, Map externalMetadata, QueryMetadataInterface metadata, 
-                                      AnalysisRecord analysis, boolean resolveNullLiterals)
+    public static TempMetadataStore resolveCommand(Command currentCommand, QueryMetadataInterface metadata, boolean resolveNullLiterals)
         throws QueryResolverException, TeiidComponentException {
 
 		LogManager.logTrace(org.teiid.logging.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving command", currentCommand}); //$NON-NLS-1$
         
         TempMetadataAdapter resolverMetadata = null;
         try {
-            TempMetadataStore rootExternalStore = new TempMetadataStore();
-            if(externalMetadata != null) {
-                for(Iterator iter = externalMetadata.entrySet().iterator(); iter.hasNext();) {
-                    Map.Entry entry = (Map.Entry)iter.next();
-                    GroupSymbol group = (GroupSymbol) entry.getKey();
-                    List elements = (List) entry.getValue();
-                    rootExternalStore.addTempGroup(group.getName(), elements);
-                    currentCommand.addExternalGroupToContext(group);
-                }
-            } 
             Map tempMetadata = currentCommand.getTemporaryMetadata();
             if(tempMetadata == null) {
-                currentCommand.setTemporaryMetadata(new HashMap(rootExternalStore.getData()));
-            } else {
-                tempMetadata.putAll(rootExternalStore.getData());
+                currentCommand.setTemporaryMetadata(new HashMap());
             }
             
             TempMetadataStore discoveredMetadata = new TempMetadataStore(currentCommand.getTemporaryMetadata());
@@ -159,12 +134,11 @@
             resolverMetadata = new TempMetadataAdapter(metadata, discoveredMetadata);
             
             // Resolve external groups for command
-            Collection externalGroups = currentCommand.getAllExternalGroups();
-            Iterator extIter = externalGroups.iterator();
-            while(extIter.hasNext()) {
-                GroupSymbol extGroup = (GroupSymbol) extIter.next();
+            Collection<GroupSymbol> externalGroups = currentCommand.getAllExternalGroups();
+            for (GroupSymbol extGroup : externalGroups) {
                 Object metadataID = extGroup.getMetadataID();
                 //make sure that the group is resolved and that it is pointing to the appropriate temp group
+                //TODO: this is mainly for XML resolving since it sends external groups in unresolved
                 if (metadataID == null || (!(extGroup.getMetadataID() instanceof TempMetadataID) && discoveredMetadata.getTempGroupID(extGroup.getName()) != null)) {
                     metadataID = resolverMetadata.getGroupID(extGroup.getName());
                     extGroup.setMetadataID(metadataID);
@@ -174,7 +148,7 @@
             CommandResolver resolver = chooseResolver(currentCommand, resolverMetadata);
 
             // Resolve this command
-            resolver.resolveCommand(currentCommand, resolverMetadata, analysis, resolveNullLiterals);            
+            resolver.resolveCommand(currentCommand, resolverMetadata, resolveNullLiterals);            
         } catch(QueryMetadataException e) {
             throw new QueryResolverException(e, e.getMessage());
         }
@@ -207,6 +181,7 @@
             case Command.TYPE_UPDATE:               return UPDATE_RESOLVER;
             case Command.TYPE_DELETE:               return DELETE_RESOLVER;
             case Command.TYPE_STORED_PROCEDURE:     return EXEC_RESOLVER;
+            case Command.TYPE_TRIGGER_ACTION:		return UPDATE_PROCEDURE_RESOLVER;
             case Command.TYPE_UPDATE_PROCEDURE:     return UPDATE_PROCEDURE_RESOLVER;
             case Command.TYPE_BATCHED_UPDATE:       return BATCHED_UPDATE_RESOLVER;
             case Command.TYPE_DYNAMIC:              return DYNAMIC_COMMAND_RESOLVER;
@@ -300,15 +275,61 @@
     }
     
 	public static void resolveSubqueries(Command command,
-			TempMetadataAdapter metadata, AnalysisRecord analysis, Collection<GroupSymbol> externalGroups)
+			TempMetadataAdapter metadata, Collection<GroupSymbol> externalGroups)
 			throws QueryResolverException, TeiidComponentException {
 		for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(command)) {
             QueryResolver.setChildMetadata(container.getCommand(), command);
             if (externalGroups != null) {
             	container.getCommand().pushNewResolvingContext(externalGroups);
             }
-            QueryResolver.resolveCommand(container.getCommand(), Collections.EMPTY_MAP, metadata.getMetadata(), analysis);
+            QueryResolver.resolveCommand(container.getCommand(), metadata.getMetadata());
         }
 	}
+	
+	public static Command resolveView(GroupSymbol virtualGroup, QueryNode qnode,
+			String cacheString, QueryMetadataInterface qmi) throws TeiidComponentException,
+			QueryMetadataException, QueryResolverException,
+			QueryValidatorException {
+		Command result = (Command)qmi.getFromMetadataCache(virtualGroup.getMetadataID(), "transformation/" + cacheString); //$NON-NLS-1$
+        if (result != null) {
+        	result = (Command)result.clone();
+        } else {
+        	result = qnode.getCommand();
+            
+            if (result == null) {
+                try {
+                	result = QueryParser.getQueryParser().parseCommand(qnode.getQuery());
+                } catch(QueryParserException e) {
+                    throw new QueryResolverException(e, "ERR.015.008.0011", QueryPlugin.Util.getString("ERR.015.008.0011", qnode.getGroupName())); //$NON-NLS-1$ //$NON-NLS-2$
+                }
+                
+                //Handle bindings and references
+                List bindings = qnode.getBindings();
+                if (bindings != null){
+                    BindVariableVisitor.bindReferences(result, bindings, qmi);
+                }
+            }
+	        QueryResolver.resolveCommand(result, qmi);
+	        Request.validateWithVisitor(new ValidationVisitor(), qmi, result);
+	        qmi.addToMetadataCache(virtualGroup.getMetadataID(), "transformation/" + cacheString, result.clone()); //$NON-NLS-1$
+        }
+		return result;
+	}
+	
+	public static void buildExternalGroups(Map<GroupSymbol, List<ElementSymbol>> externalMetadata, Command currentCommand) {
+		TempMetadataStore rootExternalStore = new TempMetadataStore();
+		for(Map.Entry<GroupSymbol, List<ElementSymbol>> entry : externalMetadata.entrySet()) {
+		    GroupSymbol group = entry.getKey();
+		    List<ElementSymbol> elements = entry.getValue();
+		    rootExternalStore.addTempGroup(group.getName(), elements);
+		    currentCommand.addExternalGroupToContext(group);
+		}
+		Map tempMetadata = currentCommand.getTemporaryMetadata();
+        if(tempMetadata == null) {
+        	currentCommand.setTemporaryMetadata(rootExternalStore.getData());
+        } else {
+            tempMetadata.putAll(rootExternalStore.getData());
+        }
+	}
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -22,13 +22,11 @@
 
 package org.teiid.query.resolver.command;
 
-import java.util.Collections;
 import java.util.Iterator;
 
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.resolver.CommandResolver;
 import org.teiid.query.resolver.QueryResolver;
@@ -42,7 +40,7 @@
  */
 public class BatchedUpdateResolver implements CommandResolver {
     
-    public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals) 
+    public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
         BatchedUpdateCommand batchedUpdateCommand = (BatchedUpdateCommand) command;
@@ -50,7 +48,7 @@
         for (Iterator i = batchedUpdateCommand.getSubCommands().iterator(); i.hasNext();) {
             Command subCommand = (Command)i.next();
             QueryResolver.setChildMetadata(subCommand, command);
-            QueryResolver.resolveCommand(subCommand, Collections.EMPTY_MAP, metadata.getMetadata(), analysis);
+            QueryResolver.resolveCommand(subCommand, metadata.getMetadata());
         }
     }
 

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/DeleteResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/DeleteResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/DeleteResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -28,7 +28,6 @@
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataStore;
@@ -48,9 +47,9 @@
 public class DeleteResolver extends ProcedureContainerResolver {
 
     /** 
-     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, org.teiid.query.analysis.AnalysisRecord)
+     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter)
      */
-    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis) 
+    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
         //Cast to known type
@@ -58,7 +57,7 @@
 
         Set<GroupSymbol> groups = new HashSet<GroupSymbol>();
         groups.add(delete.getGroup());
-        QueryResolver.resolveSubqueries(command, metadata, analysis, groups);
+        QueryResolver.resolveSubqueries(command, metadata, groups);
         ResolverVisitor.resolveLanguageObject(delete, groups, delete.getExternalGroupContexts(), metadata);
     }
     

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/DynamicCommandResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/DynamicCommandResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/DynamicCommandResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -32,7 +32,6 @@
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataID;
 import org.teiid.query.resolver.CommandResolver;
@@ -50,9 +49,9 @@
 public class DynamicCommandResolver implements CommandResolver {
 
     /** 
-     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, AnalysisRecord, boolean)
+     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, boolean)
      */
-    public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals) 
+    public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
         DynamicCommand dynamicCmd = (DynamicCommand)command;

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -23,10 +23,8 @@
 package org.teiid.query.resolver.command;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -36,7 +34,6 @@
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.mapping.relational.QueryNode;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.StoredProcedureInfo;
@@ -239,9 +236,7 @@
 
         // Look through parameters to find input elements - these become child metadata
         List<ElementSymbol> tempElements = new ArrayList<ElementSymbol>();
-        Iterator iter = storedProcedureCommand.getParameters().iterator();
-        while(iter.hasNext()) {
-            SPParameter param = (SPParameter) iter.next();
+        for (SPParameter param : storedProcedureCommand.getParameters()) {
             if(param.getParameterType() == ParameterInfo.IN || param.getParameterType() == ParameterInfo.INOUT) {
                 ElementSymbol symbol = param.getParameterSymbol();
                 tempElements.add(symbol);
@@ -254,58 +249,53 @@
     }
 
     /** 
-     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, org.teiid.query.analysis.AnalysisRecord)
+     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter)
      */
-    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis) 
+    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
         findCommandMetadata(command, metadata.getMetadataStore(), metadata);
         
         //Resolve expressions on input parameters
         StoredProcedure storedProcedureCommand = (StoredProcedure) command;
-        List params = storedProcedureCommand.getParameters();
-        if(params.size() > 0) {
-            GroupContext externalGroups = storedProcedureCommand.getExternalGroupContexts();
-            Iterator paramIter = params.iterator();
-            while(paramIter.hasNext()) {
-                SPParameter param = (SPParameter) paramIter.next();
-                Expression expr = param.getExpression();
-                if(expr == null) {
-                	continue;
-                }
-                for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(expr)) {
-                    QueryResolver.setChildMetadata(container.getCommand(), command);
-                    
-                    QueryResolver.resolveCommand(container.getCommand(), Collections.EMPTY_MAP, metadata.getMetadata(), analysis);
-                }
-                ResolverVisitor.resolveLanguageObject(expr, null, externalGroups, metadata);
-                Class paramType = param.getClassType();
-
-                ResolverUtil.setDesiredType(expr, paramType, storedProcedureCommand);
+        GroupContext externalGroups = storedProcedureCommand.getExternalGroupContexts();
+        for (SPParameter param : storedProcedureCommand.getParameters()) {
+            Expression expr = param.getExpression();
+            if(expr == null) {
+            	continue;
+            }
+            for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(expr)) {
+                QueryResolver.setChildMetadata(container.getCommand(), command);
                 
-                // Compare type of parameter expression against parameter type
-                // and add implicit conversion if necessary
-                Class exprType = expr.getType();
-                if(paramType == null || exprType == null) {
-                    throw new QueryResolverException("ERR.015.008.0061", QueryPlugin.Util.getString("ERR.015.008.0061", storedProcedureCommand.getProcedureName(), param.getName())); //$NON-NLS-1$ //$NON-NLS-2$
-                }
-                String tgtType = DataTypeManager.getDataTypeName(paramType);
-                String srcType = DataTypeManager.getDataTypeName(exprType);
-                Expression result = null;
-                                
-                if (param.getParameterType() == SPParameter.RETURN_VALUE || param.getParameterType() == SPParameter.OUT) {
-                	if (!ResolverUtil.canImplicitlyConvert(tgtType, srcType)) {
-                		throw new QueryResolverException(QueryPlugin.Util.getString("ExecResolver.out_type_mismatch", param.getParameterSymbol(), tgtType, srcType)); //$NON-NLS-1$
-                	}
-                } else {
-	                try {
-	                    result = ResolverUtil.convertExpression(expr, tgtType, metadata);
-	                } catch (QueryResolverException e) {
-	                    throw new QueryResolverException(e, QueryPlugin.Util.getString("ExecResolver.Param_convert_fail", new Object[] { srcType, tgtType}));                                     //$NON-NLS-1$
-	                }                                                       
-	                param.setExpression(result);
-                }
+                QueryResolver.resolveCommand(container.getCommand(), metadata.getMetadata());
             }
+            ResolverVisitor.resolveLanguageObject(expr, null, externalGroups, metadata);
+            Class<?> paramType = param.getClassType();
+
+            ResolverUtil.setDesiredType(expr, paramType, storedProcedureCommand);
+            
+            // Compare type of parameter expression against parameter type
+            // and add implicit conversion if necessary
+            Class<?> exprType = expr.getType();
+            if(paramType == null || exprType == null) {
+                throw new QueryResolverException("ERR.015.008.0061", QueryPlugin.Util.getString("ERR.015.008.0061", storedProcedureCommand.getProcedureName(), param.getName())); //$NON-NLS-1$ //$NON-NLS-2$
+            }
+            String tgtType = DataTypeManager.getDataTypeName(paramType);
+            String srcType = DataTypeManager.getDataTypeName(exprType);
+            Expression result = null;
+                            
+            if (param.getParameterType() == SPParameter.RETURN_VALUE || param.getParameterType() == SPParameter.OUT) {
+            	if (!ResolverUtil.canImplicitlyConvert(tgtType, srcType)) {
+            		throw new QueryResolverException(QueryPlugin.Util.getString("ExecResolver.out_type_mismatch", param.getParameterSymbol(), tgtType, srcType)); //$NON-NLS-1$
+            	}
+            } else {
+                try {
+                    result = ResolverUtil.convertExpression(expr, tgtType, metadata);
+                } catch (QueryResolverException e) {
+                    throw new QueryResolverException(e, QueryPlugin.Util.getString("ExecResolver.Param_convert_fail", new Object[] { srcType, tgtType}));                                     //$NON-NLS-1$
+                }                                                       
+                param.setExpression(result);
+            }
         }
     }
     

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -24,7 +24,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -38,7 +37,6 @@
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.util.Assertion;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.resolver.ProcedureContainerResolver;
@@ -66,16 +64,16 @@
 
     /**
      * Resolve an INSERT.  Need to resolve elements, constants, types, etc.
-     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, org.teiid.query.analysis.AnalysisRecord)
+     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter)
      */
-    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis) 
+    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
         // Cast to known type
         Insert insert = (Insert) command;
         
         if (insert.getValues() != null) {
-        	QueryResolver.resolveSubqueries(command, metadata, analysis, null);
+        	QueryResolver.resolveSubqueries(command, metadata, null);
 	        //variables and values must be resolved separately to account for implicitly defined temp groups
 	        resolveList(insert.getValues(), metadata, insert.getExternalGroupContexts(), null);
     	}
@@ -83,7 +81,7 @@
         if(insert.getQueryExpression() != null) {
         	QueryResolver.setChildMetadata(insert.getQueryExpression(), command);
             
-            QueryResolver.resolveCommand(insert.getQueryExpression(), Collections.EMPTY_MAP, metadata.getMetadata(), analysis, false);
+            QueryResolver.resolveCommand(insert.getQueryExpression(), metadata.getMetadata(), false);
         }
 
         Set<GroupSymbol> groups = new HashSet<GroupSymbol>();

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -23,7 +23,6 @@
 package org.teiid.query.resolver.command;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -33,7 +32,6 @@
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.resolver.CommandResolver;
@@ -50,19 +48,19 @@
 public class SetQueryResolver implements CommandResolver {
 
     /**
-     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, AnalysisRecord, boolean)
+     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, boolean)
      */
-    public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals)
+    public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals)
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
         SetQuery setQuery = (SetQuery) command;
         
-        SimpleQueryResolver.resolveWith(metadata, analysis, setQuery);
+        SimpleQueryResolver.resolveWith(metadata, setQuery);
         
         QueryCommand firstCommand = setQuery.getLeftQuery();
         
         QueryResolver.setChildMetadata(firstCommand, setQuery);
-        QueryResolver.resolveCommand(firstCommand, Collections.EMPTY_MAP, metadata.getMetadata(), analysis, false);
+        QueryResolver.resolveCommand(firstCommand, metadata.getMetadata(), false);
 
         List firstProject = firstCommand.getProjectedSymbols();
         List<Class<?>> firstProjectTypes = new ArrayList<Class<?>>();
@@ -74,7 +72,7 @@
         QueryCommand rightCommand = setQuery.getRightQuery();
         
         QueryResolver.setChildMetadata(rightCommand, setQuery);
-        QueryResolver.resolveCommand(rightCommand, Collections.EMPTY_MAP, metadata.getMetadata(), analysis, false);
+        QueryResolver.resolveCommand(rightCommand, metadata.getMetadata(), false);
 
         if (firstProject.size() != rightCommand.getProjectedSymbols().size()) {
             throw new QueryResolverException(QueryPlugin.Util.getString("ERR.015.012.0035", setQuery.getOperation())); //$NON-NLS-1$

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-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -42,7 +42,6 @@
 import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.StoredProcedureInfo;
 import org.teiid.query.metadata.SupportConstants;
@@ -92,17 +91,17 @@
     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, org.teiid.query.analysis.AnalysisRecord, boolean)
+     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, boolean)
      */
-    public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals)
+    public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals)
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
     	Query query = (Query) command;
     	
-    	resolveWith(metadata, analysis, query);
+    	resolveWith(metadata, query);
         
         try {
-            QueryResolverVisitor qrv = new QueryResolverVisitor(query, metadata, analysis);
+            QueryResolverVisitor qrv = new QueryResolverVisitor(query, metadata);
             qrv.visit(query);
             ResolverVisitor visitor = (ResolverVisitor)qrv.getVisitor();
 			visitor.throwException(true);
@@ -138,7 +137,7 @@
     }
 
 	static void resolveWith(TempMetadataAdapter metadata,
-			AnalysisRecord analysis, QueryCommand query) throws QueryResolverException, TeiidComponentException {
+			QueryCommand query) throws QueryResolverException, TeiidComponentException {
 		if (query.getWith() == null) {
 			return;
 		}
@@ -149,7 +148,7 @@
             QueryResolver.setChildMetadata(queryExpression, query);
             
             try {
-                QueryResolver.resolveCommand(queryExpression, Collections.EMPTY_MAP, metadata.getMetadata(), analysis, false);
+                QueryResolver.resolveCommand(queryExpression, metadata.getMetadata(), false);
             } catch (TeiidException err) {
                 throw new TeiidRuntimeException(err);
             }
@@ -211,16 +210,14 @@
         private List<GroupSymbol> implicitGroups = new LinkedList<GroupSymbol>();
         private TempMetadataAdapter metadata;
         private Query query;
-        private AnalysisRecord analysis;
         private boolean allowImplicit = true;
         
-        public QueryResolverVisitor(Query query, TempMetadataAdapter metadata, AnalysisRecord record) {
+        public QueryResolverVisitor(Query query, TempMetadataAdapter metadata) {
             super(new ResolverVisitor(metadata, null, query.getExternalGroupContexts()));
             ResolverVisitor visitor = (ResolverVisitor)getVisitor();
             visitor.setGroups(currentGroups);
             this.query = query;
             this.metadata = metadata;
-            this.analysis = record;
         }
         
         protected void postVisitVisitor(LanguageObject obj) {
@@ -260,7 +257,7 @@
             command.pushNewResolvingContext(externalGroups);
             
             try {
-                QueryResolver.resolveCommand(command, Collections.EMPTY_MAP, metadata.getMetadata(), analysis, false);
+                QueryResolver.resolveCommand(command, metadata.getMetadata(), false);
             } catch (TeiidException err) {
                 throw new TeiidRuntimeException(err);
             }
@@ -496,7 +493,7 @@
 			    }
 			}
 			
-			QueryResolver.resolveCommand(procQuery, Collections.EMPTY_MAP, metadata.getMetadata(), analysis);
+			QueryResolver.resolveCommand(procQuery, metadata.getMetadata());
 			
 			List<SingleElementSymbol> projectedSymbols = procQuery.getProjectedSymbols();
 			

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/TempTableResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -31,7 +31,6 @@
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataID;
 import org.teiid.query.resolver.CommandResolver;
@@ -51,9 +50,9 @@
 public class TempTableResolver implements CommandResolver {
 
     /** 
-     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, org.teiid.query.analysis.AnalysisRecord, boolean)
+     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, boolean)
      */
-    public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals) 
+    public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
         
         if(command.getType() == Command.TYPE_CREATE) {

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -25,27 +25,24 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
 import org.teiid.api.exception.query.QueryMetadataException;
-import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.api.exception.query.QueryResolverException;
+import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.api.exception.query.UnresolvedSymbolDescription;
 import org.teiid.client.metadata.ParameterInfo;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
+import org.teiid.language.SQLConstants;
 import org.teiid.logging.LogManager;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
-import org.teiid.query.mapping.relational.QueryNode;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataID;
 import org.teiid.query.metadata.TempMetadataStore;
-import org.teiid.query.parser.QueryParser;
 import org.teiid.query.resolver.CommandResolver;
 import org.teiid.query.resolver.ProcedureContainerResolver;
 import org.teiid.query.resolver.QueryResolver;
@@ -69,10 +66,12 @@
 import org.teiid.query.sql.proc.IfStatement;
 import org.teiid.query.sql.proc.LoopStatement;
 import org.teiid.query.sql.proc.Statement;
+import org.teiid.query.sql.proc.TriggerAction;
 import org.teiid.query.sql.proc.WhileStatement;
 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.SingleElementSymbol;
 import org.teiid.query.sql.util.SymbolMap;
 import org.teiid.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
 
@@ -89,9 +88,7 @@
 
 		// not set by user command resolver in case of modeler
 		if(virtualGroup == null) {
-	        Iterator groupIter = procCommand.getAllExternalGroups().iterator();
-	        while(groupIter.hasNext()) {
-	        	GroupSymbol groupSymbol = (GroupSymbol) groupIter.next();
+			for (GroupSymbol groupSymbol : procCommand.getAllExternalGroups()) {
 	        	String groupName = groupSymbol.getName();
 	        	if(!groupName.equalsIgnoreCase(ProcedureReservedWords.INPUT) &&
 	        		!groupName.equalsIgnoreCase(ProcedureReservedWords.INPUTS) &&
@@ -127,35 +124,31 @@
 	 */
     public static Command getQueryTransformCmd(GroupSymbol virtualGroup, QueryMetadataInterface metadata)
     throws QueryMetadataException, QueryResolverException, TeiidComponentException {
-    	Command transformCmd = (Command)metadata.getFromMetadataCache(virtualGroup.getMetadataID(), "transformation/select"); //$NON-NLS-1$
-    	if (transformCmd != null) {
-    		return transformCmd;
-    	}
-    	QueryNode queryNode = metadata.getVirtualPlan(virtualGroup.getMetadataID());
-    	String transformQuery = queryNode.getQuery();
-        try {
-            transformCmd = QueryParser.getQueryParser().parseCommand(transformQuery);
-        } catch(QueryParserException e) {
-            throw new QueryResolverException(e, "ERR.015.008.0013", QueryPlugin.Util.getString("ERR.015.008.0013", virtualGroup)); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        QueryResolver.resolveCommand(transformCmd, metadata);
-
-        return transformCmd;
+    	try {
+			return QueryResolver.resolveView(virtualGroup, metadata.getVirtualPlan(virtualGroup.getMetadataID()), SQLConstants.Reserved.SELECT, metadata);
+		} catch (QueryValidatorException e) {
+			throw new QueryResolverException(e, e.getMessage());
+		}
     }
 
     /**
-     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, AnalysisRecord, boolean)
+     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, boolean)
      */
-    public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals)
+    public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals)
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
+    	
+    	if (command instanceof TriggerAction) {
+    		TriggerAction ta = (TriggerAction)command;
+            resolveBlock(new CreateUpdateProcedureCommand(), ta.getBlock(), ta.getExternalGroupContexts(), metadata);
+    		return;
+    	}
 
         CreateUpdateProcedureCommand procCommand = (CreateUpdateProcedureCommand) command;
 
         //by creating a new group context here it means that variables will resolve with a higher precedence than input/changing
         GroupContext externalGroups = command.getExternalGroupContexts();
         
-        List symbols = new LinkedList();
+        List<ElementSymbol> symbols = new LinkedList<ElementSymbol>();
         
         // virtual group elements in HAS and TRANSLATE criteria have to be resolved
         if(procCommand.isUpdateProcedure()){
@@ -174,11 +167,11 @@
         symbols.add(updateCount);
 
         ProcedureContainerResolver.addScalarGroup(ProcedureReservedWords.VARIABLES, metadata.getMetadataStore(), externalGroups, symbols);         
-        resolveBlock(procCommand, procCommand.getBlock(), externalGroups, metadata, analysis);
+        resolveBlock(procCommand, procCommand.getBlock(), externalGroups, metadata);
     }
 
 	public void resolveBlock(CreateUpdateProcedureCommand command, Block block, GroupContext externalGroups, 
-                              TempMetadataAdapter metadata, AnalysisRecord analysis)
+                              TempMetadataAdapter metadata)
         throws QueryResolverException, QueryMetadataException, TeiidComponentException {
         LogManager.logTrace(org.teiid.logging.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving block", block}); //$NON-NLS-1$
         
@@ -190,13 +183,12 @@
         //create a new variables group for this block
         GroupSymbol variables = ProcedureContainerResolver.addScalarGroup(ProcedureReservedWords.VARIABLES, store, externalGroups, new LinkedList());
         
-        Iterator stmtIter = block.getStatements().iterator();
-        while(stmtIter.hasNext()) {
-            resolveStatement(command, (Statement)stmtIter.next(), externalGroups, variables, metadata, analysis);
+        for (Statement statement : block.getStatements()) {
+            resolveStatement(command, statement, externalGroups, variables, metadata);
         }
     }
 
-	private void resolveStatement(CreateUpdateProcedureCommand command, Statement statement, GroupContext externalGroups, GroupSymbol variables, TempMetadataAdapter metadata, AnalysisRecord analysis)
+	private void resolveStatement(CreateUpdateProcedureCommand command, Statement statement, GroupContext externalGroups, GroupSymbol variables, TempMetadataAdapter metadata)
         throws QueryResolverException, QueryMetadataException, TeiidComponentException {
         LogManager.logTrace(org.teiid.logging.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving statement", statement}); //$NON-NLS-1$
 
@@ -205,19 +197,19 @@
                 IfStatement ifStmt = (IfStatement) statement;
                 Criteria ifCrit = ifStmt.getCondition();
                 for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(ifCrit)) {
-                	resolveEmbeddedCommand(metadata, externalGroups, container.getCommand(), analysis);
+                	resolveEmbeddedCommand(metadata, externalGroups, container.getCommand());
                 }
                 ResolverVisitor.resolveLanguageObject(ifCrit, null, externalGroups, metadata);
-            	resolveBlock(command, ifStmt.getIfBlock(), externalGroups, metadata, analysis);
+            	resolveBlock(command, ifStmt.getIfBlock(), externalGroups, metadata);
                 if(ifStmt.hasElseBlock()) {
-                    resolveBlock(command, ifStmt.getElseBlock(), externalGroups, metadata, analysis);
+                    resolveBlock(command, ifStmt.getElseBlock(), externalGroups, metadata);
                 }
                 break;
             case Statement.TYPE_COMMAND:
                 CommandStatement cmdStmt = (CommandStatement) statement;
                 Command subCommand = cmdStmt.getCommand();
                 
-                TempMetadataStore discoveredMetadata = resolveEmbeddedCommand(metadata, externalGroups, subCommand, analysis);
+                TempMetadataStore discoveredMetadata = resolveEmbeddedCommand(metadata, externalGroups, subCommand);
                 
                 if (subCommand instanceof StoredProcedure) {
                 	StoredProcedure sp = (StoredProcedure)subCommand;
@@ -274,7 +266,7 @@
             	if (exprStmt.getExpression() != null) {
                     Expression expr = exprStmt.getExpression();
                     for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(expr)) {
-                    	resolveEmbeddedCommand(metadata, externalGroups, container.getCommand(), analysis);
+                    	resolveEmbeddedCommand(metadata, externalGroups, container.getCommand());
                     }
                     ResolverVisitor.resolveLanguageObject(expr, null, externalGroups, metadata);
             	}
@@ -307,10 +299,10 @@
                 WhileStatement whileStmt = (WhileStatement) statement;
                 Criteria whileCrit = whileStmt.getCondition();
                 for (SubqueryContainer container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(whileCrit)) {
-                	resolveEmbeddedCommand(metadata, externalGroups, container.getCommand(), analysis);
+                	resolveEmbeddedCommand(metadata, externalGroups, container.getCommand());
                 }
                 ResolverVisitor.resolveLanguageObject(whileCrit, null, externalGroups, metadata);
-                resolveBlock(command, whileStmt.getBlock(), externalGroups, metadata, analysis);
+                resolveBlock(command, whileStmt.getBlock(), externalGroups, metadata);
                 break;
             case Statement.TYPE_LOOP:
                 LoopStatement loopStmt = (LoopStatement) statement;
@@ -326,8 +318,8 @@
 	        		throw new QueryResolverException(errorMsg);
 	        	}
                 Command cmd = loopStmt.getCommand();
-                resolveEmbeddedCommand(metadata, externalGroups, cmd, analysis);
-                List symbols = cmd.getProjectedSymbols();
+                resolveEmbeddedCommand(metadata, externalGroups, cmd);
+                List<SingleElementSymbol> symbols = cmd.getProjectedSymbols();
                 
                 //add the loop cursor group into its own context
                 TempMetadataStore store = new TempMetadataStore(new HashMap(metadata.getMetadataStore().getData()));
@@ -336,7 +328,7 @@
                 
                 ProcedureContainerResolver.addScalarGroup(groupName, store, externalGroups, symbols);
                 
-                resolveBlock(command, loopStmt.getBlock(), externalGroups, metadata, analysis);
+                resolveBlock(command, loopStmt.getBlock(), externalGroups, metadata);
                 break;
             case Statement.TYPE_BREAK:
             case Statement.TYPE_CONTINUE:
@@ -347,11 +339,11 @@
     }
 
     private TempMetadataStore resolveEmbeddedCommand(TempMetadataAdapter metadata, GroupContext groupContext,
-                                Command cmd, AnalysisRecord analysis) throws TeiidComponentException,
+                                Command cmd) throws TeiidComponentException,
                                             QueryResolverException {
         QueryResolver.setChildMetadata(cmd, metadata.getMetadataStore().getData(), groupContext);
         
-        return QueryResolver.resolveCommand(cmd, Collections.EMPTY_MAP, metadata.getMetadata(), analysis);
+        return QueryResolver.resolveCommand(cmd, metadata.getMetadata());
     }
         
     private void collectDeclareVariable(DeclareStatement obj, GroupSymbol variables, TempMetadataAdapter metadata, GroupContext externalGroups) throws QueryResolverException, TeiidComponentException {

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -35,7 +35,6 @@
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.resolver.ProcedureContainerResolver;
@@ -59,9 +58,9 @@
 public class UpdateResolver extends ProcedureContainerResolver implements VariableResolver {
 
     /** 
-     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter, org.teiid.query.analysis.AnalysisRecord)
+     * @see org.teiid.query.resolver.ProcedureContainerResolver#resolveProceduralCommand(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.TempMetadataAdapter)
      */
-    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis) 
+    public void resolveProceduralCommand(Command command, TempMetadataAdapter metadata) 
         throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
         //Cast to known type
@@ -73,7 +72,7 @@
         for (SetClause clause : update.getChangeList().getClauses()) {
         	ResolverVisitor.resolveLanguageObject(clause.getSymbol(), groups, null, metadata);
 		}
-        QueryResolver.resolveSubqueries(command, metadata, analysis, groups);
+        QueryResolver.resolveSubqueries(command, metadata, groups);
         ResolverVisitor.resolveLanguageObject(update, groups, update.getExternalGroupContexts(), metadata);
     }
     

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-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -33,7 +33,6 @@
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.util.StringUtil;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.resolver.CommandResolver;
@@ -63,9 +62,9 @@
 public class XMLQueryResolver implements CommandResolver {
 
     /**
-     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, AnalysisRecord, boolean)
+     * @see org.teiid.query.resolver.CommandResolver#resolveCommand(org.teiid.query.sql.lang.Command, TempMetadataAdapter, boolean)
      */
-	public void resolveCommand(Command command, TempMetadataAdapter metadata, AnalysisRecord analysis, boolean resolveNullLiterals)
+	public void resolveCommand(Command command, TempMetadataAdapter metadata, boolean resolveNullLiterals)
 		throws QueryMetadataException, QueryResolverException, TeiidComponentException {
 
 		Query query = (Query) command;
@@ -96,7 +95,7 @@
             
             QueryResolver.setChildMetadata(subCommand, command);
             
-            QueryResolver.resolveCommand(subCommand, Collections.EMPTY_MAP, metadata.getMetadata(), analysis);
+            QueryResolver.resolveCommand(subCommand, metadata.getMetadata());
         }
         
 		if(crit != null) {

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -165,7 +165,7 @@
         getExternalGroupContexts().addGroup(group);
     }
     
-    public void addExternalGroupsToContext(Collection groups) {
+    public void addExternalGroupsToContext(Collection<GroupSymbol> groups) {
         getExternalGroupContexts().getGroups().addAll(groups);
     }
 
@@ -177,8 +177,8 @@
         }
     }
     
-    public void pushNewResolvingContext(Collection groups) {
-        externalGroups = new GroupContext(externalGroups, new LinkedList(groups));
+    public void pushNewResolvingContext(Collection<GroupSymbol> groups) {
+        externalGroups = new GroupContext(externalGroups, new LinkedList<GroupSymbol>(groups));
     }
 
     public GroupContext getExternalGroupContexts() {
@@ -188,9 +188,9 @@
         return this.externalGroups;
     }
     
-    public List getAllExternalGroups() {
+    public List<GroupSymbol> getAllExternalGroups() {
         if (externalGroups == null) {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
         
         return externalGroups.getAllGroups();

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -476,44 +476,18 @@
         
         validateAssignment(obj, obj.getVariable());
     }
-
-    public void visit(IfStatement obj) {
-    	Criteria criteria = obj.getCondition();
-
-    	validatorCriteriaStatement(obj, criteria);
-    }
     
-    public void visit(WhileStatement obj) {
-        Criteria criteria = obj.getCondition();
-
-        validatorCriteriaStatement(obj, criteria);
-    }
-
-    /** 
-     * @param obj
-     * @param criteria
-     */
-    private void validatorCriteriaStatement(LanguageObject obj,
-                                            Criteria criteria) {
-        Iterator criteriaIter = PredicateCollectorVisitor.getPredicates(criteria).iterator();
-    	while(criteriaIter.hasNext()) {
-    		Criteria predicateCriteria = (Criteria) criteriaIter.next();
-    		Iterator elmntIter = ElementCollectorVisitor.getElements(predicateCriteria, true).iterator();
-    		if(predicateCriteria instanceof TranslateCriteria) {
-				handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0019"), obj); //$NON-NLS-1$
-    		} else if(!(predicateCriteria instanceof HasCriteria)) {
-    			while(elmntIter.hasNext()) {
-    				ElementSymbol element = (ElementSymbol) elmntIter.next();
-    				if(!element.isExternalReference()) {
-						handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0020"), obj); //$NON-NLS-1$
-    				}
-    			}
-    		}
+    @Override
+    public void visit(HasCriteria obj) {
+    	if (this.updateProc == null || !this.updateProc.isUpdateProcedure()) {
+			handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0019"), obj); //$NON-NLS-1$
     	}
     }
-
+    
     public void visit(TranslateCriteria obj) {
-
+    	if (this.updateProc == null || !this.updateProc.isUpdateProcedure()) {
+			handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0019"), obj); //$NON-NLS-1$
+    	}
 		if(obj.hasTranslations()) {
 			Collection selectElmnts = null;
 			if(obj.getSelector().hasElements()) {
@@ -522,9 +496,9 @@
 			Iterator critIter = obj.getTranslations().iterator();
 			while(critIter.hasNext()) {
 				CompareCriteria transCrit = (CompareCriteria) critIter.next();
-				Collection leftElmnts = ElementCollectorVisitor.getElements(transCrit.getLeftExpression(), true);
+				Collection<ElementSymbol> leftElmnts = ElementCollectorVisitor.getElements(transCrit.getLeftExpression(), true);
 				// there is always only one element
-				ElementSymbol leftExpr = (ElementSymbol)leftElmnts.iterator().next();
+				ElementSymbol leftExpr = leftElmnts.iterator().next();
 
 				if(selectElmnts != null && !selectElmnts.contains(leftExpr)) {
 					handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0021"), leftExpr); //$NON-NLS-1$
@@ -581,7 +555,7 @@
 	 */
     protected void validateTranslateCriteria(TranslateCriteria obj) {
     	if(this.currentCommand == null) {
-    		return;
+	    	return;
     	}
     	Map symbolMap = this.updateProc.getSymbolMap();
 		Command userCommand = this.updateProc.getUserCommand();

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-01-10 22:09:53 UTC (rev 2825)
@@ -183,8 +183,7 @@
 ERR.015.012.0016 = Variable {0} not assigned any value in this procedure.
 ERR.015.012.0017 = Variables declared the procedure''s DeclareStatement cannot be one of the special variables: {0}, {1} and {2}.
 ERR.015.012.0018 = Inherent INSERT is not possible on a view defined by a UNION.
-ERR.015.012.0019 = TranslateCriteria cannot be used in on an if or while statement.
-ERR.015.012.0020 = Elements used on the criteria of an if or while statement should be variables declared in the procedure, virtual group elements can be used in the HAS Criteria
+ERR.015.012.0019 = Translate/HasCriteria cannot be used in a non-update procedure.
 ERR.015.012.0021 = Element being translated in the WITH clause not among the elements on the ON clause of the TranslateCriteria.
 ERR.015.012.0022 = Unable to translate criteria on the update command against the virtual group, the element {0} is mapped to an aggregate symbol in the virtual group''s query transform, and cannot be translated.
 ERR.015.012.0023 = Unable to translate criteria on the update command against the virtual group, the element {0} is mapped to an expression whose elements are not present on the command in the procedure using the translated criteria.

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -22,7 +22,6 @@
 
 package org.teiid.dqp.internal.process;
 
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -36,7 +35,6 @@
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.dqp.internal.datamgr.FakeTransactionService;
 import org.teiid.dqp.message.RequestID;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.resolver.QueryResolver;
@@ -55,7 +53,7 @@
     public Map[] helpGetMetadata(String sql, QueryMetadataInterface metadata, VDBMetaData vdb) throws Exception {
         // Prepare sql 
         Command command = QueryParser.getQueryParser().parseCommand(sql);
-        QueryResolver.resolveCommand(command, Collections.EMPTY_MAP, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.resolveCommand(command, metadata);
         
         // Create components
         SessionAwareCache<PreparedPlan> prepPlanCache = new SessionAwareCache<PreparedPlan>();

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -23,7 +23,6 @@
 package org.teiid.dqp.internal.process;
 
 import java.util.ArrayList;
-import java.util.Collections;
 
 import junit.framework.TestCase;
 
@@ -36,7 +35,6 @@
 import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
 import org.teiid.dqp.internal.datamgr.FakeTransactionService;
 import org.teiid.dqp.service.AutoGenDataService;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.processor.FakeDataManager;
@@ -75,7 +73,7 @@
         
         Request request = new Request();
         Command command = QueryParser.getQueryParser().parseCommand(QUERY);
-        QueryResolver.resolveCommand(command, Collections.EMPTY_MAP, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.resolveCommand(command, metadata);
         
         RequestMessage message = new RequestMessage();
         DQPWorkContext workContext = FakeMetadataFactory.buildWorkContext(metadata, FakeMetadataFactory.example1VDB());

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -36,7 +36,6 @@
 import org.teiid.client.metadata.ParameterInfo;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.mapping.relational.QueryNode;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempMetadataAdapter;
@@ -844,8 +843,9 @@
         Command procCommand = QueryParser.getQueryParser().parseCommand(procedure);
 		GroupSymbol virtualGroup = new GroupSymbol("vm1.g1"); //$NON-NLS-1$
 		virtualGroup.setMetadataID(metadata.getGroupID("vm1.g1")); //$NON-NLS-1$
-		Map externalMetadata = getProcedureExternalMetadata(virtualGroup, metadata);        	
-        QueryResolver.resolveCommand(procCommand, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+		Map externalMetadata = getProcedureExternalMetadata(virtualGroup, metadata);
+		QueryResolver.buildExternalGroups(externalMetadata, procCommand);
+        QueryResolver.resolveCommand(procCommand, metadata);
     }
     
 	// special variable CHANGING compared against integer no implicit conversion available
@@ -881,8 +881,9 @@
 		GroupSymbol virtualGroup = new GroupSymbol("vm1.g1"); //$NON-NLS-1$
 		virtualGroup.setMetadataID(metadata.getGroupID("vm1.g1")); //$NON-NLS-1$
 		
-    	Map externalMetadata = getProcedureExternalMetadata(virtualGroup, metadata);        	
-        QueryResolver.resolveCommand(procCommand, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+    	Map externalMetadata = getProcedureExternalMetadata(virtualGroup, metadata);        
+    	QueryResolver.buildExternalGroups(externalMetadata, procCommand);
+        QueryResolver.resolveCommand(procCommand, metadata);
     }
     
 	// special variable CHANGING compared against integer no implicit conversion available
@@ -899,8 +900,9 @@
 		GroupSymbol virtualGroup = new GroupSymbol("vm1.g1"); //$NON-NLS-1$
 		virtualGroup.setMetadataID(metadata.getGroupID("vm1.g1")); //$NON-NLS-1$
 
-		Map externalMetadata = getProcedureExternalMetadata(virtualGroup, metadata);        	
-        QueryResolver.resolveCommand(procCommand, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+		Map externalMetadata = getProcedureExternalMetadata(virtualGroup, metadata);  
+		QueryResolver.buildExternalGroups(externalMetadata, procCommand);
+        QueryResolver.resolveCommand(procCommand, metadata);
     }
 
 	// TranslateCriteria on criteria of the if statement

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -167,7 +167,7 @@
 	}
     
     public static Command helpResolve(String sql, QueryMetadataInterface queryMetadata, AnalysisRecord analysis){
-        return helpResolve(helpParse(sql), queryMetadata, analysis);
+        return helpResolve(helpParse(sql), queryMetadata);
     }
     
 	private Command helpResolve(String sql) { 
@@ -175,13 +175,13 @@
 	}
 	
     private Command helpResolve(Command command) {    
-        return helpResolve(command, this.metadata, AnalysisRecord.createNonRecordingRecord());  
+        return helpResolve(command, this.metadata);  
     }	
 
-	static Command helpResolve(Command command, QueryMetadataInterface queryMetadataInterface, AnalysisRecord analysis) {		
+	static Command helpResolve(Command command, QueryMetadataInterface queryMetadataInterface) {		
         // resolve
         try { 
-            QueryResolver.resolveCommand(command, queryMetadataInterface, analysis);
+            QueryResolver.resolveCommand(command, queryMetadataInterface);
         } catch(TeiidException e) {
             throw new RuntimeException(e);
         } 
@@ -985,8 +985,8 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
-        
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
 
         // Verify results        
         helpCheckFrom((Query)command, new String[] { "pm1.g1" });         //$NON-NLS-1$
@@ -1005,8 +1005,8 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
-                    
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.buildExternalGroups(externalMetadata, command);            
+        QueryResolver.resolveCommand(command, metadata);
 
         // Verify results        
         helpCheckFrom((Query)command, new String[] { "pm1.g1" });         //$NON-NLS-1$
@@ -1025,9 +1025,9 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
 
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
-
         // Verify results
         Collection vars = getVariables(command);
         assertEquals("Did not find variable in resolved query", 1, vars.size()); //$NON-NLS-1$
@@ -1047,7 +1047,7 @@
             Map externalMetadata = new HashMap();
             externalMetadata.put(sqGroup, sqParams);
 
-            QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+            QueryResolver.resolveCommand(command, metadata);
             
             fail("Expected exception on invalid variable pm1.sq2.in"); //$NON-NLS-1$
         } catch(QueryResolverException e) {
@@ -1966,7 +1966,7 @@
  
     @Test public void testDefect10809(){
         String sql = "select * from LOB_TESTING_ONE where CLOB_COLUMN LIKE '%fff%'"; //$NON-NLS-1$
-        helpResolve(helpParse(sql), FakeMetadataFactory.exampleBQTCached(), AnalysisRecord.createNonRecordingRecord());
+        helpResolve(helpParse(sql), FakeMetadataFactory.exampleBQTCached());
     }
     
     @Test public void testNonAutoConversionOfLiteralIntegerToShort() throws Exception {       
@@ -2080,7 +2080,7 @@
         helpResolve(
             helpParse("SELECT myModel.myTable.myColumn AS myColumn from myModel.myTable UNION " + //$NON-NLS-1$
                 "SELECT convert(null, string) AS myColumn From myModel2.mySchema.myTable2"),  //$NON-NLS-1$
-            example_12968(), AnalysisRecord.createNonRecordingRecord());
+            example_12968());
     }
 
 
@@ -2216,7 +2216,7 @@
         String userSql = "SELECT null as x"; //$NON-NLS-1$
         Query query = (Query)helpParse(userSql);
         
-        QueryResolver.resolveCommand(query, FakeMetadataFactory.exampleBQTCached(), AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.resolveCommand(query, FakeMetadataFactory.exampleBQTCached());
         
         // Check type of resolved null constant
         SingleElementSymbol symbol = (SingleElementSymbol) query.getSelect().getSymbols().get(0);
@@ -2233,7 +2233,7 @@
     	inputSetElements.add(inputSetElement);
     	externalMetadata.put(inputSet, inputSetElements);
         Query command = (Query)helpParse(sql);
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.resolveCommand(command, metadata);
         Collection groups = GroupCollectorVisitor.getGroups(command, false);
         assertFalse(groups.contains(inputSet));
     }
@@ -2251,7 +2251,8 @@
     	param.setType(String.class);
     	procPrarms.add(param);
     	externalMetadata.put(procGroup, procPrarms);
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+    	QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
         CreateUpdateProcedureCommand proc = (CreateUpdateProcedureCommand)command;
         Query query = (Query)proc.getSubCommands().get(0);
         ElementSymbol inElement = (ElementSymbol)((CompareCriteria)query.getCriteria()).getLeftExpression();
@@ -2521,7 +2522,8 @@
         param.setType(DataTypeManager.DefaultDataClasses.STRING);
         procPrarms.add(param);
         externalMetadata.put(proc, procPrarms);
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
     }
         
     @Test public void testBatchedUpdateResolver() throws Exception {

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -399,8 +399,8 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
-        
-        QueryResolver.resolveCommand(command, externalMetadata, FakeMetadataFactory.example1Cached(), AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, FakeMetadataFactory.example1Cached());
     
         // Verify results        
         Collection vars = TestResolver.getVariables(command);
@@ -443,7 +443,7 @@
         expected.setOperator(CompareCriteria.EQ);
         expected.setRightExpression(new Constant("yyz")); //$NON-NLS-1$
     
-        Query query = (Query) TestResolver.helpResolve(QueryParser.getQueryParser().parseCommand("select \"xml\" from xmltest.doc1 where node1 = 'yyz'"), FakeMetadataFactory.example1Cached(), null); //$NON-NLS-1$
+        Query query = (Query) TestResolver.helpResolve(QueryParser.getQueryParser().parseCommand("select \"xml\" from xmltest.doc1 where node1 = 'yyz'"), FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
         Criteria actual = query.getCriteria();
         assertEquals("Did not match expected criteria", expected, actual);     //$NON-NLS-1$
     } 

Modified: trunk/engine/src/test/java/org/teiid/query/sql/util/TestElementSymbolOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/util/TestElementSymbolOptimizer.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/query/sql/util/TestElementSymbolOptimizer.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -28,7 +28,7 @@
 import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
-import org.teiid.query.analysis.AnalysisRecord;
+import org.teiid.core.types.DataTypeManager;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.resolver.QueryResolver;
@@ -55,9 +55,8 @@
     
     public Command helpResolve(String sql, QueryMetadataInterface metadata, Map externalMetadata) throws QueryParserException, QueryResolverException, TeiidComponentException {
         Command command = QueryParser.getQueryParser().parseCommand(sql);
-
-        final boolean USE_METADATA_COMMANDS = true;
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
         
         return command;      
     }
@@ -69,7 +68,7 @@
     
     
     public void helpTestOptimize(String sql, QueryMetadataInterface metadata, String expected, Map externalMetadata) throws QueryMetadataException, TeiidComponentException, QueryParserException, QueryResolverException {
-        Command command = helpResolve(sql, metadata, externalMetadata);
+    	Command command = helpResolve(sql, metadata, externalMetadata);
         ElementSymbolOptimizer.optimizeElements(command, metadata);
         String actual = command.toString();
             
@@ -153,40 +152,6 @@
                             "EXEC pm1.vsp7(5)"); //$NON-NLS-1$
     }
 
-    public void testStoredQueryTransform() throws Exception {
-        
-        // Set up external metadata - stored query pm1.sq3 with
-        // params in and in2
-        Map externalMetadata = new HashMap();
-        GroupSymbol gs = new GroupSymbol("pm1.sq3"); //$NON-NLS-1$
-        List elements = new ArrayList(2);
-        elements.add(new ElementSymbol("pm1.sq3.in")); //$NON-NLS-1$
-        elements.add(new ElementSymbol("pm1.sq3.in2")); //$NON-NLS-1$
-        externalMetadata.put(gs, elements);
-        
-        helpTestOptimize("SELECT pm1.g6.in, pm1.g6.in3 FROM pm1.g6 WHERE pm1.g6.in=pm1.sq3.in AND pm1.g6.in3=pm1.sq3.in2",  //$NON-NLS-1$
-                            FakeMetadataFactory.example1Cached(),  
-                            "SELECT pm1.g6.\"in\", in3 FROM pm1.g6 WHERE (pm1.g6.\"in\" = pm1.sq3.\"in\") AND (in3 = in2)", //$NON-NLS-1$
-                            externalMetadata); 
-    }
-    
-    /** Test stored query whose transformation is another stored query */
-    public void testStoredQueryTransform2() throws Exception {
-        // Set up external metadata - stored query pm1.sq3 with
-        // params in and in2
-        Map externalMetadata = new HashMap();
-        GroupSymbol gs = new GroupSymbol("pm1.sq3"); //$NON-NLS-1$
-        List elements = new ArrayList(2);
-        elements.add(new ElementSymbol("pm1.sq3.in")); //$NON-NLS-1$
-        elements.add(new ElementSymbol("pm1.sq3.in2")); //$NON-NLS-1$
-        externalMetadata.put(gs, elements);
-        
-        helpTestOptimize("EXEC pm1.sq2(pm1.sq3.in)",  //$NON-NLS-1$
-                            FakeMetadataFactory.example1Cached(),  
-                            "EXEC pm1.sq2(\"in\")", //$NON-NLS-1$
-                            externalMetadata);         
-    }
-
     public void testStoredQuerySubquery() throws Exception {
         helpTestOptimize("select x.e1 from (EXEC pm1.sq1()) as x",  //$NON-NLS-1$
                             FakeMetadataFactory.example1Cached(), 
@@ -205,8 +170,9 @@
         // params in and in2
         Map externalMetadata = new HashMap();
         GroupSymbol gs = new GroupSymbol("SYSTEM.DESCRIBE"); //$NON-NLS-1$
-        List elements = new ArrayList(2);
+        List<ElementSymbol> elements = new ArrayList<ElementSymbol>(2);
         elements.add(new ElementSymbol("SYSTEM.DESCRIBE.entity")); //$NON-NLS-1$
+        elements.get(0).setType(DataTypeManager.DefaultDataClasses.STRING);
         externalMetadata.put(gs, elements);
         
         

Modified: trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -1856,7 +1856,7 @@
 		QueryNode vm1g2n1 = new QueryNode("vm1.g2", "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3 FROM pm1.g2"); //$NON-NLS-1$ //$NON-NLS-2$
 		FakeMetadataObject vm1g2 = createUpdatableVirtualGroup("vm1.g2", vm1, vm1g2n1); //$NON-NLS-1$
 
-		QueryNode vm1g3n1 = new QueryNode("vm1.g3", "SELECT CONCAT(e1, 'm') as x, (e2 +1) as y, Count(*) as e3, e4*50 as e4 FROM pm1.g1"); //$NON-NLS-1$ //$NON-NLS-2$
+		QueryNode vm1g3n1 = new QueryNode("vm1.g3", "SELECT CONCAT(e1, 'm') as x, (e2 +1) as y, 1 as e3, e4*50 as e4 FROM pm1.g1"); //$NON-NLS-1$ //$NON-NLS-2$
 		FakeMetadataObject vm1g3 = createUpdatableVirtualGroup("vm1.g3", vm1, vm1g3n1); //$NON-NLS-1$
 
 		QueryNode vm1g4n1 = new QueryNode("vm1.g4", "SELECT * FROM pm1.g1"); //$NON-NLS-1$ //$NON-NLS-2$

Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -328,7 +328,8 @@
 		
 		try { 
 			command = QueryParser.getQueryParser().parseCommand(sql);
-			QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+			QueryResolver.buildExternalGroups(externalMetadata, command);
+			QueryResolver.resolveCommand(command, metadata);
 		} catch(Exception e) {
             throw new TeiidRuntimeException(e);
 		} 
@@ -612,9 +613,9 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
 
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
-
         helpRunValidator(command, new String[] {}, metadata);
     }
 
@@ -631,9 +632,9 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
 
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
-
         helpRunValidator(command, new String[] {}, metadata);
     }
     
@@ -702,9 +703,9 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
 
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
-
         helpRunValidator(command, new String[] {}, metadata);
     }
 
@@ -721,8 +722,8 @@
         sqParams.add(in);
         Map externalMetadata = new HashMap();
         externalMetadata.put(sqGroup, sqParams);
-
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
         helpRunValidator(command, new String[] {}, metadata);
     }
 
@@ -1162,7 +1163,7 @@
 
         String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
         
-		helpFailProcedure(procedure, userUpdateStr,
+		helpValidateProcedure(procedure, userUpdateStr,
 									 FakeMetadataObject.Props.UPDATE_PROCEDURE);
     }
     
@@ -1199,6 +1200,7 @@
     
 	// virtual group elements used in procedure in if statement(TRANSLATE CRITERIA)
 	// failure, aggregate function in query transform
+    @Ignore
     @Test public void testCreateUpdateProcedure18() {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
@@ -1215,6 +1217,7 @@
     
 	// virtual group elements used in procedure in if statement(TRANSLATE CRITERIA)
 	// failure, aggregate function in query transform
+    @Ignore
     @Test public void testCreateUpdateProcedure18a() {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
@@ -1603,7 +1606,8 @@
         
         GroupSymbol group = new GroupSymbol(procName);
         Map externalMetadata = getStoredProcedureExternalMetadata(group, metadata);
-        QueryResolver.resolveCommand(command, externalMetadata, metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.buildExternalGroups(externalMetadata, command);
+        QueryResolver.resolveCommand(command, metadata);
         
         // Validate
         return Validator.validate(command, metadata);         
@@ -1665,7 +1669,7 @@
         QueryMetadataInterface metadata = FakeMetadataFactory.example1Cached();
         
         Command command = new QueryParser().parseCommand(sql);
-        QueryResolver.resolveCommand(command, new HashMap(), metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.resolveCommand(command, metadata);
         
         // Validate
         ValidatorReport report = Validator.validate(command, metadata); 
@@ -1680,7 +1684,7 @@
         e1.putProperty(FakeMetadataObject.Props.UPDATE, Boolean.FALSE);
         
         Command command = new QueryParser().parseCommand(sql);
-        QueryResolver.resolveCommand(command, new HashMap(), metadata, AnalysisRecord.createNonRecordingRecord());
+        QueryResolver.resolveCommand(command, metadata);
         
         // Validate
         ValidatorReport report = Validator.validate(command, metadata); 
@@ -1751,6 +1755,7 @@
             FakeMetadataObject paramID = (FakeMetadataObject)i.next();
             if (paramID.getProperty(FakeMetadataObject.Props.DIRECTION).equals(new Integer(ParameterInfo.IN))) {
                 param.setMetadataID(paramID);
+                param.setType(DataTypeManager.getDataTypeClass((String)paramID.getProperty(FakeMetadataObject.Props.TYPE)));
                 break;
             }
         }

Modified: trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -111,6 +111,9 @@
 	@Override
 	public void closeSession(String sessionID) throws InvalidSessionException {
 		LogManager.logDetail(LogConstants.CTX_SECURITY, new Object[] {"closeSession", sessionID}); //$NON-NLS-1$
+		if (sessionID == null) {
+			throw new InvalidSessionException(RuntimePlugin.Util.getString("SessionServiceImpl.invalid_session", sessionID)); //$NON-NLS-1$
+		}
 		SessionMetadata info = this.sessionCache.remove(sessionID);
 		if (info == null) {
 			throw new InvalidSessionException(RuntimePlugin.Util.getString("SessionServiceImpl.invalid_session", sessionID)); //$NON-NLS-1$

Modified: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/BaseQueryTest.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/BaseQueryTest.java	2011-01-10 21:56:13 UTC (rev 2824)
+++ trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/BaseQueryTest.java	2011-01-10 22:09:53 UTC (rev 2825)
@@ -56,6 +56,7 @@
         
     protected void doProcess(QueryMetadataInterface metadata, String sql, CapabilitiesFinder capFinder, ProcessorDataManager dataManager, List[] expectedResults, boolean debug) throws Exception {
     	CommandContext context = createCommandContext();
+    	context.setMetadata(metadata);
         Command command = TestOptimizer.helpGetCommand(sql, metadata, null);
 
         // plan



More information about the teiid-commits mailing list