HIVE-13102: CBO: Reduce operations in Calcite do not fold as tight as 
rule-based folding (Jesus Camacho Rodriguez, reviewed by Ashutosh Chauhan)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/2ddcc387
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/2ddcc387
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/2ddcc387

Branch: refs/heads/llap
Commit: 2ddcc387449db52e4118438b15880fc5feb1b973
Parents: e9b7348
Author: Jesus Camacho Rodriguez <[email protected]>
Authored: Tue Feb 23 18:17:13 2016 +0100
Committer: Jesus Camacho Rodriguez <[email protected]>
Committed: Thu Feb 25 17:19:15 2016 +0100

----------------------------------------------------------------------
 .../ql/optimizer/calcite/HiveCalciteUtil.java   |   2 +-
 .../hive/ql/optimizer/calcite/HiveRexUtil.java  |  71 ++-
 .../HiveJoinPushTransitivePredicatesRule.java   |   2 +-
 .../rules/HiveReduceExpressionsRule.java        |  10 +-
 .../calcite/stats/HiveRelMdPredicates.java      |  40 +-
 ql/src/test/queries/clientpositive/constprog3.q |   8 +
 .../queries/clientpositive/infer_join_preds.q   |  61 ++
 .../results/clientpositive/constprog3.q.out     |  83 +++
 .../test/results/clientpositive/fold_case.q.out |  24 +-
 .../clientpositive/infer_join_preds.q.out       | 619 +++++++++++++++++++
 .../test/results/clientpositive/mergejoin.q.out |   2 -
 .../clientpositive/partition_boolexpr.q.out     |  26 +-
 .../results/clientpositive/ppd_udf_col.q.out    |  20 +-
 .../results/clientpositive/tez/mergejoin.q.out  |   2 -
 14 files changed, 905 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
index fcdafdd..c60f733 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
@@ -623,7 +623,7 @@ public class HiveCalciteUtil {
     return call.getKind().belongsTo(SqlKind.COMPARISON);
   }
 
