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