[teiid-commits] teiid SVN: r3599 - in trunk: documentation/reference/src/main/docbook/en-US/content and 8 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Tue Nov 1 13:22:08 EDT 2011
Author: shawkins
Date: 2011-11-01 13:22:07 -0400 (Tue, 01 Nov 2011)
New Revision: 3599
Modified:
trunk/build/kits/jboss-container/teiid-releasenotes.html
trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java
trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
Log:
TEIID-1805 adding support for no_unnest control over view removal
Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-11-01 17:22:07 UTC (rev 3599)
@@ -35,6 +35,7 @@
<LI><B>GSSAPI</B> - both the Teiid JDBC client/server and the ODBC pg backend can now support GSSAPI for single sign-on.
<LI><B>Server-side Query Timeouts</B> - default query timeouts can be configured at both the VDB (via the query-timeout VDB property) and entire server (via the teiid-jboss-beans.xml queryTimeout property).
<LI><B>Native Queries</B> - added the ability to specify native query SQL for JDBC physical tables and stored procedures via extension metadata.
+ <LI><B>View removal hint</B> - the NO_UNNEST hint now also applies to from clause views and subqueries. It will instruct the planner to not perform view flattening.
</UL>
<h2><a name="Compatibility">Compatibility Issues</a></h2>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2011-11-01 17:22:07 UTC (rev 3599)
@@ -49,14 +49,15 @@
<listitem><para>FROM table1 JOIN /*+ MAKEDEP */ table2 ON join-criteria</para></listitem>
<listitem><para>FROM table1 JOIN /*+ MAKENOTDEP */ table2 ON join-criteria</para></listitem>
<listitem><para>FROM /*+ MAKEIND */ table1 JOIN table2 ON join-criteria</para></listitem>
+ <listitem><para>FROM /*+ NO_UNNEST */ vw1 JOIN table2 ON join-criteria</para></listitem>
<listitem><para>FROM table1 left outer join <link linkend="optional_join">/*+ optional */</link> table2 ON join-criteria</para></listitem>
<listitem><para>FROM <link linkend="texttable">TEXTTABLE...</link></para></listitem>
<listitem><para>FROM <link linkend="xmltable">XMLTABLE...</link></para></listitem>
<listitem><para>FROM <link linkend="arraytable">ARRAYTABLE...</link></para></listitem>
<listitem><para>FROM <link linkend="from_subquery">(SELECT ...</link></para></listitem>
</itemizedlist>
- <note>
- <title>DEP Hints</title>
+ <section>
+ <title>From Clause Hints</title>
<para>
MAKEIND, MAKEDEP, and MAKENOTDEP are hints used to control
<link linkend="dependent_joins">dependent join</link>
@@ -65,7 +66,12 @@
metadata, and costing information. The hints may appear in a comment that proceeds the from clause.
The hints can be specified against any from clause, not just a named table.
</para>
- </note>
+ <para>
+ NO_UNNEST can be specified against a subquery from clause or view to instruct the planner to not merge
+ the nested SQL in the surrounding query - also known as view flattening. This hint only applies to Teiid
+ planning and is not passed to source queries. NO_UNNEST may appear in a comment that proceeds the from clause.
+ </para>
+ </section>
<section id="nested_table">
<title>Nested Table Reference</title>
<para>Nested tables may appear in the FROM clause with the TABLE
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -839,6 +839,9 @@
if (group.getModelMetadataId() != null) {
node.setProperty(Info.MODEL_ID, group.getModelMetadataId());
}
+ if (ufc.isNoUnnest()) {
+ node.setProperty(Info.NO_UNNEST, Boolean.TRUE);
+ }
node.addGroup(group);
if (nestedCommand != null) {
UpdateInfo info = ProcedureContainerResolver.getUpdateInfo(group, metadata);
@@ -882,6 +885,9 @@
if (sfc.isTable()) {
sfc.getCommand().setCorrelatedReferences(getCorrelatedReferences(parent, node, sfc));
}
+ if (sfc.isNoUnnest()) {
+ node.setProperty(Info.NO_UNNEST, Boolean.TRUE);
+ }
node.addGroup(group);
addNestedCommand(node, group, nestedCommand, nestedCommand, true);
if (nestedCommand instanceof SetQuery) {
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -126,6 +126,7 @@
CORRELATED_REFERENCES, // SymbolMap
MAKE_NOT_DEP, // Boolean
INLINE_VIEW, // If the source node represents an inline view
+ NO_UNNEST,
MAKE_IND,
// Group node properties
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -81,7 +81,9 @@
static PlanNode doMerge(PlanNode frame,
PlanNode root, boolean beforeDecomposeJoin,
QueryMetadataInterface metadata) throws QueryPlannerException, QueryMetadataException, TeiidComponentException {
-
+ if (frame.hasBooleanProperty(Info.NO_UNNEST)) {
+ return root;
+ }
GroupSymbol virtualGroup = frame.getGroups().iterator().next();
// check to see if frame represents a proc relational query.
Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -180,7 +180,9 @@
fromClause.setMakeNotDep(true);
} else if (parts[i].equalsIgnoreCase(FromClause.MAKEIND)) {
fromClause.setMakeInd(true);
- }
+ } else if (parts[i].equalsIgnoreCase(SubqueryHint.NOUNNEST)) {
+ fromClause.setNoUnnest(true);
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/FromClause.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -45,6 +45,7 @@
private boolean makeDep;
private boolean makeNotDep;
private boolean makeInd;
+ private boolean noUnnest;
public boolean isOptional() {
return optional;
@@ -72,8 +73,17 @@
clone.makeInd = makeInd;
clone.makeNotDep = makeNotDep;
clone.optional = optional;
+ clone.noUnnest = noUnnest;
return clone;
}
+
+ public void setNoUnnest(boolean noUnnest) {
+ this.noUnnest = noUnnest;
+ }
+
+ public boolean isNoUnnest() {
+ return noUnnest;
+ }
public boolean isMakeDep() {
return this.makeDep;
@@ -92,7 +102,7 @@
}
public boolean hasHint() {
- return optional || makeDep || makeNotDep || makeInd;
+ return optional || makeDep || makeNotDep || makeInd || noUnnest;
}
public boolean equals(Object obj) {
@@ -109,7 +119,8 @@
return other.isOptional() == this.isOptional()
&& other.isMakeDep() == this.isMakeDep()
&& other.isMakeNotDep() == this.isMakeNotDep()
- && other.isMakeInd() == this.isMakeInd();
+ && other.isMakeInd() == this.isMakeInd()
+ && other.isNoUnnest() == this.isNoUnnest();
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -530,6 +530,10 @@
append(FromClause.MAKEIND);
append(SPACE);
}
+ if (obj.isNoUnnest()) {
+ append(SubqueryHint.NOUNNEST);
+ append(SPACE);
+ }
append(END_HINT);
append(SPACE);
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -48,6 +48,24 @@
TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
}
+ @Test public void testNoUnnest() {
+ ProcessorPlan plan = TestOptimizer.helpPlan("SELECT x FROM /*+ no_unnest */ (SELECT e1, max(e2) as x FROM pm1.g1 GROUP BY e1) AS z", //$NON-NLS-1$
+ RealMetadataFactory.example1Cached(), null, TestAggregatePushdown.getAggregatesFinder(),
+ new String[] {
+ "SELECT v_0.c_0 FROM (SELECT MAX(g_0.e2) AS c_0 FROM pm1.g1 AS g_0 GROUP BY g_0.e1) AS v_0"}, TestOptimizer.SHOULD_SUCCEED); //$NON-NLS-1$
+
+ TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
+ }
+
+ @Test public void testNoUnnestView() {
+ ProcessorPlan plan = TestOptimizer.helpPlan("SELECT e1 FROM /*+ no_unnest */ vm1.g1", //$NON-NLS-1$
+ RealMetadataFactory.example1Cached(), null, TestAggregatePushdown.getAggregatesFinder(),
+ new String[] {
+ "SELECT v_0.c_0 FROM (SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0) AS v_0"}, TestOptimizer.SHOULD_SUCCEED); //$NON-NLS-1$
+
+ TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
+ }
+
@Test public void testSimpleMergeGroupBy1() {
ProcessorPlan plan = TestOptimizer.helpPlan("SELECT x FROM (SELECT distinct min(e1), max(e2) as x FROM pm1.g1 GROUP BY e1) AS z", //$NON-NLS-1$
RealMetadataFactory.example1Cached(), null, TestAggregatePushdown.getAggregatesFinder(),
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java 2011-11-01 15:25:47 UTC (rev 3598)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java 2011-11-01 17:22:07 UTC (rev 3599)
@@ -29,6 +29,7 @@
import java.util.List;
import org.junit.Test;
+import org.teiid.api.exception.query.QueryParserException;
import org.teiid.query.sql.lang.AbstractCompareCriteria;
import org.teiid.query.sql.lang.CacheHint;
import org.teiid.query.sql.lang.CompareCriteria;
@@ -57,12 +58,12 @@
import org.teiid.query.sql.proc.HasCriteria;
import org.teiid.query.sql.proc.IfStatement;
import org.teiid.query.sql.proc.Statement;
-import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
@SuppressWarnings("nls")
@@ -1156,4 +1157,9 @@
TestParser.helpTest(sql, "SELECT a FROM db.g WHERE b IN /*+ MJ */ (SELECT a FROM db.g WHERE a2 = 5)", q); //$NON-NLS-1$
}
+ @Test public void testNoUnnest() throws QueryParserException {
+ String sql = "SELECT a FROM /*+ no_unnest */ (SELECT a FROM db.g WHERE a2 = 5) x"; //$NON-NLS-1$
+ assertEquals("SELECT a FROM /*+ NO_UNNEST */ (SELECT a FROM db.g WHERE a2 = 5) AS x", QueryParser.getQueryParser().parseCommand(sql, new ParseInfo()).toString()); //$NON-NLS-1$
+ }
+
}
More information about the teiid-commits
mailing list