[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