[teiid-commits] teiid SVN: r2490 - in branches/7.1.x/engine/src: main/java/org/teiid/query/optimizer and 17 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Aug 25 12:18:56 EDT 2010


Author: shawkins
Date: 2010-08-25 12:18:52 -0400 (Wed, 25 Aug 2010)
New Revision: 2490

Added:
   branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/QueryProcessorFactoryImpl.java
Removed:
   branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java
Modified:
   branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
   branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedPlan.java
   branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
   branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
   branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
   branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/parser/QueryParser.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Command.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Delete.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Insert.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/ProcedureContainer.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Query.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SPParameter.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SetQuery.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Update.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/sql/proc/CreateUpdateProcedureCommand.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/util/CommandContext.java
   branches/7.1.x/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
   branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java
   branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
   branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/optimizer/proc/TestProcedurePlanner.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
Log:
TEIID-1226 TEIID-1225 TEIID-1223 TEIID-1222 adding additional plan reuse, fixing the cache hint logic, fixing partially qualified virtual procs

Modified: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -338,7 +338,7 @@
 	    ClientState state = this.getClientState(workContext.getSessionId(), true);
 	    request.initialize(requestMsg, bufferManager,
 				dataTierMgr, transactionService, state.sessionTables,
-				workContext, this.useEntitlements);
+				workContext, this.useEntitlements, this.prepPlanCache);
 		
         ResultsFuture<ResultsMessage> resultsFuture = new ResultsFuture<ResultsMessage>();
         RequestWorkItem workItem = new RequestWorkItem(this, requestMsg, request, resultsFuture.getResultsReceiver(), requestID, workContext);

Modified: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedPlan.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedPlan.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedPlan.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -30,7 +30,7 @@
 import org.teiid.query.sql.symbol.Reference;
 
 
-class PreparedPlan{
+public class PreparedPlan{
 	private ProcessorPlan plan;
 	private Command command;
 	private List<Reference> refs;

Modified: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -146,7 +146,7 @@
 		        // Defect 13751: Clone the plan in its current state (i.e. before processing) so that it can be used for later queries
 		        prepPlan.setPlan(processPlan.clone());
 		        prepPlan.setAnalysisRecord(analysisRecord);
-		        this.prepPlanCache.put(id, this.context.getDeterminismLevel(), prepPlan);
+		        this.prepPlanCache.put(id, this.context.getDeterminismLevel(), prepPlan, userCommand.getCacheHint() != null?userCommand.getCacheHint().getTtl():null);
         	}
         } else {
         	LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Query exist in cache: ", sqlQuery }); //$NON-NLS-1$

Copied: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/QueryProcessorFactoryImpl.java (from rev 2478, branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java)
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/QueryProcessorFactoryImpl.java	                        (rev 0)
+++ branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/QueryProcessorFactoryImpl.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -0,0 +1,101 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.dqp.internal.process;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.common.buffer.BufferManager;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.id.IDGenerator;
+import org.teiid.query.analysis.AnalysisRecord;
+import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.optimizer.QueryOptimizer;
+import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
+import org.teiid.query.parser.ParseInfo;
+import org.teiid.query.parser.QueryParser;
+import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.processor.ProcessorPlan;
+import org.teiid.query.processor.QueryProcessor;
+import org.teiid.query.resolver.QueryResolver;
+import org.teiid.query.rewriter.QueryRewriter;
+import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.symbol.Reference;
+import org.teiid.query.sql.util.VariableContext;
+import org.teiid.query.sql.visitor.ReferenceCollectorVisitor;
+import org.teiid.query.util.CommandContext;
+import org.teiid.query.validator.AbstractValidationVisitor;
+import org.teiid.query.validator.ValidationVisitor;
+
+public class QueryProcessorFactoryImpl implements QueryProcessor.ProcessorFactory {
+
+	private QueryMetadataInterface metadata;
+	private CapabilitiesFinder finder;
+	private IDGenerator idGenerator;
+	private BufferManager bufferMgr;
+	private ProcessorDataManager dataMgr;
+	
+	public QueryProcessorFactoryImpl(BufferManager bufferMgr,
+			ProcessorDataManager dataMgr, CapabilitiesFinder finder,
+			IDGenerator idGenerator, QueryMetadataInterface metadata) {
+		this.bufferMgr = bufferMgr;
+		this.dataMgr = dataMgr;
+		this.finder = finder;
+		this.idGenerator = idGenerator;
+		this.metadata = metadata;
+	}
+
+	@Override
+	public QueryProcessor createQueryProcessor(String query, String recursionGroup, CommandContext commandContext, Object... params) throws TeiidProcessingException, TeiidComponentException {
+		PreparedPlan pp = commandContext.getPlan(query);
+        CommandContext copy = commandContext.clone();
+        if (recursionGroup != null) {
+        	copy.pushCall(recursionGroup);
+        }
+		if (pp == null) {
+			ParseInfo parseInfo = new ParseInfo();
+			Command newCommand = QueryParser.getQueryParser().parseCommand(query, parseInfo);
+	        QueryResolver.resolveCommand(newCommand, metadata);            
+	        
+	        List<Reference> references = ReferenceCollectorVisitor.getReferences(newCommand);
+	        
+	        AbstractValidationVisitor visitor = new ValidationVisitor();
+	        Request.validateWithVisitor(visitor, metadata, newCommand);
+	        int determinismLevel = copy.resetDeterminismLevel();
+	        newCommand = QueryRewriter.rewrite(newCommand, metadata, copy);
+	        AnalysisRecord record = new AnalysisRecord(false, false);
+	        ProcessorPlan plan = QueryOptimizer.optimizePlan(newCommand, metadata, idGenerator, finder, record, copy);
+	        pp = new PreparedPlan();
+	        pp.setPlan(plan);
+	        pp.setReferences(references);
+	        pp.setAnalysisRecord(record);
+	        pp.setCommand(newCommand);
+	        commandContext.putPlan(query, pp, copy.getDeterminismLevel());
+	        copy.setDeterminismLevel(determinismLevel);
+		}
+		copy.pushVariableContext(new VariableContext());
+		PreparedStatementRequest.resolveParameterValues(pp.getReferences(), Arrays.asList(params), copy, metadata);
+        return new QueryProcessor(pp.getPlan().clone(), copy, bufferMgr, dataMgr);
+	}
+}


Property changes on: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/QueryProcessorFactoryImpl.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -96,7 +96,7 @@
 /**
  * Server side representation of the RequestMessage.  Knows how to process itself.
  */
-public class Request implements QueryProcessor.ProcessorFactory {
+public class Request {
     
 	// init state
     protected RequestMessage requestMsg;
@@ -130,6 +130,7 @@
     protected boolean returnsUpdateCount;
     protected boolean useEntitlements;
 	private TempTableStore globalTables;
+	private SessionAwareCache<PreparedPlan> planCache;
 
     void initialize(RequestMessage requestMsg,
                               BufferManager bufferManager,
@@ -137,7 +138,8 @@
                               TransactionService transactionService,
                               TempTableStore tempTableStore,
                               DQPWorkContext workContext,
-                              boolean useEntitlements) {
+                              boolean useEntitlements,
+                              SessionAwareCache<PreparedPlan> planCache) {
 
         this.requestMsg = requestMsg;
         this.vdbName = workContext.getVdbName();        
@@ -151,6 +153,7 @@
         this.requestId = workContext.getRequestID(this.requestMsg.getExecutionId());
         this.connectorManagerRepo = workContext.getVDB().getAttachment(ConnectorManagerRepository.class);
         this.useEntitlements = useEntitlements;
+        this.planCache = planCache;
     }
     
 	void setMetadata(CapabilitiesFinder capabilitiesFinder, QueryMetadataInterface metadata, Set multiSourceModels) {
@@ -253,9 +256,10 @@
 			}
         });
         context.setTempTableStore(tempTableStore);
-        context.setQueryProcessorFactory(this);
+        context.setQueryProcessorFactory(new QueryProcessorFactoryImpl(this.bufferManager, this.processorDataManager, this.capabilitiesFinder, idGenerator, metadata));
         context.setMetadata(this.metadata);
         context.setBufferManager(this.bufferManager);
+        context.setPreparedPlanCache(planCache);
     }
 
     protected void checkReferences(List<Reference> references) throws QueryValidatorException {
@@ -449,27 +453,6 @@
         }
         this.context.setValidateXML(requestMsg.getValidationMode());
 	}
