try {
Object value = procEnv.evaluateExpression(dynamicCommand.getSql());
if (value == null) {
throw new QueryProcessingException(QueryPlugin.Util
.getString("ExecDynamicSqlInstruction.0")); //$NON-NLS-1$
}
LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP,
new Object[] { "Executing dynamic sql ", value }); //$NON-NLS-1$
Command command = QueryParser.getQueryParser().parseCommand(value.toString());
command.setExternalGroupContexts(dynamicCommand.getExternalGroupContexts());
command.setTemporaryMetadata(dynamicCommand.getTemporaryMetadata());
updateContextWithUsingValues(procEnv, localContext);
Map tempMetadata = command.getTemporaryMetadata();
final TempMetadataStore metadataStore = new TempMetadataStore(tempMetadata);
if (dynamicCommand.getUsing() != null
&& !dynamicCommand.getUsing().isEmpty()) {
metadataStore.addTempGroup(Reserved.USING, new LinkedList(dynamicCommand.getUsing().getClauseMap().keySet()));
GroupSymbol using = new GroupSymbol(Reserved.USING);
using.setMetadataID(metadataStore.getTempGroupID(Reserved.USING));
command.addExternalGroupToContext(using);
metadataStore.addTempGroup(ProcedureReservedWords.DVARS, new LinkedList(dynamicCommand.getUsing().getClauseMap().keySet()));
using = new GroupSymbol(ProcedureReservedWords.DVARS);
using.setMetadataID(metadataStore.getTempGroupID(ProcedureReservedWords.DVARS));
command.addExternalGroupToContext(using);
}
// Resolve any groups
if (parentProcCommand.isUpdateProcedure()) {
ResolveVirtualGroupCriteriaVisitor.resolveCriteria(command,
parentProcCommand.getVirtualGroup(), metadata);
}
QueryResolver.resolveCommand(command, metadata.getDesignTimeMetadata());
validateDynamicCommand(procEnv, command);
// create a new set of variables including vars
Map<ElementSymbol, Expression> nameValueMap = createVariableValuesMap(localContext);
nameValueMap.putAll(QueryResolver.getVariableValues(parentProcCommand.getUserCommand(), false, metadata));
ValidationVisitor visitor = new ValidationVisitor();
visitor.setUpdateProc(parentProcCommand);
Request.validateWithVisitor(visitor, metadata, command);
if (dynamicCommand.getAsColumns() != null
&& !dynamicCommand.getAsColumns().isEmpty()) {
command = QueryRewriter.createInlineViewQuery(new GroupSymbol("X"), command, metadata, dynamicCommand.getAsColumns()); //$NON-NLS-1$
if (dynamicCommand.getIntoGroup() != null) {
Insert insert = new Insert(dynamicCommand.getIntoGroup(), dynamicCommand.getAsColumns(), Collections.emptyList());
insert.setQueryExpression((Query)command);
command = insert;
}
}
command = QueryRewriter.rewrite(command, parentProcCommand, metadata,
procEnv.getContext(), nameValueMap, parentProcCommand.getUserCommand().getType());
ProcessorPlan commandPlan = QueryOptimizer.optimizePlan(command, metadata,
idGenerator, capFinder, AnalysisRecord
.createNonRecordingRecord(), procEnv
.getContext());
CreateCursorResultSetInstruction inst = new CreateCursorResultSetInstruction(CreateCursorResultSetInstruction.RS_NAME, commandPlan, dynamicCommand.getIntoGroup() != null) {
@Override
public void process(ProcedurePlan procEnv)
throws BlockedException, TeiidComponentException,
TeiidProcessingException {
super.process(procEnv);
procEnv.getContext().popCall();
}
};
dynamicProgram = new Program();
dynamicProgram.addInstruction(inst);
if (dynamicCommand.getIntoGroup() != null) {
String groupName = dynamicCommand.getIntoGroup().getCanonicalName();
if (!procEnv.getTempTableStore().getAllTempTables().contains(groupName)) {
procEnv.getTempContext().add(groupName);
}
}
procEnv.push(dynamicProgram);
} catch (TeiidProcessingException e) {
Object[] params = {dynamicCommand, dynamicCommand.getSql(), e.getMessage()};
throw new QueryProcessingException(e, QueryPlugin.Util.getString("ExecDynamicSqlInstruction.couldnt_execute", params)); //$NON-NLS-1$
}
}