[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