[teiid-commits] teiid SVN: r2982 - in trunk/engine/src: test/java/org/teiid/query/optimizer and 1 other directory.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Wed Mar 9 09:21:55 EST 2011
Author: shawkins
Date: 2011-03-09 09:21:54 -0500 (Wed, 09 Mar 2011)
New Revision: 2982
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
Log:
TEIID-1503 fix for bad semijoin query
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2011-03-08 23:03:13 UTC (rev 2981)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2011-03-09 14:21:54 UTC (rev 2982)
@@ -260,6 +260,7 @@
RelationalPlan originalPlan = (RelationalPlan)plannedResult.query.getProcessorPlan();
Number originalCardinality = originalPlan.getRootNode().getEstimateNodeCardinality();
if (originalCardinality.floatValue() == NewCalculateCostUtil.UNKNOWN_VALUE) {
+ //TODO: this check isn't really accurate - exists and scalarsubqueries will always have cardinality 2/1
//if it's currently unknown, removing criteria won't make it any better
return current;
}
@@ -271,7 +272,7 @@
}
//add an order by, which hopefully will get pushed down
- plannedResult.query.setOrderBy(new OrderBy(plannedResult.rightExpressions));
+ plannedResult.query.setOrderBy(new OrderBy(plannedResult.rightExpressions).clone());
for (OrderByItem item : plannedResult.query.getOrderBy().getOrderByItems()) {
int index = plannedResult.query.getProjectedSymbols().indexOf(item.getSymbol());
item.setExpressionPosition(index);
@@ -481,7 +482,14 @@
}
if (addGroupBy) {
- plannedResult.query.setGroupBy(new GroupBy(plannedResult.rightExpressions));
+ LinkedHashSet<SingleElementSymbol> groupingSymbols = new LinkedHashSet<SingleElementSymbol>();
+ ArrayList<SingleElementSymbol> aggs = new ArrayList<SingleElementSymbol>();
+ for (Expression expr : (List<Expression>)plannedResult.rightExpressions) {
+ AggregateSymbolCollectorVisitor.getAggregates(expr, aggs, groupingSymbols);
+ }
+ if (!groupingSymbols.isEmpty()) {
+ plannedResult.query.setGroupBy((GroupBy) new GroupBy(new ArrayList<SingleElementSymbol>(groupingSymbols)).clone());
+ }
}
HashSet<SingleElementSymbol> projectedSymbols = new HashSet<SingleElementSymbol>();
for (SingleElementSymbol ses : plannedResult.query.getProjectedSymbols()) {
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-03-08 23:03:13 UTC (rev 2981)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-03-09 14:21:54 UTC (rev 2982)
@@ -84,6 +84,7 @@
import org.teiid.query.unittest.FakeMetadataFactory;
import org.teiid.query.unittest.FakeMetadataObject;
import org.teiid.query.unittest.FakeMetadataStore;
+import org.teiid.query.unittest.RealMetadataFactory;
import org.teiid.query.util.CommandContext;
import org.teiid.query.validator.Validator;
import org.teiid.query.validator.ValidatorReport;
@@ -6753,6 +6754,17 @@
helpPlan("update pm1.g1 set e1 = 1 where exists (select 1 from pm1.g2)", FakeMetadataFactory.example1Cached(), null, //$NON-NLS-1$
null, null, false); //$NON-NLS-1$
}
+
+ /**
+ * Test to ensure that we don't create an invalid semijoin query when attempting to convert the subquery to a semijoin
+ */
+ @Test public void testInvalidGeneratedSemijoinQuery() throws Exception {
+ String sql = "SELECT intkey FROM BQT1.SmallA AS A WHERE convert(shortvalue, integer) = (SELECT MAX(convert(shortvalue, integer)) FROM (select * from BQT1.SmallA) AS B WHERE b.intnum = a.intnum) ORDER BY intkey";
+ BasicSourceCapabilities bsc = getTypicalCapabilities();
+ bsc.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true);
+ bsc.setCapabilitySupport(Capability.QUERY_GROUP_BY, true);
+ TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.shortvalue, g_0.intnum, g_0.intkey FROM BQT1.SmallA AS g_0"}, new DefaultCapabilitiesFinder(bsc), ComparisonMode.EXACT_COMMAND_STRING);
+ }
public static final boolean DEBUG = false;
More information about the teiid-commits
mailing list