You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by na...@apache.org on 2012/11/15 07:49:13 UTC

svn commit: r1409664 - in /hive/trunk: data/files/ ql/src/java/org/apache/hadoop/hive/ql/ ql/src/java/org/apache/hadoop/hive/ql/parse/ ql/src/test/queries/clientnegative/ ql/src/test/queries/clientpositive/ ql/src/test/results/clientnegative/ ql/src/te...

Author: namit
Date: Thu Nov 15 06:49:11 2012
New Revision: 1409664

URL: http://svn.apache.org/viewvc?rev=1409664&view=rev
Log:
HIVE-3471 Implement grouping sets in hive
(Ivan Gorbachev via namit)


Added:
    hive/trunk/data/files/grouping_sets.txt
    hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets1.q
    hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets2.q
    hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets3.q
    hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets4.q
    hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets5.q
    hive/trunk/ql/src/test/queries/clientpositive/groupby_grouping_sets1.q
    hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets1.q.out
    hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets2.q.out
    hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets3.q.out
    hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets4.q.out
    hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets5.q.out
    hive/trunk/ql/src/test/results/clientpositive/groupby_grouping_sets1.q.out
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QBParseInfo.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Added: hive/trunk/data/files/grouping_sets.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/grouping_sets.txt?rev=1409664&view=auto
==============================================================================
--- hive/trunk/data/files/grouping_sets.txt (added)
+++ hive/trunk/data/files/grouping_sets.txt Thu Nov 15 06:49:11 2012
@@ -0,0 +1,6 @@
+8 1 1
+5 2 2
+1 1 3
+2 2 4
+2 3 5
+3 2 8

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java?rev=1409664&r1=1409663&r2=1409664&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java Thu Nov 15 06:49:11 2012
@@ -280,12 +280,18 @@ public enum ErrorMsg {
     "Grouping sets aggregations (with rollups or cubes) are not allowed if aggregation function " +
     "parameters overlap with the aggregation functions columns"),
 
+  HIVE_GROUPING_SETS_AGGR_NOFUNC(10211,
+    "Grouping sets aggregations are not allowed if no aggregation function is presented"),
+
   HIVE_UNION_REMOVE_OPTIMIZATION_NEEDS_SUBDIRECTORIES(10212,
     "In order to use hive.optimize.union.remove, the hadoop version that you are using " +
     "should support sub-directories for tables/partitions. If that is true, set " +
     "hive.hadoop.supports.subdirectories to true. Otherwise, set hive.optimize.union.remove " +
     "to false"),
 
+  HIVE_GROUPING_SETS_EXPR_NOT_IN_GROUPBY(10213,
+    "Grouping sets expression is not in GROUP BY key"),
+
   SCRIPT_INIT_ERROR(20000, "Unable to initialize custom script."),
   SCRIPT_IO_ERROR(20001, "An error occurred while reading or writing to your custom script. "
       + "It may have crashed with an error."),

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g?rev=1409664&r1=1409663&r2=1409664&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g Thu Nov 15 06:49:11 2012
@@ -76,6 +76,8 @@ TOK_ALIASLIST;
 TOK_GROUPBY;
 TOK_ROLLUP_GROUPBY;
 TOK_CUBE_GROUPBY;
+TOK_GROUPING_SETS;
+TOK_GROUPING_SETS_EXPRESSION;
 TOK_HAVING;
 TOK_ORDERBY;
 TOK_CLUSTERBY;
@@ -1875,11 +1877,32 @@ groupByClause
     groupByExpression
     ( COMMA groupByExpression )*
     ((rollup=KW_WITH KW_ROLLUP) | (cube=KW_WITH KW_CUBE)) ?
+    (sets=KW_GROUPING KW_SETS 
+    LPAREN groupingSetExpression ( COMMA groupingSetExpression)*  RPAREN ) ?
     -> {rollup != null}? ^(TOK_ROLLUP_GROUPBY groupByExpression+)
     -> {cube != null}? ^(TOK_CUBE_GROUPBY groupByExpression+)
+    -> {sets != null}? ^(TOK_GROUPING_SETS groupByExpression+ groupingSetExpression+)
     -> ^(TOK_GROUPBY groupByExpression+)
     ;
 
+groupingSetExpression
+@init {msgs.push("grouping set expression"); }
+@after {msgs.pop(); }
+   :
+   groupByExpression
+   -> ^(TOK_GROUPING_SETS_EXPRESSION groupByExpression)
+   |
+   LPAREN 
+   groupByExpression (COMMA groupByExpression)*
+   RPAREN
+   -> ^(TOK_GROUPING_SETS_EXPRESSION groupByExpression+)
+   |
+   LPAREN
+   RPAREN
+   -> ^(TOK_GROUPING_SETS_EXPRESSION groupByExpression*)
+   ;
+
+
 groupByExpression
 @init { msgs.push("group by expression"); }
 @after { msgs.pop(); }
