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