From d42dc33bc4e052725bce4788501197a9eaec21d5 Mon Sep 17 00:00:00 2001 From: shawkins Date: Tue, 11 Jun 2013 14:17:36 -0400 Subject: [PATCH] TEIID-2381 ensuring proper handling with unions and inline views --- .../jdbc/oracle/TestOracleTranslator.java | 6 ++-- .../relational/RelationalPlanner.java | 10 +++++- .../relational/rules/RuleCollapseSource.java | 1 + .../query/processor/TestSourceHints.java | 34 +++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/oracle/TestOracleTranslator.java b/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/oracle/TestOracleTranslator.java index 19c9bb957a..141e0765da 100644 --- a/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/oracle/TestOracleTranslator.java +++ b/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/oracle/TestOracleTranslator.java @@ -100,14 +100,14 @@ private void helpTestVisitor(String input, String expectedOutput) throws Transla @Test public void testSourceHint2() throws Exception { ExecutionContextImpl impl = new FakeExecutionContextImpl(); - impl.setHint("hello world"); + impl.setHints(Arrays.asList("hello world")); helpTestVisitor(getTestVDB(), "with x (y) as (select part_name from parts) select y from x", impl, null, "WITH x AS (SELECT PARTS.PART_NAME AS y FROM PARTS) SELECT /*+ hello world */ g_0.y FROM x g_0", true); } @Test public void testSourceHint3() throws Exception { ExecutionContextImpl impl = new FakeExecutionContextImpl(); - impl.setHint("hello world"); - impl.setGeneralHint("other"); + impl.setHints(Arrays.asList("hello world")); + impl.setGeneralHints(Arrays.asList("other")); helpTestVisitor(getTestVDB(), "select part_name from parts", impl, null, "SELECT /*+ hello world other */ g_0.PART_NAME FROM PARTS g_0", true); } diff --git a/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java b/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java index dfc1105b8d..915f9c2cc3 100644 --- a/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java +++ b/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java @@ -282,6 +282,7 @@ private static void assignWithClause(RelationalNode node, Map>> partitionInfo = PartitionAnalyzer.extractPartionInfo((SetQuery)nestedCommand, ResolverUtil.resolveElementsInGroup(group, metadata)); if (!partitionInfo.isEmpty()) { diff --git a/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java b/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java index 2adfb2631f..366f4ab1d6 100644 --- a/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java +++ b/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java @@ -96,6 +96,7 @@ public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, Capabili addDistinct(metadata, capFinder, accessNode, queryCommand); command = queryCommand; queryCommand.setSourceHint((SourceHint) accessNode.getProperty(Info.SOURCE_HINT)); + queryCommand.getProjectedQuery().setSourceHint((SourceHint) accessNode.getProperty(Info.SOURCE_HINT)); if (intoGroup != null) { Insert insertCommand = (Insert)commandRoot.getParent().getProperty(NodeConstants.Info.VIRTUAL_COMMAND); if (insertCommand == null) { diff --git a/engine/src/test/java/org/teiid/query/processor/TestSourceHints.java b/engine/src/test/java/org/teiid/query/processor/TestSourceHints.java index 0a987bb1ef..4f20f84198 100644 --- a/engine/src/test/java/org/teiid/query/processor/TestSourceHints.java +++ b/engine/src/test/java/org/teiid/query/processor/TestSourceHints.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.teiid.common.buffer.TupleSource; import org.teiid.core.TeiidComponentException; +import org.teiid.core.TeiidException; import org.teiid.dqp.internal.process.DQPWorkContext; import org.teiid.metadata.MetadataStore; import org.teiid.metadata.Schema; @@ -37,6 +38,9 @@ import org.teiid.query.mapping.relational.QueryNode; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.optimizer.TestOptimizer; +import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities; +import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder; +import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability; import org.teiid.query.sql.lang.Command; import org.teiid.query.unittest.RealMetadataFactory; import org.teiid.query.util.CommandContext; @@ -63,6 +67,36 @@ public class TestSourceHints { helpProcess(plan, manager("foo x", "leading", "foo", "leading"), expected); } + @Test public void testWithHintPushdown() throws TeiidException { + String sql = "WITH x as (SELECT /*+ sh:'x' */ e1 from pm1.g2) " + + "SELECT /*+ sh:'foo' bar:'leading' */ g1.e1 from pm1.g1, x where g1.e1 = x.e1 order by g1.e1 limit 1"; //$NON-NLS-1$ + + BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); + caps.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true); + CommandContext context = new CommandContext(); + context.setDQPWorkContext(new DQPWorkContext()); + context.getDQPWorkContext().getSession().setVdb(RealMetadataFactory.example1VDB()); + ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached(), new DefaultCapabilitiesFinder(caps), context); + + List[] expected = new List[] {}; + helpProcess(plan, manager("foo x", "leading"), expected); + } + + @Test public void testUnionHintPushdown() throws TeiidException { + String sql = "SELECT /*+ sh:'foo' bar:'leading' */ g1.e1 from pm1.g1 " + + "UNION ALL SELECT * from (SELECT /*+ sh:'x' bar:'z' */ g1.e1 from pm1.g1) as x"; //$NON-NLS-1$ + + BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); + caps.setCapabilitySupport(Capability.QUERY_UNION, true); + CommandContext context = new CommandContext(); + context.setDQPWorkContext(new DQPWorkContext()); + context.getDQPWorkContext().getSession().setVdb(RealMetadataFactory.example1VDB()); + ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached(), new DefaultCapabilitiesFinder(caps), context); + + List[] expected = new List[] {}; + helpProcess(plan, manager("foo x", "leading z"), expected); + } + @Test public void testKeepAliases() throws Exception { String sql = "SELECT /*+ sh KEEP ALIASES bar:'leading(g)' */ e1 from pm1.g1 g order by e1 limit 1"; //$NON-NLS-1$ CommandContext cc = TestProcessor.createCommandContext();