[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