-  private static final Function<RexNode, String> REX_STR_FN = new 
Function<RexNode, String>() {
+  public static final Function<RexNode, String> REX_STR_FN = new 
Function<RexNode, String>() {
                                                               public String 
apply(RexNode r) {
                                                                 return 
r.toString();
                                                               }

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
index f75303f..6745d79 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
@@ -19,7 +19,9 @@ package org.apache.hadoop.hive.ql.optimizer.calcite;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.plan.RelOptUtil;
@@ -35,6 +37,7 @@ import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
 
 public class HiveRexUtil {
@@ -145,11 +148,15 @@ public class HiveRexUtil {
   public static RexNode simplifyAnd(RexBuilder rexBuilder, RexCall e) {
     final List<RexNode> terms = RelOptUtil.conjunctions(e);
     final List<RexNode> notTerms = new ArrayList<>();
+    final List<RexNode> negatedTerms = new ArrayList<>();
     final List<RexNode> nullOperands = new ArrayList<>();
     final List<RexNode> notNullOperands = new ArrayList<>();
-    final List<RexNode> comparedOperands = new ArrayList<>();
+    final Set<RexNode> comparedOperands = new HashSet<>();
     for (int i = 0; i < terms.size(); i++) {
       final RexNode term = terms.get(i);
+      if (!HiveCalciteUtil.isDeterministic(term)) {
+        continue;
+      }
       switch (term.getKind()) {
       case NOT:
         notTerms.add(
@@ -186,6 +193,14 @@ public class HiveRexUtil {
           RexCall rightCast = (RexCall) right;
           comparedOperands.add(rightCast.getOperands().get(0));
         }
+        RexCall negatedTerm = negate(rexBuilder, call);
+        if (negatedTerm != null) {
+          negatedTerms.add(negatedTerm);
+          RexCall invertNegatedTerm = invert(rexBuilder, negatedTerm);
+          if (invertNegatedTerm != null) {
+            negatedTerms.add(invertNegatedTerm);
+          }
+        }
         break;
       case IN:
         comparedOperands.add(((RexCall) term).operands.get(0));
@@ -230,9 +245,12 @@ public class HiveRexUtil {
     // Example #1. x AND y AND z AND NOT (x AND y)  - not satisfiable
     // Example #2. x AND y AND NOT (x AND y)        - not satisfiable
     // Example #3. x AND y AND NOT (x AND y AND z)  - may be satisfiable
+    final Set<String> termsSet = new HashSet<String>(
+            Lists.transform(terms, HiveCalciteUtil.REX_STR_FN));
     for (RexNode notDisjunction : notTerms) {
-      final List<RexNode> terms2 = RelOptUtil.conjunctions(notDisjunction);
-      if (terms.containsAll(terms2)) {
+      final Set<String> notSet = new HashSet<String>(
+              Lists.transform(RelOptUtil.conjunctions(notDisjunction), 
HiveCalciteUtil.REX_STR_FN));
+      if (termsSet.containsAll(notSet)) {
         return rexBuilder.makeLiteral(false);
       }
     }
@@ -242,6 +260,14 @@ public class HiveRexUtil {
           rexBuilder.makeCall(
               SqlStdOperatorTable.NOT, notDisjunction));
     }
+    // The negated terms
+    for (RexNode notDisjunction : negatedTerms) {
+      final Set<String> notSet = new HashSet<String>(
+              Lists.transform(RelOptUtil.conjunctions(notDisjunction), 
HiveCalciteUtil.REX_STR_FN));
+      if (termsSet.containsAll(notSet)) {
+        return rexBuilder.makeLiteral(false);
+      }
+    }
     return RexUtil.composeConjunction(rexBuilder, terms, false);
   }
 
@@ -263,7 +289,40 @@ public class HiveRexUtil {
     }
     return RexUtil.composeDisjunction(rexBuilder, terms, false);
   }
-  
-  
-  
+
+  private static RexCall negate(RexBuilder rexBuilder, RexCall call) {
+    switch (call.getKind()) {
+      case EQUALS:
+        return (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.NOT_EQUALS, 
call.getOperands());
+      case NOT_EQUALS:
+        return (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, 
call.getOperands());
+      case LESS_THAN:
+        return (RexCall) 
rexBuilder.makeCall(SqlStdOperatorTable.GREATER_THAN_OR_EQUAL, 
call.getOperands());
+      case GREATER_THAN:
+        return (RexCall) 
rexBuilder.makeCall(SqlStdOperatorTable.LESS_THAN_OR_EQUAL, call.getOperands());
+      case LESS_THAN_OR_EQUAL:
+        return (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.GREATER_THAN, 
call.getOperands());
+      case GREATER_THAN_OR_EQUAL:
+        return (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.LESS_THAN, 
call.getOperands());
+    }
+    return null;
+  }
+
+  private static RexCall invert(RexBuilder rexBuilder, RexCall call) {
+    switch (call.getKind()) {
+      case LESS_THAN:
+        return (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.GREATER_THAN,
+                Lists.reverse(call.getOperands()));
+      case GREATER_THAN:
+        return (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.LESS_THAN,
+                Lists.reverse(call.getOperands()));
+      case LESS_THAN_OR_EQUAL:
+        return (RexCall) 
rexBuilder.makeCall(SqlStdOperatorTable.GREATER_THAN_OR_EQUAL,
+                Lists.reverse(call.getOperands()));
+      case GREATER_THAN_OR_EQUAL:
+        return (RexCall) 
rexBuilder.makeCall(SqlStdOperatorTable.LESS_THAN_OR_EQUAL,
+                Lists.reverse(call.getOperands()));
+    }
+    return null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinPushTransitivePredicatesRule.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinPushTransitivePredicatesRule.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinPushTransitivePredicatesRule.java
index 994af97..65a19e1 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinPushTransitivePredicatesRule.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinPushTransitivePredicatesRule.java
@@ -79,7 +79,7 @@ public class HiveJoinPushTransitivePredicatesRule extends 
RelOptRule {
   @Override
   public void onMatch(RelOptRuleCall call) {
     Join join = call.rel(0);
-    
+
     RelOptPredicateList preds = 
RelMetadataQuery.instance().getPulledUpPredicates(join);
 
     HiveRulesRegistry registry = 
call.getPlanner().getContext().unwrap(HiveRulesRegistry.class);

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
index 1d2c4cc..9006f45 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
@@ -142,17 +142,11 @@ public abstract class HiveReduceExpressionsRule extends 
RelOptRule {
       // predicate to see if it was already a constant,
       // in which case we don't need any runtime decision
       // about filtering.
+      // TODO: support LogicalValues
       if (newConditionExp.isAlwaysTrue()) {
         call.transformTo(
             filter.getInput());
-      }
-      // TODO: support LogicalValues
-      else if (newConditionExp instanceof RexLiteral
-          || RexUtil.isNullLiteral(newConditionExp, true)) {
-        // 
call.transformTo(call.builder().values(filter.getRowType()).build());
-        return;
-      }
-      else if (reduced
+      } else if (reduced
               || 
!newConditionExp.toString().equals(filter.getCondition().toString())) {
         call.transformTo(call.builder().
             push(filter.getInput()).filter(newConditionExp).build());

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
index 36d0b45..e810747 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
@@ -17,6 +17,15 @@
  */
 package org.apache.hadoop.hive.ql.optimizer.calcite.stats;
 
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+
 import org.apache.calcite.linq4j.Linq4j;
 import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.linq4j.function.Predicate1;
@@ -39,6 +48,7 @@ import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexPermutationShuttle;
 import org.apache.calcite.rex.RexPermuteInputsShuttle;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexUtil;
@@ -61,18 +71,10 @@ import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-
 
 //TODO: Move this to calcite
 public class HiveRelMdPredicates extends RelMdPredicates {
+
   public static final RelMetadataProvider SOURCE = 
ReflectiveRelMetadataProvider.reflectiveSource(
                                                      
BuiltInMethod.PREDICATES.method,
                                                      new 
HiveRelMdPredicates());
@@ -333,7 +335,14 @@ public class HiveRelMdPredicates extends RelMdPredicates {
 
       for (RexNode iP : inferredPredicates) {
         ImmutableBitSet iPBitSet = RelOptUtil.InputFinder.bits(iP);
-        if (leftFieldsBitSet.contains(iPBitSet)) {
+        if (iPBitSet.isEmpty() && joinType == JoinRelType.INNER) {
+          leftInferredPredicates.add(iP);
+          rightInferredPredicates.add(iP);
+        } else if (iPBitSet.isEmpty() && joinType == JoinRelType.LEFT) {
+          rightInferredPredicates.add(iP);
+        } else if (iPBitSet.isEmpty() && joinType == JoinRelType.RIGHT) {
+          leftInferredPredicates.add(iP);
+        } else if (leftFieldsBitSet.contains(iPBitSet)) {
           leftInferredPredicates.add(iP.accept(leftPermute));
         } else if (rightFieldsBitSet.contains(iPBitSet)) {
           rightInferredPredicates.add(iP.accept(rightPermute));
@@ -359,11 +368,11 @@ public class HiveRelMdPredicates extends RelMdPredicates {
       case LEFT:
         return RelOptPredicateList.of(
             RelOptUtil.conjunctions(leftChildPredicates),
-            leftInferredPredicates, rightInferredPredicates);
+            EMPTY_LIST, rightInferredPredicates);
       case RIGHT:
         return RelOptPredicateList.of(
             RelOptUtil.conjunctions(rightChildPredicates),
-            inferredPredicates, EMPTY_LIST);
+            leftInferredPredicates, EMPTY_LIST);
       default:
         assert inferredPredicates.size() == 0;
         return RelOptPredicateList.EMPTY;
@@ -382,6 +391,13 @@ public class HiveRelMdPredicates extends RelMdPredicates {
         List<RexNode> inferedPredicates, boolean includeEqualityInference,
         ImmutableBitSet inferringFields) {
       for (RexNode r : RelOptUtil.conjunctions(predicates)) {
+        if (r.isAlwaysFalse()) {
+          RexLiteral falseVal =
+                  joinRel.getCluster().getRexBuilder().makeLiteral(false);
+          inferedPredicates.add(falseVal);
+          allExprsDigests.add(falseVal.toString());
+          continue;
+        }
         if (!includeEqualityInference
             && equalityPredicates.contains(r.toString())) {
           continue;

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/queries/clientpositive/constprog3.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/constprog3.q 
b/ql/src/test/queries/clientpositive/constprog3.q
new file mode 100644
index 0000000..2911fe2
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/constprog3.q
@@ -0,0 +1,8 @@
+create temporary table table1(id int, val int, val1 int, dimid int);
+create temporary table table3(id int, val int, val1 int);
+
+explain
+select table1.id, table1.val, table1.val1
+from table1 inner join table3
+on table1.dimid = table3.id and table3.id = 1 where table1.dimid <> 1;
+

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/queries/clientpositive/infer_join_preds.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/infer_join_preds.q 
b/ql/src/test/queries/clientpositive/infer_join_preds.q
new file mode 100644
index 0000000..c2e0d09
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/infer_join_preds.q
@@ -0,0 +1,61 @@
+-- SORT_QUERY_RESULTS
+
+explain
+select * from src a join src1 b on a.key = b.key;
+
+select * from src a join src1 b on a.key = b.key;
+
+explain
+select * from
+(select * from src where 1 = 0)a
+join
+(select * from src1)b on a.key = b.key;
+
+select * from
+(select * from src where 1 = 0)a
+join
+(select * from src1)b on a.key = b.key;
+
+explain
+select * from
+(select * from src where 1 = 0)a
+left outer join
+(select * from src1)b on a.key = b.key;
+
+select * from
+(select * from src where 1 = 0)a
+left outer join
+(select * from src1)b on a.key = b.key;
+
+explain
+select * from
+(select * from src where 1 = 0)a
+right outer join
+(select * from src1)b on a.key = b.key;
+
+select * from
+(select * from src where 1 = 0)a
+right outer join
+(select * from src1)b on a.key = b.key;
+
+explain
+select * from
+(select * from src where 1 = 0)a
+full outer join
+(select * from src1)b on a.key = b.key;
+
+select * from
+(select * from src where 1 = 0)a
+full outer join
+(select * from src1)b on a.key = b.key;
+
+explain
+select * from
+(select * from src)a
+right outer join
+(select * from src1 where 1 = 0)b on a.key = b.key;
+
+select * from
+(select * from src)a
+right outer join
+(select * from src1 where 1 = 0)b on a.key = b.key;

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/results/clientpositive/constprog3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/constprog3.q.out 
b/ql/src/test/results/clientpositive/constprog3.q.out
new file mode 100644
index 0000000..e01a733
--- /dev/null
+++ b/ql/src/test/results/clientpositive/constprog3.q.out
@@ -0,0 +1,83 @@
+PREHOOK: query: create temporary table table1(id int, val int, val1 int, dimid 
int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@table1
+POSTHOOK: query: create temporary table table1(id int, val int, val1 int, 
dimid int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@table1
+PREHOOK: query: create temporary table table3(id int, val int, val1 int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@table3
+POSTHOOK: query: create temporary table table3(id int, val int, val1 int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@table3
+Warning: Shuffle Join JOIN[10][tables = [$hdt$_0, $hdt$_1]] in Stage 
'Stage-1:MAPRED' is a cross product
+PREHOOK: query: explain
+select table1.id, table1.val, table1.val1
+from table1 inner join table3
+on table1.dimid = table3.id and table3.id = 1 where table1.dimid <> 1
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select table1.id, table1.val, table1.val1
+from table1 inner join table3
+on table1.dimid = table3.id and table3.id = 1 where table1.dimid <> 1
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: table1
+            Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: NONE
+              Select Operator
+                expressions: id (type: int), val (type: int), val1 (type: int)
+                outputColumnNames: _col0, _col1, _col2
+                Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: NONE
+                Reduce Output Operator
+                  sort order: 
+                  Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: NONE
+                  value expressions: _col0 (type: int), _col1 (type: int), 
_col2 (type: int)
+          TableScan
+            alias: table3
+            Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: COMPLETE
+            Select Operator
+              Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: COMPLETE
+              Filter Operator
+                predicate: false (type: boolean)
+                Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: COMPLETE
+                Reduce Output Operator
+                  sort order: 
+                  Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: COMPLETE
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Inner Join 0 to 1
+          keys:
+            0 
+            1 
+          outputColumnNames: _col0, _col1, _col2
+          Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: NONE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: NONE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/results/clientpositive/fold_case.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/fold_case.q.out 
b/ql/src/test/results/clientpositive/fold_case.q.out
index 8e88dbf..53139da 100644
--- a/ql/src/test/results/clientpositive/fold_case.q.out
+++ b/ql/src/test/results/clientpositive/fold_case.q.out
@@ -117,18 +117,20 @@ STAGE PLANS:
           TableScan
             alias: src
             Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: COMPLETE
-            Filter Operator
-              predicate: false (type: boolean)
-              Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: COMPLETE
-              Group By Operator
-                aggregations: count(1)
-                mode: hash
-                outputColumnNames: _col0
-                Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: COMPLETE
-                Reduce Output Operator
-                  sort order: 
+            Select Operator
+              Statistics: Num rows: 500 Data size: 2000 Basic stats: COMPLETE 
Column stats: COMPLETE
+              Filter Operator
+                predicate: false (type: boolean)
+                Statistics: Num rows: 1 Data size: 4 Basic stats: COMPLETE 
Column stats: COMPLETE
+                Group By Operator
+                  aggregations: count(1)
+                  mode: hash
+                  outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: COMPLETE
-                  value expressions: _col0 (type: bigint)
+                  Reduce Output Operator
+                    sort order: 
+                    Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: COMPLETE
+                    value expressions: _col0 (type: bigint)
       Reduce Operator Tree:
         Group By Operator
           aggregations: count(VALUE._col0)

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/results/clientpositive/infer_join_preds.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/infer_join_preds.q.out 
b/ql/src/test/results/clientpositive/infer_join_preds.q.out
new file mode 100644
index 0000000..8afc905
--- /dev/null
+++ b/ql/src/test/results/clientpositive/infer_join_preds.q.out
@@ -0,0 +1,619 @@
+PREHOOK: query: -- SORT_QUERY_RESULTS
+
+explain
+select * from src a join src1 b on a.key = b.key
+PREHOOK: type: QUERY
+POSTHOOK: query: -- SORT_QUERY_RESULTS
+
+explain
+select * from src a join src1 b on a.key = b.key
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: a
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: key is not null (type: boolean)
+              Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE
+                  value expressions: _col1 (type: string)
+          TableScan
+            alias: b
+            Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: key is not null (type: boolean)
+              Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 25 Data size: 191 Basic stats: 
COMPLETE Column stats: NONE
+                  value expressions: _col1 (type: string)
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Inner Join 0 to 1
+          keys:
+            0 _col0 (type: string)
+            1 _col0 (type: string)
+          outputColumnNames: _col0, _col1, _col2, _col3
+          Statistics: Num rows: 550 Data size: 5843 Basic stats: COMPLETE 
Column stats: NONE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 550 Data size: 5843 Basic stats: COMPLETE 
Column stats: NONE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select * from src a join src1 b on a.key = b.key
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@src1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from src a join src1 b on a.key = b.key
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@src1
+#### A masked pattern was here ####
+128    val_128 128     
+128    val_128 128     
+128    val_128 128     
+146    val_146 146     val_146
+146    val_146 146     val_146
+150    val_150 150     val_150
+213    val_213 213     val_213
+213    val_213 213     val_213
+224    val_224 224     
+224    val_224 224     
+238    val_238 238     val_238
+238    val_238 238     val_238
+255    val_255 255     val_255
+255    val_255 255     val_255
+273    val_273 273     val_273
+273    val_273 273     val_273
+273    val_273 273     val_273
+278    val_278 278     val_278
+278    val_278 278     val_278
+311    val_311 311     val_311
+311    val_311 311     val_311
+311    val_311 311     val_311
+369    val_369 369     
+369    val_369 369     
+369    val_369 369     
+401    val_401 401     val_401
+401    val_401 401     val_401
+401    val_401 401     val_401
+401    val_401 401     val_401
+401    val_401 401     val_401
+406    val_406 406     val_406
+406    val_406 406     val_406
+406    val_406 406     val_406
+406    val_406 406     val_406
+66     val_66  66      val_66
+98     val_98  98      val_98
+98     val_98  98      val_98
+PREHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: src
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+          TableScan
+            alias: src1
+            Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Inner Join 0 to 1
+          keys:
+            0 _col0 (type: string)
+            1 _col0 (type: string)
+          outputColumnNames: _col0, _col1, _col2, _col3
+          Statistics: Num rows: 1 Data size: 11 Basic stats: COMPLETE Column 
stats: NONE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 1 Data size: 11 Basic stats: COMPLETE Column 
stats: NONE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select * from
+(select * from src where 1 = 0)a
+join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@src1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from
+(select * from src where 1 = 0)a
+join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@src1
+#### A masked pattern was here ####
+PREHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+left outer join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+left outer join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: src
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+          TableScan
+            alias: src1
+            Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Left Outer Join0 to 1
+          keys:
+            0 _col0 (type: string)
+            1 _col0 (type: string)
+          outputColumnNames: _col0, _col1, _col2, _col3
+          Statistics: Num rows: 1 Data size: 11 Basic stats: COMPLETE Column 
stats: NONE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 1 Data size: 11 Basic stats: COMPLETE Column 
stats: NONE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select * from
+(select * from src where 1 = 0)a
+left outer join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@src1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from
+(select * from src where 1 = 0)a
+left outer join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@src1
+#### A masked pattern was here ####
+PREHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+right outer join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+right outer join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: src
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+          TableScan
+            alias: src1
+            Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+            Select Operator
+              expressions: key (type: string), value (type: string)
+              outputColumnNames: _col0, _col1
+              Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+              Reduce Output Operator
+                key expressions: _col0 (type: string)
+                sort order: +
+                Map-reduce partition columns: _col0 (type: string)
+                Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+                value expressions: _col1 (type: string)
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Right Outer Join0 to 1
+          keys:
+            0 _col0 (type: string)
+            1 _col0 (type: string)
+          outputColumnNames: _col0, _col1, _col2, _col3
+          Statistics: Num rows: 27 Data size: 210 Basic stats: COMPLETE Column 
stats: NONE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 27 Data size: 210 Basic stats: COMPLETE 
Column stats: NONE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select * from
+(select * from src where 1 = 0)a
+right outer join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@src1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from
+(select * from src where 1 = 0)a
+right outer join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@src1
+#### A masked pattern was here ####
+NULL   NULL            
+NULL   NULL            
+NULL   NULL            
+NULL   NULL            
+NULL   NULL            val_165
+NULL   NULL            val_193
+NULL   NULL            val_265
+NULL   NULL            val_27
+NULL   NULL            val_409
+NULL   NULL            val_484
+NULL   NULL    128     
+NULL   NULL    146     val_146
+NULL   NULL    150     val_150
+NULL   NULL    213     val_213
+NULL   NULL    224     
+NULL   NULL    238     val_238
+NULL   NULL    255     val_255
+NULL   NULL    273     val_273
+NULL   NULL    278     val_278
+NULL   NULL    311     val_311
+NULL   NULL    369     
+NULL   NULL    401     val_401
+NULL   NULL    406     val_406
+NULL   NULL    66      val_66
+NULL   NULL    98      val_98
+PREHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+full outer join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select * from
+(select * from src where 1 = 0)a
+full outer join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: src
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+          TableScan
+            alias: src1
+            Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+            Select Operator
+              expressions: key (type: string), value (type: string)
+              outputColumnNames: _col0, _col1
+              Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+              Reduce Output Operator
+                key expressions: _col0 (type: string)
+                sort order: +
+                Map-reduce partition columns: _col0 (type: string)
+                Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+                value expressions: _col1 (type: string)
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Outer Join 0 to 1
+          keys:
+            0 _col0 (type: string)
+            1 _col0 (type: string)
+          outputColumnNames: _col0, _col1, _col2, _col3
+          Statistics: Num rows: 27 Data size: 210 Basic stats: COMPLETE Column 
stats: NONE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 27 Data size: 210 Basic stats: COMPLETE 
Column stats: NONE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select * from
+(select * from src where 1 = 0)a
+full outer join
+(select * from src1)b on a.key = b.key
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@src1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from
+(select * from src where 1 = 0)a
+full outer join
+(select * from src1)b on a.key = b.key
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@src1
+#### A masked pattern was here ####
+NULL   NULL            
+NULL   NULL            
+NULL   NULL            
+NULL   NULL            
+NULL   NULL            val_165
+NULL   NULL            val_193
+NULL   NULL            val_265
+NULL   NULL            val_27
+NULL   NULL            val_409
+NULL   NULL            val_484
+NULL   NULL    128     
+NULL   NULL    146     val_146
+NULL   NULL    150     val_150
+NULL   NULL    213     val_213
+NULL   NULL    224     
+NULL   NULL    238     val_238
+NULL   NULL    255     val_255
+NULL   NULL    273     val_273
+NULL   NULL    278     val_278
+NULL   NULL    311     val_311
+NULL   NULL    369     
+NULL   NULL    401     val_401
+NULL   NULL    406     val_406
+NULL   NULL    66      val_66
+NULL   NULL    98      val_98
+PREHOOK: query: explain
+select * from
+(select * from src)a
+right outer join
+(select * from src1 where 1 = 0)b on a.key = b.key
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select * from
+(select * from src)a
+right outer join
+(select * from src1 where 1 = 0)b on a.key = b.key
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: src
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+          TableScan
+            alias: src1
+            Statistics: Num rows: 25 Data size: 191 Basic stats: COMPLETE 
Column stats: NONE
+            Filter Operator
+              predicate: false (type: boolean)
+              Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+              Select Operator
+                expressions: key (type: string), value (type: string)
+                outputColumnNames: _col0, _col1
+                Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+                Reduce Output Operator
+                  key expressions: _col0 (type: string)
+                  sort order: +
+                  Map-reduce partition columns: _col0 (type: string)
+                  Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE 
Column stats: NONE
+                  value expressions: _col1 (type: string)
+      Reduce Operator Tree:
+        Join Operator
+          condition map:
+               Right Outer Join0 to 1
+          keys:
+            0 _col0 (type: string)
+            1 _col0 (type: string)
+          outputColumnNames: _col0, _col1, _col2, _col3
+          Statistics: Num rows: 1 Data size: 11 Basic stats: COMPLETE Column 
stats: NONE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 1 Data size: 11 Basic stats: COMPLETE Column 
stats: NONE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select * from
+(select * from src)a
+right outer join
+(select * from src1 where 1 = 0)b on a.key = b.key
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@src1
+#### A masked pattern was here ####
+POSTHOOK: query: select * from
+(select * from src)a
+right outer join
+(select * from src1 where 1 = 0)b on a.key = b.key
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@src1
+#### A masked pattern was here ####

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/results/clientpositive/mergejoin.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/mergejoin.q.out 
b/ql/src/test/results/clientpositive/mergejoin.q.out
index f2c04e2..a85fd8b 100644
--- a/ql/src/test/results/clientpositive/mergejoin.q.out
+++ b/ql/src/test/results/clientpositive/mergejoin.q.out
@@ -2699,7 +2699,6 @@ full outer join
 PREHOOK: type: QUERY
 PREHOOK: Input: default@tab
 PREHOOK: Input: default@tab_part
-PREHOOK: Input: default@tab_part@ds=2008-04-08
 #### A masked pattern was here ####
 POSTHOOK: query: select * from
 (select * from tab where tab.key = 0)a
@@ -2708,7 +2707,6 @@ full outer join
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@tab
 POSTHOOK: Input: default@tab_part
-POSTHOOK: Input: default@tab_part@ds=2008-04-08
 #### A masked pattern was here ####
 PREHOOK: query: select * from
 (select * from tab where tab.key = 0)a

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/results/clientpositive/partition_boolexpr.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/partition_boolexpr.q.out 
b/ql/src/test/results/clientpositive/partition_boolexpr.q.out
index 5272f33..fe33e18 100644
--- a/ql/src/test/results/clientpositive/partition_boolexpr.q.out
+++ b/ql/src/test/results/clientpositive/partition_boolexpr.q.out
@@ -274,19 +274,21 @@ STAGE PLANS:
       Map Operator Tree:
           TableScan
             alias: srcpart
-            Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: NONE
-            Filter Operator
-              predicate: false (type: boolean)
-              Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: NONE
-              Group By Operator
-                aggregations: count(1)
-                mode: hash
-                outputColumnNames: _col0
-                Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
-                Reduce Output Operator
-                  sort order: 
+            Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE 
Column stats: NONE
+            Select Operator
+              Statistics: Num rows: 2000 Data size: 21248 Basic stats: 
COMPLETE Column stats: NONE
+              Filter Operator
+                predicate: false (type: boolean)
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
+                Group By Operator
+                  aggregations: count(1)
+                  mode: hash
+                  outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
-                  value expressions: _col0 (type: bigint)
+                  Reduce Output Operator
+                    sort order: 
+                    Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
+                    value expressions: _col0 (type: bigint)
       Reduce Operator Tree:
         Group By Operator
           aggregations: count(VALUE._col0)

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/results/clientpositive/ppd_udf_col.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/ppd_udf_col.q.out 
b/ql/src/test/results/clientpositive/ppd_udf_col.q.out
index 2641f5c..a6310ed 100644
--- a/ql/src/test/results/clientpositive/ppd_udf_col.q.out
+++ b/ql/src/test/results/clientpositive/ppd_udf_col.q.out
@@ -109,17 +109,17 @@ STAGE PLANS:
       Map Operator Tree:
           TableScan
             alias: src
-            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: COMPLETE
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
             Filter Operator
               predicate: false (type: boolean)
-              Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: COMPLETE
+              Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
               Select Operator
-                expressions: '100' (type: string), rand() (type: double), '4' 
(type: string)
+                expressions: key (type: string), rand() (type: double), '4' 
(type: string)
                 outputColumnNames: _col0, _col1, _col2
-                Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: COMPLETE
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
                 File Output Operator
                   compressed: false
-                  Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: COMPLETE
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
                   table:
                       input format: 
org.apache.hadoop.mapred.SequenceFileInputFormat
                       output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
@@ -284,17 +284,17 @@ STAGE PLANS:
       Map Operator Tree:
           TableScan
             alias: src
-            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: COMPLETE
+            Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
             Filter Operator
               predicate: false (type: boolean)
-              Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column 
stats: COMPLETE
+              Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
               Select Operator
-                expressions: '100' (type: string), rand() (type: double), '4' 
(type: string)
+                expressions: key (type: string), rand() (type: double), '4' 
(type: string)
                 outputColumnNames: _col0, _col1, _col2
-                Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: COMPLETE
+                Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
                 File Output Operator
                   compressed: false
-                  Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL 
Column stats: COMPLETE
+                  Statistics: Num rows: 1 Data size: 10 Basic stats: COMPLETE 
Column stats: NONE
                   table:
                       input format: 
org.apache.hadoop.mapred.SequenceFileInputFormat
                       output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

http://git-wip-us.apache.org/repos/asf/hive/blob/2ddcc387/ql/src/test/results/clientpositive/tez/mergejoin.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/tez/mergejoin.q.out 
b/ql/src/test/results/clientpositive/tez/mergejoin.q.out
index 14d0431..88a310f 100644
--- a/ql/src/test/results/clientpositive/tez/mergejoin.q.out
+++ b/ql/src/test/results/clientpositive/tez/mergejoin.q.out
@@ -2683,7 +2683,6 @@ full outer join
 PREHOOK: type: QUERY
 PREHOOK: Input: default@tab
 PREHOOK: Input: default@tab_part
-PREHOOK: Input: default@tab_part@ds=2008-04-08
 #### A masked pattern was here ####
 POSTHOOK: query: select * from
 (select * from tab where tab.key = 0)a
@@ -2692,7 +2691,6 @@ full outer join
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@tab
 POSTHOOK: Input: default@tab_part
-POSTHOOK: Input: default@tab_part@ds=2008-04-08
 #### A masked pattern was here ####
 PREHOOK: query: select * from
 (select * from tab where tab.key = 0)a

Reply via email to