[teiid-commits] teiid SVN: r3018 - in trunk/engine/src: main/java/org/teiid/query/optimizer and 12 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Tue Mar 22 13:09:47 EDT 2011
Author: shawkins
Date: 2011-03-22 13:09:46 -0400 (Tue, 22 Mar 2011)
New Revision: 3018
Modified:
trunk/engine/src/main/java/org/teiid/query/metadata/GroupInfo.java
trunk/engine/src/main/java/org/teiid/query/optimizer/TriggerActionPlanner.java
trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java
trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/VariableResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/ElementSymbol.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/GroupSymbol.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java
Log:
TEIID-1520 TEIID-1523 reducing calls that construct strings and correcting null handling in dynamic sql
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/GroupInfo.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/GroupInfo.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/GroupInfo.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -30,7 +30,6 @@
import java.util.List;
import java.util.Map;
-import org.teiid.core.types.DataTypeManager;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -49,7 +48,7 @@
this.symbolList = Collections.unmodifiableList(new ArrayList(symbols.values()));
this.shortNameToSymbolMap = new HashMap<String, ElementSymbol>(symbolList.size());
for (ElementSymbol symbol : symbolList) {
- shortNameToSymbolMap.put(DataTypeManager.getCanonicalString(symbol.getShortCanonicalName()), symbol);
+ shortNameToSymbolMap.put(symbol.getShortCanonicalName(), symbol);
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/TriggerActionPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/TriggerActionPlanner.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/TriggerActionPlanner.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -93,15 +93,17 @@
throw new AssertionError();
}
- for (Map.Entry<String, Expression> entry : QueryResolver.getVariableValues(userCommand, false, metadata).entrySet()) {
- if (entry.getKey().startsWith(ProcedureReservedWords.INPUTS)) {
+ for (Map.Entry<ElementSymbol, Expression> entry : QueryResolver.getVariableValues(userCommand, false, metadata).entrySet()) {
+ if (entry.getKey().getGroupSymbol().getShortName().equalsIgnoreCase(ProcedureReservedWords.INPUTS)) {
Expression value = entry.getValue() instanceof SingleElementSymbol ? entry.getValue() : new ExpressionSymbol("x", entry.getValue()); //$NON-NLS-1$
- params.put(new ElementSymbol(SQLConstants.Reserved.NEW + ElementSymbol.SEPARATOR + SingleElementSymbol.getShortName(entry.getKey())), value);
+ ElementSymbol newElementSymbol = entry.getKey().clone();
+ newElementSymbol.getGroupSymbol().setName(SQLConstants.Reserved.NEW);
+ params.put(newElementSymbol, value);
if (userCommand instanceof Update) {
((Query)query).getSelect().addSymbol((SelectSymbol) value);
}
} else {
- params.put(new ElementSymbol(entry.getKey()), entry.getValue());
+ params.put(entry.getKey(), entry.getValue());
}
}
ForEachRowPlan result = new ForEachRowPlan();
Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ExecDynamicSqlInstruction.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -61,6 +61,7 @@
import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.util.VariableContext;
@@ -167,7 +168,7 @@
validateDynamicCommand(procEnv, command);
// create a new set of variables including vars
- Map nameValueMap = createVariableValuesMap(localContext);
+ Map<ElementSymbol, Expression> nameValueMap = createVariableValuesMap(localContext);
nameValueMap.putAll(QueryResolver.getVariableValues(parentProcCommand.getUserCommand(), false, metadata));
ValidationVisitor visitor = new ValidationVisitor();
visitor.setUpdateProc(parentProcCommand);
@@ -236,7 +237,9 @@
new Object[] { this, " The using variable ", //$NON-NLS-1$
setClause.getSymbol(), " has value :", assignment }); //$NON-NLS-1$
localContext.setValue(setClause.getSymbol(), assignment);
- localContext.setValue(new ElementSymbol(Reserved.USING + ElementSymbol.SEPARATOR + setClause.getSymbol().getShortName()), assignment);
+ ElementSymbol es = setClause.getSymbol().clone();
+ es.getGroupSymbol().setShortName(Reserved.USING);
+ localContext.setValue(es, assignment);
}
}
}
@@ -245,17 +248,13 @@
* @param localContext
* @return
*/
- private Map createVariableValuesMap(VariableContext localContext) {
- Map variableMap = new HashMap();
+ private Map<ElementSymbol, Expression> createVariableValuesMap(VariableContext localContext) {
+ Map<ElementSymbol, Object> variableMap = new HashMap<ElementSymbol, Object>();
localContext.getFlattenedContextMap(variableMap);
- Map nameValueMap = new HashMap(variableMap.size());
- Iterator entries = variableMap.entrySet().iterator();
- while (entries.hasNext()) {
- Map.Entry entry = (Map.Entry) entries.next();
- nameValueMap.put(((ElementSymbol) entry.getKey())
- .getCanonicalName(), new Constant(entry.getValue()));
+ Map<ElementSymbol, Expression> nameValueMap = new HashMap<ElementSymbol, Expression>(variableMap.size());
+ for (Map.Entry<ElementSymbol, Object> entry : variableMap.entrySet()) {
+ nameValueMap.put(entry.getKey(), new Constant(entry.getValue(), entry.getKey().getType()));
}
-
return nameValueMap;
}
@@ -303,7 +302,7 @@
// conversion between the
// two
Object[] params = new Object[] { sourceTypeName,
- dynamicSymbol.getShortCanonicalName(),
+ dynamicSymbol.getShortName(),
dynamicTypeName };
throw new QueryProcessingException(QueryPlugin.Util
.getString("ExecDynamicSqlInstruction.6", params)); //$NON-NLS-1$
Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -109,6 +109,11 @@
static ElementSymbol ROWCOUNT =
new ElementSymbol(ProcedureReservedWords.VARIABLES+"."+ProcedureReservedWords.ROWCOUNT); //$NON-NLS-1$
+
+ static {
+ ROWS_UPDATED.setType(DataTypeManager.DefaultDataClasses.INTEGER);
+ ROWCOUNT.setType(DataTypeManager.DefaultDataClasses.INTEGER);
+ }
private VariableContext currentVarContext;
private boolean isUpdateProcedure = true;
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -399,7 +399,7 @@
subCommand.setExternalGroupContexts(parentContext);
}
- public static Map<String, Expression> getVariableValues(Command command, boolean changingOnly, QueryMetadataInterface metadata) throws QueryMetadataException, QueryResolverException, TeiidComponentException {
+ public static Map<ElementSymbol, Expression> getVariableValues(Command command, boolean changingOnly, QueryMetadataInterface metadata) throws QueryMetadataException, QueryResolverException, TeiidComponentException {
CommandResolver resolver = chooseResolver(command, metadata);
@@ -407,7 +407,7 @@
return ((VariableResolver)resolver).getVariableValues(command, changingOnly, metadata);
}
- return Collections.EMPTY_MAP;
+ return Collections.emptyMap();
}
public static void resolveSubqueries(Command command,
@@ -452,7 +452,9 @@
//ensure that null types match the view
List<ElementSymbol> symbols = ResolverUtil.resolveElementsInGroup(virtualGroup, qmi);
List<SingleElementSymbol> projectedSymbols = result.getProjectedSymbols();
- Assertion.assertTrue(symbols.size() == projectedSymbols.size(), "View " + virtualGroup + " does not have the correct number of projected symbols"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (symbols.size() != projectedSymbols.size()) {
+ Assertion.failed("View " + virtualGroup + " does not have the correct number of projected symbols"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
for (int i = 0; i < projectedSymbols.size(); i++) {
SingleElementSymbol projectedSymbol = projectedSymbols.get(i);
if (projectedSymbol.getType() != DataTypeManager.DefaultDataClasses.NULL) {
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/VariableResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/VariableResolver.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/VariableResolver.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -29,11 +29,12 @@
import org.teiid.core.TeiidComponentException;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
public interface VariableResolver {
- Map<String, Expression> getVariableValues(Command command, boolean changingOnly, QueryMetadataInterface metadata) throws QueryMetadataException, QueryResolverException, TeiidComponentException;
+ Map<ElementSymbol, Expression> getVariableValues(Command command, boolean changingOnly, QueryMetadataInterface metadata) throws QueryMetadataException, QueryResolverException, TeiidComponentException;
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -241,15 +241,15 @@
* @throws QueryMetadataException
* @see org.teiid.query.resolver.CommandResolver#getVariableValues(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.QueryMetadataInterface)
*/
- public Map<String, Expression> getVariableValues(Command command, boolean changingOnly,
+ public Map<ElementSymbol, Expression> getVariableValues(Command command, boolean changingOnly,
QueryMetadataInterface metadata) throws QueryMetadataException, QueryResolverException, TeiidComponentException {
Insert insert = (Insert) command;
- Map<String, Expression> result = new HashMap<String, Expression>();
+ Map<ElementSymbol, Expression> result = new HashMap<ElementSymbol, Expression>();
// iterate over the variables and values they should be the same number
- Iterator varIter = insert.getVariables().iterator();
+ Iterator<ElementSymbol> varIter = insert.getVariables().iterator();
Iterator valIter = null;
if (insert.getQueryExpression() != null) {
valIter = insert.getQueryExpression().getProjectedSymbols().iterator();
@@ -257,34 +257,32 @@
valIter = insert.getValues().iterator();
}
while (varIter.hasNext()) {
- ElementSymbol varSymbol = (ElementSymbol) varIter.next();
+ ElementSymbol varSymbol = varIter.next().clone();
- String varName = varSymbol.getShortCanonicalName();
- String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + varName;
- String inputsKey = ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + varName;
- result.put(changingKey, new Constant(Boolean.TRUE));
+ varSymbol.getGroupSymbol().setName(ProcedureReservedWords.CHANGING);
+ result.put(varSymbol, new Constant(Boolean.TRUE));
if (!changingOnly) {
- Object value = valIter.next();
- result.put(inputsKey, (Expression)value);
+ varSymbol = varSymbol.clone();
+ varSymbol.getGroupSymbol().setName(ProcedureReservedWords.INPUTS);
+ result.put(varSymbol, (Expression)valIter.next());
}
}
- Collection insertElmnts = ResolverUtil.resolveElementsInGroup(insert.getGroup(), metadata);
+ Collection<ElementSymbol> insertElmnts = ResolverUtil.resolveElementsInGroup(insert.getGroup(), metadata);
insertElmnts.removeAll(insert.getVariables());
- Iterator defaultIter = insertElmnts.iterator();
+ Iterator<ElementSymbol> defaultIter = insertElmnts.iterator();
while(defaultIter.hasNext()) {
- ElementSymbol varSymbol = (ElementSymbol) defaultIter.next();
-
- Expression value = ResolverUtil.getDefault(varSymbol, metadata);
+ ElementSymbol varSymbol = defaultIter.next().clone();
+ varSymbol.getGroupSymbol().setName(ProcedureReservedWords.CHANGING);
+ result.put(varSymbol, new Constant(Boolean.FALSE));
- String varName = varSymbol.getShortCanonicalName();
- String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + varName;
- String inputsKey = ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + varName;
- result.put(changingKey, new Constant(Boolean.FALSE));
if (!changingOnly) {
- result.put(inputsKey, value);
+ Expression value = ResolverUtil.getDefault(varSymbol, metadata);
+ varSymbol = varSymbol.clone();
+ varSymbol.getGroupSymbol().setName(ProcedureReservedWords.INPUTS);
+ result.put(varSymbol, value);
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -26,8 +26,6 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
@@ -92,40 +90,35 @@
/**
* @see org.teiid.query.resolver.VariableResolver#getVariableValues(org.teiid.query.sql.lang.Command, org.teiid.query.metadata.QueryMetadataInterface)
*/
- public Map<String, Expression> getVariableValues(Command command, boolean changingOnly,
+ public Map<ElementSymbol, Expression> getVariableValues(Command command, boolean changingOnly,
QueryMetadataInterface metadata) throws QueryMetadataException,
TeiidComponentException {
- Map result = new HashMap();
+ Map<ElementSymbol, Expression> result = new HashMap<ElementSymbol, Expression>();
Update update = (Update) command;
- List updateVars = new LinkedList();
+ Map<ElementSymbol, Expression> changing = update.getChangeList().getClauseMap();
- for (Entry<ElementSymbol, Expression> entry : update.getChangeList().getClauseMap().entrySet()) {
- ElementSymbol leftSymbol = entry.getKey();
-
- String varName = leftSymbol.getShortCanonicalName();
- String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + varName;
- String inputsKey = ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + varName;
- result.put(changingKey, new Constant(Boolean.TRUE));
+ for (Entry<ElementSymbol, Expression> entry : changing.entrySet()) {
+ ElementSymbol leftSymbol = entry.getKey().clone();
+ leftSymbol.getGroupSymbol().setName(ProcedureReservedWords.CHANGING);
+ result.put(leftSymbol, new Constant(Boolean.TRUE));
if (!changingOnly) {
- result.put(inputsKey, entry.getValue());
+ leftSymbol = leftSymbol.clone();
+ leftSymbol.getGroupSymbol().setName(ProcedureReservedWords.INPUTS);
+ result.put(leftSymbol, entry.getValue());
}
- updateVars.add(leftSymbol);
}
- Collection insertElmnts = ResolverUtil.resolveElementsInGroup(update.getGroup(), metadata);
+ Collection<ElementSymbol> insertElmnts = ResolverUtil.resolveElementsInGroup(update.getGroup(), metadata);
- insertElmnts.removeAll(updateVars);
+ insertElmnts.removeAll(changing.keySet());
- Iterator defaultIter = insertElmnts.iterator();
+ Iterator<ElementSymbol> defaultIter = insertElmnts.iterator();
while(defaultIter.hasNext()) {
- ElementSymbol varSymbol = (ElementSymbol) defaultIter.next();
-
- String varName = varSymbol.getShortCanonicalName();
- String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + varName;
-
- result.put(changingKey, new Constant(Boolean.FALSE));
+ ElementSymbol varSymbol = defaultIter.next().clone();
+ varSymbol.getGroupSymbol().setName(ProcedureReservedWords.CHANGING);
+ result.put(varSymbol, new Constant(Boolean.FALSE));
}
return result;
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -447,13 +447,12 @@
public static Expression getDefault(ElementSymbol symbol, QueryMetadataInterface metadata) throws TeiidComponentException, QueryMetadataException, QueryResolverException {
//Check if there is a default value, if so use it
Object mid = symbol.getMetadataID();
- Class type = symbol.getType();
- String name = symbol.getCanonicalName();
+ Class<?> type = symbol.getType();
Object defaultValue = metadata.getDefaultValue(mid);
if (defaultValue == null && !metadata.elementSupports(mid, SupportConstants.Element.NULL)) {
- throw new QueryResolverException(QueryPlugin.Util.getString("ResolverUtil.required_param", name)); //$NON-NLS-1$
+ throw new QueryResolverException(QueryPlugin.Util.getString("ResolverUtil.required_param", symbol.getOutputName())); //$NON-NLS-1$
}
return getProperlyTypedConstant(defaultValue, type);
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -201,7 +201,7 @@
private boolean rewriteSubcommands;
private boolean processing;
private Evaluator evaluator;
- private Map variables; //constant propagation
+ private Map<ElementSymbol, Expression> variables; //constant propagation
private int commandType;
private QueryRewriter(QueryMetadataInterface metadata,
@@ -220,7 +220,7 @@
return queryRewriter.rewriteCommand(command, false);
}
- public static Command rewrite(Command command, CreateUpdateProcedureCommand procCommand, QueryMetadataInterface metadata, CommandContext context, Map variableValues, int commandType) throws TeiidComponentException, TeiidProcessingException{
+ public static Command rewrite(Command command, CreateUpdateProcedureCommand procCommand, QueryMetadataInterface metadata, CommandContext context, Map<ElementSymbol, Expression> variableValues, int commandType) throws TeiidComponentException, TeiidProcessingException{
QueryRewriter rewriter = new QueryRewriter(metadata, context, procCommand);
rewriter.rewriteSubcommands = true;
rewriter.variables = variableValues;
@@ -307,7 +307,7 @@
private Command rewriteUpdateProcedure(CreateUpdateProcedureCommand command)
throws TeiidComponentException, TeiidProcessingException{
- Map oldVariables = variables;
+ Map<ElementSymbol, Expression> oldVariables = variables;
if (command.getUserCommand() != null) {
variables = QueryResolver.getVariableValues(command.getUserCommand(), false, metadata);
commandType = command.getUserCommand().getType();
@@ -2271,21 +2271,21 @@
ElementSymbol es = (ElementSymbol)expression;
Class<?> type = es.getType();
if (!processing && es.isExternalReference()) {
- String grpName = es.getGroupSymbol().getCanonicalName();
-
if (variables == null) {
return new Reference(es);
}
-
- Expression value = (Expression)variables.get(es.getCanonicalName());
+ Expression value = variables.get(es);
if (value == null) {
- if (grpName.equals(ProcedureReservedWords.INPUTS)) {
- return new Constant(null, es.getType());
- }
- if (grpName.equals(ProcedureReservedWords.CHANGING)) {
- Assertion.failed("Changing value should not be null"); //$NON-NLS-1$
- }
+ if (es.getGroupSymbol().getSchema() == null) {
+ String grpName = es.getGroupSymbol().getShortCanonicalName();
+ if (grpName.equals(ProcedureReservedWords.INPUTS)) {
+ return new Constant(null, es.getType());
+ }
+ if (grpName.equals(ProcedureReservedWords.CHANGING)) {
+ Assertion.failed("Changing value should not be null"); //$NON-NLS-1$
+ }
+ }
} else if (value instanceof Constant) {
if (value.getType() == type) {
return value;
@@ -3014,12 +3014,12 @@
private boolean checkInputVariables(Expression expr) throws TeiidComponentException, TeiidProcessingException{
Boolean result = null;
for (ElementSymbol var : ElementCollectorVisitor.getElements(expr, false)) {
- String grpName = var.getGroupSymbol().getName();
- if (var.isExternalReference() && grpName.equalsIgnoreCase(ProcedureReservedWords.INPUTS)) {
+ if (var.isExternalReference() && var.getGroupSymbol().getSchema() == null && var.getGroupSymbol().getShortName().equalsIgnoreCase(ProcedureReservedWords.INPUTS)) {
- String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + var.getShortCanonicalName();
+ var = var.clone();
+ var.getGroupSymbol().setShortName(ProcedureReservedWords.CHANGING);
- Boolean changingValue = (Boolean)((Constant)variables.get(changingKey)).getValue();
+ Boolean changingValue = (Boolean)((Constant)variables.get(var)).getValue();
if (result == null) {
result = changingValue;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/Block.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -88,8 +88,8 @@
stmt.setCommand(null);
stmt.setExpression(null);
String fullName = ProcedureReservedWords.VARIABLES+ElementSymbol.SEPARATOR+ProcedureReservedWords.ROWCOUNT;
- if (stmt.getVariable().getCanonicalName().equals(ProcedureReservedWords.ROWCOUNT)
- || stmt.getVariable().getCanonicalName().equals(fullName)) {
+ if (stmt.getVariable().getShortName().equalsIgnoreCase(ProcedureReservedWords.ROWCOUNT)
+ && stmt.getVariable().getCanonicalName().equals(fullName)) {
return;
}
stmt.setExpression(new ElementSymbol(fullName));
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/ElementSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/ElementSymbol.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/ElementSymbol.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -252,7 +252,7 @@
* Return a deep copy of this object.
* @return Deep copy of this object
*/
- public Object clone() {
+ public ElementSymbol clone() {
ElementSymbol copy = new ElementSymbol(getShortName(), getCanonical());
if(getGroupSymbol() != null) {
copy.setGroupSymbol(getGroupSymbol().clone());
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/GroupSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/GroupSymbol.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/GroupSymbol.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -319,4 +319,8 @@
}
return canonicalSchema;
}
+
+ public String getSchema() {
+ return schema;
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -481,16 +481,6 @@
}
public void visit(DeclareStatement obj) {
- ElementSymbol variable = obj.getVariable();
- String elementname = variable.getShortCanonicalName();
-
- // varible cannot be one of the special variables
- if(elementname.equals(ProcedureReservedWords.ROWS_UPDATED)) {
- handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0017", new Object[] {ProcedureReservedWords.ROWS_UPDATED}), obj); //$NON-NLS-1$
- } else if(elementname.equals(ProcedureReservedWords.ROWCOUNT)) {
- handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0017", new Object[] {ProcedureReservedWords.ROWCOUNT}), obj); //$NON-NLS-1$
- }
-
validateAssignment(obj, obj.getVariable());
}
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -44,7 +44,7 @@
TestPreparedStatement.helpTestProcessing(sql, Collections.EMPTY_LIST, null, new HardcodedDataManager(), FakeMetadataFactory.exampleBQTCached(), true, FakeMetadataFactory.exampleBQTVDB());
fail();
} catch (QueryResolverException e) {
- assertEquals("Required parameter 'PM4.SPTEST9.INKEY' has no value was set or is an invalid parameter.", e.getMessage()); //$NON-NLS-1$
+ assertEquals("Required parameter 'pm4.spTest9.inkey' has no value was set or is an invalid parameter.", e.getMessage()); //$NON-NLS-1$
}
}
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -246,6 +246,16 @@
helpTestMultiSourcePlan(metadata, userSql, multiModel, sources, dataMgr, expected, FakeMetadataFactory.exampleMultiBindingVDB());
}
+ @Test public void testSingleReplacementInDynamicCommandNullValue() throws Exception {
+ final QueryMetadataInterface metadata = FakeMetadataFactory.exampleMultiBinding();
+ final String userSql = "exec Virt.sq1(null)"; //$NON-NLS-1$
+ final String multiModel = "MultiModel"; //$NON-NLS-1$
+ final int sources = 3;
+ final List[] expected = new List[0];
+ final ProcessorDataManager dataMgr = new MultiSourceDataManager();
+ helpTestMultiSourcePlan(metadata, userSql, multiModel, sources, dataMgr, expected, FakeMetadataFactory.exampleMultiBindingVDB());
+ }
+
@Test public void testMultiUpdateAll() throws Exception {
final QueryMetadataInterface metadata = FakeMetadataFactory.exampleMultiBinding();
final String userSql = "update MultiModel.Phys set a = '1' where b = 'z'"; //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -1599,7 +1599,7 @@
ProcessorPlan plan = getProcedurePlan(userUpdateStr, metadata);
- helpTestProcessFailure(plan, dataMgr, "Couldn't execute the dynamic SQL command \"EXECUTE 'select e1 from pm1.g1'\" with the SQL statement \"'select e1 from pm1.g1'\" due to: The datatype 'string' for element 'E1' in the dynamic SQL cannot be implicitly converted to 'integer'.", metadata); //$NON-NLS-1$
+ helpTestProcessFailure(plan, dataMgr, "Couldn't execute the dynamic SQL command \"EXECUTE 'select e1 from pm1.g1'\" with the SQL statement \"'select e1 from pm1.g1'\" due to: The datatype 'string' for element 'e1' in the dynamic SQL cannot be implicitly converted to 'integer'.", metadata); //$NON-NLS-1$
}
@Test public void testDynamicCommandWithTwoDynamicStatements() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java 2011-03-22 14:51:13 UTC (rev 3017)
+++ trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java 2011-03-22 17:09:46 UTC (rev 3018)
@@ -2322,6 +2322,7 @@
FakeMetadataObject rs2 = FakeMetadataFactory.createResultSet("Virt.rs1", virtModel, new String[] { "a", "b" }, new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
FakeMetadataObject rs2p1 = FakeMetadataFactory.createParameter("ret", 1, ParameterInfo.RESULT_SET, DataTypeManager.DefaultDataTypes.OBJECT, rs2); //$NON-NLS-1$
FakeMetadataObject rs2p2 = FakeMetadataFactory.createParameter("in", 2, ParameterInfo.IN, DataTypeManager.DefaultDataTypes.STRING, null); //$NON-NLS-1$
+ rs2p2.putProperty(FakeMetadataObject.Props.NULL, Boolean.TRUE);
QueryNode sq2n1 = new QueryNode("pm1.sq1", "CREATE VIRTUAL PROCEDURE BEGIN\n" //$NON-NLS-1$ //$NON-NLS-2$
+ "execute string 'SELECT a, b FROM MultiModel.Phys where SOURCE_NAME = Virt.sq1.in'; END"); //$NON-NLS-1$
FakeMetadataObject sq1 = FakeMetadataFactory.createVirtualProcedure("Virt.sq1", virtModel, Arrays.asList(new FakeMetadataObject[] { rs2p1, rs2p2 }), sq2n1); //$NON-NLS-1$
More information about the teiid-commits
mailing list