[teiid-commits] teiid SVN: r2955 - in trunk: client/src/main/java/org/teiid/client/metadata and 9 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Mar 1 16:25:23 EST 2011


Author: shawkins
Date: 2011-03-01 16:25:23 -0500 (Tue, 01 Mar 2011)
New Revision: 2955

Modified:
   trunk/api/src/main/java/org/teiid/translator/TypeFacility.java
   trunk/client/src/main/java/org/teiid/client/metadata/ResultsMetadataDefaults.java
   trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
   trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2ExecutionFactory.java
   trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/db2/TestDB2SqlTranslator.java
   trunk/engine/src/main/java/org/teiid/query/mapping/relational/QueryNode.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java
   trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
Log:
TEIID-1487 TEIID-1483 refining null type handling logic and binding handling 

Modified: trunk/api/src/main/java/org/teiid/translator/TypeFacility.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/TypeFacility.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/api/src/main/java/org/teiid/translator/TypeFacility.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -34,6 +34,7 @@
 import org.teiid.core.types.ClobType;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.JDBCSQLTypeInfo;
+import org.teiid.core.types.NullType;
 import org.teiid.core.types.XMLType;
 import org.teiid.core.util.TimestampWithTimezone;
 
@@ -60,6 +61,7 @@
         public static final Class<BlobType> BLOB          = DataTypeManager.DefaultDataClasses.BLOB;
         public static final Class<ClobType> CLOB          = DataTypeManager.DefaultDataClasses.CLOB;
         public static final Class<XMLType> XML           = DataTypeManager.DefaultDataClasses.XML;
