[teiid-commits] teiid SVN: r1146 - in trunk/engine/src: test/java/com/metamatrix/query/optimizer and 4 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Fri Jul 17 10:44:22 EDT 2009
Author: shawkins
Date: 2009-07-17 10:44:22 -0400 (Fri, 17 Jul 2009)
New Revision: 1146
Modified:
trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java
trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java
trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java
trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java
Log:
TEIID-727 adding a conversion to ensure that the lookup search value matches the type of the key value.
Modified: trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java 2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java 2009-07-17 14:44:22 UTC (rev 1146)
@@ -825,41 +825,42 @@
Expression[] args = lookup.getArgs();
ResolvedLookup result = new ResolvedLookup();
// Special code to handle setting return type of the lookup function to match the type of the return element
- if( args[0] instanceof Constant && args[1] instanceof Constant && args[2] instanceof Constant) {
- // If code table name in lookup function refers to virtual group, throws exception
- GroupSymbol groupSym = new GroupSymbol((String) ((Constant)args[0]).getValue());
- try {
- groupSym.setMetadataID(metadata.getGroupID((String) ((Constant)args[0]).getValue()));
- if (groupSym.getMetadataID() instanceof TempMetadataID) {
- throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0065, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0065, ((Constant)args[0]).getValue()));
- }
- } catch(QueryMetadataException e) {
- throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, ((Constant)args[0]).getValue()));
+ if( !(args[0] instanceof Constant) || !(args[1] instanceof Constant) || !(args[2] instanceof Constant)) {
+ throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0063, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0063));
+ }
+ // If code table name in lookup function refers to temp group throw exception
+ GroupSymbol groupSym = new GroupSymbol((String) ((Constant)args[0]).getValue());
+ try {
+ groupSym.setMetadataID(metadata.getGroupID((String) ((Constant)args[0]).getValue()));
+ if (groupSym.getMetadataID() instanceof TempMetadataID) {
+ throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0065, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0065, ((Constant)args[0]).getValue()));
}
- result.setGroup(groupSym);
-
- List<GroupSymbol> groups = Arrays.asList(groupSym);
-
- String returnElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[1]).getValue(); //$NON-NLS-1$
- ElementSymbol returnElement = new ElementSymbol(returnElementName);
- try {
- ResolverVisitor.resolveLanguageObject(returnElement, groups, metadata);
- } catch(QueryMetadataException e) {
- throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, returnElementName));
- }
- result.setReturnElement(returnElement);
-
- String keyElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[2]).getValue(); //$NON-NLS-1$
- ElementSymbol keyElement = new ElementSymbol(keyElementName);
- try {
- ResolverVisitor.resolveLanguageObject(keyElement, groups, metadata);
- } catch(QueryMetadataException e) {
- throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, keyElementName));
- }
- result.setKeyElement(keyElement);
- return result;
- }
- throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0063, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0063));
+ } catch(QueryMetadataException e) {
+ throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, ((Constant)args[0]).getValue()));
+ }
+ result.setGroup(groupSym);
+
+ List<GroupSymbol> groups = Arrays.asList(groupSym);
+
+ String returnElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[1]).getValue(); //$NON-NLS-1$
+ ElementSymbol returnElement = new ElementSymbol(returnElementName);
+ try {
+ ResolverVisitor.resolveLanguageObject(returnElement, groups, metadata);
+ } catch(QueryMetadataException e) {
+ throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, returnElementName));
+ }
+ result.setReturnElement(returnElement);
+
+ String keyElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[2]).getValue(); //$NON-NLS-1$
+ ElementSymbol keyElement = new ElementSymbol(keyElementName);
+ try {
+ ResolverVisitor.resolveLanguageObject(keyElement, groups, metadata);
+ } catch(QueryMetadataException e) {
+ throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, keyElementName));
+ }
+ result.setKeyElement(keyElement);
+ args[3] = convertExpression(args[3], DataTypeManager.getDataTypeName(keyElement.getType()));
+ return result;
}
private static QueryResolverException handleUnresolvedGroup(GroupSymbol symbol, String description) {
Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java 2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java 2009-07-17 14:44:22 UTC (rev 1146)
@@ -3557,21 +3557,21 @@
});
}
- /** defect 11630 - note that the lookup function is pushed down, it will actually be evaluated before being sent to the connector */
+ /** defect 11630 - note that the lookup function is not pushed down, it will actually be evaluated before being sent to the connector */
public void testLookupFunction() {
- ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 'value') IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
- new String[] { "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1', 'e1', 'e2', 'value') IS NULL" }); //$NON-NLS-1$
+ ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 1) IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
+ new String[] { "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1', 'e1', 'e2', 1) IS NULL" }); //$NON-NLS-1$
checkNodeTypes(plan, FULL_PUSHDOWN);
}
/** case 5213 - note here that the lookup cannot be pushed down since it is dependent upon an element symbol*/
- public void testLookupFunction2() {
+ public void testLookupFunction2() throws Exception {
- ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', e1) IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
- new String[] { "SELECT e1 FROM pm1.g2" }); //$NON-NLS-1$
+ ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', e2) IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
+ new String[] { "SELECT g_0.e2, g_0.e1 FROM pm1.g2 AS g_0" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
1, // Access
@@ -3594,7 +3594,7 @@
/** defect 21965 */
public void testLookupFunctionInSelect() {
- ProcessorPlan plan = helpPlan("SELECT e1, LOOKUP('pm1.g1','e1', 'e2', 'value') FROM pm1.g2", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
+ ProcessorPlan plan = helpPlan("SELECT e1, LOOKUP('pm1.g1','e1', 'e2', 1) FROM pm1.g2", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
new String[] { "SELECT e1 FROM pm1.g2" }); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2009-07-17 14:44:22 UTC (rev 1146)
@@ -7029,7 +7029,7 @@
capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
// Plan query
- String sql = "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 'value') = e1";//$NON-NLS-1$
+ String sql = "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 1) = e1";//$NON-NLS-1$
Command command = TestProcessor.helpParse(sql);
ProcessorPlan plan = helpGetPlan(command, FakeMetadataFactory.example1Cached(), capFinder);
@@ -7041,7 +7041,7 @@
FakeDataManager dataManager = new FakeDataManager();
sampleData1(dataManager);
Map valueMap = new HashMap();
- valueMap.put("value", "b"); //$NON-NLS-1$ //$NON-NLS-2$
+ valueMap.put(1, "b"); //$NON-NLS-1$ //$NON-NLS-2$
dataManager.defineCodeTable("pm1.g1", "e2", "e1", valueMap); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
dataManager.setThrowBlocked(true);
Modified: trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java 2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java 2009-07-17 14:44:22 UTC (rev 1146)
@@ -121,10 +121,26 @@
private Function helpResolveFunction(String sql) throws QueryParserException,
QueryResolverException, MetaMatrixComponentException {
- Function func = (Function)QueryParser.getQueryParser().parseExpression(sql);
- ResolverVisitor.resolveLanguageObject(func, FakeMetadataFactory.example1Cached());
+ Function func = getFunction(sql);
assertEquals(DataTypeManager.DefaultDataClasses.STRING, func.getType());
return func;
}
+
+ private Function getFunction(String sql) throws QueryParserException,
+ MetaMatrixComponentException, QueryResolverException {
+ Function func = (Function)QueryParser.getQueryParser().parseExpression(sql);
+ ResolverVisitor.resolveLanguageObject(func, FakeMetadataFactory.example1Cached());
+ return func;
+ }
+ /**
+ * e1 is of type string, so 1 should be converted to string
+ * @throws Exception
+ */
+ @Test public void testLookupTypeConversion() throws Exception {
+ String sql = "lookup('pm1.g1', 'e2', 'e1', 1)"; //$NON-NLS-1$
+ Function f = getFunction(sql);
+ assertEquals(DataTypeManager.DefaultDataClasses.STRING, f.getArg(3).getType());
+ }
+
}
Modified: trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java 2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java 2009-07-17 14:44:22 UTC (rev 1146)
@@ -1458,20 +1458,20 @@
//base test. no change is expected
public void testRewriteLookupFunction1() {
- String criteria = "lookup('pm1.g1','e1', 'e2', 'value') = 'ab'"; //$NON-NLS-1$
+ String criteria = "lookup('pm1.g1','e1', 'e2', 1) = 'ab'"; //$NON-NLS-1$
CompareCriteria expected = (CompareCriteria)parseCriteria(criteria, FakeMetadataFactory.example1Cached());
helpTestRewriteCriteria(criteria, expected, FakeMetadataFactory.example1Cached());
}
public void testRewriteLookupFunction1b() {
- helpTestRewriteCriteria("lookup('pm1.g1','e1', 'e2', pm1.g1.e1) = 'ab'", "lookup('pm1.g1','e1', 'e2', pm1.g1.e1) = 'ab'"); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTestRewriteCriteria("lookup('pm1.g1','e1', 'e2', pm1.g1.e2) = 'ab'", "lookup('pm1.g1','e1', 'e2', pm1.g1.e2) = 'ab'"); //$NON-NLS-1$ //$NON-NLS-2$
}
/** defect 11630 1 should still get rewritten as '1'*/
public void testRewriteLookupFunctionCompoundCriteria() {
- String criteria = "LOOKUP('pm1.g1','e1', 'e2', 'value') IS NULL AND pm1.g1.e1='1'"; //$NON-NLS-1$
+ String criteria = "LOOKUP('pm1.g1','e1', 'e2', 1) IS NULL AND pm1.g1.e1='1'"; //$NON-NLS-1$
CompoundCriteria expected = (CompoundCriteria)parseCriteria(criteria, FakeMetadataFactory.example1Cached());
- helpTestRewriteCriteria("LOOKUP('pm1.g1','e1', 'e2', 'value') IS NULL AND pm1.g1.e1=1", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
+ helpTestRewriteCriteria("LOOKUP('pm1.g1','e1', 'e2', 1) IS NULL AND pm1.g1.e1=1", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
}
public void testSelectWithNoFrom() {
@@ -1680,9 +1680,9 @@
}
public void testRewriteSearchedCaseExpr4() {
- String criteria = "lookup('pm1.g1', 'e2', 'e1', null) = 0"; //$NON-NLS-1$
+ String criteria = "lookup('pm1.g1', 'e2', 'e1', '2') = 0"; //$NON-NLS-1$
CompareCriteria expected = (CompareCriteria)parseCriteria(criteria, FakeMetadataFactory.example1Cached());
- helpTestRewriteCriteria("lookup('pm1.g1', 'e2', 'e1', case 0 when 1 then pm1.g1.e1 end) = 0", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
+ helpTestRewriteCriteria("lookup('pm1.g1', 'e2', 'e1', case 0 when 1 then pm1.g1.e1 else 2 end) = 0", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
}
// First WHEN always false, so remove it
Modified: trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java 2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java 2009-07-17 14:44:22 UTC (rev 1146)
@@ -1703,7 +1703,7 @@
public void testLookupKeyElementComparable() throws Exception {
QueryMetadataInterface metadata = exampleMetadata2();
- String sql = "SELECT lookup('test.group', 'e2', 'e3', e2) AS x FROM test.group"; //$NON-NLS-1$
+ String sql = "SELECT lookup('test.group', 'e2', 'e3', convert(e2, blob)) AS x FROM test.group"; //$NON-NLS-1$
Command command = QueryParser.getQueryParser().parseCommand(sql);
QueryResolver.resolveCommand(command, metadata);
More information about the teiid-commits
mailing list