You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2018/06/05 04:01:04 UTC
[8/8] hive git commit: HIVE-19358 : CBO decorrelation logic should
generate Hive operators (Jesus Camacho Rodriguez via Ashutosh Chauhan)
HIVE-19358 : CBO decorrelation logic should generate Hive operators (Jesus Camacho Rodriguez via Ashutosh Chauhan)
Signed-off-by: Ashutosh Chauhan <ha...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/f567a823
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/f567a823
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/f567a823
Branch: refs/heads/master
Commit: f567a8231f4329e77d8eceb68b40d0cee8022a47
Parents: 0ebf04c
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Sun Apr 29 14:14:00 2018 -0700
Committer: Ashutosh Chauhan <ha...@apache.org>
Committed: Mon Jun 4 21:00:15 2018 -0700
----------------------------------------------------------------------
.../ql/optimizer/calcite/HiveRelOptUtil.java | 113 +++
.../calcite/cost/HiveVolcanoPlanner.java | 5 +-
.../calcite/rules/HiveRelDecorrelator.java | 442 +++++------
.../clientpositive/llap/explainuser_1.q.out | 112 ++-
.../llap/groupby_groupingset_bug.q.out | 16 +-
.../results/clientpositive/llap/lineage3.q.out | 4 +-
.../clientpositive/llap/subquery_in.q.out | 100 ++-
.../llap/subquery_in_having.q.out | 60 +-
.../clientpositive/llap/subquery_multi.q.out | 212 ++++--
.../clientpositive/llap/subquery_notin.q.out | 738 ++++++++++---------
.../clientpositive/llap/subquery_scalar.q.out | 545 +++++++-------
.../clientpositive/llap/subquery_select.q.out | 100 ++-
.../clientpositive/llap/subquery_views.q.out | 93 +--
.../clientpositive/perf/spark/query1.q.out | 16 +-
.../clientpositive/perf/spark/query30.q.out | 18 +-
.../clientpositive/perf/spark/query32.q.out | 18 +-
.../clientpositive/perf/spark/query6.q.out | 22 +-
.../clientpositive/perf/spark/query81.q.out | 18 +-
.../clientpositive/perf/spark/query92.q.out | 18 +-
.../clientpositive/perf/tez/query1.q.out | 8 +-
.../clientpositive/perf/tez/query30.q.out | 10 +-
.../clientpositive/perf/tez/query32.q.out | 8 +-
.../clientpositive/perf/tez/query6.q.out | 12 +-
.../clientpositive/perf/tez/query81.q.out | 50 +-
.../clientpositive/perf/tez/query92.q.out | 8 +-
.../spark/spark_explainuser_1.q.out | 120 +--
.../clientpositive/spark/subquery_in.q.out | 84 +--
.../clientpositive/spark/subquery_multi.q.out | 87 +--
.../clientpositive/spark/subquery_notin.q.out | 512 ++++++-------
.../clientpositive/spark/subquery_scalar.q.out | 537 +++++++-------
.../clientpositive/spark/subquery_select.q.out | 90 +--
.../clientpositive/spark/subquery_views.q.out | 85 ++-
.../clientpositive/subquery_notexists.q.out | 42 +-
.../clientpositive/subquery_notin_having.q.out | 43 +-
.../subquery_unqualcolumnrefs.q.out | 25 +-
35 files changed, 2233 insertions(+), 2138 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/f567a823/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
index 50fbb78..268284a 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
@@ -21,13 +21,19 @@ import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
+import com.google.common.collect.ImmutableList;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.AggregateCall;
+import org.apache.calcite.rel.core.Filter;
+import org.apache.calcite.rel.core.RelFactories;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexCall;
+import org.apache.calcite.rex.RexFieldAccess;
+import org.apache.calcite.rex.RexInputRef;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.rex.RexUtil;
import org.apache.calcite.sql.SqlKind;
@@ -347,4 +353,111 @@ public class HiveRelOptUtil extends RelOptUtil {
}, true, relBuilder);
}
+ public static RexNode splitCorrelatedFilterCondition(
+ Filter filter,
+ List<RexNode> joinKeys,
+ List<RexNode> correlatedJoinKeys,
+ boolean extractCorrelatedFieldAccess) {
+ final List<RexNode> nonEquiList = new ArrayList<>();
+
+ splitCorrelatedFilterCondition(
+ filter,
+ filter.getCondition(),
+ joinKeys,
+ correlatedJoinKeys,
+ nonEquiList,
+ extractCorrelatedFieldAccess);
+
+ // Convert the remainders into a list that are AND'ed together.
+ return RexUtil.composeConjunction(
+ filter.getCluster().getRexBuilder(), nonEquiList, true);
+ }
+
+ private static void splitCorrelatedFilterCondition(
+ Filter filter,
+ RexNode condition,
+ List<RexNode> joinKeys,
+ List<RexNode> correlatedJoinKeys,
+ List<RexNode> nonEquiList,
+ boolean extractCorrelatedFieldAccess) {
+ if (condition instanceof RexCall) {
+ RexCall call = (RexCall) condition;
+ if (call.getOperator().getKind() == SqlKind.AND) {
+ for (RexNode operand : call.getOperands()) {
+ splitCorrelatedFilterCondition(
+ filter,
+ operand,
+ joinKeys,
+ correlatedJoinKeys,
+ nonEquiList,
+ extractCorrelatedFieldAccess);
+ }
+ return;
+ }
+
+ if (call.getOperator().getKind() == SqlKind.EQUALS) {
+ final List<RexNode> operands = call.getOperands();
+ RexNode op0 = operands.get(0);
+ RexNode op1 = operands.get(1);
+
+ if (extractCorrelatedFieldAccess) {
+ if (!RexUtil.containsFieldAccess(op0)
+ && (op1 instanceof RexFieldAccess)) {
+ joinKeys.add(op0);
+ correlatedJoinKeys.add(op1);
+ return;
+ } else if (
+ (op0 instanceof RexFieldAccess)
+ && !RexUtil.containsFieldAccess(op1)) {
+ correlatedJoinKeys.add(op0);
+ joinKeys.add(op1);
+ return;
+ }
+ } else {
+ if (!(RexUtil.containsInputRef(op0))
+ && (op1 instanceof RexInputRef)) {
+ correlatedJoinKeys.add(op0);
+ joinKeys.add(op1);
+ return;
+ } else if (
+ (op0 instanceof RexInputRef)
+ && !(RexUtil.containsInputRef(op1))) {
+ joinKeys.add(op0);
+ correlatedJoinKeys.add(op1);
+ return;
+ }
+ }
+ }
+ }
+
+ // The operator is not of RexCall type
+ // So we fail. Fall through.
+ // Add this condition to the list of non-equi-join conditions.
+ nonEquiList.add(condition);
+ }
+
+ /**
+ * Creates a LogicalAggregate that removes all duplicates from the result of
+ * an underlying relational expression.
+ *
+ * @param rel underlying rel
+ * @return rel implementing SingleValueAgg
+ */
+ public static RelNode createSingleValueAggRel(
+ RelOptCluster cluster,
+ RelNode rel,
+ RelFactories.AggregateFactory aggregateFactory) {
+ // assert (rel.getRowType().getFieldCount() == 1);
+ final int aggCallCnt = rel.getRowType().getFieldCount();
+ final List<AggregateCall> aggCalls = new ArrayList<>();
+
+ for (int i = 0; i < aggCallCnt; i++) {
+ aggCalls.add(
+ AggregateCall.create(
+ SqlStdOperatorTable.SINGLE_VALUE, false, false,
+ ImmutableList.of(i), -1, 0, rel, null, null));
+ }
+
+ return aggregateFactory.createAggregate(rel, false, ImmutableBitSet.of(), null, aggCalls);
+ }
}
http://git-wip-us.apache.org/repos/asf/hive/blob/f567a823/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveVolcanoPlanner.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveVolcanoPlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveVolcanoPlanner.java
index 23ff518..5dcbff6 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveVolcanoPlanner.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/cost/HiveVolcanoPlanner.java
@@ -97,7 +97,10 @@ public class HiveVolcanoPlanner extends VolcanoPlanner {
if (rel instanceof RelSubset) {
// Get cost of the subset, best rel may have been chosen or not
RelSubset subset = (RelSubset) rel;
- return getCost(Util.first(subset.getBest(), subset.getOriginal()), mq);
+ if (subset.getBest() != null) {
+ return getCost(subset.getBest(), mq);
+ }
+ return costFactory.makeInfiniteCost();
}
if (rel.getTraitSet().getTrait(ConventionTraitDef.INSTANCE)
== Convention.NONE) {
http://git-wip-us.apache.org/repos/asf/hive/blob/f567a823/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelDecorrelator.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelDecorrelator.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelDecorrelator.java
index 24e22a0..238ae4e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelDecorrelator.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelDecorrelator.java
@@ -53,22 +53,14 @@ import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.rel.core.Correlate;
import org.apache.calcite.rel.core.CorrelationId;
import org.apache.calcite.rel.core.Filter;
+import org.apache.calcite.rel.core.Join;
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.RelFactories;
import org.apache.calcite.rel.core.Sort;
import org.apache.calcite.rel.core.Values;
-import org.apache.calcite.rel.logical.LogicalAggregate;
import org.apache.calcite.rel.logical.LogicalCorrelate;
-import org.apache.calcite.rel.logical.LogicalFilter;
-import org.apache.calcite.rel.logical.LogicalIntersect;
-import org.apache.calcite.rel.logical.LogicalJoin;
-import org.apache.calcite.rel.logical.LogicalProject;
-import org.apache.calcite.rel.logical.LogicalUnion;
import org.apache.calcite.rel.metadata.RelMdUtil;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.rel.rules.FilterJoinRule;
-import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeField;
@@ -104,6 +96,8 @@ import org.apache.calcite.util.ReflectiveVisitor;
import org.apache.calcite.util.Stacks;
import org.apache.calcite.util.Util;
import org.apache.calcite.util.mapping.Mappings;
+import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelFactories;
+import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelOptUtil;
import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelShuttleImpl;
import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveAggregate;
import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveFilter;
@@ -137,7 +131,7 @@ import java.util.Stack;
* NOTE: this whole logic is replicated from Calcite's RelDecorrelator
* and is exteneded to make it suitable for HIVE
* We should get rid of this and replace it with Calcite's RelDecorrelator
- * once that works with Join, Project etc instead of LogicalJoin, LogicalProject.
+ * once that works with Join, Project etc instead of Join, Project.
* At this point this has differed from Calcite's version significantly so cannot
* get rid of this.
*
@@ -198,8 +192,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
this.cm = cm;
this.rexBuilder = cluster.getRexBuilder();
this.context = context;
- relBuilder = RelFactories.LOGICAL_BUILDER.create(cluster, null);
-
+ relBuilder = HiveRelFactories.HIVE_BUILDER.create(cluster, null);
}
//~ Methods ----------------------------------------------------------------
@@ -245,8 +238,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
HepProgram program = HepProgram.builder()
.addRuleInstance(new AdjustProjectForCountAggregateRule(false))
.addRuleInstance(new AdjustProjectForCountAggregateRule(true))
- .addRuleInstance(FilterJoinRule.FILTER_ON_JOIN)
- .addRuleInstance(FilterProjectTransposeRule.INSTANCE)
+ .addRuleInstance(HiveFilterJoinRule.FILTER_ON_JOIN)
+ .addRuleInstance(HiveFilterProjectTransposeRule.INSTANCE)
// FilterCorrelateRule rule mistakenly pushes a FILTER, consiting of correlated vars,
// on top of LogicalCorrelate to within left input for scalar corr queries
// which causes exception during decorrelation. This has been disabled for now.
@@ -265,8 +258,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
if (frame != null) {
// has been rewritten; apply rules post-decorrelation
final HepProgram program2 = HepProgram.builder()
- .addRuleInstance(FilterJoinRule.FILTER_ON_JOIN)
- .addRuleInstance(FilterJoinRule.JOIN)
+ .addRuleInstance(HiveFilterJoinRule.FILTER_ON_JOIN)
+ .addRuleInstance(HiveFilterJoinRule.JOIN)
.build();
final HepPlanner planner2 = createPlanner(program2);
@@ -504,11 +497,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
/**
- * Rewrites a {@link LogicalAggregate}.
+ * Rewrites a {@link Aggregate}.
*
* @param rel Aggregate to rewrite
*/
- public Frame decorrelateRel(LogicalAggregate rel) throws SemanticException{
+ public Frame decorrelateRel(Aggregate rel) throws SemanticException{
if (rel.getGroupType() != Aggregate.Group.SIMPLE) {
throw new AssertionError(Bug.CALCITE_461_FIXED);
}
@@ -654,12 +647,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
newInputOutputFieldCount + i);
}
- relBuilder.push(
- LogicalAggregate.create(newProject,
- false,
- newGroupSet,
- null,
- newAggCalls));
+ relBuilder.push(newProject)
+ .aggregate(relBuilder.groupKey(newGroupSet, null), newAggCalls);
if (!omittedConstants.isEmpty()) {
final List<RexNode> postProjects = new ArrayList<>(relBuilder.fields());
@@ -877,17 +866,17 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
final List<RexNode> oldProjects = rel.getProjects();
final List<RelDataTypeField> relOutput = rel.getRowType().getFieldList();
- // LogicalProject projects the original expressions,
+ // Project projects the original expressions,
// plus any correlated variables the input wants to pass along.
final List<Pair<RexNode, String>> projects = Lists.newArrayList();
- // If this LogicalProject has correlated reference, create value generator
+ // If this Project has correlated reference, create value generator
// and produce the correlated variables in the new output.
if (cm.mapRefRelToCorRef.containsKey(rel)) {
frame = decorrelateInputWithValueGenerator(rel);
}
- // LogicalProject projects the original expressions
+ // Project projects the original expressions
final Map<Integer, Integer> mapOldToNewOutputs = new HashMap<>();
int newPos;
for (newPos = 0; newPos < oldProjects.size(); newPos++) {
@@ -917,11 +906,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
corDefOutputs);
}
/**
- * Rewrite LogicalProject.
+ * Rewrite Project.
*
* @param rel the project rel to rewrite
*/
- public Frame decorrelateRel(LogicalProject rel) throws SemanticException{
+ public Frame decorrelateRel(Project rel) throws SemanticException{
//
// Rewrite logic:
//
@@ -937,17 +926,17 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
final List<RexNode> oldProjects = rel.getProjects();
final List<RelDataTypeField> relOutput = rel.getRowType().getFieldList();
- // LogicalProject projects the original expressions,
+ // Project projects the original expressions,
// plus any correlated variables the input wants to pass along.
final List<Pair<RexNode, String>> projects = Lists.newArrayList();
- // If this LogicalProject has correlated reference, create value generator
+ // If this Project has correlated reference, create value generator
// and produce the correlated variables in the new output.
if (cm.mapRefRelToCorRef.containsKey(rel)) {
frame = decorrelateInputWithValueGenerator(rel);
}
- // LogicalProject projects the original expressions
+ // Project projects the original expressions
final Map<Integer, Integer> mapOldToNewOutputs = new HashMap<>();
int newPos;
for (newPos = 0; newPos < oldProjects.size(); newPos++) {
@@ -977,13 +966,6 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
/**
* Create RelNode tree that produces a list of correlated variables.
- *
- * @param correlations correlated variables to generate
- * @param valueGenFieldOffset offset in the output that generated columns
- * will start
- * @param mapCorVarToOutputPos output positions for the correlated variables
- * generated
- * @return RelNode the root of the resultant RelNode tree
*/
private RelNode createValueGenerator(
Iterable<CorRef> correlations,
@@ -1039,11 +1021,9 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
assert newInput != null;
if (!joinedInputs.contains(newInput)) {
- RelNode project =
- RelOptUtil.createProject(
- newInput,
- mapNewInputToOutputs.get(newInput));
- RelNode distinct = RelOptUtil.createDistinctRel(project);
+ RelNode project = RelOptUtil.createProject(
+ HiveRelFactories.HIVE_PROJECT_FACTORY, newInput, mapNewInputToOutputs.get(newInput));
+ RelNode distinct = relBuilder.push(project).distinct().build();
RelOptCluster cluster = distinct.getCluster();
joinedInputs.add(newInput);
@@ -1053,10 +1033,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
if (r == null) {
r = distinct;
} else {
- r =
- LogicalJoin.create(r, distinct,
- cluster.getRexBuilder().makeLiteral(true),
- ImmutableSet.<CorrelationId>of(), JoinRelType.INNER);
+ r = relBuilder.push(r).push(distinct)
+ .join(JoinRelType.INNER, cluster.getRexBuilder().makeLiteral(true)).build();
}
}
}
@@ -1153,13 +1131,12 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
leftInputOutputCount,
corDefOutputs);
- RelNode join =
- LogicalJoin.create(frame.r, valueGenRel, rexBuilder.makeLiteral(true),
- ImmutableSet.<CorrelationId>of(), JoinRelType.INNER);
+ RelNode join = relBuilder.push(frame.r).push(valueGenRel)
+ .join(JoinRelType.INNER, rexBuilder.makeLiteral(true)).build();
- // LogicalJoin or LogicalFilter does not change the old input ordering. All
+ // Join or Filter does not change the old input ordering. All
// input fields from newLeftInput(i.e. the original input to the old
- // LogicalFilter) are in the output and in the same position.
+ // Filter) are in the output and in the same position.
return register(oldInput, join, frame.oldToNewOutputs, corDefOutputs);
}
@@ -1242,16 +1219,16 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
//
// Rewrite logic:
//
- // 1. If a LogicalFilter references a correlated field in its filter
- // condition, rewrite the LogicalFilter to be
- // LogicalFilter
- // LogicalJoin(cross product)
+ // 1. If a Filter references a correlated field in its filter
+ // condition, rewrite the Filter to be
+ // Filter
+ // Join(cross product)
// OriginalFilterInput
// ValueGenerator(produces distinct sets of correlated variables)
// and rewrite the correlated fieldAccess in the filter condition to
- // reference the LogicalJoin output.
+ // reference the Join output.
//
- // 2. If LogicalFilter does not reference correlated variables, simply
+ // 2. If Filter does not reference correlated variables, simply
// rewrite the filter condition using new input.
//
@@ -1263,7 +1240,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
Frame oldInputFrame = frame;
- // If this LogicalFilter has correlated reference, create value generator
+ // If this Filter has correlated reference, create value generator
// and produce the correlated variables in the new output.
if (cm.mapRefRelToCorRef.containsKey(rel)) {
frame = decorrelateInputWithValueGenerator(rel);
@@ -1306,24 +1283,24 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
/**
- * Rewrite LogicalFilter.
+ * Rewrite Filter.
*
* @param rel the filter rel to rewrite
*/
- public Frame decorrelateRel(LogicalFilter rel) {
+ public Frame decorrelateRel(Filter rel) {
//
// Rewrite logic:
//
- // 1. If a LogicalFilter references a correlated field in its filter
- // condition, rewrite the LogicalFilter to be
- // LogicalFilter
- // LogicalJoin(cross product)
+ // 1. If a Filter references a correlated field in its filter
+ // condition, rewrite the Filter to be
+ // Filter
+ // Join(cross product)
// OriginalFilterInput
// ValueGenerator(produces distinct sets of correlated variables)
// and rewrite the correlated fieldAccess in the filter condition to
- // reference the LogicalJoin output.
+ // reference the Join output.
//
- // 2. If LogicalFilter does not reference correlated variables, simply
+ // 2. If Filter does not reference correlated variables, simply
// rewrite the filter condition using new input.
//
@@ -1334,7 +1311,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
return null;
}
- // If this LogicalFilter has correlated reference, create value generator
+ // If this Filter has correlated reference, create value generator
// and produce the correlated variables in the new output.
if (cm.mapRefRelToCorRef.containsKey(rel)) {
frame = decorrelateInputWithValueGenerator(rel);
@@ -1500,9 +1477,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
rightFrame.oldToNewOutputs.get(i) + newLeftFieldCount);
}
- newJoin = LogicalJoin.create(leftFrame.r, rightFrame.r, condition,
- ImmutableSet.<CorrelationId>of(), rel.getJoinType().toJoinType());
-
+ newJoin = relBuilder.push(leftFrame.r).push(rightFrame.r)
+ .join(rel.getJoinType().toJoinType(), condition).build();
}
valueGen.pop();
@@ -1564,11 +1540,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
return register(rel, newJoin, mapOldToNewOutputs, corDefOutputs);
}
/**
- * Rewrite LogicalJoin.
+ * Rewrite Join.
*
- * @param rel LogicalJoin
+ * @param rel Join
*/
- public Frame decorrelateRel(LogicalJoin rel) {
+ public Frame decorrelateRel(Join rel) {
//
// Rewrite logic:
//
@@ -1684,11 +1660,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
* @param join Join
* @param project Original project as the right-hand input of the join
* @param nullIndicatorPos Position of null indicator
- * @return the subtree with the new LogicalProject at the root
+ * @return the subtree with the new Project at the root
*/
private RelNode projectJoinOutputWithNullability(
- LogicalJoin join,
- LogicalProject project,
+ Join join,
+ Project project,
int nullIndicatorPos) {
final RelDataTypeFactory typeFactory = join.getCluster().getTypeFactory();
final RelNode left = join.getLeft();
@@ -1730,7 +1706,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
newProjExprs.add(Pair.of(newProjExpr, pair.right));
}
- return RelOptUtil.createProject(join, newProjExprs, false);
+ return RelOptUtil.createProject(join, Pair.left(newProjExprs), Pair.right(newProjExprs),
+ false, relBuilder);
}
/**
@@ -1741,11 +1718,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
* @param project the original project as the RHS input of the join
* @param isCount Positions which are calls to the <code>COUNT</code>
* aggregation function
- * @return the subtree with the new LogicalProject at the root
+ * @return the subtree with the new Project at the root
*/
private RelNode aggregateCorrelatorOutput(
Correlate correlate,
- LogicalProject project,
+ Project project,
Set<Integer> isCount) {
final RelNode left = correlate.getLeft();
final JoinRelType joinType = correlate.getJoinType().toJoinType();
@@ -1777,7 +1754,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
newProjects.add(Pair.of(newProjExpr, pair.right));
}
- return RelOptUtil.createProject(correlate, newProjects, false);
+ return RelOptUtil.createProject(correlate, Pair.left(newProjects), Pair.right(newProjects),
+ false, relBuilder);
}
/**
@@ -1792,8 +1770,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
*/
private boolean checkCorVars(
LogicalCorrelate correlate,
- LogicalProject project,
- LogicalFilter filter,
+ Project project,
+ Filter filter,
List<RexFieldAccess> correlatedJoinKeys) {
if (filter != null) {
assert correlatedJoinKeys != null;
@@ -1852,7 +1830,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
*
* @param input Input relational expression
* @param additionalExprs Additional expressions and names
- * @return the new LogicalProject
+ * @return the new Project
*/
private RelNode createProjectWithAdditionalExprs(
RelNode input,
@@ -1868,7 +1846,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
field.e.getName()));
}
projects.addAll(additionalExprs);
- return RelOptUtil.createProject(input, projects, false);
+ return RelOptUtil.createProject(input, Pair.left(projects), Pair.right(projects),
+ false, relBuilder);
}
/* Returns an immutable map with the identity [0: 0, .., count-1: count-1]. */
@@ -2157,7 +2136,6 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
}
- final RelDataType newType;
if (!isSpecialCast) {
// TODO: ideally this only needs to be called if the result
// type will also change. However, since that requires
@@ -2165,7 +2143,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// decides return type based on input types, for now all
// operators will be recreated with new type if any operand
// changed, unless the operator has "built-in" type.
- newType = rexBuilder.deriveReturnType(operator, clonedOperands);
+ newCall = rexBuilder.ensureType(
+ call.getType(),
+ rexBuilder.makeCall(
+ rexBuilder.deriveReturnType(operator, clonedOperands), operator, clonedOperands),
+ true);
} else {
// Use the current return type when creating a new call, for
// operators with return type built into the operator
@@ -2175,13 +2157,12 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// TODO: Comments in RexShuttle.visitCall() mention other
// types in this category. Need to resolve those together
// and preferably in the base class RexShuttle.
- newType = call.getType();
+ newCall =
+ rexBuilder.makeCall(
+ call.getType(),
+ operator,
+ clonedOperands);
}
- newCall =
- rexBuilder.makeCall(
- newType,
- operator,
- clonedOperands);
} else {
newCall = call;
}
@@ -2206,16 +2187,16 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
RemoveSingleAggregateRule() {
super(
operand(
- LogicalAggregate.class,
+ Aggregate.class,
operand(
- LogicalProject.class,
- operand(LogicalAggregate.class, any()))));
+ Project.class,
+ operand(Aggregate.class, any()))));
}
public void onMatch(RelOptRuleCall call) {
- LogicalAggregate singleAggregate = call.rel(0);
- LogicalProject project = call.rel(1);
- LogicalAggregate aggregate = call.rel(2);
+ Aggregate singleAggregate = call.rel(0);
+ Project project = call.rel(1);
+ Aggregate aggregate = call.rel(2);
// check singleAggRel is single_value agg
if ((!singleAggregate.getGroupSet().isEmpty())
@@ -2241,15 +2222,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// singleAggRel produces a nullable type, so create the new
// projection that casts proj expr to a nullable type.
final RelOptCluster cluster = project.getCluster();
- RelNode newProject =
- RelOptUtil.createProject(aggregate,
- ImmutableList.of(
- rexBuilder.makeCast(
- cluster.getTypeFactory().createTypeWithNullability(
- projExprs.get(0).getType(),
- true),
- projExprs.get(0))),
- null);
+ RelNode newProject = RelOptUtil.createProject(aggregate,
+ ImmutableList.of(rexBuilder.makeCast(
+ cluster.getTypeFactory().createTypeWithNullability(projExprs.get(0).getType(), true),
+ projExprs.get(0))),
+ null, false, relBuilder);
call.transformTo(newProject);
}
}
@@ -2260,16 +2237,16 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
super(
operand(LogicalCorrelate.class,
operand(RelNode.class, any()),
- operand(LogicalAggregate.class,
- operand(LogicalProject.class,
+ operand(Aggregate.class,
+ operand(Project.class,
operand(RelNode.class, any())))));
}
public void onMatch(RelOptRuleCall call) {
final LogicalCorrelate correlate = call.rel(0);
final RelNode left = call.rel(1);
- final LogicalAggregate aggregate = call.rel(2);
- final LogicalProject project = call.rel(3);
+ final Aggregate aggregate = call.rel(2);
+ final Project project = call.rel(3);
RelNode right = call.rel(4);
final RelOptCluster cluster = correlate.getCluster();
@@ -2281,9 +2258,12 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
//
// CorrelateRel(left correlation, condition = true)
// LeftInputRel
- // LogicalAggregate (groupby (0) single_value())
- // LogicalProject-A (may reference coVar)
+ // Aggregate (groupby (0) single_value())
+ // Project-A (may reference coVar)
// RightInputRel
+ if(correlate.getJoinType() != SemiJoinType.LEFT) {
+ return;
+ }
final JoinRelType joinType = correlate.getJoinType().toJoinType();
// corRel.getCondition was here, however Correlate was updated so it
@@ -2311,18 +2291,18 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
int nullIndicatorPos;
- if ((right instanceof LogicalFilter)
+ if ((right instanceof Filter)
&& cm.mapRefRelToCorRef.containsKey(right)) {
// rightInputRel has this shape:
//
- // LogicalFilter (references corvar)
+ // Filter (references corvar)
// FilterInputRel
// If rightInputRel is a filter and contains correlated
// reference, make sure the correlated keys in the filter
// condition forms a unique key of the RHS.
- LogicalFilter filter = (LogicalFilter) right;
+ Filter filter = (Filter) right;
right = filter.getInput();
assert right instanceof HepRelVertex;
@@ -2342,7 +2322,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// refs. These comparisons are AND'ed together.
List<RexNode> tmpRightJoinKeys = Lists.newArrayList();
List<RexNode> correlatedJoinKeys = Lists.newArrayList();
- RelOptUtil.splitCorrelatedFilterCondition(
+ HiveRelOptUtil.splitCorrelatedFilterCondition(
filter,
tmpRightJoinKeys,
correlatedJoinKeys,
@@ -2386,8 +2366,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// Change the plan to this structure.
// Note that the aggregateRel is removed.
//
- // LogicalProject-A' (replace corvar to input ref from the LogicalJoin)
- // LogicalJoin (replace corvar to input ref from LeftInputRel)
+ // Project-A' (replace corvar to input ref from the Join)
+ // Join (replace corvar to input ref from LeftInputRel)
// LeftInputRel
// RightInputRel(oreviously FilterInputRel)
@@ -2410,11 +2390,11 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// Change the plan to this structure.
//
- // LogicalProject-A' (replace corvar to input ref from LogicalJoin)
- // LogicalJoin (left, condition = true)
+ // Project-A' (replace corvar to input ref from Join)
+ // Join (left, condition = true)
// LeftInputRel
- // LogicalAggregate(groupby(0), single_value(0), s_v(1)....)
- // LogicalProject-B (everything from input plus literal true)
+ // Aggregate(groupby(0), single_value(0), s_v(1)....)
+ // Project-B (everything from input plus literal true)
// ProjInputRel
// make the new projRel to provide a null indicator
@@ -2426,7 +2406,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// make the new aggRel
right =
- RelOptUtil.createSingleValueAggRel(cluster, right);
+ HiveRelOptUtil.createSingleValueAggRel(cluster, right, HiveRelFactories.HIVE_AGGREGATE_FACTORY);
// The last field:
// single_value(true)
@@ -2439,9 +2419,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
// make the new join rel
- LogicalJoin join =
- LogicalJoin.create(left, right, joinCond,
- ImmutableSet.<CorrelationId>of(), joinType);
+ Join join = (Join) relBuilder.push(left).push(right)
+ .join(joinType, joinCond).build();
RelNode newProject =
projectJoinOutputWithNullability(join, project, nullIndicatorPos);
@@ -2459,18 +2438,18 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
super(
operand(LogicalCorrelate.class,
operand(RelNode.class, any()),
- operand(LogicalProject.class,
- operand(LogicalAggregate.class, null, Aggregate.IS_SIMPLE,
- operand(LogicalProject.class,
+ operand(Project.class,
+ operand(Aggregate.class, null, Aggregate.IS_SIMPLE,
+ operand(Project.class,
operand(RelNode.class, any()))))));
}
public void onMatch(RelOptRuleCall call) {
final LogicalCorrelate correlate = call.rel(0);
final RelNode left = call.rel(1);
- final LogicalProject aggOutputProject = call.rel(2);
- final LogicalAggregate aggregate = call.rel(3);
- final LogicalProject aggInputProject = call.rel(4);
+ final Project aggOutputProject = call.rel(2);
+ final Aggregate aggregate = call.rel(3);
+ final Project aggInputProject = call.rel(4);
RelNode right = call.rel(5);
final RelOptCluster cluster = correlate.getCluster();
@@ -2482,9 +2461,9 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
//
// CorrelateRel(left correlation, condition = true)
// LeftInputRel
- // LogicalProject-A (a RexNode)
- // LogicalAggregate (groupby (0), agg0(), agg1()...)
- // LogicalProject-B (references coVar)
+ // Project-A (a RexNode)
+ // Aggregate (groupby (0), agg0(), agg1()...)
+ // Project-B (references coVar)
// rightInputRel
// check aggOutputProject projects only one expression
@@ -2493,6 +2472,10 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
return;
}
+ if(correlate.getJoinType() != SemiJoinType.LEFT) {
+ return;
+ }
+
final JoinRelType joinType = correlate.getJoinType().toJoinType();
// corRel.getCondition was here, however Correlate was updated so it
// never includes a join condition. The code was not modified for brevity.
@@ -2523,13 +2506,13 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
}
- if ((right instanceof LogicalFilter)
+ if ((right instanceof Filter)
&& cm.mapRefRelToCorRef.containsKey(right)) {
// rightInputRel has this shape:
//
- // LogicalFilter (references corvar)
+ // Filter (references corvar)
// FilterInputRel
- LogicalFilter filter = (LogicalFilter) right;
+ Filter filter = (Filter) right;
right = filter.getInput();
assert right instanceof HepRelVertex;
@@ -2550,7 +2533,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// expressions. These comparisons are AND'ed together.
List<RexNode> rightJoinKeys = Lists.newArrayList();
List<RexNode> tmpCorrelatedJoinKeys = Lists.newArrayList();
- RelOptUtil.splitCorrelatedFilterCondition(
+ HiveRelOptUtil.splitCorrelatedFilterCondition(
filter,
rightJoinKeys,
tmpCorrelatedJoinKeys,
@@ -2600,21 +2583,21 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
//
// CorrelateRel(left correlation, condition = true)
// LeftInputRel
- // LogicalProject-A (a RexNode)
- // LogicalAggregate (groupby(0), agg0(),agg1()...)
- // LogicalProject-B (may reference coVar)
- // LogicalFilter (references corVar)
+ // Project-A (a RexNode)
+ // Aggregate (groupby(0), agg0(),agg1()...)
+ // Project-B (may reference coVar)
+ // Filter (references corVar)
// RightInputRel (no correlated reference)
//
// to this plan:
//
- // LogicalProject-A' (all gby keys + rewritten nullable ProjExpr)
- // LogicalAggregate (groupby(all left input refs)
+ // Project-A' (all gby keys + rewritten nullable ProjExpr)
+ // Aggregate (groupby(all left input refs)
// agg0(rewritten expression),
// agg1()...)
- // LogicalProject-B' (rewriten original projected exprs)
- // LogicalJoin(replace corvar w/ input ref from LeftInputRel)
+ // Project-B' (rewriten original projected exprs)
+ // Join(replace corvar w/ input ref from LeftInputRel)
// LeftInputRel
// RightInputRel
//
@@ -2626,14 +2609,14 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// projection list from the RHS for simplicity to avoid
// searching for non-null fields.
//
- // LogicalProject-A' (all gby keys + rewritten nullable ProjExpr)
- // LogicalAggregate (groupby(all left input refs),
+ // Project-A' (all gby keys + rewritten nullable ProjExpr)
+ // Aggregate (groupby(all left input refs),
// count(nullIndicator), other aggs...)
- // LogicalProject-B' (all left input refs plus
+ // Project-B' (all left input refs plus
// the rewritten original projected exprs)
- // LogicalJoin(replace corvar to input ref from LeftInputRel)
+ // Join(replace corvar to input ref from LeftInputRel)
// LeftInputRel
- // LogicalProject (everything from RightInputRel plus
+ // Project (everything from RightInputRel plus
// the nullIndicator "true")
// RightInputRel
//
@@ -2668,20 +2651,20 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
//
// CorrelateRel(left correlation, condition = true)
// LeftInputRel
- // LogicalProject-A (a RexNode)
- // LogicalAggregate (groupby(0), agg0(), agg1()...)
- // LogicalProject-B (references coVar)
+ // Project-A (a RexNode)
+ // Aggregate (groupby(0), agg0(), agg1()...)
+ // Project-B (references coVar)
// RightInputRel (no correlated reference)
//
// to this plan:
//
- // LogicalProject-A' (all gby keys + rewritten nullable ProjExpr)
- // LogicalAggregate (groupby(all left input refs)
+ // Project-A' (all gby keys + rewritten nullable ProjExpr)
+ // Aggregate (groupby(all left input refs)
// agg0(rewritten expression),
// agg1()...)
- // LogicalProject-B' (rewriten original projected exprs)
- // LogicalJoin (LOJ cond = true)
+ // Project-B' (rewriten original projected exprs)
+ // Join (LOJ cond = true)
// LeftInputRel
// RightInputRel
//
@@ -2693,14 +2676,14 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// projection list from the RHS for simplicity to avoid
// searching for non-null fields.
//
- // LogicalProject-A' (all gby keys + rewritten nullable ProjExpr)
- // LogicalAggregate (groupby(all left input refs),
+ // Project-A' (all gby keys + rewritten nullable ProjExpr)
+ // Aggregate (groupby(all left input refs),
// count(nullIndicator), other aggs...)
- // LogicalProject-B' (all left input refs plus
+ // Project-B' (all left input refs plus
// the rewritten original projected exprs)
- // LogicalJoin(replace corvar to input ref from LeftInputRel)
+ // Join(replace corvar to input ref from LeftInputRel)
// LeftInputRel
- // LogicalProject (everything from RightInputRel plus
+ // Project (everything from RightInputRel plus
// the nullIndicator "true")
// RightInputRel
} else {
@@ -2718,9 +2701,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
Pair.<RexNode, String>of(rexBuilder.makeLiteral(true),
"nullIndicator")));
- LogicalJoin join =
- LogicalJoin.create(left, right, joinCond,
- ImmutableSet.<CorrelationId>of(), joinType);
+ Join join = (Join) relBuilder.push(left).push(right)
+ .join(joinType, joinCond).build();
// To the consumer of joinOutputProjRel, nullIndicator is located
// at the end
@@ -2754,11 +2736,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
joinOutputProjects.add(
rexBuilder.makeInputRef(join, nullIndicatorPos));
- RelNode joinOutputProject =
- RelOptUtil.createProject(
- join,
- joinOutputProjects,
- null);
+ RelNode joinOutputProject = RelOptUtil.createProject(
+ join, joinOutputProjects, null, false, relBuilder);
// nullIndicator is now at a different location in the output of
// the join
@@ -2793,12 +2772,9 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
ImmutableBitSet groupSet =
ImmutableBitSet.range(groupCount);
- LogicalAggregate newAggregate =
- LogicalAggregate.create(joinOutputProject,
- false,
- groupSet,
- null,
- newAggCalls);
+ Aggregate newAggregate =
+ (Aggregate) relBuilder.push(joinOutputProject)
+ .aggregate(relBuilder.groupKey(groupSet, null), newAggCalls).build();
List<RexNode> newAggOutputProjectList = Lists.newArrayList();
for (int i : groupSet) {
@@ -2815,11 +2791,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
true),
newAggOutputProjects));
- RelNode newAggOutputProject =
- RelOptUtil.createProject(
- newAggregate,
- newAggOutputProjectList,
- null);
+ RelNode newAggOutputProject = RelOptUtil.createProject(
+ newAggregate, newAggOutputProjectList, null, false, relBuilder);
call.transformTo(newAggOutputProject);
@@ -2844,19 +2817,19 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
flavor
? operand(LogicalCorrelate.class,
operand(RelNode.class, any()),
- operand(LogicalProject.class,
- operand(LogicalAggregate.class, any())))
+ operand(Project.class,
+ operand(Aggregate.class, any())))
: operand(LogicalCorrelate.class,
operand(RelNode.class, any()),
- operand(LogicalAggregate.class, any())));
+ operand(Aggregate.class, any())));
this.flavor = flavor;
}
public void onMatch(RelOptRuleCall call) {
final LogicalCorrelate correlate = call.rel(0);
final RelNode left = call.rel(1);
- final LogicalProject aggOutputProject;
- final LogicalAggregate aggregate;
+ final Project aggOutputProject;
+ final Aggregate aggregate;
if (flavor) {
aggOutputProject = call.rel(2);
aggregate = call.rel(3);
@@ -2870,11 +2843,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
for (int i = 0; i < fields.size(); i++) {
projects.add(RexInputRef.of2(projects.size(), fields));
}
- aggOutputProject =
- (LogicalProject) RelOptUtil.createProject(
- aggregate,
- projects,
- false);
+ aggOutputProject = (Project) RelOptUtil.createProject(
+ aggregate, Pair.left(projects), Pair.right(projects), false, relBuilder);
}
onMatch2(call, correlate, left, aggOutputProject, aggregate);
}
@@ -2883,8 +2853,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
RelOptRuleCall call,
LogicalCorrelate correlate,
RelNode leftInput,
- LogicalProject aggOutputProject,
- LogicalAggregate aggregate) {
+ Project aggOutputProject,
+ Aggregate aggregate) {
if (generatedCorRels.contains(correlate)) {
// This correlator was generated by a previous invocation of
// this rule. No further work to do.
@@ -2899,8 +2869,8 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
//
// CorrelateRel(left correlation, condition = true)
// LeftInputRel
- // LogicalProject-A (a RexNode)
- // LogicalAggregate (groupby (0), agg0(), agg1()...)
+ // Project-A (a RexNode)
+ // Aggregate (groupby (0), agg0(), agg1()...)
// check aggOutputProj projects only one expression
List<RexNode> aggOutputProjExprs = aggOutputProject.getProjects();
@@ -2908,6 +2878,10 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
return;
}
+ if(correlate.getJoinType() != SemiJoinType.LEFT) {
+ return;
+ }
+
JoinRelType joinType = correlate.getJoinType().toJoinType();
// corRel.getCondition was here, however Correlate was updated so it
// never includes a join condition. The code was not modified for brevity.
@@ -2940,7 +2914,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
// replacing references to count() with case statement)
// Correlator(left correlation, condition = true)
// LeftInputRel
- // LogicalAggregate (groupby (0), agg0(), agg1()...)
+ // Aggregate (groupby (0), agg0(), agg1()...)
//
LogicalCorrelate newCorrelate =
LogicalCorrelate.create(leftInput, aggregate,
@@ -3179,24 +3153,10 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
mightRequireValueGen = true;
return rel;
}
- public RelNode visit(LogicalUnion rel) {
- mightRequireValueGen = true;
- return rel;
- }
- public RelNode visit(LogicalIntersect rel) {
- mightRequireValueGen = true;
- return rel;
- }
-
public RelNode visit(HiveIntersect rel) {
mightRequireValueGen = true;
return rel;
}
-
- @Override public RelNode visit(LogicalJoin rel) {
- mightRequireValueGen = true;
- return rel;
- }
@Override public RelNode visit(HiveProject rel) {
if(!(hasRexOver(((HiveProject)rel).getProjects()))) {
mightRequireValueGen = false;
@@ -3206,15 +3166,6 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
return rel;
}
}
- @Override public RelNode visit(LogicalProject rel) {
- if(!(hasRexOver(((LogicalProject)rel).getProjects()))) {
- mightRequireValueGen = false;
- return super.visit(rel);
- } else {
- mightRequireValueGen = true;
- return rel;
- }
- }
@Override public RelNode visit(HiveAggregate rel) {
// if there are aggregate functions or grouping sets we will need
// value generator
@@ -3228,17 +3179,6 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
return rel;
}
}
- @Override public RelNode visit(LogicalAggregate rel) {
- if(rel.getAggCallList().isEmpty() && !rel.indicator) {
- this.mightRequireValueGen = false;
- return super.visit(rel);
- } else {
- // need to reset to true in case previous aggregate/project
- // has set it to false
- this.mightRequireValueGen = true;
- return rel;
- }
- }
@Override public RelNode visit(LogicalCorrelate rel) {
// this means we are hitting nested subquery so don't
// need to go further
@@ -3279,16 +3219,6 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
mapFieldAccessToCorVar);
}
- @Override public RelNode visit(LogicalJoin join) {
- try {
- Stacks.push(stack, join);
- join.getCondition().accept(rexVisitor(join));
- } finally {
- Stacks.pop(stack, join);
- }
- return visitJoin(join);
- }
-
public RelNode visit(HiveJoin join) {
try {
Stacks.push(stack, join);
@@ -3329,6 +3259,7 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
return super.visit(project);
}
+
public RelNode visit(final HiveFilter filter) {
try {
Stacks.push(stack, filter);
@@ -3338,27 +3269,6 @@ public final class HiveRelDecorrelator implements ReflectiveVisitor {
}
return super.visit(filter);
}
- @Override public RelNode visit(final LogicalFilter filter) {
- try {
- Stacks.push(stack, filter);
- filter.getCondition().accept(rexVisitor(filter));
- } finally {
- Stacks.pop(stack, filter);
- }
- return super.visit(filter);
- }
-
- @Override public RelNode visit(LogicalProject project) {
- try {
- Stacks.push(stack, project);
- for (RexNode node : project.getProjects()) {
- node.accept(rexVisitor(project));
- }
- } finally {
- Stacks.pop(stack, project);
- }
- return super.visit(project);
- }
private RexVisitorImpl<Void> rexVisitor(final RelNode rel) {
return new RexVisitorImpl<Void>(true) {
http://git-wip-us.apache.org/repos/asf/hive/blob/f567a823/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/explainuser_1.q.out b/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
index 0c339e5..8801331 100644
--- a/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
+++ b/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
@@ -2287,27 +2287,27 @@ Stage-0
limit:-1
Stage-1
Reducer 3 llap
- File Output Operator [FS_26]
- Select Operator [SEL_25] (rows=13 width=223)
+ File Output Operator [FS_24]
+ Select Operator [SEL_23] (rows=13 width=223)
Output:["_col0","_col1","_col2"]
- Filter Operator [FIL_24] (rows=13 width=231)
- predicate:(not CASE WHEN ((_col4 = 0L)) THEN (false) WHEN (_col4 is null) THEN (false) WHEN (_col8 is not null) THEN (true) WHEN (_col0 is null) THEN (null) WHEN ((_col5 < _col4)) THEN (true) ELSE (false) END)
- Merge Join Operator [MERGEJOIN_32] (rows=26 width=230)
- Conds:RS_21._col0, _col1=RS_22._col0, _col1(Left Outer),Output:["_col0","_col1","_col2","_col4","_col5","_col8"]
+ Filter Operator [FIL_22] (rows=13 width=231)
+ predicate:CASE WHEN ((_col4 = 0L)) THEN (true) WHEN (_col4 is null) THEN (true) WHEN (_col8 is not null) THEN (false) WHEN (_col0 is null) THEN (null) WHEN ((_col5 < _col4)) THEN (false) ELSE (true) END
+ Merge Join Operator [MERGEJOIN_30] (rows=26 width=230)
+ Conds:RS_19._col0, _col1=RS_20._col0, _col1(Left Outer),Output:["_col0","_col1","_col2","_col4","_col5","_col8"]
<-Reducer 2 [SIMPLE_EDGE] llap
- SHUFFLE [RS_21]
+ SHUFFLE [RS_19]
PartitionCols:_col0, _col1
- Merge Join Operator [MERGEJOIN_31] (rows=26 width=229)
- Conds:RS_18._col1=RS_19._col0(Left Outer),Output:["_col0","_col1","_col2","_col4","_col5"]
+ Merge Join Operator [MERGEJOIN_29] (rows=26 width=229)
+ Conds:RS_16._col1=RS_17._col0(Left Outer),Output:["_col0","_col1","_col2","_col4","_col5"]
<-Map 1 [SIMPLE_EDGE] llap
- SHUFFLE [RS_18]
+ SHUFFLE [RS_16]
PartitionCols:_col1
Select Operator [SEL_1] (rows=26 width=223)
Output:["_col0","_col1","_col2"]
TableScan [TS_0] (rows=26 width=223)
default@part,b,Tbl:COMPLETE,Col:COMPLETE,Output:["p_name","p_mfgr","p_size"]
<-Reducer 4 [ONE_TO_ONE_EDGE] llap
- FORWARD [RS_19]
+ FORWARD [RS_17]
PartitionCols:_col0
Group By Operator [GBY_7] (rows=2 width=114)
Output:["_col0","_col1","_col2"],aggregations:["count(VALUE._col0)","count(VALUE._col1)"],keys:KEY._col0
@@ -2318,28 +2318,26 @@ Stage-0
Output:["_col0","_col1","_col2"],aggregations:["count()","count(p_name)"],keys:p_mfgr
Select Operator [SEL_4] (rows=8 width=223)
Output:["p_name","p_mfgr"]
- Filter Operator [FIL_29] (rows=8 width=223)
+ Filter Operator [FIL_27] (rows=8 width=223)
predicate:((p_size < 10) and p_mfgr is not null)
Please refer to the previous TableScan [TS_0]
<-Reducer 5 [ONE_TO_ONE_EDGE] llap
- FORWARD [RS_22]
+ FORWARD [RS_20]
PartitionCols:_col0, _col1
- Select Operator [SEL_17] (rows=4 width=223)
+ Select Operator [SEL_15] (rows=4 width=223)
Output:["_col0","_col1","_col2"]
- Filter Operator [FIL_16] (rows=4 width=219)
- predicate:_col0 is not null
- Group By Operator [GBY_14] (rows=4 width=219)
- Output:["_col0","_col1"],keys:KEY._col0, KEY._col1
- <-Map 1 [SIMPLE_EDGE] llap
- SHUFFLE [RS_13]
- PartitionCols:_col0, _col1
- Group By Operator [GBY_12] (rows=4 width=219)
- Output:["_col0","_col1"],keys:p_name, p_mfgr
- Select Operator [SEL_11] (rows=8 width=223)
- Output:["p_name","p_mfgr"]
- Filter Operator [FIL_30] (rows=8 width=223)
- predicate:((p_size < 10) and p_mfgr is not null)
- Please refer to the previous TableScan [TS_0]
+ Group By Operator [GBY_14] (rows=4 width=219)
+ Output:["_col0","_col1"],keys:KEY._col0, KEY._col1
+ <-Map 1 [SIMPLE_EDGE] llap
+ SHUFFLE [RS_13]
+ PartitionCols:_col0, _col1
+ Group By Operator [GBY_12] (rows=4 width=219)
+ Output:["_col0","_col1"],keys:p_name, p_mfgr
+ Select Operator [SEL_11] (rows=8 width=223)
+ Output:["p_name","p_mfgr"]
+ Filter Operator [FIL_28] (rows=8 width=223)
+ predicate:((p_size < 10) and p_mfgr is not null and p_name is not null)
+ Please refer to the previous TableScan [TS_0]
PREHOOK: query: explain select p_name, p_size
from
@@ -2451,24 +2449,24 @@ Stage-0
limit:-1
Stage-1
Reducer 5 llap
- File Output Operator [FS_37]
- Select Operator [SEL_36] (rows=3 width=106)
+ File Output Operator [FS_36]
+ Select Operator [SEL_35] (rows=2 width=106)
Output:["_col0","_col1"]
<-Reducer 4 [SIMPLE_EDGE] llap
- SHUFFLE [RS_35]
- Select Operator [SEL_34] (rows=3 width=106)
+ SHUFFLE [RS_34]
+ Select Operator [SEL_33] (rows=2 width=106)
Output:["_col0","_col1"]
- Filter Operator [FIL_33] (rows=3 width=119)
- predicate:(not CASE WHEN ((_col3 = 0L)) THEN (false) WHEN (_col3 is null) THEN (false) WHEN (_col7 is not null) THEN (true) WHEN (_col0 is null) THEN (null) WHEN ((_col4 < _col3)) THEN (true) ELSE (false) END)
- Merge Join Operator [MERGEJOIN_44] (rows=5 width=114)
- Conds:RS_30._col0, _col1=RS_31._col0, _col1(Left Outer),Output:["_col0","_col1","_col3","_col4","_col7"]
+ Filter Operator [FIL_32] (rows=2 width=116)
+ predicate:CASE WHEN ((_col3 = 0L)) THEN (true) WHEN (_col3 is null) THEN (true) WHEN (_col7 is not null) THEN (false) WHEN (_col0 is null) THEN (null) WHEN ((_col4 < _col3)) THEN (false) ELSE (true) END
+ Merge Join Operator [MERGEJOIN_43] (rows=5 width=114)
+ Conds:RS_29._col0, _col1=RS_30._col0, _col1(Left Outer),Output:["_col0","_col1","_col3","_col4","_col7"]
<-Reducer 3 [SIMPLE_EDGE] llap
- SHUFFLE [RS_30]
+ SHUFFLE [RS_29]
PartitionCols:_col0, _col1
- Merge Join Operator [MERGEJOIN_43] (rows=5 width=112)
- Conds:RS_27._col1=RS_28._col0(Left Outer),Output:["_col0","_col1","_col3","_col4"]
+ Merge Join Operator [MERGEJOIN_42] (rows=5 width=112)
+ Conds:RS_26._col1=RS_27._col0(Left Outer),Output:["_col0","_col1","_col3","_col4"]
<-Reducer 2 [SIMPLE_EDGE] llap
- SHUFFLE [RS_27]
+ SHUFFLE [RS_26]
PartitionCols:_col1
Group By Operator [GBY_4] (rows=5 width=106)
Output:["_col0","_col1"],aggregations:["min(VALUE._col0)"],keys:KEY._col0
@@ -2482,7 +2480,7 @@ Stage-0
TableScan [TS_0] (rows=26 width=106)
default@part,b,Tbl:COMPLETE,Col:COMPLETE,Output:["p_mfgr","p_retailprice"]
<-Reducer 7 [ONE_TO_ONE_EDGE] llap
- FORWARD [RS_28]
+ FORWARD [RS_27]
PartitionCols:_col0
Group By Operator [GBY_16] (rows=1 width=24)
Output:["_col0","_col1","_col2"],aggregations:["count(VALUE._col0)","count(VALUE._col1)"],keys:KEY._col0
@@ -2493,7 +2491,7 @@ Stage-0
Output:["_col0","_col1","_col2"],aggregations:["count()","count(_col0)"],keys:_col1
Select Operator [SEL_12] (rows=1 width=114)
Output:["_col0","_col1"]
- Filter Operator [FIL_40] (rows=1 width=114)
+ Filter Operator [FIL_39] (rows=1 width=114)
predicate:(((_col2 - _col1) > 600.0D) and _col1 is not null)
Group By Operator [GBY_10] (rows=5 width=114)
Output:["_col0","_col1","_col2"],aggregations:["min(VALUE._col0)","max(VALUE._col1)"],keys:KEY._col0
@@ -2504,24 +2502,22 @@ Stage-0
Output:["_col0","_col1","_col2"],aggregations:["min(p_retailprice)","max(p_retailprice)"],keys:p_mfgr
Please refer to the previous Select Operator [SEL_1]
<-Reducer 8 [SIMPLE_EDGE] llap
- SHUFFLE [RS_31]
+ SHUFFLE [RS_30]
PartitionCols:_col0, _col1
- Select Operator [SEL_26] (rows=1 width=110)
+ Select Operator [SEL_25] (rows=1 width=110)
Output:["_col0","_col1","_col2"]
- Filter Operator [FIL_25] (rows=1 width=110)
- predicate:_col0 is not null
- Select Operator [SEL_24] (rows=1 width=110)
- Output:["_col0","_col1"]
- Filter Operator [FIL_41] (rows=1 width=114)
- predicate:(((_col2 - _col1) > 600.0D) and _col1 is not null)
- Group By Operator [GBY_22] (rows=5 width=114)
- Output:["_col0","_col1","_col2"],aggregations:["min(VALUE._col0)","max(VALUE._col1)"],keys:KEY._col0
- <-Map 1 [SIMPLE_EDGE] llap
- SHUFFLE [RS_21]
- PartitionCols:_col0
- Group By Operator [GBY_20] (rows=5 width=114)
- Output:["_col0","_col1","_col2"],aggregations:["min(p_retailprice)","max(p_retailprice)"],keys:p_mfgr
- Please refer to the previous TableScan [TS_0]
+ Filter Operator [FIL_40] (rows=1 width=114)
+ predicate:(((_col2 - _col1) > 600.0D) and _col1 is not null)
+ Group By Operator [GBY_23] (rows=5 width=114)
+ Output:["_col0","_col1","_col2"],aggregations:["min(VALUE._col0)","max(VALUE._col1)"],keys:KEY._col0
+ <-Map 1 [SIMPLE_EDGE] llap
+ SHUFFLE [RS_22]
+ PartitionCols:_col0
+ Group By Operator [GBY_21] (rows=5 width=114)
+ Output:["_col0","_col1","_col2"],aggregations:["min(p_retailprice)","max(p_retailprice)"],keys:p_mfgr
+ Filter Operator [FIL_41] (rows=26 width=106)
+ predicate:p_mfgr is not null
+ Please refer to the previous TableScan [TS_0]
PREHOOK: query: explain select count(c_int) over(), sum(c_float) over(), max(c_int) over(), min(c_int) over(), row_number() over(), rank() over(), dense_rank() over(), percent_rank() over(), lead(c_int, 2, c_int) over(), lag(c_float, 2, c_float) over() from cbo_t1
PREHOOK: type: QUERY
http://git-wip-us.apache.org/repos/asf/hive/blob/f567a823/ql/src/test/results/clientpositive/llap/groupby_groupingset_bug.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/groupby_groupingset_bug.q.out b/ql/src/test/results/clientpositive/llap/groupby_groupingset_bug.q.out
index 6ba8811..5e18f33 100644
--- a/ql/src/test/results/clientpositive/llap/groupby_groupingset_bug.q.out
+++ b/ql/src/test/results/clientpositive/llap/groupby_groupingset_bug.q.out
@@ -230,9 +230,9 @@ Stage-0
SHUFFLE [RS_139]
PartitionCols:_col0
Group By Operator [GBY_138] (rows=1 width=12)
- Output:["_col0","_col1"],aggregations:["count()"],keys:_col9
+ Output:["_col0","_col1"],aggregations:["count()"],keys:_col8
Map Join Operator [MAPJOIN_137] (rows=5185194 width=4)
- Conds:MAPJOIN_136._col7=RS_130._col0(Inner),Output:["_col9"]
+ Conds:MAPJOIN_136._col6=RS_130._col0(Inner),Output:["_col8"]
<-Map 7 [BROADCAST_EDGE] vectorized, llap
BROADCAST [RS_130]
PartitionCols:_col0
@@ -271,17 +271,17 @@ Stage-0
Output:["_col0"]
Please refer to the previous Map Join Operator [MAPJOIN_129]
<-Map Join Operator [MAPJOIN_136] (rows=370371 width=4)
- Conds:RS_30._col0=SEL_135._col0(Inner),Output:["_col7"]
+ Conds:RS_30._col0=SEL_135._col0(Inner),Output:["_col6"]
<-Map 1 [BROADCAST_EDGE] llap
BROADCAST [RS_30]
PartitionCols:_col0
Map Join Operator [MAPJOIN_100] (rows=6 width=228)
- Conds:SEL_2._col1=RS_113._col2(Inner),Output:["_col0","_col2","_col3","_col4"],residual filter predicates:{(_col2 > CASE WHEN (_col4 is null) THEN (null) ELSE (_col3) END)}
+ Conds:SEL_2._col1=RS_113._col1(Inner),Output:["_col0","_col2","_col3"],residual filter predicates:{(_col2 > _col3)}
<-Reducer 3 [BROADCAST_EDGE] vectorized, llap
BROADCAST [RS_113]
- PartitionCols:_col2
- Select Operator [SEL_112] (rows=1 width=201)
- Output:["_col0","_col1","_col2"]
+ PartitionCols:_col1
+ Select Operator [SEL_112] (rows=1 width=197)
+ Output:["_col0","_col1"]
Group By Operator [GBY_111] (rows=1 width=197)
Output:["_col0","_col1"],aggregations:["min(VALUE._col0)"],keys:KEY._col0
<-Map 2 [SIMPLE_EDGE] vectorized, llap
@@ -296,7 +296,7 @@ Stage-0
<-Select Operator [SEL_2] (rows=18 width=201)
Output:["_col0","_col1","_col2"]
Filter Operator [FIL_57] (rows=18 width=201)
- predicate:i_item_sk is not null
+ predicate:(i_category is not null and i_item_sk is not null)
TableScan [TS_0] (rows=18 width=201)
default@x1_item,i,Tbl:COMPLETE,Col:COMPLETE,Output:["i_item_sk","i_category","i_current_price"]
<-Select Operator [SEL_135] (rows=123457 width=8)
http://git-wip-us.apache.org/repos/asf/hive/blob/f567a823/ql/src/test/results/clientpositive/llap/lineage3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/lineage3.q.out b/ql/src/test/results/clientpositive/llap/lineage3.q.out
index 1ac02ec..16c4efa 100644
--- a/ql/src/test/results/clientpositive/llap/lineage3.q.out
+++ b/ql/src/test/results/clientpositive/llap/lineage3.q.out
@@ -178,7 +178,7 @@ PREHOOK: type: QUERY
PREHOOK: Input: default@alltypesorc
PREHOOK: Input: default@src1
#### A masked pattern was here ####
-{"version":"1.0","engine":"tez","database":"default","hash":"94e9cc0a67801fe1503a3cb0c5029d59","queryText":"select * from src1 a\nwhere exists\n (select cint from alltypesorc b\n where a.key = b.ctinyint + 300)\nand key > 300","edges":[{"sources":[2],"targets":[0],"edgeType":"PROJECTION"},{"sources":[3],"targets":[1],"edgeType":"PROJECTION"},{"sources":[2],"targets":[0,1],"expression":"(UDFToDouble(a.key) > 300.0D)","edgeType":"PREDICATE"},{"sources":[2],"targets":[0,1],"expression":"(a.key = a.key)","edgeType":"PREDICATE"},{"sources":[4,2],"targets":[0,1],"expression":"(UDFToDouble((UDFToInteger(b.ctinyint) + 300)) = UDFToDouble(a.key))","edgeType":"PREDICATE"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"a.key"},{"id":1,"vertexType":"COLUMN","vertexId":"a.value"},{"id":2,"vertexType":"COLUMN","vertexId":"default.src1.key"},{"id":3,"vertexType":"COLUMN","vertexId":"default.src1.value"},{"id":4,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"}]}
+{"version":"1.0","engine":"tez","database":"default","hash":"94e9cc0a67801fe1503a3cb0c5029d59","queryText":"select * from src1 a\nwhere exists\n (select cint from alltypesorc b\n where a.key = b.ctinyint + 300)\nand key > 300","edges":[{"sources":[2],"targets":[0],"edgeType":"PROJECTION"},{"sources":[3],"targets":[1],"edgeType":"PROJECTION"},{"sources":[2],"targets":[0,1],"expression":"(UDFToDouble(a.key) > 300.0D)","edgeType":"PREDICATE"},{"sources":[2],"targets":[0,1],"expression":"(a.key = a.key)","edgeType":"PREDICATE"},{"sources":[4],"targets":[0,1],"expression":"b.ctinyint is not null","edgeType":"PREDICATE"},{"sources":[4,2],"targets":[0,1],"expression":"(UDFToDouble((UDFToInteger(b.ctinyint) + 300)) = UDFToDouble(a.key))","edgeType":"PREDICATE"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"a.key"},{"id":1,"vertexType":"COLUMN","vertexId":"a.value"},{"id":2,"vertexType":"COLUMN","vertexId":"default.src1.key"},{"id":3,"vertexType":"COLUMN","vertexId":"default.src1
.value"},{"id":4,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"}]}
311 val_311
Warning: Shuffle Join MERGEJOIN[29][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
PREHOOK: query: select key, value from src1
@@ -196,7 +196,7 @@ PREHOOK: type: QUERY
PREHOOK: Input: default@alltypesorc
PREHOOK: Input: default@src1
#### A masked pattern was here ####
-{"version":"1.0","engine":"tez","database":"default","hash":"723e79692e1de404c4ffb702097586da","queryText":"select * from src1 a\nwhere not exists\n (select cint from alltypesorc b\n where a.key = b.ctinyint + 300)\nand key > 300","edges":[{"sources":[2],"targets":[0],"edgeType":"PROJECTION"},{"sources":[3],"targets":[1],"edgeType":"PROJECTION"},{"sources":[2],"targets":[0,1],"expression":"(UDFToDouble(a.key) > 300.0D)","edgeType":"PREDICATE"},{"sources":[2],"targets":[0,1],"expression":"(a.key = a.key)","edgeType":"PREDICATE"},{"sources":[4,2],"targets":[0,1],"expression":"(UDFToDouble((UDFToInteger(b.ctinyint) + 300)) = UDFToDouble(a.key))","edgeType":"PREDICATE"},{"sources":[],"targets":[0,1],"expression":"true is null","edgeType":"PREDICATE"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"a.key"},{"id":1,"vertexType":"COLUMN","vertexId":"a.value"},{"id":2,"vertexType":"COLUMN","vertexId":"default.src1.key"},{"id":3,"vertexType":"COLUMN","vertexId":"default.src1.value"
},{"id":4,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"}]}
+{"version":"1.0","engine":"tez","database":"default","hash":"723e79692e1de404c4ffb702097586da","queryText":"select * from src1 a\nwhere not exists\n (select cint from alltypesorc b\n where a.key = b.ctinyint + 300)\nand key > 300","edges":[{"sources":[2],"targets":[0],"edgeType":"PROJECTION"},{"sources":[3],"targets":[1],"edgeType":"PROJECTION"},{"sources":[2],"targets":[0,1],"expression":"(UDFToDouble(a.key) > 300.0D)","edgeType":"PREDICATE"},{"sources":[2],"targets":[0,1],"expression":"(a.key = a.key)","edgeType":"PREDICATE"},{"sources":[4],"targets":[0,1],"expression":"b.ctinyint is not null","edgeType":"PREDICATE"},{"sources":[4,2],"targets":[0,1],"expression":"(UDFToDouble((UDFToInteger(b.ctinyint) + 300)) = UDFToDouble(a.key))","edgeType":"PREDICATE"},{"sources":[],"targets":[0,1],"expression":"true is null","edgeType":"PREDICATE"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"a.key"},{"id":1,"vertexType":"COLUMN","vertexId":"a.value"},{"id":2,"vertexType":"COLUMN"
,"vertexId":"default.src1.key"},{"id":3,"vertexType":"COLUMN","vertexId":"default.src1.value"},{"id":4,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"}]}
369
401 val_401
406 val_406