+        public static final Class<NullType> NULL         = DataTypeManager.DefaultDataClasses.NULL;
     }
     
     public static final class RUNTIME_NAMES {

Modified: trunk/client/src/main/java/org/teiid/client/metadata/ResultsMetadataDefaults.java
===================================================================
--- trunk/client/src/main/java/org/teiid/client/metadata/ResultsMetadataDefaults.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/client/src/main/java/org/teiid/client/metadata/ResultsMetadataDefaults.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -44,9 +44,9 @@
     public static final String UPDATE_COLUMN = "count"; //$NON-NLS-1$
 
     /** Maximum display size for the data type (Class -> Integer) */
-    private static final Map MAX_DISPLAY_SIZE = new HashMap(21, 1.0f);
+    private static final Map<String, Integer> MAX_DISPLAY_SIZE = new HashMap<String, Integer>();
     /** Default precision for a data type (String -> Integer) */
-    private static final Map DEFAULT_PRECISION = new HashMap(21, 1.0f);
+    private static final Map<String, Integer> DEFAULT_PRECISION = new HashMap<String, Integer>();
 
     static {
         MAX_DISPLAY_SIZE.put(DataTypeManager.DefaultDataTypes.BIG_DECIMAL, new Integer(22));
@@ -68,6 +68,7 @@
         MAX_DISPLAY_SIZE.put(DataTypeManager.DefaultDataTypes.TIME, new Integer(8));
         MAX_DISPLAY_SIZE.put(DataTypeManager.DefaultDataTypes.TIMESTAMP, new Integer(29));
         MAX_DISPLAY_SIZE.put(DataTypeManager.DefaultDataTypes.XML, new Integer(Integer.MAX_VALUE));
+        MAX_DISPLAY_SIZE.put(DataTypeManager.DefaultDataTypes.NULL, 4);
 
         /* NOTE1
          * For non-numeric columns (BLOB, BOOLEAN, CHAR, CLOB, DATE, OBJECT, STRING, TIME, TIMESTAMP, XML),
@@ -92,22 +93,23 @@
         DEFAULT_PRECISION.put(DataTypeManager.DefaultDataTypes.TIME, new Integer(8));
         DEFAULT_PRECISION.put(DataTypeManager.DefaultDataTypes.TIMESTAMP, new Integer(29));
         DEFAULT_PRECISION.put(DataTypeManager.DefaultDataTypes.XML, new Integer(Integer.MAX_VALUE));
+        DEFAULT_PRECISION.put(DataTypeManager.DefaultDataTypes.NULL, 1);
     }
     
-    public static Integer getMaxDisplaySize(Class dataTypeClass) {
-        return (Integer)MAX_DISPLAY_SIZE.get(DataTypeManager.getDataTypeName(dataTypeClass));
+    public static Integer getMaxDisplaySize(Class<?> dataTypeClass) {
+        return MAX_DISPLAY_SIZE.get(DataTypeManager.getDataTypeName(dataTypeClass));
     }
     
     public static Integer getMaxDisplaySize(String typeName) {
-        return (Integer)MAX_DISPLAY_SIZE.get(typeName);
+        return MAX_DISPLAY_SIZE.get(typeName);
     }
     
-    public static Integer getDefaultPrecision(Class dataTypeClass) {
-        return (Integer)DEFAULT_PRECISION.get(DataTypeManager.getDataTypeName(dataTypeClass));
+    public static Integer getDefaultPrecision(Class<?> dataTypeClass) {
+        return DEFAULT_PRECISION.get(DataTypeManager.getDataTypeName(dataTypeClass));
     }
     
     public static Integer getDefaultPrecision(String typeName) {
-        return (Integer)DEFAULT_PRECISION.get(typeName);
+        return DEFAULT_PRECISION.get(typeName);
     }
     
     /** Uninstantiable */

Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -61,28 +61,30 @@
     public static final int BLOB = 15;
     public static final int CLOB = 16;
     public static final int XML = 17;
+    public static final int NULL = 18;
 
     private static final Map<Class<?>, Integer> typeMap = new HashMap<Class<?>, Integer>();
     
     static {
-        typeMap.put(TypeFacility.RUNTIME_TYPES.STRING, new Integer(STRING));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.CHAR, new Integer(CHAR));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.BOOLEAN, new Integer(BOOLEAN));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.BYTE, new Integer(BYTE));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.SHORT, new Integer(SHORT));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.INTEGER, new Integer(INTEGER));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.LONG, new Integer(LONG));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_INTEGER, new Integer(BIGINTEGER));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.FLOAT, new Integer(FLOAT));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.DOUBLE, new Integer(DOUBLE));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_DECIMAL, new Integer(BIGDECIMAL));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.DATE, new Integer(DATE));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.TIME, new Integer(TIME));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.TIMESTAMP, new Integer(TIMESTAMP));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.OBJECT, new Integer(OBJECT));        
-        typeMap.put(TypeFacility.RUNTIME_TYPES.BLOB, new Integer(BLOB));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.CLOB, new Integer(CLOB));
-        typeMap.put(TypeFacility.RUNTIME_TYPES.XML, new Integer(XML));
+        typeMap.put(TypeFacility.RUNTIME_TYPES.STRING, STRING);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.CHAR, CHAR);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.BOOLEAN, BOOLEAN);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.BYTE, BYTE);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.SHORT, SHORT);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.INTEGER, INTEGER);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.LONG, LONG);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_INTEGER, BIGINTEGER);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.FLOAT, FLOAT);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.DOUBLE, DOUBLE);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_DECIMAL, BIGDECIMAL);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.DATE, DATE);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.TIME, TIME);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.TIMESTAMP, TIMESTAMP);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.OBJECT, OBJECT);        
+        typeMap.put(TypeFacility.RUNTIME_TYPES.BLOB, BLOB);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.CLOB, CLOB);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.XML, XML);
+        typeMap.put(TypeFacility.RUNTIME_TYPES.NULL, NULL);
     }    
     
     public static int getCode(Class<?> source) {

Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2ExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2ExecutionFactory.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2ExecutionFactory.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -35,10 +35,10 @@
 import org.teiid.language.Literal;
 import org.teiid.language.Comparison.Operator;
 import org.teiid.language.Join.JoinType;
+import org.teiid.translator.ExecutionContext;
+import org.teiid.translator.SourceSystemFunctions;
 import org.teiid.translator.Translator;
 import org.teiid.translator.TranslatorException;
-import org.teiid.translator.ExecutionContext;
-import org.teiid.translator.SourceSystemFunctions;
 import org.teiid.translator.TypeFacility;
 import org.teiid.translator.jdbc.AliasModifier;
 import org.teiid.translator.jdbc.ConvertModifier;
@@ -140,7 +140,11 @@
 			if (selectSymbol.getExpression() instanceof Literal) {
 				Literal literal = (Literal)selectSymbol.getExpression();
 				if (literal.getValue() == null) {
-					selectSymbol.setExpression(ConvertModifier.createConvertFunction(getLanguageFactory(), literal, TypeFacility.getDataTypeName(literal.getType())));
+					String type = TypeFacility.RUNTIME_NAMES.INTEGER;
+					if (literal.getType() != TypeFacility.RUNTIME_TYPES.NULL) {
+						type = TypeFacility.getDataTypeName(literal.getType());
+					}
+					selectSymbol.setExpression(ConvertModifier.createConvertFunction(getLanguageFactory(), literal, type));
 				}
 			}
 		}

Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/db2/TestDB2SqlTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/db2/TestDB2SqlTranslator.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/db2/TestDB2SqlTranslator.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -22,7 +22,7 @@
 
 package org.teiid.translator.jdbc.db2;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -31,8 +31,8 @@
 import org.teiid.cdk.unittest.FakeTranslationFactory;
 import org.teiid.core.util.UnitTestUtil;
 import org.teiid.language.Command;