-    
-	public QueryProcessor createQueryProcessor(String query, String recursionGroup, CommandContext commandContext) throws TeiidProcessingException, TeiidComponentException {
-		ParseInfo parseInfo = new ParseInfo();
-		Command newCommand = QueryParser.getQueryParser().parseCommand(query, parseInfo);
-        QueryResolver.resolveCommand(newCommand, metadata);            
-        
-        List<Reference> references = ReferenceCollectorVisitor.getReferences(newCommand);
-        
-        referenceCheck(references);
-        
-        validateQuery(newCommand);
-        
-        CommandContext copy = commandContext.clone();
-        if (recursionGroup != null) {
-        	copy.pushCall(recursionGroup);
-        }
-        
-        newCommand = QueryRewriter.rewrite(newCommand, metadata, copy);
-        ProcessorPlan plan = QueryOptimizer.optimizePlan(newCommand, metadata, idGenerator, capabilitiesFinder, analysisRecord, copy);
-        return new QueryProcessor(plan, copy, bufferManager, processorDataManager);
-	}
 
 	protected void validateAccess(Command command) throws QueryValidatorException, TeiidComponentException {
 		AuthorizationValidationVisitor visitor = new AuthorizationValidationVisitor(this.workContext.getVDB(), this.useEntitlements, this.workContext.getAllowedDataPolicies(), this.workContext.getUserName());

Modified: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -336,8 +336,8 @@
 		SessionAwareCache<CachedResults> rsCache = dqpCore.getRsCache();
 		ParseInfo pi = Request.createParseInfo(requestMsg);
 		CacheID cacheId = new CacheID(this.dqpWorkContext, pi, requestMsg.getCommandString());
-    	cacheId.setParameters(requestMsg.getParameterValues());
-		if (rsCache != null) {
+    	boolean cachable = cacheId.setParameters(requestMsg.getParameterValues());
+		if (rsCache != null && cachable) {
 			CachedResults cr = rsCache.get(cacheId);
 			if (cr != null && (requestMsg.useResultSetCache() || cr.getHint() != null)) {
 				this.resultsBuffer = cr.getResults();
@@ -351,7 +351,7 @@
 		}
 		request.processRequest();
 		originalCommand = request.userCommand;
-        if ((requestMsg.useResultSetCache() || originalCommand.getCacheHint() != null) && rsCache != null && originalCommand.areResultsCachable()) {
+        if (cachable && (requestMsg.useResultSetCache() || originalCommand.getCacheHint() != null) && rsCache != null && originalCommand.areResultsCachable()) {
         	this.cid = cacheId;
         }
 		processor = request.processor;

Modified: branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -57,7 +57,7 @@
 	
 	private BufferManager bufferManager;
 	
-	SessionAwareCache(){
+	public SessionAwareCache(){
 		this(new DefaultCacheFactory(), Cache.Type.RESULTSET, new CacheConfiguration(Policy.LRU, 60, DEFAULT_MAX_SIZE_TOTAL));
 	}
 	
@@ -114,15 +114,7 @@
 		return cacheHit.get();
 	}
 	
-	public void put(CacheID id, int determinismLevel, T t){
-		this.put(id, determinismLevel, t, null);
-	}
-	
 	public void put(CacheID id, int determinismLevel, T t, Long ttl){
-		if (!id.cachable) {
-			return;
-		}
-		
 		if (determinismLevel >= FunctionMethod.SESSION_DETERMINISTIC) {
 			id.setSessionId(id.originalSessionId);
 			this.localCache.put(id, t, ttl);
@@ -160,7 +152,7 @@
 		this.distributedCache.clear();
 	}	
 	
-	static class CacheID implements Serializable {
+	public static class CacheID implements Serializable {
 		private static final long serialVersionUID = 8261905111156764744L;
 		private String sql;
 		private VDBKey vdbInfo;
@@ -170,39 +162,52 @@
 		private List<Serializable> parameters;
 		private String userName;
 		private String originalUserName;
-		private boolean cachable = true;
-				
-		CacheID(DQPWorkContext context, ParseInfo pi, String sql){
+		
+		public CacheID(DQPWorkContext context, ParseInfo pi, String sql){
+			this(pi, sql, context.getVdbName(), context.getVdbVersion(), context.getSessionId(), context.getUserName());
+		}
+		
+		public CacheID(ParseInfo pi, String sql, String vdbName, int vdbVersion, String sessionId, String userName){
 			this.sql = sql;
-			this.vdbInfo = new VDBKey(context.getVdbName(), context.getVdbVersion());
+			this.vdbInfo = new VDBKey(vdbName, vdbVersion);
 			this.pi = pi;
-			this.originalSessionId = context.getSessionId();
-			this.originalUserName = context.getUserName();
+			this.originalSessionId = sessionId;
+			this.originalUserName = userName;
 		}
+
 		
+		public String getSessionId() {
+			return sessionId;
+		}
+		
+		public String getUserName() {
+			return userName;
+		}
+		
 		private void setSessionId(String sessionId) {
 			this.sessionId = sessionId;
 		}
 		
-		public void setParameters(List<?> parameters) {
+		public boolean setParameters(List<?> parameters) {
 			if (parameters !=  null && !parameters.isEmpty()) {
 				this.parameters = new ArrayList<Serializable>();
 				for (Object obj:parameters) {
-					if (obj instanceof Serializable) {
+					if (obj instanceof Serializable && obj instanceof Comparable<?>) {
 						this.parameters.add((Serializable)obj);
 					}
 					else{
-						this.cachable = false;
+						return false;
 					}
 				}
 			}
+			return true;
 		}
 		
 		public String getSql() {
 			return sql;
 		}
 		
-		public void setUserName(String name) {
+		void setUserName(String name) {
 			this.userName = name;
 		}
 						
@@ -214,7 +219,7 @@
 	            return false;
 	        } 
         	CacheID that = (CacheID)obj;
-            return this.pi.equals(that.pi) && this.vdbInfo.equals(that.vdbInfo) && this.sql.equals(that.sql) 
+            return EquivalenceUtil.areEqual(this.pi, that.pi) && this.vdbInfo.equals(that.vdbInfo) && this.sql.equals(that.sql) 
             	&& EquivalenceUtil.areEqual(this.userName, that.userName)            	
             	&& EquivalenceUtil.areEqual(this.sessionId, that.sessionId)
             	&& EquivalenceUtil.areEqual(this.parameters, that.parameters);
@@ -228,6 +233,7 @@
 	    public String toString() {
 	    	return "Cache Entry<" + originalSessionId + "="+ originalUserName + "> params:" + parameters + " sql:" + sql; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 	    }
+	    
 	}
 	
 	//for testing purpose 

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -22,8 +22,6 @@
 
 package org.teiid.query.optimizer;
 
-import java.util.Map;
-
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryPlannerException;
 import org.teiid.core.TeiidComponentException;
@@ -48,9 +46,6 @@
 import org.teiid.query.processor.proc.WhileInstruction;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.DynamicCommand;
-import org.teiid.query.sql.lang.ProcedureContainer;
-import org.teiid.query.sql.lang.StoredProcedure;
-import org.teiid.query.sql.lang.TranslatableProcedureContainer;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
 import org.teiid.query.sql.proc.CommandStatement;
@@ -92,7 +87,7 @@
             analysisRecord.println("PROCEDURE COMMAND: " + procCommand); //$NON-NLS-1$
         }
 
-        Assertion.isInstanceOf(procCommand, CreateUpdateProcedureCommand.class, "Wrong command type"); //$NON-NLS-1$
+        CreateUpdateProcedureCommand cupc = Assertion.isInstanceOf(procCommand, CreateUpdateProcedureCommand.class, "Wrong command type"); //$NON-NLS-1$
 
         if(debug) {
             analysisRecord.println("OPTIMIZING SUB-COMMANDS: "); //$NON-NLS-1$
@@ -104,35 +99,20 @@
         	}
         }
 
-        Block block = ((CreateUpdateProcedureCommand) procCommand).getBlock();
+        Block block = cupc.getBlock();
 
-		Program programBlock = planBlock(((CreateUpdateProcedureCommand)procCommand), block, metadata, debug, idGenerator, capFinder, analysisRecord, context);
+		Program programBlock = planBlock(cupc, block, metadata, debug, idGenerator, capFinder, analysisRecord, context);
 
         if(debug) {
             analysisRecord.println("\n####################################################"); //$NON-NLS-1$
         }
-
+                
         // create plan from program and initialized environment
         ProcedurePlan plan = new ProcedurePlan(programBlock);
         
-        // propagate procedure parameters to the plan to allow runtime type checking
-        ProcedureContainer container = (ProcedureContainer)((CreateUpdateProcedureCommand) procCommand).getUserCommand();
+        plan.setUpdateProcedure(cupc.isUpdateProcedure());
+        plan.setOutputElements(cupc.getProjectedSymbols());
         
-        if (container != null) {
-        	if (container instanceof StoredProcedure) {
-        		plan.setRequiresTransaction(container.getUpdateCount() > 0);
-        	}
-            Map params = container.getProcedureParameters();
-            plan.setParams(params);
-            plan.setMetadata(metadata);
-            if (container instanceof TranslatableProcedureContainer) {
-            	plan.setImplicitParams(((TranslatableProcedureContainer)container).getImplicitParams());
-            }
-        }
-        
-        plan.setUpdateProcedure(((CreateUpdateProcedureCommand)procCommand).isUpdateProcedure());
-        plan.setOutputElements(((CreateUpdateProcedureCommand)procCommand).getProjectedSymbols());
-        
         if(debug) {
             analysisRecord.println("####################################################"); //$NON-NLS-1$
             analysisRecord.println("PROCEDURE PLAN :"+plan); //$NON-NLS-1$
@@ -148,8 +128,8 @@
 	 * @param block The <code>Block</code> to be planned
 	 * @param metadata Metadata used during planning
 	 * @param childNodes list of CommandTreeNode objects that contain the ProcessorPlans of the child nodes of this procedure
-	 * @param debug Boolean detemining if procedure plan needs to be printed for debug purposes
-	 * @param analysisRecord TODO
+	 * @param debug Boolean determining if procedure plan needs to be printed for debug purposes
+	 * @param analysisRecord
 	 * @return A Program resulting in the block planning
 	 * @throws QueryPlannerException if invalid statement is encountered in the block
 	 * @throws QueryMetadataException if there is an error accessing metadata
@@ -183,14 +163,14 @@
 	/**
 	 * <p> Plan a {@link Statement} object, depending on the type of the statement construct the appropriate
 	 * {@link ProgramInstruction} return it to added to a {@link Program}. If the statement references a
-	 * <code>Command</code>, it looks up the child CommandTreeNodes to get approproiate child's ProcessrPlan
+	 * <code>Command</code>, it looks up the child CommandTreeNodes to get appropriate child's ProcessrPlan
 	 * and uses it for constructing the necessary instruction.</p>
 	 * @param statement The statement to be planned
 	 * @param metadata Metadata used during planning
 	 * @param childNodes list of CommandTreeNode objects that contain the ProcessorPlans of the child nodes of this procedure
-	 * @param debug Boolean detemining if procedure plan needs to be printed for debug purposes
-	 * @param analysisRecord TODO
-	 * @return An array containing index of the next child to be accessesd and the ProgramInstruction resulting
+	 * @param debug Boolean determining if procedure plan needs to be printed for debug purposes
+	 * @param analysisRecord
+	 * @return An array containing index of the next child to be accessed and the ProgramInstruction resulting
 	 * in the statement planning
 	 * @throws QueryPlannerException if invalid statement is encountered
 	 * @throws QueryMetadataException if there is an error accessing metadata

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -22,15 +22,18 @@
 
 package org.teiid.query.optimizer;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryPlannerException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
 import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.id.IDGenerator;
 import org.teiid.core.id.IntegerIDFactory;
+import org.teiid.dqp.internal.process.PreparedPlan;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.TempCapabilitiesFinder;
@@ -40,20 +43,23 @@
 import org.teiid.query.optimizer.relational.RelationalPlanner;
 import org.teiid.query.optimizer.xml.XMLPlanner;
 import org.teiid.query.processor.ProcessorPlan;
+import org.teiid.query.processor.proc.ProcedurePlan;
 import org.teiid.query.resolver.QueryResolver;
+import org.teiid.query.rewriter.QueryRewriter;
 import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.ProcedureContainer;
 import org.teiid.query.sql.lang.Query;
+import org.teiid.query.sql.lang.StoredProcedure;
+import org.teiid.query.sql.lang.TranslatableProcedureContainer;
+import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
+import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.util.CommandContext;
 
 
 /**
  * <p>This Class produces a ProcessorPlan object (a plan for query execution) from a 
  * user's command and a source of metadata.</p>
- * 
- * <p>The user's Command object may in fact be a tree of commands and subcommands.
- * This component is architected to defer to the proper 
- * {@link CommandPlanner CommandPlanner} implementation to plan each Command in the
- * tree.</p>
  */
 public class QueryOptimizer {
 	
@@ -65,7 +71,7 @@
 	private QueryOptimizer() {}
 
 	public static ProcessorPlan optimizePlan(Command command, QueryMetadataInterface metadata, IDGenerator idGenerator, CapabilitiesFinder capFinder, AnalysisRecord analysisRecord, CommandContext context)
-		throws QueryPlannerException, QueryMetadataException, TeiidComponentException {
+		throws QueryMetadataException, TeiidComponentException, QueryPlannerException {
 
 		if (analysisRecord == null) {
 			analysisRecord = new AnalysisRecord(false, false);
@@ -98,7 +104,37 @@
 		ProcessorPlan result = null;
 
 		if (command.getType() == Command.TYPE_UPDATE_PROCEDURE){
-			result = PROCEDURE_PLANNER.optimize(command, idGenerator, metadata, capFinder, analysisRecord, context);
+			CreateUpdateProcedureCommand cupc = (CreateUpdateProcedureCommand)command;
+			if (cupc.isUpdateProcedure()) {
+				result = planProcedure(command, metadata, idGenerator, capFinder, analysisRecord, context);
+			} else {
+				String fullName = metadata.getFullName(cupc.getVirtualGroup().getMetadataID());
+				PreparedPlan pp = context.getPlan(fullName);
+				if (pp == null) {
+					int determinismLevel = context.resetDeterminismLevel();
+					ProcessorPlan plan = planProcedure(command, metadata, idGenerator, capFinder, analysisRecord, context);
+					//note that this is not a full prepared plan.  It is not usable by user queries.
+					pp = new PreparedPlan();
+					pp.setPlan(plan);
+					context.putPlan(fullName, pp, context.getDeterminismLevel());
+					context.setDeterminismLevel(determinismLevel);
+				}
+				result = pp.getPlan().clone();
+			}
+	        // propagate procedure parameters to the plan to allow runtime type checking
+	        ProcedureContainer container = (ProcedureContainer)cupc.getUserCommand();
+	        ProcedurePlan plan = (ProcedurePlan)result;
+	        if (container != null) {
+	        	LinkedHashMap<ElementSymbol, Expression> params = container.getProcedureParameters();
+	        	if (container instanceof StoredProcedure) {
+	        		plan.setRequiresTransaction(container.getUpdateCount() > 0);
+	        	}
+	            plan.setParams(params);
+	            plan.setMetadata(metadata);
+	            if (container instanceof TranslatableProcedureContainer) {
+	            	plan.setImplicitParams(((TranslatableProcedureContainer)container).getImplicitParams());
+	            }
+	        }
         } else if (command.getType() == Command.TYPE_BATCHED_UPDATE){
             result = BATCHED_UPDATE_PLANNER.optimize(command, idGenerator, metadata, capFinder, analysisRecord, context);
         } else {
@@ -124,5 +160,20 @@
 
 		return result;
 	}
+
+	private static ProcessorPlan planProcedure(Command command,
+			QueryMetadataInterface metadata, IDGenerator idGenerator,
+			CapabilitiesFinder capFinder, AnalysisRecord analysisRecord,
+			CommandContext context) throws TeiidComponentException,
+			QueryPlannerException, QueryMetadataException {
+		ProcessorPlan result;
+		try {
+			command = QueryRewriter.rewrite(command, metadata, context);
+		} catch (TeiidProcessingException e) {
+			throw new QueryPlannerException(e, e.getMessage());
+		}
+		result = PROCEDURE_PLANNER.optimize(command, idGenerator, metadata, capFinder, analysisRecord, context);
+		return result;
+	}
 	
 }

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -44,8 +44,6 @@
 import org.teiid.core.id.IDGenerator;
 import org.teiid.dqp.internal.process.Request;
 import org.teiid.language.SQLConstants;
-import org.teiid.logging.LogConstants;
-import org.teiid.logging.LogManager;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.execution.QueryExecPlugin;
@@ -485,8 +483,9 @@
 			}
 		}
 		if (c != null) {
-		    c = QueryRewriter.rewrite(c, metadata, context);
-		    addNestedCommand(sourceNode, container.getGroup(), container, c, false);
+			//skip the rewrite here, we'll do that in the optimizer
+			//so that we know what the determinism level is.
+			addNestedCommand(sourceNode, container.getGroup(), container, c, false);
 		}
 	}
 
@@ -1034,15 +1033,10 @@
     		//only OPTION NOCACHE, no group specified
     		return true;
     	}       
+    	String fullName = metadata.getFullName(metadataID);
     	for (String groupName : option.getNoCacheGroups()) {
-            try {
-                Object noCacheGroupID = metadata.getGroupID(groupName);
-                if(metadataID.equals(noCacheGroupID)){
-                    return true;
-                }
-            } catch (QueryMetadataException e) {
-                //log that an unknown groups was used in the no cache
-                LogManager.logWarning(LogConstants.CTX_QUERY_RESOLVER, e, QueryPlugin.Util.getString("SimpleQueryResolver.unknown_group_in_nocache", groupName)); //$NON-NLS-1$
+            if(groupName.equalsIgnoreCase(fullName)){
+                return true;
             }
         }
         return false;

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlanner.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -107,7 +107,7 @@
         }
 
         // lookup mapping node for the user command
-        GroupSymbol group = (GroupSymbol)xmlQuery.getFrom().getGroups().iterator().next();
+        GroupSymbol group = xmlQuery.getFrom().getGroups().iterator().next();
 
         MappingDocument doc = (MappingDocument)metadata.getMappingNode(group.getMetadataID());
         doc = (MappingDocument)doc.clone();

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/parser/QueryParser.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/parser/QueryParser.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/parser/QueryParser.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -106,39 +106,23 @@
             throw new QueryParserException(QueryPlugin.Util.getString("QueryParser.emptysql")); //$NON-NLS-1$
         }
         
-        try {
-	        Command result = parseCommandWithParser(sql, parseInfo);
-	        if (parseInfo.cacheHint != null) {
-		        result.setCacheHint(parseInfo.cacheHint);
-	        }
-			return result;
-        } catch (QueryParserException e) {
-            if(sql.startsWith(XML_OPEN_BRACKET) || sql.startsWith(XQUERY_DECLARE)) {
-            	throw new QueryParserException(e, QueryPlugin.Util.getString("QueryParser.xqueryCompilation", sql)); //$NON-NLS-1$
-            }
-        	throw e;
-        }
-	}
-
-    /**
-     * Parse the String sql into a Command using the MetaMatrix parser.
-     * @param sql to parse
-     * @return parsed Command
-     * @throws QueryParserException
-     */
-    private Command parseCommandWithParser(String sql, ParseInfo parseInfo) throws QueryParserException {
-        Command result = null;
+    	Command result = null;
         try{
             result = getSqlParser(sql).command(parseInfo);
-            
+            result.setCacheHint(SQLParserUtil.getQueryCacheOption(sql));
         } catch(ParseException pe) {
+        	if(sql.startsWith(XML_OPEN_BRACKET) || sql.startsWith(XQUERY_DECLARE)) {
+            	throw new QueryParserException(pe, QueryPlugin.Util.getString("QueryParser.xqueryCompilation", sql)); //$NON-NLS-1$
+            }
             throw convertParserException(pe);
-
         } catch(TokenMgrError tme) {
+        	if(sql.startsWith(XML_OPEN_BRACKET) || sql.startsWith(XQUERY_DECLARE)) {
+            	throw new QueryParserException(tme, QueryPlugin.Util.getString("QueryParser.xqueryCompilation", sql)); //$NON-NLS-1$
+            }
             handleTokenMgrError(tme);
         }
-        return result;        
-    }
+		return result;
+	}
 
     /**
      * Takes a SQL string representing an SQL criteria (i.e. just the WHERE

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -189,25 +189,25 @@
         return hint;
 	}
 	
-	private static Pattern CACHE_HINT = Pattern.compile("\\s*cache(\\(\\s*(pref_mem)?\\s*(ttl:\\d{1,19})?\\s*(updatable)?[^)]*\\))?.*", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
+	private static Pattern CACHE_HINT = Pattern.compile("/\\*\\+?\\s*cache(\\(\\s*(pref_mem)?\\s*(ttl:\\d{1,19})?\\s*(updatable)?[^\\)]*\\))?[^\\*]*\\*\\/.*", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
     
-    void setQueryCacheOption(Token t, ParseInfo p) {
-    	String hint = getComment(t);
-
-    	Matcher match = CACHE_HINT.matcher(hint);
+	static CacheHint getQueryCacheOption(String query) {
+    	Matcher match = CACHE_HINT.matcher(query);
     	if (match.matches()) {
-    		p.cacheHint = new CacheHint();
+    		CacheHint hint = new CacheHint();
     		if (match.group(2) !=null) {
-    			p.cacheHint.setPrefersMemory(true);
+    			hint.setPrefersMemory(true);
     		}
     		String ttl = match.group(3);
     		if (ttl != null) {
-    			p.cacheHint.setTtl(Long.valueOf(ttl.substring(4)));
+    			hint.setTtl(Long.valueOf(ttl.substring(4)));
     		}
     		if (match.group(4) != null) {
-    			p.cacheHint.setUpdatable(true);
+    			hint.setUpdatable(true);
     		}
+    		return hint;
     	}
+    	return null;
     }
 
     /**

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -54,7 +54,7 @@
 	private static ExpiredTimeSliceException EXPIRED_TIME_SLICE = new ExpiredTimeSliceException();
 	
 	public interface ProcessorFactory {
-		QueryProcessor createQueryProcessor(String query, String recursionGroup, CommandContext commandContext) throws TeiidProcessingException, TeiidComponentException;
+		QueryProcessor createQueryProcessor(String query, String recursionGroup, CommandContext commandContext, Object... params) throws TeiidProcessingException, TeiidComponentException;
 	}
 	
     private CommandContext context;

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -29,6 +29,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -69,10 +70,10 @@
  */
 public class ProcedurePlan extends ProcessorPlan {
 
-	public static class CursorState {
-		private QueryProcessor processor;
-		private IndexedTupleSource ts;
-		private List<?> currentRow;
+	private static class CursorState {
+		QueryProcessor processor;
+		IndexedTupleSource ts;
+		List<?> currentRow;
 	}
 	
     private Program originalProgram;
@@ -91,7 +92,7 @@
     private int beginBatch = 1;
     private List batchRows;
     private boolean lastBatch = false;
-    private Map<ElementSymbol, Expression> params;
+    private LinkedHashMap<ElementSymbol, Expression> params;
     private Map<ElementSymbol, Reference> implicitParams;
     private QueryMetadataInterface metadata;
 
@@ -191,7 +192,7 @@
 		            if (value == null && !metadata.elementSupports(param.getMetadataID(), SupportConstants.Element.NULL)) {
 		                throw new QueryValidatorException(QueryExecPlugin.Util.getString("ProcedurePlan.nonNullableParam", expr)); //$NON-NLS-1$
 		            }
-		            context.setValue(param, value);
+		            setParameterValue(param, context, value);
 		        }
     		}
     		if (this.implicitParams != null) {
@@ -207,6 +208,11 @@
     	this.evaluatedParams = true;
     }
 
+	protected void setParameterValue(ElementSymbol param,
+			VariableContext context, Object value) {
+		context.setValue(param, value);
+	}
+
     /**
      * @see ProcessorPlan#nextBatch()
      */
@@ -378,7 +384,7 @@
         this.metadata = metadata;
     }
 
-    public void setParams( Map<ElementSymbol, Expression> params ) {
+    public void setParams( LinkedHashMap<ElementSymbol, Expression> params ) {
         this.params = params;
     }
     
@@ -539,7 +545,6 @@
         }
     }
 
-
     /**
      * Get the schema from the tuple source that
      * represents the columns in a result set

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -45,7 +45,6 @@
 import org.teiid.query.metadata.TempMetadataStore;
 import org.teiid.query.resolver.ProcedureContainerResolver;
 import org.teiid.query.resolver.QueryResolver;
-import org.teiid.query.resolver.VariableResolver;
 import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.resolver.util.ResolverVisitor;
 import org.teiid.query.sql.lang.Command;
@@ -63,7 +62,7 @@
 
 /**
  */
-public class ExecResolver extends ProcedureContainerResolver implements VariableResolver {
+public class ExecResolver extends ProcedureContainerResolver {
 	
     /**
      * @see org.teiid.query.resolver.CommandResolver#findCommandMetadata(org.teiid.query.sql.lang.Command,
@@ -217,7 +216,7 @@
 
         // Create temporary metadata that defines a group based on either the stored proc
         // name or the stored query name - this will be used later during planning
-        String procName = storedProcedureCommand.getProcedureName();
+        String procName = metadata.getFullName(storedProcedureCommand.getProcedureID());
         
         GroupContext context = new GroupContext();
 
@@ -291,29 +290,7 @@
                                                               QueryResolverException {
         //Do nothing
     }
-    
-    /**
-     * Collect input expressions from a procedure and map them to the parameters they came from
-     * @param command Procedure to collect input expressions from
-     * @return Map of param name (full upper case) to Expression
-     */
-    public Map getVariableValues(Command command, QueryMetadataInterface metadata) {
-        StoredProcedure proc = (StoredProcedure)command;
 
-        List oldParams = proc.getInputParameters();
-        Map inputMap = new HashMap();
-
-        Iterator oldParamIter = oldParams.iterator();
-        while(oldParamIter.hasNext()) {
-            SPParameter param = (SPParameter) oldParamIter.next();
-            String paramName = proc.getParamFullName(param).toUpperCase();
-            Expression expr = param.getExpression();
-            inputMap.put(paramName, expr);
-        }
-
-        return inputMap;
-    }
-
     /** 
      * @see org.teiid.query.resolver.ProcedureContainerResolver#getPlan(org.teiid.query.metadata.QueryMetadataInterface, org.teiid.query.sql.symbol.GroupSymbol)
      */

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -24,10 +24,13 @@
 
 import java.io.Serializable;
 
+import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.query.sql.visitor.SQLStringVisitor;
 
 public class CacheHint implements Serializable {
 
+	private static final long serialVersionUID = -4119606289701982511L;
+	
 	public static final String PREF_MEM = "pref_mem"; //$NON-NLS-1$
 	public static final String TTL = "ttl:"; //$NON-NLS-1$
 	public static final String UPDATABLE = "updatable"; //$NON-NLS-1$
@@ -75,5 +78,19 @@
 	public void setUpdatable(boolean updatable) {
 		this.updatable = updatable;
 	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == this) {
+			return true;
+		}
+		if (!(obj instanceof CacheHint)) {
+			return false;
+		}
+		CacheHint other = (CacheHint)obj;
+		return this.prefersMemory == other.prefersMemory 
+		&& EquivalenceUtil.areEqual(this.ttl, other.ttl) 
+		&& this.updatable == other.updatable;
+	}
 
 }

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Command.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -32,6 +32,7 @@
 import java.util.Map;
 
 import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.query.processor.ProcessorPlan;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.symbol.ElementSymbol;
@@ -334,4 +335,9 @@
     public String toString() {
         return SQLStringVisitor.getSQLString(this);
     }
+    
+    protected boolean sameOptionAndHint(Command cmd) {
+    	return EquivalenceUtil.areEqual(this.cacheHint, cmd.cacheHint) && 
+    	EquivalenceUtil.areEqual(this.option, cmd.option);
+    }
 }

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Delete.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Delete.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Delete.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -22,13 +22,14 @@
 
 package org.teiid.query.sql.lang;
 
-import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.core.util.HashCodeUtil;
 import org.teiid.query.sql.LanguageVisitor;
+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.SQLStringVisitor;
 
@@ -167,8 +168,8 @@
      * @see org.teiid.query.sql.lang.ProcedureContainer#getParameters()
      * @since 5.0
      */
-    public Map getProcedureParameters() {
-        return Collections.EMPTY_MAP;
+    public LinkedHashMap<ElementSymbol, Expression> getProcedureParameters() {
+        return new LinkedHashMap<ElementSymbol, Expression>();
     }
 
 	/**

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Insert.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Insert.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Insert.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -23,11 +23,10 @@
 package org.teiid.query.sql.lang;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 import org.teiid.common.buffer.TupleSource;
 import org.teiid.core.util.EquivalenceUtil;
@@ -50,11 +49,8 @@
     /** Identifies the group to be udpdated. */
     private GroupSymbol group;
 
-    /** list of column variables, null = all columns */
-    private List variables = new LinkedList();
-
-    /** List of Expressions */
-    private List values = new LinkedList();
+    private List<ElementSymbol> variables = new LinkedList<ElementSymbol>();
+    private List<Expression> values = new LinkedList<Expression>();
     
     private QueryCommand queryExpression;
     
@@ -234,14 +230,13 @@
      * @see org.teiid.query.sql.lang.ProcedureContainer#getParameters()
      * @since 5.0
      */
-    public Map getProcedureParameters() {
+    public LinkedHashMap<ElementSymbol, Expression> getProcedureParameters() {
         
         int iSize = getVariables().size();
-        HashMap map = new HashMap();
+        LinkedHashMap<ElementSymbol, Expression> map = new LinkedHashMap<ElementSymbol, Expression>();
         
         for (int j = 0; j < iSize; j++) {
-            ElementSymbol symbol = (ElementSymbol)((ElementSymbol)variables.get( j )).clone();
-            symbol = (ElementSymbol)((ElementSymbol)variables.get( j )).clone();
+            ElementSymbol symbol = (ElementSymbol)variables.get( j ).clone();
             symbol.setName(ProcedureReservedWords.INPUTS + SingleElementSymbol.SEPARATOR + symbol.getShortCanonicalName());
             map.put(symbol, values.get( j ) );
         } // for 

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/ProcedureContainer.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/ProcedureContainer.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/ProcedureContainer.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -22,8 +22,10 @@
 
 package org.teiid.query.sql.lang;
 
-import java.util.Map;
+import java.util.LinkedHashMap;
 
+import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
 
 
@@ -59,5 +61,5 @@
         this.updateCount = updateCount;
     }
     
-    public abstract Map getProcedureParameters();
+    public abstract LinkedHashMap<ElementSymbol, Expression> getProcedureParameters();
 }

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Query.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Query.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Query.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -23,6 +23,7 @@
 package org.teiid.query.sql.lang;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
@@ -373,12 +374,10 @@
      * @return True if equal
      */
     public boolean equals(Object obj) {
-    	// Quick same object test
     	if(this == obj) {
     		return true;
 		}
 
-		// Quick fail tests		
     	if(!(obj instanceof Query)) {
     		return false;
 		}
@@ -392,8 +391,8 @@
                EquivalenceUtil.areEqual(getHaving(), other.getHaving()) &&
                EquivalenceUtil.areEqual(getOrderBy(), other.getOrderBy()) &&
                EquivalenceUtil.areEqual(getLimit(), other.getLimit()) &&
-               EquivalenceUtil.areEqual(getOption(), other.getOption()) &&
-               getIsXML() == other.getIsXML();
+               getIsXML() == other.getIsXML() &&
+               sameOptionAndHint(other);
     }
 
     /**
@@ -426,9 +425,8 @@
 		return areResultsCachable(projectedSymbols);
 	}
 
-	static boolean areResultsCachable(List projectedSymbols) {
-		for(int i=0; i<projectedSymbols.size(); i++){
-			SingleElementSymbol projectedSymbol = (SingleElementSymbol)projectedSymbols.get(i);
+	public static boolean areResultsCachable(Collection<? extends SingleElementSymbol> projectedSymbols) {
+		for (SingleElementSymbol projectedSymbol : projectedSymbols) {
 			if(DataTypeManager.isLOB(projectedSymbol.getType()) || projectedSymbol.getType() == DataTypeManager.DefaultDataClasses.OBJECT) {
 				return false;
 			}

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SPParameter.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SPParameter.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SPParameter.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -29,10 +29,8 @@
 import java.util.List;
 
 import org.teiid.client.metadata.ParameterInfo;
-import org.teiid.core.TeiidException;
-import org.teiid.core.TeiidRuntimeException;
+import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.eval.Evaluator;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.util.ErrorMessageKeys;
@@ -303,7 +301,7 @@
 			return true;
 		}
 
-		if(obj == null || !(obj instanceof SPParameter)){
+		if(!(obj instanceof SPParameter)){
 			return false;
 		}
 
@@ -314,11 +312,7 @@
         }
         
         // If indexes match, check associated IDs if existent
-        if (this.getMetadataID() != null && other.getMetadataID() != null) {
-            return this.getMetadataID().equals(other.getMetadataID());
-        }
-        
-        return true;
+        return EquivalenceUtil.areEqual(this.expression, other.expression);
 	}
 
     /**

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SetQuery.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SetQuery.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SetQuery.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -213,7 +213,7 @@
         EquivalenceUtil.areEqual(this.rightQuery, other.rightQuery) &&
         EquivalenceUtil.areEqual(getOrderBy(), other.getOrderBy()) &&
         EquivalenceUtil.areEqual(getLimit(), other.getLimit()) &&
-        EquivalenceUtil.areEqual(getOption(), other.getOption());        
+        sameOptionAndHint(other);        
     }
 
     /**

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -26,6 +26,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -35,6 +36,7 @@
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.sql.LanguageVisitor;
 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.SQLStringVisitor;
 import org.teiid.query.util.ErrorMessageKeys;
@@ -300,7 +302,7 @@
      */
     @Override
     public int hashCode() {
-        return this.toString().hashCode();
+        return this.getGroup().hashCode();
     }
 
     public boolean equals(Object obj) {
@@ -314,7 +316,11 @@
     		return false;
 		}
     	
-		return this.toString().equals(obj.toString());
+    	StoredProcedure other = (StoredProcedure)obj;
+    	
+		return sameOptionAndHint(other) && 
+		this.getGroup().equals(other.getGroup()) &&
+		this.mapOfParameters.equals(other.mapOfParameters);
     }
 
     public void clearParameters(){
@@ -407,9 +413,9 @@
 	 * @see org.teiid.query.sql.lang.ProcedureContainer#getProcedureParameters()
 	 * @since 5.0
 	 */
-	public Map getProcedureParameters() {
+	public LinkedHashMap<ElementSymbol, Expression> getProcedureParameters() {
 	    
-	    HashMap map = new HashMap();
+		LinkedHashMap<ElementSymbol, Expression> map = new LinkedHashMap<ElementSymbol, Expression>();
 	    for (Iterator iter = this.getInputParameters().iterator(); iter.hasNext();) {
 	        
 	        SPParameter element = (SPParameter)iter.next();

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Update.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Update.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Update.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -22,10 +22,9 @@
 
 package org.teiid.query.sql.lang;
 
-import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.core.util.HashCodeUtil;
@@ -259,14 +258,13 @@
      * @see org.teiid.query.sql.lang.ProcedureContainer#getProcedureParameters()
      * @since 5.0
      */
-    public Map getProcedureParameters() {
+    public LinkedHashMap<ElementSymbol, Expression> getProcedureParameters() {
         
-        HashMap map = new HashMap();
+    	LinkedHashMap<ElementSymbol, Expression> map = new LinkedHashMap<ElementSymbol, Expression>();
         
         for (Iterator iter = getChangeList().getClauses().iterator(); iter.hasNext();) {
         	SetClause setClause = (SetClause)iter.next();
             ElementSymbol symbol = (ElementSymbol)(setClause.getSymbol()).clone();
-            symbol = (ElementSymbol)(setClause.getSymbol()).clone();
             symbol.setName(ProcedureReservedWords.INPUTS + SingleElementSymbol.SEPARATOR + symbol.getShortCanonicalName());
             map.put( symbol, setClause.getValue() );
         } // for

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/proc/CreateUpdateProcedureCommand.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/proc/CreateUpdateProcedureCommand.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/proc/CreateUpdateProcedureCommand.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -32,6 +32,7 @@
 import org.teiid.core.util.HashCodeUtil;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.visitor.SQLStringVisitor;
 
@@ -185,9 +186,11 @@
     	if(! (obj instanceof CreateUpdateProcedureCommand)) {
     		return false;
 		}
+    	
+    	CreateUpdateProcedureCommand other = (CreateUpdateProcedureCommand)obj;
         
         // Compare the block
-        return EquivalenceUtil.areEqual(getBlock(), ((CreateUpdateProcedureCommand)obj).getBlock());
+        return sameOptionAndHint(other) && EquivalenceUtil.areEqual(getBlock(), other.getBlock());
     } 
 
     /**
@@ -279,7 +282,7 @@
 		if(isUpdateProcedure()){
 			return false;
 		}
-		return true;
+		return Query.areResultsCachable(getProjectedSymbols());
 	}
     
     public GroupSymbol getVirtualGroup() {

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -248,8 +248,8 @@
 			Constant key = (Constant)proc.getParameter(2).getExpression();
 			LogManager.logInfo(LogConstants.CTX_MATVIEWS, QueryExecPlugin.Util.getString("TempTableDataManager.row_refresh", matViewName, key)); //$NON-NLS-1$
 			String queryString = Reserved.SELECT + " * " + Reserved.FROM + ' ' + matViewName + ' ' + Reserved.WHERE + ' ' + //$NON-NLS-1$
-				metadata.getFullName(ids.iterator().next()) + '=' + key.toString() + ' ' + Reserved.OPTION + ' ' + Reserved.NOCACHE; 
-			QueryProcessor qp = context.getQueryProcessorFactory().createQueryProcessor(queryString, matViewName.toUpperCase(), context);
+				metadata.getFullName(ids.iterator().next()) + " = ?" + ' ' + Reserved.OPTION + ' ' + Reserved.NOCACHE; //$NON-NLS-1$
+			QueryProcessor qp = context.getQueryProcessorFactory().createQueryProcessor(queryString, matViewName.toUpperCase(), context, key.getValue());
 			qp.setNonBlocking(true);
 			TupleSource ts = new BatchCollector.BatchProducerTupleSource(qp);
 			tempTable = globalStore.getOrCreateTempTable(matTableName, new Query(), bufferManager, false);

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/util/CommandContext.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/util/CommandContext.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/util/CommandContext.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -33,11 +33,16 @@
 import org.teiid.common.buffer.BufferManager;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.util.ArgCheck;
+import org.teiid.dqp.internal.process.PreparedPlan;
+import org.teiid.dqp.internal.process.SessionAwareCache;
+import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.eval.SecurityFunctionEvaluator;
 import org.teiid.query.execution.QueryExecPlugin;
+import org.teiid.query.function.metadata.FunctionMethod;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.optimizer.relational.PlanToProcessConverter;
+import org.teiid.query.parser.ParseInfo;
 import org.teiid.query.processor.QueryProcessor;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
@@ -67,7 +72,7 @@
 	    
 	    private Serializable commandPayload;
 	    
-	    private String vdbName;
+	    private String vdbName = ""; //$NON-NLS-1$
 	    
 	    private int vdbVersion;
 	    
@@ -101,6 +106,8 @@
 	    private BufferManager bufferManager;
 	    
 	    private TempTableStore globalTables;
+	    
+	    private SessionAwareCache<PreparedPlan> planCache;
 	}
 	
 	private GlobalState globalState = new GlobalState();
@@ -136,13 +143,23 @@
              
     }
 
-    public CommandContext() {        
+    public CommandContext() {
     }
     
+    private CommandContext(GlobalState state) {
+    	this.globalState = state;
+    }
+    
     public int getDeterminismLevel() {
 		return globalState.determinismLevel;
 	}
     
+    public int resetDeterminismLevel() {
+    	int result = globalState.determinismLevel;
+    	globalState.determinismLevel = 0;
+    	return result;
+    }
+    
     public void setDeterminismLevel(int level) {
     	globalState.determinismLevel = Math.max(globalState.determinismLevel, level);
     }
@@ -163,8 +180,7 @@
     }
 
     public CommandContext clone() {
-    	CommandContext clone = new CommandContext();
-    	clone.globalState = this.globalState;
+    	CommandContext clone = new CommandContext(this.globalState);
     	clone.variableContext = this.variableContext;
     	clone.tempTableStore = this.tempTableStore;
     	if (this.recursionStack != null) {
@@ -454,5 +470,34 @@
     public void setNonBlocking(boolean nonBlocking) {
 		this.nonBlocking = nonBlocking;
 	}
+    
+    public void setPreparedPlanCache(SessionAwareCache<PreparedPlan> cache) {
+    	this.globalState.planCache = cache;
+    }
+    
+    public PreparedPlan getPlan(String key) {
+    	if (this.globalState.planCache == null) {
+    		return null;
+    	}
+    	CacheID id = new CacheID(new ParseInfo(), key, getVdbName(), getVdbVersion(), getConnectionID(), getUserName());
+    	PreparedPlan pp = this.globalState.planCache.get(id);
+    	if (pp != null) {
+    		if (id.getSessionId() != null) {
+    			setDeterminismLevel(FunctionMethod.USER_DETERMINISTIC);
+    		} else if (id.getUserName() != null) {
+    			setDeterminismLevel(FunctionMethod.SESSION_DETERMINISTIC);
+    		}
+        	return pp;
+    	}
+    	return null;
+    }
+    
+    public void putPlan(String key, PreparedPlan plan, int determinismLevel) {
+    	if (this.globalState.planCache == null) {
+    		return;
+    	}
+    	CacheID id = new CacheID(new ParseInfo(), key, getVdbName(), getVdbVersion(), getConnectionID(), getUserName());
+    	this.globalState.planCache.put(id, determinismLevel, plan, null);
+    }
 	
 }

Modified: branches/7.1.x/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- branches/7.1.x/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2010-08-25 16:18:52 UTC (rev 2490)
@@ -1171,17 +1171,10 @@
 	StoredProcedure storedProcedure = new StoredProcedure();
 	String procName = null;
 	Option option = null;
-	Token execToken = null;
 }
 {
 	(
-		(
-		 (execToken = <EXEC> { setQueryCacheOption(execToken, info); }) 
-		 |
-		 (execToken = <EXECUTE> { setQueryCacheOption(execToken, info); })
-		 |
-		 (execToken = <CALL> { setQueryCacheOption(execToken, info); })
-		)
+		(<EXEC> | <EXECUTE> | <CALL>)
 		procName = id()
 		{
 			storedProcedure.setProcedureName(procName);
@@ -1594,13 +1587,9 @@
 	SelectSymbol symbol = null;
 	Select select = new Select();
 	info.aggregatesAllowed = true;
-	Token selectToken = null;
 }
 {
-	selectToken = <SELECT>
-	{
-	  setQueryCacheOption(selectToken, info);
-	}
+	<SELECT>
 	[<ALL> | (<DISTINCT> {isDistinct=true;})]
 	(<STAR>
 		{

Deleted: branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -1,75 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.dqp.internal.process;
-
-import org.teiid.common.buffer.BufferManager;
-import org.teiid.core.TeiidComponentException;
-import org.teiid.core.TeiidProcessingException;
-import org.teiid.core.id.IDGenerator;
-import org.teiid.query.analysis.AnalysisRecord;
-import org.teiid.query.metadata.QueryMetadataInterface;
-import org.teiid.query.optimizer.QueryOptimizer;
-import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
-import org.teiid.query.parser.QueryParser;
-import org.teiid.query.processor.ProcessorDataManager;
-import org.teiid.query.processor.ProcessorPlan;
-import org.teiid.query.processor.QueryProcessor;
-import org.teiid.query.resolver.QueryResolver;
-import org.teiid.query.rewriter.QueryRewriter;
-import org.teiid.query.sql.lang.Command;
-import org.teiid.query.util.CommandContext;
-
-
-
-public class SimpleQueryProcessorFactory implements QueryProcessor.ProcessorFactory {
-
-	private QueryMetadataInterface metadata;
-	private CapabilitiesFinder finder;
-	private IDGenerator idGenerator;
-	private BufferManager bufferMgr;
-	private ProcessorDataManager dataMgr;
-	
-	public SimpleQueryProcessorFactory(BufferManager bufferMgr,
-			ProcessorDataManager dataMgr, CapabilitiesFinder finder,
-			IDGenerator idGenerator, QueryMetadataInterface metadata) {
-		this.bufferMgr = bufferMgr;
-		this.dataMgr = dataMgr;
-		this.finder = finder;
-		this.idGenerator = idGenerator;
-		this.metadata = metadata;
-	}
-
-	@Override
-	public QueryProcessor createQueryProcessor(String sql, String recursionGroup, CommandContext commandContext)
-			throws TeiidProcessingException, TeiidComponentException {
-		Command command = QueryParser.getQueryParser().parseCommand(sql);
-		QueryResolver.resolveCommand(command, metadata);
-		command = QueryRewriter.rewrite(command, metadata, commandContext);
-		ProcessorPlan plan = QueryOptimizer.optimizePlan(command, metadata,
-				idGenerator, finder, AnalysisRecord.createNonRecordingRecord(),
-				commandContext);
-
-		CommandContext copy = commandContext.clone();
-		return new QueryProcessor(plan, copy, bufferMgr, dataMgr);
-	}
-}

Modified: branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -94,7 +94,7 @@
         context.setProcessorID(requestID);
         context.setVdbName("test"); //$NON-NLS-1$
         context.setVdbVersion(1);
-        context.setQueryProcessorFactory(new SimpleQueryProcessorFactory(bs.getBufferManager(), dtm, new DefaultCapabilitiesFinder(), null, metadata));
+        context.setQueryProcessorFactory(new QueryProcessorFactoryImpl(bs.getBufferManager(), dtm, new DefaultCapabilitiesFinder(), null, metadata));
         workItem = TestDQPCoreRequestHandling.addRequest(rm, original, requestID, null, workContext);
         
         request = new AtomicRequestMessage(original, workContext, nodeId);

Modified: branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -245,7 +245,7 @@
         ConnectorManagerRepository repo = Mockito.mock(ConnectorManagerRepository.class);
         Mockito.stub(repo.getConnectorManager(Mockito.anyString())).toReturn(new AutoGenDataService());
         
-        serverRequest.initialize(request, BufferManagerFactory.getStandaloneBufferManager(), null, new FakeTransactionService(), null, workContext, false);
+        serverRequest.initialize(request, BufferManagerFactory.getStandaloneBufferManager(), null, new FakeTransactionService(), null, workContext, false, prepPlanCache);
 
         serverRequest.setMetadata(capFinder, metadata, null);
         serverRequest.processRequest();

Modified: branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -80,7 +80,7 @@
         RequestMessage message = new RequestMessage();
         DQPWorkContext workContext = FakeMetadataFactory.buildWorkContext(metadata, FakeMetadataFactory.example1VDB());
         
-        request.initialize(message, null, null,new FakeTransactionService(),null, workContext, false);
+        request.initialize(message, null, null,new FakeTransactionService(),null, workContext, false, null);
         request.initMetadata();
         request.validateAccess(command);
     }
@@ -134,7 +134,7 @@
         Mockito.stub(repo.getConnectorManager(Mockito.anyString())).toReturn(new AutoGenDataService());
         
         request.initialize(message, Mockito.mock(BufferManager.class),
-				new FakeDataManager(), new FakeTransactionService(), null, workContext, false);
+				new FakeDataManager(), new FakeTransactionService(), null, workContext, false, null);
         
         request.processRequest();
         return request;

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/optimizer/proc/TestProcedurePlanner.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/optimizer/proc/TestProcedurePlanner.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/optimizer/proc/TestProcedurePlanner.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -22,12 +22,16 @@
 
 package org.teiid.query.optimizer.proc;
 
+import java.util.Collections;
+
+import org.junit.Test;
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.metadata.TempMetadataID;
 import org.teiid.query.optimizer.QueryOptimizer;
 import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
 import org.teiid.query.parser.QueryParser;
@@ -35,31 +39,19 @@
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.rewriter.QueryRewriter;
 import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
+import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.unittest.FakeMetadataFactory;
 import org.teiid.query.unittest.FakeMetadataObject;
 import org.teiid.query.validator.Validator;
 import org.teiid.query.validator.ValidatorFailure;
 import org.teiid.query.validator.ValidatorReport;
 
-import junit.framework.TestCase;
+ at SuppressWarnings("nls")
+public class TestProcedurePlanner {
 
-
-public class TestProcedurePlanner extends TestCase {
-
-	/**
-	 * Constructor for TestGenerateCanonical.
-	 * @param arg0
-	 */
-	public TestProcedurePlanner(String arg0) {
-		super(arg0);
-	}
-
 	// ################ getReplacementClause tests ################### 
 
-    private ProcessorPlan helpPlanProcedure(String procedure, String procedureType) throws QueryMetadataException, TeiidComponentException, TeiidProcessingException {
-        return helpPlanProcedure(null, procedure, procedureType);
-    }
-    
 	private ProcessorPlan helpPlanProcedure(String userQuery,
                                             String procedure,
                                             String procedureType) throws TeiidComponentException,
@@ -68,6 +60,13 @@
 
         QueryParser parser = QueryParser.getQueryParser();
         Command userCommand = userQuery != null ? parser.parseCommand(userQuery) : parser.parseCommand(procedure);
+        
+        if (userCommand instanceof CreateUpdateProcedureCommand) {
+        	GroupSymbol gs = new GroupSymbol("proc");
+        	gs.setMetadataID(new TempMetadataID("proc", Collections.EMPTY_LIST));
+        	((CreateUpdateProcedureCommand)userCommand).setVirtualGroup(gs);
+        }
+        
         QueryResolver.resolveCommand(userCommand, metadata);
 		ValidatorReport report = Validator.validate(userCommand, metadata);
         
@@ -92,7 +91,7 @@
     // TESTS
     // =============================================================================
 	
-    public void testCreateUpdateProcedure1() throws Exception {
+    @Test public void testCreateUpdateProcedure1() throws Exception {
         String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "Declare String var1;\n";         //$NON-NLS-1$
@@ -110,7 +109,7 @@
     }
     
 	// special variable CHANGING used with declared variable
-    public void testCreateUpdateProcedure2() throws Exception {
+    @Test public void testCreateUpdateProcedure2() throws Exception {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
@@ -129,7 +128,7 @@
     }
     
 	// special variable CHANGING and INPUT used in conpound criteria
-    public void testCreateUpdateProcedure3() throws Exception {
+    @Test public void testCreateUpdateProcedure3() throws Exception {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
@@ -148,7 +147,7 @@
     }
     
 	// special variable CHANGING and INPUT used in conpound criteria, with declared variables
-    public void testCreateUpdateProcedure4() throws Exception {
+    @Test public void testCreateUpdateProcedure4() throws Exception {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
@@ -167,7 +166,7 @@
     }
     
 	// virtual group elements used in procedure(HAS CRITERIA)
-    public void testCreateUpdateProcedure5() throws Exception {
+    @Test public void testCreateUpdateProcedure5() throws Exception {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
@@ -182,7 +181,7 @@
     }
     
 	// virtual group elements used in procedure in if statement(HAS CRITERIA)
-    public void testCreateUpdateProcedure6() throws Exception {
+    @Test public void testCreateUpdateProcedure6() throws Exception {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
@@ -200,7 +199,7 @@
     }
     
 	// testing rows updated incremented, Input and assignment statements
-    public void testCreateUpdateProcedure7() throws Exception {
+    @Test public void testCreateUpdateProcedure7() throws Exception {
         String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "Select pm1.g1.e2 from pm1.g1;\n"; //$NON-NLS-1$
@@ -215,42 +214,42 @@
     }      
     
     // testing select into with virtual group in from clause
-    public void testCreateVirtualProcedure1() throws Exception  {
+    @Test public void testCreateVirtualProcedure1() throws Exception  {
         String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1 INTO #temptable FROM vm1.g1;\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1 FROM #temptable;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
         
-        helpPlanProcedure(procedure,
+        helpPlanProcedure(null, procedure,
                                      FakeMetadataObject.Props.UPDATE_PROCEDURE);
     }  
     
     // testing select into with function in select clause
-    public void testCreateVirtualProcedure2() throws Exception {
+    @Test public void testCreateVirtualProcedure2() throws Exception {
         String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, convert(e2, string) INTO #temptable FROM vm1.g1;\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1 FROM #temptable;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
         
-        helpPlanProcedure(procedure,
+        helpPlanProcedure(null, procedure,
                                      FakeMetadataObject.Props.UPDATE_PROCEDURE);
     }      
     
     // testing select into with function in select clause
-    public void testCreateVirtualProcedure3() throws Exception {
+    @Test public void testCreateVirtualProcedure3() throws Exception {
         String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, convert(e2, string) as a1 INTO #temptable FROM vm1.g1;\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1 FROM #temptable;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
         
-        helpPlanProcedure(procedure,
+        helpPlanProcedure(null, procedure,
                                      FakeMetadataObject.Props.UPDATE_PROCEDURE);
     }
     
-    public void testCase4504() throws Exception { 
+    @Test public void testCase4504() throws Exception { 
         String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$ 
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$ 
         procedure = procedure + "SELECT y INTO #temptable FROM (select x.e1 as y from (select convert(pm1.g1.e1, date) e1 from pm1.g1) x) z;\n"; //$NON-NLS-1$ 
@@ -260,7 +259,7 @@
         procedure = procedure + "END\n"; //$NON-NLS-1$ 
         procedure = procedure + "END\n"; //$NON-NLS-1$ 
          
-        helpPlanProcedure(procedure, 
+        helpPlanProcedure(null, procedure, 
                                      FakeMetadataObject.Props.UPDATE_PROCEDURE); 
     }
 

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -43,11 +43,14 @@
 import org.teiid.query.sql.lang.JoinType;
 import org.teiid.query.sql.lang.Option;
 import org.teiid.query.sql.lang.Query;
+import org.teiid.query.sql.lang.SPParameter;
 import org.teiid.query.sql.lang.Select;
+import org.teiid.query.sql.lang.SetQuery;
 import org.teiid.query.sql.lang.StoredProcedure;
 import org.teiid.query.sql.lang.SubqueryFromClause;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.Update;
+import org.teiid.query.sql.lang.SetQuery.Operation;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
@@ -64,6 +67,7 @@
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
 
+ at SuppressWarnings("nls")
 public class TestOptionsAndHints {
     
     /*+* Select a From db.g1 MAKENOTDEP, db.g2 MAKENOTDEP WHERE a = b */
@@ -1074,9 +1078,55 @@
         UnaryFromClause ufc = new UnaryFromClause();
         from.addClause(ufc);
         ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
-        query.setFrom(from);           
-        query.setCacheHint(new CacheHint());
+        query.setFrom(from);
+        CacheHint hint = new CacheHint();
+        hint.setPrefersMemory(true);
+        hint.setTtl(Long.valueOf(2000));
+        query.setCacheHint(hint);
         TestParser.helpTest(sql, "/*+ cache(pref_mem ttl:2000) */ SELECT * FROM t1", query);         //$NON-NLS-1$
     }
     
+    @Test public void testCacheHintUnion() {
+        String sql = "/*+ cache( pref_mem) */ SELECT * FROM t1 union select * from t2"; //$NON-NLS-1$
+        
+        Query query = new Query();
+        Select select = new Select();
+        select.addSymbol(new AllSymbol());
+        query.setSelect(select);
+        From from = new From();
+        UnaryFromClause ufc = new UnaryFromClause();
+        from.addClause(ufc);
+        ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
+        query.setFrom(from);
+        
+        Query query1 = new Query();
+        select = new Select();
+        select.addSymbol(new AllSymbol());
+        query1.setSelect(select);
+        from = new From();
+        ufc = new UnaryFromClause();
+        from.addClause(ufc);
+        ufc.setGroup(new GroupSymbol("t2")); //$NON-NLS-1$
+        query1.setFrom(from);
+        
+        SetQuery sq = new SetQuery(Operation.UNION, false, query, query1);
+        CacheHint hint = new CacheHint();
+        hint.setPrefersMemory(true);
+        sq.setCacheHint(hint);
+        TestParser.helpTest(sql, "/*+ cache(pref_mem) */ SELECT * FROM t1 UNION SELECT * FROM t2", sq);         //$NON-NLS-1$
+    }
+    
+    @Test public void testCacheHintCallableStatement() {
+        String sql = "/*+ cache */ { ? = call proc() }"; //$NON-NLS-1$
+        StoredProcedure sp = new StoredProcedure();
+        SPParameter param = new SPParameter(1, null);
+        param.setParameterType(SPParameter.RETURN_VALUE);
+        sp.setParameter(param);
+        sp.setProcedureName("proc");
+        sp.setCallableStatement(true);
+        CacheHint hint = new CacheHint();
+        sp.setCacheHint(hint);
+        TestParser.helpTest(sql, "/*+ cache */ EXEC proc()", sp);         //$NON-NLS-1$
+    }
+    
 }

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -23,7 +23,6 @@
 package org.teiid.query.processor;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -32,7 +31,6 @@
 import org.teiid.common.buffer.BlockedException;
 import org.teiid.common.buffer.TupleSource;
 import org.teiid.core.TeiidComponentException;
-import org.teiid.query.processor.ProcessorDataManager;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.util.CommandContext;
 

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -32,7 +32,7 @@
 import org.junit.Test;
 import org.teiid.common.buffer.BufferManagerFactory;
 import org.teiid.core.TeiidProcessingException;
-import org.teiid.dqp.internal.process.SimpleQueryProcessorFactory;
+import org.teiid.dqp.internal.process.QueryProcessorFactoryImpl;
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
 import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
@@ -69,7 +69,7 @@
 		cc.setMetadata(metadata);
 		CapabilitiesFinder finder = new DefaultCapabilitiesFinder();
 		previousPlan = TestProcessor.helpGetPlan(TestProcessor.helpParse(sql), metadata, finder, cc);
-		cc.setQueryProcessorFactory(new SimpleQueryProcessorFactory(BufferManagerFactory.getStandaloneBufferManager(), dataManager, finder, null, metadata));
+		cc.setQueryProcessorFactory(new QueryProcessorFactoryImpl(BufferManagerFactory.getStandaloneBufferManager(), dataManager, finder, null, metadata));
 		TestProcessor.doProcess(previousPlan, dataManager, expectedResults, cc);
 	}
 

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -54,7 +54,9 @@
 import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.XMLType;
-import org.teiid.dqp.internal.process.SimpleQueryProcessorFactory;
+import org.teiid.dqp.internal.process.PreparedPlan;
+import org.teiid.dqp.internal.process.QueryProcessorFactoryImpl;
+import org.teiid.dqp.internal.process.SessionAwareCache;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.function.FunctionLibrary;
 import org.teiid.query.function.FunctionTree;
@@ -245,7 +247,7 @@
         	dataManager = new TempTableDataManager(dataManager, bufferMgr);
         }        
         if (context.getQueryProcessorFactory() == null) {
-        	context.setQueryProcessorFactory(new SimpleQueryProcessorFactory(bufferMgr, dataManager, new DefaultCapabilitiesFinder(), null, context.getMetadata()));
+        	context.setQueryProcessorFactory(new QueryProcessorFactoryImpl(bufferMgr, dataManager, new DefaultCapabilitiesFinder(), null, context.getMetadata()));
         }
         TupleBuffer id = null;
         try {
@@ -345,6 +347,7 @@
         context.setProcessorBatchSize(BufferManager.DEFAULT_PROCESSOR_BATCH_SIZE);
         context.setConnectorBatchSize(BufferManager.DEFAULT_CONNECTOR_BATCH_SIZE);
         context.setBufferManager(BufferManagerFactory.getStandaloneBufferManager());
+        context.setPreparedPlanCache(new SessionAwareCache<PreparedPlan>());
 		return context;
 	}   
     	

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -48,6 +48,7 @@
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.processor.FakeDataManager;
 import org.teiid.query.processor.FakeDataStore;
+import org.teiid.query.processor.HardcodedDataManager;
 import org.teiid.query.processor.ProcessorDataManager;
 import org.teiid.query.processor.ProcessorPlan;
 import org.teiid.query.processor.TestProcessor;
@@ -73,7 +74,7 @@
     	return getProcedurePlan(userQuery, metadata, /*capabilitiesFinder*/null);
     }
     
-    public static ProcessorPlan getProcedurePlan(String userQuery, FakeMetadataFacade metadata, CapabilitiesFinder capabilitiesFinder) throws Exception {
+    public static ProcessorPlan getProcedurePlan(String userQuery, QueryMetadataInterface metadata, CapabilitiesFinder capabilitiesFinder) throws Exception {
         Command userCommand = QueryParser.getQueryParser().parseCommand(userQuery);
         QueryResolver.resolveCommand(userCommand, metadata);
         ValidatorReport report = Validator.validate(userCommand, metadata);
@@ -2636,5 +2637,16 @@
         helpTestProcess(plan, expected, dataMgr, metadata);
     }
     
+    @Test public void testUnambiguousVirtualProc() throws Exception {
+        String userQuery = "EXEC MMSP6('1')"; //$NON-NLS-1$
+        QueryMetadataInterface metadata = FakeMetadataFactory.exampleBQTCached();
+        ProcessorPlan plan = getProcedurePlan(userQuery, metadata, TestOptimizer.getGenericFinder());
+
+        List[] expected = new List[] {
+                Arrays.asList( "1" ),
+        };
+        helpTestProcess(plan, expected, new HardcodedDataManager(), metadata);
+    }
+    
     private static final boolean DEBUG = false;
 }

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java	2010-08-25 00:56:42 UTC (rev 2489)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java	2010-08-25 16:18:52 UTC (rev 2490)
@@ -250,7 +250,7 @@
 
         ColumnSet<Procedure> vsprs6 = createResultSet("mmspTest1.vsprs1", new String[] { "StringKey" }, new String[] { DataTypeManager.DefaultDataTypes.STRING }); //$NON-NLS-1$ //$NON-NLS-2$
         ProcedureParameter vsp6p1 = createParameter("p1", ParameterInfo.IN, DataTypeManager.DefaultDataTypes.STRING); //$NON-NLS-1$
-        QueryNode vspqn6 = new QueryNode("vsp6", "CREATE VIRTUAL PROCEDURE BEGIN SELECT 1; END"); //$NON-NLS-1$ //$NON-NLS-2$
+        QueryNode vspqn6 = new QueryNode("vsp6", "CREATE VIRTUAL PROCEDURE BEGIN SELECT p1 as StringKey; END"); //$NON-NLS-1$ //$NON-NLS-2$
         Procedure vsp6 = createVirtualProcedure("MMSP6", mmspTest1, Arrays.asList(vsp6p1), vspqn6); //$NON-NLS-1$
         vsp6.setResultSet(vsprs6);
     	



More information about the teiid-commits mailing list