@@ -2521,7 +2544,8 @@ KW_ROLLUP: 'ROLLUP';
 KW_CUBE: 'CUBE';
 KW_DIRECTORIES: 'DIRECTORIES';
 KW_FOR: 'FOR';
-
+KW_GROUPING: 'GROUPING';
+KW_SETS: 'SETS';
 
 // Operators
 // NOTE: if you add a new function/operator, add it to sysFuncNames so that describe function _FUNC_ will work.

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QBParseInfo.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QBParseInfo.java?rev=1409664&r1=1409663&r2=1409664&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QBParseInfo.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QBParseInfo.java Thu Nov 15 06:49:11 2012
@@ -50,6 +50,7 @@ public class QBParseInfo {
   private final HashMap<String, ASTNode> destToGroupby;
   private final Set<String> destRollups;
   private final Set<String> destCubes;
+  private final Set<String> destGroupingSets;
   private final Map<String, ASTNode> destToHaving;
   private final HashSet<String> insertIntoTables;
 
@@ -114,6 +115,7 @@ public class QBParseInfo {
     insertIntoTables = new HashSet<String>();
     destRollups = new HashSet<String>();
     destCubes = new HashSet<String>();
+    destGroupingSets = new HashSet<String>();
 
     destToAggregationExprs = new LinkedHashMap<String, LinkedHashMap<String, ASTNode>>();
     destToDistinctFuncExprs = new HashMap<String, List<ASTNode>>();
@@ -259,6 +261,10 @@ public class QBParseInfo {
     return destCubes;
   }
 
+  public Set<String> getDestGroupingSets() {
+    return destGroupingSets;
+  }
+
   public HashMap<String, ASTNode> getDestToGroupBy() {
     return destToGroupby;
   }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1409664&r1=1409663&r2=1409664&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Thu Nov 15 06:49:11 2012
@@ -797,6 +797,7 @@ public class SemanticAnalyzer extends Ba
       case HiveParser.TOK_GROUPBY:
       case HiveParser.TOK_ROLLUP_GROUPBY:
       case HiveParser.TOK_CUBE_GROUPBY:
+      case HiveParser.TOK_GROUPING_SETS:
         // Get the groupby aliases - these are aliased to the entries in the
         // select list
         queryProperties.setHasGroupBy(true);
@@ -815,6 +816,8 @@ public class SemanticAnalyzer extends Ba
           qbp.getDestRollups().add(ctx_1.dest);
         } else if (ast.getToken().getType() == HiveParser.TOK_CUBE_GROUPBY) {
           qbp.getDestCubes().add(ctx_1.dest);
+        } else if (ast.getToken().getType() == HiveParser.TOK_GROUPING_SETS) {
+          qbp.getDestGroupingSets().add(ctx_1.dest);
         }
         break;
 
@@ -2019,18 +2022,69 @@ public class SemanticAnalyzer extends Ba
   // Even if rollups and cubes are present in the query, they are converted to
   // grouping sets at this point
   private ObjectPair<List<ASTNode>, List<Integer>> getGroupByGroupingSetsForClause(
-      QBParseInfo parseInfo, String dest) {
+      QBParseInfo parseInfo, String dest) throws SemanticException {
     List<Integer> groupingSets = new ArrayList<Integer>();
     List<ASTNode> groupByExprs = getGroupByForClause(parseInfo, dest);
     if (parseInfo.getDestRollups().contains(dest)) {
       groupingSets = getGroupingSetsForRollup(groupByExprs.size());
     } else if (parseInfo.getDestCubes().contains(dest)) {
       groupingSets = getGroupingSetsForCube(groupByExprs.size());
+    } else if (parseInfo.getDestGroupingSets().contains(dest)) {
+      groupingSets = getGroupingSets(groupByExprs, parseInfo, dest);
     }
 
     return new ObjectPair<List<ASTNode>, List<Integer>>(groupByExprs, groupingSets);
   }
 
+  private List<Integer> getGroupingSets(List<ASTNode> groupByExpr, QBParseInfo parseInfo,
+      String dest) throws SemanticException {
+    Map<String, Integer> exprPos = new HashMap<String, Integer>();
+    for (int i = 0; i < groupByExpr.size(); ++i) {
+      ASTNode node = groupByExpr.get(i);
+      exprPos.put(node.toStringTree(), i);
+    }
+
+    ASTNode root = parseInfo.getGroupByForClause(dest);
+    List<Integer> result = new ArrayList<Integer>(root == null ? 0 : root.getChildCount());
+    if (root != null) {
+      for (int i = 0; i < root.getChildCount(); ++i) {
+        ASTNode child = (ASTNode) root.getChild(i);
+        if(child.getType() != HiveParser.TOK_GROUPING_SETS_EXPRESSION) {
+          continue;
+        }
+        int bitmap = 0;
+        for (int j = 0; j < child.getChildCount(); ++j) {
+          String treeAsString = child.getChild(j).toStringTree();
+          Integer pos = exprPos.get(treeAsString);
+          if(pos == null) {
+            throw new SemanticException(
+                generateErrorMessage((ASTNode)child.getChild(j),
+                    ErrorMsg.HIVE_GROUPING_SETS_EXPR_NOT_IN_GROUPBY.getErrorCodedMsg()));
+          }
+          bitmap = setBit(bitmap, pos);
+        }
+        result.add(bitmap);
+      }
+    }
+    if(checkForNoAggr(result)) {
+      throw new SemanticException(
+          ErrorMsg.HIVE_GROUPING_SETS_AGGR_NOFUNC.getMsg());
+    }
+    return result;
+  }
+
+  private boolean checkForNoAggr(List<Integer> bitmaps) {
+    boolean ret = true;
+    for(int mask : bitmaps) {
+      ret &= mask == 0;
+    }
+    return ret;
+  }
+
+  private int setBit(int bitmap, int bitIdx) {
+    return bitmap | (1 << bitIdx);
+  }
+
   /**
    * This function is a wrapper of parseInfo.getGroupByForClause which
    * automatically translates SELECT DISTINCT a,b,c to SELECT a,b,c GROUP BY
@@ -2059,7 +2113,9 @@ public class SemanticAnalyzer extends Ba
       if (grpByExprs != null) {
         for (int i = 0; i < grpByExprs.getChildCount(); ++i) {
           ASTNode grpbyExpr = (ASTNode) grpByExprs.getChild(i);
-          result.add(grpbyExpr);
+          if (grpbyExpr.getType() != HiveParser.TOK_GROUPING_SETS_EXPRESSION) {
+            result.add(grpbyExpr);
+          }
         }
       }
       return result;

Added: hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets1.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets1.q?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets1.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets1.q Thu Nov 15 06:49:11 2012
@@ -0,0 +1,5 @@
+CREATE TABLE T1(a STRING, b STRING, c STRING);
+
+-- Check for empty grouping set
+SELECT * FROM T1 GROUP BY a GROUPING SETS (());
+

Added: hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets2.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets2.q?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets2.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets2.q Thu Nov 15 06:49:11 2012
@@ -0,0 +1,4 @@
+CREATE TABLE T1(a STRING, b STRING, c STRING);
+
+-- Check for mupltiple empty grouping sets
+SELECT * FROM T1 GROUP BY b GROUPING SETS ((), (), ());

Added: hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets3.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets3.q?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets3.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets3.q Thu Nov 15 06:49:11 2012
@@ -0,0 +1,4 @@
+CREATE TABLE T1(a STRING, b STRING, c STRING); 
+
+-- Grouping sets expression is not in GROUP BY clause
+SELECT a FROM T1 GROUP BY a GROUPING SETS (a, b);

Added: hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets4.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets4.q?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets4.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets4.q Thu Nov 15 06:49:11 2012
@@ -0,0 +1,4 @@
+CREATE TABLE T1(a STRING, b STRING, c STRING); 
+
+-- Expression 'a' is not in GROUP BY clause
+SELECT a FROM T1 GROUP BY b GROUPING SETS (b);

Added: hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets5.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets5.q?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets5.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/groupby_grouping_sets5.q Thu Nov 15 06:49:11 2012
@@ -0,0 +1,5 @@
+CREATE TABLE T1(a STRING, b STRING, c STRING);
+
+-- Alias in GROUPING SETS
+SELECT a as c, count(*) FROM T1 GROUP BY c GROUPING SETS (c);
+

Added: hive/trunk/ql/src/test/queries/clientpositive/groupby_grouping_sets1.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/groupby_grouping_sets1.q?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/groupby_grouping_sets1.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/groupby_grouping_sets1.q Thu Nov 15 06:49:11 2012
@@ -0,0 +1,18 @@
+CREATE TABLE T1(a STRING, b STRING, c STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE; 
+
+LOAD DATA LOCAL INPATH '../data/files/grouping_sets.txt' INTO TABLE T1;
+
+SELECT * FROM T1;
+
+SELECT a, b, count(*) from T1 group by a, b with cube;
+
+SELECT a, b, count(*) FROM T1 GROUP BY a, b  GROUPING SETS (a, (a, b), b, ());
+
+SELECT a, b, count(*) FROM T1 GROUP BY a, b GROUPING SETS (a, (a, b));
+
+SELECT a FROM T1 GROUP BY a, b, c GROUPING SETS (a, b, c);
+
+SELECT a FROM T1 GROUP BY a GROUPING SETS ((a), (a));
+
+SELECT a + b, count(*) FROM T1 GROUP BY a + b GROUPING SETS (a+b);
+

Added: hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets1.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets1.q.out?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets1.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets1.q.out Thu Nov 15 06:49:11 2012
@@ -0,0 +1,6 @@
+PREHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@T1
+FAILED: SemanticException [Error 10211]: Grouping sets aggregations are not allowed if no aggregation function is presented

Added: hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets2.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets2.q.out?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets2.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets2.q.out Thu Nov 15 06:49:11 2012
@@ -0,0 +1,6 @@
+PREHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@T1
+FAILED: SemanticException [Error 10211]: Grouping sets aggregations are not allowed if no aggregation function is presented

Added: hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets3.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets3.q.out?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets3.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets3.q.out Thu Nov 15 06:49:11 2012
@@ -0,0 +1,6 @@
+PREHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@T1
+FAILED: SemanticException 4:46 [Error 10213]: Grouping sets expression is not in GROUP BY key. Error encountered near token 'b'

Added: hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets4.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets4.q.out?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets4.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets4.q.out Thu Nov 15 06:49:11 2012
@@ -0,0 +1,6 @@
+PREHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@T1
+FAILED: SemanticException [Error 10025]: Line 4:7 Expression not in GROUP BY key 'a'

Added: hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets5.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets5.q.out?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets5.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/groupby_grouping_sets5.q.out Thu Nov 15 06:49:11 2012
@@ -0,0 +1,6 @@
+PREHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@T1
+FAILED: SemanticException [Error 10025]: Line 4:7 Expression not in GROUP BY key 'a'

Added: hive/trunk/ql/src/test/results/clientpositive/groupby_grouping_sets1.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/groupby_grouping_sets1.q.out?rev=1409664&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/groupby_grouping_sets1.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/groupby_grouping_sets1.q.out Thu Nov 15 06:49:11 2012
@@ -0,0 +1,138 @@
+PREHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE T1(a STRING, b STRING, c STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@T1
+PREHOOK: query: LOAD DATA LOCAL INPATH '../data/files/grouping_sets.txt' INTO TABLE T1
+PREHOOK: type: LOAD
+PREHOOK: Output: default@t1
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../data/files/grouping_sets.txt' INTO TABLE T1
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@t1
+PREHOOK: query: SELECT * FROM T1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM T1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+8	1	1
+5	2	2
+1	1	3
+2	2	4
+2	3	5
+3	2	8
+PREHOOK: query: SELECT a, b, count(*) from T1 group by a, b with cube
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT a, b, count(*) from T1 group by a, b with cube
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+NULL	NULL	6
+NULL	1	2
+NULL	2	3
+NULL	3	1
+1	NULL	1
+1	1	1
+2	NULL	2
+2	2	1
+2	3	1
+3	NULL	1
+3	2	1
+5	NULL	1
+5	2	1
+8	NULL	1
+8	1	1
+PREHOOK: query: SELECT a, b, count(*) FROM T1 GROUP BY a, b  GROUPING SETS (a, (a, b), b, ())
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT a, b, count(*) FROM T1 GROUP BY a, b  GROUPING SETS (a, (a, b), b, ())
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+NULL	NULL	6
+NULL	1	2
+NULL	2	3
+NULL	3	1
+1	NULL	1
+1	1	1
+2	NULL	2
+2	2	1
+2	3	1
+3	NULL	1
+3	2	1
+5	NULL	1
+5	2	1
+8	NULL	1
+8	1	1
+PREHOOK: query: SELECT a, b, count(*) FROM T1 GROUP BY a, b GROUPING SETS (a, (a, b))
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT a, b, count(*) FROM T1 GROUP BY a, b GROUPING SETS (a, (a, b))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+1	NULL	1
+1	1	1
+2	NULL	2
+2	2	1
+2	3	1
+3	NULL	1
+3	2	1
+5	NULL	1
+5	2	1
+8	NULL	1
+8	1	1
+PREHOOK: query: SELECT a FROM T1 GROUP BY a, b, c GROUPING SETS (a, b, c)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT a FROM T1 GROUP BY a, b, c GROUPING SETS (a, b, c)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+NULL
+NULL
+NULL
+NULL
+NULL
+NULL
+NULL
+NULL
+NULL
+1
+2
+3
+5
+8
+PREHOOK: query: SELECT a FROM T1 GROUP BY a GROUPING SETS ((a), (a))
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT a FROM T1 GROUP BY a GROUPING SETS ((a), (a))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+1
+2
+3
+5
+8
+PREHOOK: query: SELECT a + b, count(*) FROM T1 GROUP BY a + b GROUPING SETS (a+b)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT a + b, count(*) FROM T1 GROUP BY a + b GROUPING SETS (a+b)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+2.0	1
+4.0	1
+5.0	2
+7.0	1
+9.0	1