+import org.teiid.translator.ExecutionContext;
 import org.teiid.translator.TranslatorException;
-import org.teiid.translator.ExecutionContext;
 import org.teiid.translator.jdbc.TranslatedCommand;
 import org.teiid.translator.jdbc.TranslationHelper;
 
@@ -114,6 +114,16 @@
                 input, 
                 output);
     }    
+    
+    @Test
+    public void testSelectNullLiteral1() throws Exception {
+        String input = "select x, intkey from (select null as x, intkey from BQT1.Smalla) y "; //$NON-NLS-1$       
+        String output = "SELECT y.x, y.intkey FROM (SELECT cast(NULL AS integer) AS x, SmallA.IntKey FROM SmallA) AS y";  //$NON-NLS-1$
+        
+        helpTestVisitor(FakeTranslationFactory.getInstance().getBQTTranslationUtility(),
+                input, 
+                output);
+    }    
 
     /**
      * Test the translator's ability to rewrite the LOCATE() function in a form 

Modified: trunk/engine/src/main/java/org/teiid/query/mapping/relational/QueryNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/mapping/relational/QueryNode.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/engine/src/main/java/org/teiid/query/mapping/relational/QueryNode.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -45,7 +45,7 @@
 	// Initial state
 	private String groupName;
 	private String query;
-	private List bindings;     // optional - construct if needed
+	private List<String> bindings;     // optional - construct if needed
 
 	// After parsing and resolution
 	private Command command;
@@ -91,7 +91,7 @@
      */
     public void addBinding(String binding) {
         if(this.bindings == null) {
-            this.bindings = new ArrayList();
+            this.bindings = new ArrayList<String>();
         }
         this.bindings.add(binding);
     }
@@ -100,7 +100,7 @@
      * Get list of bindings.
      * @return bindings
      */
