Author: shawkins
Date: 2012-07-05 11:43:21 -0400 (Thu, 05 Jul 2012)
New Revision: 4222
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java
Log:
TEIID-2091 improving txn detection for txnautowrap detect
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -25,6 +25,7 @@
import static org.teiid.query.analysis.AnalysisRecord.*;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -45,13 +46,18 @@
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.RegisterRequestParameter;
import org.teiid.query.rewriter.QueryRewriter;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.ExistsCriteria;
import org.teiid.query.sql.lang.OrderByItem;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.Select;
+import org.teiid.query.sql.lang.SubqueryContainer;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.util.SymbolMap;
+import org.teiid.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
import org.teiid.query.util.CommandContext;
@@ -440,5 +446,38 @@
public void setConnectorBindingId(String connectorBindingId) {
this.connectorBindingId = connectorBindingId;
}
-
+
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ ArrayList<LanguageObject> list = new ArrayList<LanguageObject>();
+ if (projection != null) {
+ for (Object obj : projection) {
+ if (obj instanceof LanguageObject) {
+ list.add((LanguageObject)obj);
+ }
+ }
+ }
+ if (shouldEvaluate) {
+ //collect any evaluatable subqueries
+ for (SubqueryContainer<?> container :
ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(this.command)) {
+ if (container instanceof ExistsCriteria &&
((ExistsCriteria)container).shouldEvaluate()) {
+ list.add(container);
+ }
+ if (container instanceof ScalarSubquery &&
((ScalarSubquery)container).shouldEvaluate()) {
+ list.add(container);
+ }
+ }
+ }
+ return list;
+ }
+
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ Boolean required = super.requiresTransaction(transactionalReads);
+ if (Boolean.TRUE.equals(required)) {
+ return true;
+ }
+ return null;
+ }
+
}
\ No newline at end of file
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -24,6 +24,8 @@
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.Map;
@@ -37,6 +39,7 @@
import org.teiid.query.QueryPlugin;
import org.teiid.query.function.FunctionMethods;
import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.ArrayTable;
import org.teiid.query.sql.lang.TableFunctionReference.ProjectedColumn;
import org.teiid.query.util.CommandContext;
@@ -107,5 +110,10 @@
terminateBatches();
return pullBatch();
}
+
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ return Arrays.asList(this.table.getArrayValue());
+ }
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -24,6 +24,7 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -37,6 +38,7 @@
import org.teiid.query.QueryPlugin;
import org.teiid.query.eval.Evaluator;
import org.teiid.query.processor.RegisterRequestParameter;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.BatchedUpdateCommand;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.util.VariableContext;
@@ -177,5 +179,15 @@
super.copy(this, clonedNode);
return clonedNode;
}
+
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ return null;
+ }
+
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ return true;
+ }
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -33,6 +33,7 @@
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.DependentSetCriteria;
import org.teiid.query.sql.lang.Query;
+import org.teiid.query.sql.lang.QueryCommand;
/**
@@ -208,5 +209,13 @@
public void setPushdown(boolean pushdown) {
this.pushdown = pushdown;
}
+
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ if (transactionalReads || !(this.getCommand() instanceof QueryCommand)) {
+ return true;
+ }
+ return null;
+ }
}
\ No newline at end of file
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -120,5 +120,10 @@
public Criteria getInputCriteria() {
return this.inputCriteria;
}
+
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ return true; //TODO: check the underlying
+ }
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -113,5 +113,10 @@
this.batchRow = 1;
this.insertCount = 0;
}
+
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ return true;
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -25,6 +25,7 @@
import static org.teiid.query.analysis.AnalysisRecord.*;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -38,6 +39,7 @@
import org.teiid.core.TeiidProcessingException;
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.relational.SourceState.ImplicitBuffer;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.JoinType;
import org.teiid.query.util.CommandContext;
@@ -329,5 +331,18 @@
public DependentValueSource getDependentValueSource() {
return dvs;
}
+
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ List<LanguageObject> all = new ArrayList<LanguageObject>();
+ if (leftExpressions != null) {
+ all.addAll(leftExpressions);
+ all.addAll(rightExpressions);
+ }
+ if (joinCriteria != null) {
+ all.add(joinCriteria);
+ }
+ return all;
+ }
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -180,4 +180,12 @@
return props;
}
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ if (Boolean.TRUE.equals(getProcessorPlan().requiresTransaction(transactionalReads))) {
+ return true;
+ }
+ return null;
+ }
+
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -283,4 +283,12 @@
return modelName;
}
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ if (getMode() != Mode.ITERATOR) {
+ return true;
+ }
+ return null;
+ }
+
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -26,6 +26,7 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -39,6 +40,7 @@
import org.teiid.core.TeiidProcessingException;
import org.teiid.query.analysis.AnalysisRecord;
import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.util.SymbolMap;
@@ -221,4 +223,9 @@
return props;
}
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ return this.selectSymbols;
+ }
+
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -637,4 +637,12 @@
throw e;
}
+ /**
+ * @param transactionalReads
+ * @return true if required, false if not required, and null if transactional reads and
a single source command is issued.
+ */
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ return false;
+ }
+
}
\ No newline at end of file
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -40,13 +40,12 @@
import org.teiid.query.processor.ProcessorPlan;
import org.teiid.query.processor.QueryProcessor;
import org.teiid.query.processor.RegisterRequestParameter;
-import org.teiid.query.processor.relational.ProjectIntoNode.Mode;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.Create;
import org.teiid.query.sql.lang.Insert;
-import org.teiid.query.sql.lang.QueryCommand;
import org.teiid.query.sql.lang.SourceHint;
import org.teiid.query.sql.lang.WithQueryCommand;
+import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.tempdata.TempTableStore;
import org.teiid.query.tempdata.TempTableStore.TransactionMode;
import org.teiid.query.util.CommandContext;
@@ -57,7 +56,7 @@
// Initialize state - don't reset
private RelationalNode root;
- private List outputCols;
+ private List<? extends Expression> outputCols;
private List<WithQueryCommand> with;
private List<WithQueryCommand> withToProcess;
@@ -131,7 +130,7 @@
* Get list of resolved elements describing output columns for this plan.
* @return List of SingleElementSymbol
*/
- public List getOutputElements() {
+ public List<? extends Expression> getOutputElements() {
return this.outputCols;
}
@@ -244,7 +243,7 @@
/**
* @param outputCols The outputCols to set.
*/
- public void setOutputElements(List outputCols) {
+ public void setOutputElements(List<? extends Expression> outputCols) {
this.outputCols = outputCols;
}
@@ -267,40 +266,32 @@
}
}
}
- return requiresTransaction(transactionalReads, root);
+ return Boolean.TRUE.equals(requiresTransaction(transactionalReads, root));
}
- /**
- * Currently does not detect procedures in non-inline view subqueries
- */
- boolean requiresTransaction(boolean transactionalReads, RelationalNode node) {
- if (node instanceof DependentAccessNode) {
- if (transactionalReads || !(((DependentAccessNode)node).getCommand() instanceof
QueryCommand)) {
- return true;
- }
- return false;
- }
- if (node instanceof ProjectIntoNode) {
- if (((ProjectIntoNode)node).getMode() == Mode.ITERATOR) {
- return transactionalReads;
- }
+ static Boolean requiresTransaction(boolean transactionalReads, RelationalNode node)
{
+ Boolean requiresTxn = node.requiresTransaction(transactionalReads);
+ if (Boolean.TRUE.equals(requiresTxn)) {
return true;
- } else if (node instanceof AccessNode) {
- return false;
- }
- if (transactionalReads) {
- return true;
- }
- if (node instanceof PlanExecutionNode) {
- ProcessorPlan plan = ((PlanExecutionNode)node).getProcessorPlan();
- return plan.requiresTransaction(transactionalReads);
- }
+ }
for (RelationalNode child : node.getChildren()) {
- if (child != null && requiresTransaction(transactionalReads, child)) {
+ if (child == null) {
+ continue;
+ }
+ Boolean childRequires = requiresTransaction(transactionalReads, child);
+ if (Boolean.TRUE.equals(childRequires)) {
return true;
}
+ if (transactionalReads) {
+ if (childRequires == null) {
+ if (requiresTxn == null) {
+ return true;
+ }
+ requiresTxn = null;
+ }
+ }
}
- return false;
+ return requiresTxn;
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -25,6 +25,7 @@
import static org.teiid.query.analysis.AnalysisRecord.*;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -36,6 +37,7 @@
import org.teiid.core.TeiidProcessingException;
import org.teiid.query.analysis.AnalysisRecord;
import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.util.CommandContext;
@@ -97,7 +99,7 @@
}
while (currentRow <= currentBatch.getEndRow() && !isBatchFull()) {
- List tuple = currentBatch.getTuple(currentRow);
+ List<?> tuple = currentBatch.getTuple(currentRow);
if(getEvaluator(this.elementMap).evaluate(this.criteria, tuple)) {
addBatchRow(projectTuple(this.projectionIndexes, tuple));
@@ -139,4 +141,9 @@
return props;
}
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ return Arrays.asList(this.criteria);
+ }
+
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -22,6 +22,7 @@
package org.teiid.query.processor.relational;
+import java.util.Collection;
import java.util.Collections;
import java.util.Map;
@@ -29,9 +30,11 @@
import org.teiid.common.buffer.BlockedException;
import org.teiid.core.TeiidComponentException;
import org.teiid.query.eval.Evaluator;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.TableFunctionReference;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
public abstract class SubqueryAwareRelationalNode extends RelationalNode {
@@ -77,5 +80,15 @@
getContext().getVariableContext().setValue(entry.getKey(),
getEvaluator(Collections.emptyMap()).evaluate(entry.getValue(), null));
}
}
+
+ abstract protected Collection<? extends LanguageObject> getObjects();
+
+ @Override
+ public Boolean requiresTransaction(boolean transactionalReads) {
+ if (!transactionalReads) {
+ return false;
+ }
+ return
!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(getObjects()).isEmpty();
+ }
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -27,6 +27,8 @@
import java.io.Reader;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -44,6 +46,7 @@
import org.teiid.core.types.TransformationException;
import org.teiid.query.QueryPlugin;
import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.TextTable;
import org.teiid.query.sql.lang.TextTable.TextColumn;
import org.teiid.query.sql.symbol.Expression;
@@ -483,4 +486,9 @@
return result;
}
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ return Arrays.asList(this.table.getFile());
+ }
+
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -24,6 +24,7 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -48,6 +49,7 @@
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.relational.GroupingNode.ProjectingTupleSource;
import org.teiid.query.processor.relational.SortUtility.Mode;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.OrderByItem;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -471,5 +473,10 @@
this.elementMap = createLookupMap(sourceElements);
}
}
+
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ return getElements();
+ }
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -23,6 +23,7 @@
package org.teiid.query.processor.relational;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -54,6 +55,7 @@
import org.teiid.query.QueryPlugin;
import org.teiid.query.eval.Evaluator;
import org.teiid.query.function.FunctionDescriptor;
+import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.XMLTable;
import org.teiid.query.sql.lang.XMLTable.XMLColumn;
import org.teiid.query.xquery.saxon.XQueryEvaluator;
@@ -339,5 +341,10 @@
private boolean hasNextBatch() {
return this.outputRow + this.buffer.getBatchSize() <= rowCount + 1;
}
+
+ @Override
+ protected Collection<? extends LanguageObject> getObjects() {
+ return this.table.getPassing();
+ }
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java 2012-07-03
20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -22,11 +22,13 @@
package org.teiid.query.sql.lang;
+import org.teiid.query.sql.LanguageObject;
+
/**
- * This interface defines a common interface for all MetaMatrix SQL objects
+ * This interface defines a common interface for all SQL objects
* that contain subqueries.
*/
-public interface SubqueryContainer<T extends Command> {
+public interface SubqueryContainer<T extends Command> extends LanguageObject {
/**
* Returns the subquery Command object
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2012-07-03
20:05:54 UTC (rev 4221)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -1547,7 +1547,10 @@
0, // Select
0, // Sort
0 // UnionAll
- });
+ });
+
+ assertTrue(plan.requiresTransaction(true));
+ assertFalse(plan.requiresTransaction(false));
}
@Test public void testCantPushJoin2() {
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -22,6 +22,7 @@
package org.teiid.query.optimizer;
+import static org.junit.Assert.*;
import static org.teiid.query.optimizer.TestOptimizer.*;
import org.junit.After;
@@ -142,6 +143,9 @@
null, capFinder,
new String[] { "SELECT intkey FROM bqt1.smalla AS n WHERE intkey =
(SELECT MAX(intkey) FROM bqt1.smallb AS s WHERE s.stringkey = n.stringkey)" },
SHOULD_SUCCEED); //$NON-NLS-1$
checkNodeTypes(plan, FULL_PUSHDOWN);
+
+ assertFalse(plan.requiresTransaction(true));
+ assertFalse(plan.requiresTransaction(false));
}
@Test public void testPushCorrelatedSubquery2() {
@@ -276,6 +280,9 @@
0, // Sort
0 // UnionAll
});
+
+ assertTrue(plan.requiresTransaction(true));
+ assertFalse(plan.requiresTransaction(false));
}
@Test public void testCorrelatedSubquery2() {
@@ -749,6 +756,9 @@
ProcessorPlan plan = helpPlan("Select e1 from pm1.g1 where e1 > (select
e1 FROM pm2.g1 where e2 = 13)", RealMetadataFactory.example1Cached(), //$NON-NLS-1$
new String[] { "SELECT g_0.e1 FROM pm1.g1 AS g_0 WHERE g_0.e1 >
(SELECT g_0.e1 FROM pm2.g1 AS g_0 WHERE g_0.e2 = 13)" },
ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, FULL_PUSHDOWN);
+
+ assertTrue(plan.requiresTransaction(true));
+ assertFalse(plan.requiresTransaction(false));
}
@Test public void testScalarSubquery1() throws TeiidComponentException,
TeiidProcessingException {
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java 2012-07-03
20:05:54 UTC (rev 4221)
+++
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java 2012-07-05
15:43:21 UTC (rev 4222)
@@ -22,8 +22,7 @@
package org.teiid.query.processor.relational;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
@@ -54,6 +53,7 @@
import org.teiid.query.unittest.RealMetadataFactory;
import org.teiid.query.util.CommandContext;
+@SuppressWarnings("unchecked")
public class TestSelectNode {
public void helpTestSelect(List elements, Criteria criteria, List[] data, List
childElements, ProcessorDataManager dataMgr, List[] expected) throws
TeiidComponentException, TeiidProcessingException {