-    public List getBindings() {
+    public List<String> getBindings() {
         return this.bindings;
     }
 
@@ -108,8 +108,8 @@
      * Set all of the bindings (existing are dropped)
      * @param bindings New bindings
      */
-    public void setBindings(List bindings) {
-        this.bindings = new ArrayList(bindings);
+    public void setBindings(List<String> bindings) {
+        this.bindings = new ArrayList<String>(bindings);
     }
 
     /**

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/xml/QueryUtil.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -27,6 +27,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -82,7 +83,7 @@
         if (query == null) {
             try {
                 query = QueryParser.getQueryParser().parseCommand(queryNode.getQuery());
-                QueryResolver.resolveWithBindingMetadata(query, env.getGlobalMetadata(), queryNode);
+                QueryResolver.resolveWithBindingMetadata(query, env.getGlobalMetadata(), queryNode, true);
             } catch (TeiidException e) {
                 throw new QueryPlannerException(e, QueryPlugin.Util.getString("ERR.015.004.0054", new Object[]{queryNode.getGroupName(), queryNode.getQuery()})); //$NON-NLS-1$
 			}
@@ -187,7 +188,7 @@
     }
     
     static List<ElementSymbol> getBindingsReferences(LanguageObject object, Collection<ElementSymbol> allBindings) {
-    	List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
+    	List<ElementSymbol> elements = new LinkedList<ElementSymbol>();
     	ElementCollectorVisitor visitor = new ElementCollectorVisitor(elements);
         DeepPreOrderNavigator.doVisit(object, visitor);
         for (Iterator<ElementSymbol> i = elements.iterator(); i.hasNext();) {

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-01 21:12:17 UTC (rev 2954)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -29,7 +29,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.api.exception.query.QueryResolverException;
@@ -149,14 +148,14 @@
 	    case Command.TYPE_QUERY:
 	        QueryNode queryNode = metadata.getVirtualPlan(metadata.getGroupID(container.getCanonicalName()));
             
-	        return resolveWithBindingMetadata(currentCommand, metadata, queryNode);
+	        return resolveWithBindingMetadata(currentCommand, metadata, queryNode, false);
     	case Command.TYPE_INSERT:
     	case Command.TYPE_UPDATE:
     	case Command.TYPE_DELETE:
     	case Command.TYPE_STORED_PROCEDURE:
     		ProcedureContainerResolver.findChildCommandMetadata(currentCommand, container, type, metadata);
     	}
-    	return resolveCommand(currentCommand, metadata, true);
+    	return resolveCommand(currentCommand, metadata, false);
     }
 
 	/**
@@ -167,13 +166,11 @@
 	 * be marked as external references.
 	 */
 	public static TempMetadataStore resolveWithBindingMetadata(Command currentCommand,
-			QueryMetadataInterface metadata, QueryNode queryNode)
+			QueryMetadataInterface metadata, QueryNode queryNode, boolean replaceBindings)
 			throws TeiidComponentException, QueryResolverException {
 		Map<ElementSymbol, ElementSymbol> symbolMap = null;
 		if (queryNode.getBindings() != null && queryNode.getBindings().size() > 0) {
 			symbolMap = new HashMap<ElementSymbol, ElementSymbol>();
-			// GroupSymbol (name form) for InputSet
-		    GroupSymbol inputSetSymbol = new GroupSymbol(ProcedureReservedWords.INPUT);
 
 		    // Create ElementSymbols for each InputParameter
 		    final List<ElementSymbol> elements = new ArrayList<ElementSymbol>(queryNode.getBindings().size());
@@ -189,6 +186,7 @@
 		    	elementSymbol.setIsExternalReference(true);
 		    	if (!positional) {
 		    		symbolMap.put(new ElementSymbol(ProcedureReservedWords.INPUT + ElementSymbol.SEPARATOR + name), (ElementSymbol)elementSymbol.clone());
+		    		symbolMap.put(new ElementSymbol(ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + name), (ElementSymbol)elementSymbol.clone());
 		    		elementSymbol.setName(name);
 		    	}
 		        elements.add(elementSymbol);
@@ -210,19 +208,16 @@
 		    	DeepPostOrderNavigator.doVisit(currentCommand, emv);
 		    } else {
 		        TempMetadataStore rootExternalStore = new TempMetadataStore();
-		        rootExternalStore.addTempGroup(inputSetSymbol.getName(), elements);
-		        currentCommand.addExternalGroupToContext(inputSetSymbol);
-   
-		        Map tempMetadata = currentCommand.getTemporaryMetadata();
-		        if(tempMetadata == null) {
-		            currentCommand.setTemporaryMetadata(rootExternalStore.getData());
-		        } else {
-		            tempMetadata.putAll(rootExternalStore.getData());
-		        }
+		        
+		        GroupContext externalGroups = new GroupContext();
+		        
+		        ProcedureContainerResolver.addScalarGroup(ProcedureReservedWords.INPUT, rootExternalStore, externalGroups, elements);
+		        ProcedureContainerResolver.addScalarGroup(ProcedureReservedWords.INPUTS, rootExternalStore, externalGroups, elements);
+		        QueryResolver.setChildMetadata(currentCommand, rootExternalStore.getData(), externalGroups);
 		    }
 		}
-		TempMetadataStore result = resolveCommand(currentCommand, metadata, true);
-		if (symbolMap != null && !symbolMap.isEmpty()) {
+		TempMetadataStore result = resolveCommand(currentCommand, metadata, false);
+		if (replaceBindings && symbolMap != null && !symbolMap.isEmpty()) {
 			ExpressionMappingVisitor emv = new ExpressionMappingVisitor(symbolMap);
 			emv.setClone(true);
 			DeepPostOrderNavigator.doVisit(currentCommand, emv);
@@ -445,9 +440,9 @@
                 bindings = qnode.getBindings();
             }
             if (bindings != null && !bindings.isEmpty()) {
-            	QueryResolver.resolveCommand(result, virtualGroup, Command.TYPE_QUERY, qmi);
+            	QueryResolver.resolveWithBindingMetadata(result, qmi, qnode, true);
             } else {
-            	QueryResolver.resolveCommand(result, qmi);
+            	QueryResolver.resolveCommand(result, qmi, false);
             }
 	        Request.validateWithVisitor(new ValidationVisitor(), qmi, result);
 	        qmi.addToMetadataCache(virtualGroup.getMetadataID(), "transformation/" + cacheString, result.clone()); //$NON-NLS-1$

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/SetQueryResolver.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -24,7 +24,6 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 
 import org.teiid.api.exception.query.QueryMetadataException;
@@ -62,10 +61,9 @@
         QueryResolver.setChildMetadata(firstCommand, setQuery);
         QueryResolver.resolveCommand(firstCommand, metadata.getMetadata(), false);
 
-        List firstProject = firstCommand.getProjectedSymbols();
+        List<SingleElementSymbol> firstProject = firstCommand.getProjectedSymbols();
         List<Class<?>> firstProjectTypes = new ArrayList<Class<?>>();
-        for (Iterator j = firstProject.iterator(); j.hasNext();) {
-            SingleElementSymbol symbol = (SingleElementSymbol)j.next();
+        for (SingleElementSymbol symbol : firstProject) {
             firstProjectTypes.add(symbol.getType());
         }
 

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -183,8 +183,14 @@
                 resolveAgainstGroups(shortCanonicalName, matchedGroups, matches);
                 
                 if (matches.size() > 1) {
-                    handleUnresolvedElement(elementSymbol, QueryPlugin.Util.getString("ERR.015.008.0053", elementSymbol)); //$NON-NLS-1$
-                    return;
+                	if (isExternal && matches.size() == 2 
+                			&& ((isScalar(matches.get(0).element, ProcedureReservedWords.INPUTS) && isScalar(matches.get(1).element, ProcedureReservedWords.INPUT))
+                					|| (isScalar(matches.get(1).element, ProcedureReservedWords.INPUTS) && isScalar(matches.get(0).element, ProcedureReservedWords.INPUT)))) {
+                		matches.remove();
+                	} else {
+                	    handleUnresolvedElement(elementSymbol, QueryPlugin.Util.getString("ERR.015.008.0053", elementSymbol)); //$NON-NLS-1$
+                	    return;
+                	}
                 }
                 
                 if (matches.size() == 1) {
@@ -211,8 +217,7 @@
         GroupSymbol resolvedGroup = match.group;
         String oldName = elementSymbol.getOutputName();
         if (isExternal //convert input to inputs
-        		&& metadata.isScalarGroup(resolvedSymbol.getGroupSymbol().getMetadataID())
-        		&& ProcedureReservedWords.INPUT.equals(groupContext)) {
+        		&& isScalar(resolvedSymbol, ProcedureReservedWords.INPUT)) {
         	resolvedSymbol = new ElementSymbol(ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + elementShortName);
         	resolveElementSymbol(resolvedSymbol);
         	oldName = resolvedSymbol.getOutputName();
@@ -230,6 +235,11 @@
         elementSymbol.setName(resolvedSymbol.getName());
         elementSymbol.setOutputName(oldName);
    }
+    
+    private boolean isScalar(ElementSymbol resolvedSymbol, String group) throws QueryMetadataException, TeiidComponentException {
+    	return metadata.isScalarGroup(resolvedSymbol.getGroupSymbol().getMetadataID())
+		&& group.equals(resolvedSymbol.getGroupSymbol().getCanonicalName());
+    }
 
     private void resolveAgainstGroups(String elementShortName,
                                       Collection<GroupSymbol> matchedGroups, LinkedList<ElementMatch> matches) throws QueryMetadataException,

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-03-01 21:12:17 UTC (rev 2954)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-03-01 21:25:23 UTC (rev 2955)
@@ -234,7 +234,7 @@
         QueryNode qn = new QueryNode("x", sql);
         qn.setBindings(bindings);
         // resolve
-    	QueryResolver.resolveWithBindingMetadata(command, metadata, qn);
+    	QueryResolver.resolveWithBindingMetadata(command, metadata, qn, true);
 
         CheckSymbolsAreResolvedVisitor vis = new CheckSymbolsAreResolvedVisitor();
         DeepPreOrderNavigator.doVisit(command, vis);



More information about the teiid-commits mailing list