You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by ji...@apache.org on 2017/04/12 19:34:12 UTC

[09/27] incubator-quickstep git commit: Implement parser and resolver for UNION and INTERSECT.

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5b7b5cb8/parser/preprocessed/SqlParser_gen.hpp
----------------------------------------------------------------------
diff --git a/parser/preprocessed/SqlParser_gen.hpp b/parser/preprocessed/SqlParser_gen.hpp
index f1876b8..857eaaf 100644
--- a/parser/preprocessed/SqlParser_gen.hpp
+++ b/parser/preprocessed/SqlParser_gen.hpp
@@ -65,117 +65,119 @@ extern int quickstep_yydebug;
     TOKEN_IS = 275,
     UNARY_PLUS = 276,
     UNARY_MINUS = 277,
-    TOKEN_ADD = 278,
-    TOKEN_ALL = 279,
-    TOKEN_ALTER = 280,
-    TOKEN_AS = 281,
-    TOKEN_ASC = 282,
-    TOKEN_BIGINT = 283,
-    TOKEN_BIT = 284,
-    TOKEN_BITWEAVING = 285,
-    TOKEN_BLOCKPROPERTIES = 286,
-    TOKEN_BLOCKSAMPLE = 287,
-    TOKEN_BLOOM_FILTER = 288,
-    TOKEN_CSB_TREE = 289,
-    TOKEN_BY = 290,
-    TOKEN_CASE = 291,
-    TOKEN_CHARACTER = 292,
-    TOKEN_CHECK = 293,
-    TOKEN_COLUMN = 294,
-    TOKEN_CONSTRAINT = 295,
-    TOKEN_COPY = 296,
-    TOKEN_CREATE = 297,
-    TOKEN_CURRENT = 298,
-    TOKEN_DATE = 299,
-    TOKEN_DATETIME = 300,
-    TOKEN_DAY = 301,
-    TOKEN_DECIMAL = 302,
-    TOKEN_DEFAULT = 303,
-    TOKEN_DELETE = 304,
-    TOKEN_DELIMITER = 305,
-    TOKEN_DESC = 306,
-    TOKEN_DISTINCT = 307,
-    TOKEN_DOUBLE = 308,
-    TOKEN_DROP = 309,
-    TOKEN_ELSE = 310,
-    TOKEN_END = 311,
-    TOKEN_ESCAPE_STRINGS = 312,
-    TOKEN_EXISTS = 313,
-    TOKEN_EXTRACT = 314,
-    TOKEN_FALSE = 315,
-    TOKEN_FIRST = 316,
-    TOKEN_FLOAT = 317,
-    TOKEN_FOLLOWING = 318,
-    TOKEN_FOR = 319,
-    TOKEN_FOREIGN = 320,
-    TOKEN_FROM = 321,
-    TOKEN_FULL = 322,
-    TOKEN_GROUP = 323,
-    TOKEN_HASH = 324,
-    TOKEN_HAVING = 325,
-    TOKEN_HOUR = 326,
-    TOKEN_IN = 327,
-    TOKEN_INDEX = 328,
-    TOKEN_INNER = 329,
-    TOKEN_INSERT = 330,
-    TOKEN_INTEGER = 331,
-    TOKEN_INTERVAL = 332,
-    TOKEN_INTO = 333,
-    TOKEN_JOIN = 334,
-    TOKEN_KEY = 335,
-    TOKEN_LAST = 336,
-    TOKEN_LEFT = 337,
-    TOKEN_LIMIT = 338,
-    TOKEN_LONG = 339,
-    TOKEN_MINUTE = 340,
-    TOKEN_MONTH = 341,
-    TOKEN_NULL = 342,
-    TOKEN_NULLS = 343,
-    TOKEN_OFF = 344,
-    TOKEN_ON = 345,
-    TOKEN_ORDER = 346,
-    TOKEN_OUTER = 347,
-    TOKEN_OVER = 348,
-    TOKEN_PARTITION = 349,
-    TOKEN_PARTITIONS = 350,
-    TOKEN_PERCENT = 351,
-    TOKEN_PRECEDING = 352,
-    TOKEN_PRIMARY = 353,
-    TOKEN_PRIORITY = 354,
-    TOKEN_QUIT = 355,
-    TOKEN_RANGE = 356,
-    TOKEN_REAL = 357,
-    TOKEN_REFERENCES = 358,
-    TOKEN_RIGHT = 359,
-    TOKEN_ROW = 360,
-    TOKEN_ROW_DELIMITER = 361,
-    TOKEN_ROWS = 362,
-    TOKEN_SECOND = 363,
-    TOKEN_SELECT = 364,
-    TOKEN_SET = 365,
-    TOKEN_SMA = 366,
-    TOKEN_SMALLINT = 367,
-    TOKEN_SUBSTRING = 368,
-    TOKEN_TABLE = 369,
-    TOKEN_THEN = 370,
-    TOKEN_TIME = 371,
-    TOKEN_TIMESTAMP = 372,
-    TOKEN_TRUE = 373,
-    TOKEN_TUPLESAMPLE = 374,
-    TOKEN_UNBOUNDED = 375,
-    TOKEN_UNIQUE = 376,
-    TOKEN_UPDATE = 377,
-    TOKEN_USING = 378,
-    TOKEN_VALUES = 379,
-    TOKEN_VARCHAR = 380,
-    TOKEN_WHEN = 381,
-    TOKEN_WHERE = 382,
-    TOKEN_WINDOW = 383,
-    TOKEN_WITH = 384,
-    TOKEN_YEAR = 385,
-    TOKEN_YEARMONTH = 386,
-    TOKEN_EOF = 387,
-    TOKEN_LEX_ERROR = 388
+    TOKEN_ALL = 278,
+    TOKEN_UNION = 279,
+    TOKEN_INTERSECT = 280,
+    TOKEN_ADD = 281,
+    TOKEN_ALTER = 282,
+    TOKEN_AS = 283,
+    TOKEN_ASC = 284,
+    TOKEN_BIGINT = 285,
+    TOKEN_BIT = 286,
+    TOKEN_BITWEAVING = 287,
+    TOKEN_BLOCKPROPERTIES = 288,
+    TOKEN_BLOCKSAMPLE = 289,
+    TOKEN_BLOOM_FILTER = 290,
+    TOKEN_CSB_TREE = 291,
+    TOKEN_BY = 292,
+    TOKEN_CASE = 293,
+    TOKEN_CHARACTER = 294,
+    TOKEN_CHECK = 295,
+    TOKEN_COLUMN = 296,
+    TOKEN_CONSTRAINT = 297,
+    TOKEN_COPY = 298,
+    TOKEN_CREATE = 299,
+    TOKEN_CURRENT = 300,
+    TOKEN_DATE = 301,
+    TOKEN_DATETIME = 302,
+    TOKEN_DAY = 303,
+    TOKEN_DECIMAL = 304,
+    TOKEN_DEFAULT = 305,
+    TOKEN_DELETE = 306,
+    TOKEN_DELIMITER = 307,
+    TOKEN_DESC = 308,
+    TOKEN_DISTINCT = 309,
+    TOKEN_DOUBLE = 310,
+    TOKEN_DROP = 311,
+    TOKEN_ELSE = 312,
+    TOKEN_END = 313,
+    TOKEN_ESCAPE_STRINGS = 314,
+    TOKEN_EXISTS = 315,
+    TOKEN_EXTRACT = 316,
+    TOKEN_FALSE = 317,
+    TOKEN_FIRST = 318,
+    TOKEN_FLOAT = 319,
+    TOKEN_FOLLOWING = 320,
+    TOKEN_FOR = 321,
+    TOKEN_FOREIGN = 322,
+    TOKEN_FROM = 323,
+    TOKEN_FULL = 324,
+    TOKEN_GROUP = 325,
+    TOKEN_HASH = 326,
+    TOKEN_HAVING = 327,
+    TOKEN_HOUR = 328,
+    TOKEN_IN = 329,
+    TOKEN_INDEX = 330,
+    TOKEN_INNER = 331,
+    TOKEN_INSERT = 332,
+    TOKEN_INTEGER = 333,
+    TOKEN_INTERVAL = 334,
+    TOKEN_INTO = 335,
+    TOKEN_JOIN = 336,
+    TOKEN_KEY = 337,
+    TOKEN_LAST = 338,
+    TOKEN_LEFT = 339,
+    TOKEN_LIMIT = 340,
+    TOKEN_LONG = 341,
+    TOKEN_MINUTE = 342,
+    TOKEN_MONTH = 343,
+    TOKEN_NULL = 344,
+    TOKEN_NULLS = 345,
+    TOKEN_OFF = 346,
+    TOKEN_ON = 347,
+    TOKEN_ORDER = 348,
+    TOKEN_OUTER = 349,
+    TOKEN_OVER = 350,
+    TOKEN_PARTITION = 351,
+    TOKEN_PARTITIONS = 352,
+    TOKEN_PERCENT = 353,
+    TOKEN_PRECEDING = 354,
+    TOKEN_PRIMARY = 355,
+    TOKEN_PRIORITY = 356,
+    TOKEN_QUIT = 357,
+    TOKEN_RANGE = 358,
+    TOKEN_REAL = 359,
+    TOKEN_REFERENCES = 360,
+    TOKEN_RIGHT = 361,
+    TOKEN_ROW = 362,
+    TOKEN_ROW_DELIMITER = 363,
+    TOKEN_ROWS = 364,
+    TOKEN_SECOND = 365,
+    TOKEN_SELECT = 366,
+    TOKEN_SET = 367,
+    TOKEN_SMA = 368,
+    TOKEN_SMALLINT = 369,
+    TOKEN_SUBSTRING = 370,
+    TOKEN_TABLE = 371,
+    TOKEN_THEN = 372,
+    TOKEN_TIME = 373,
+    TOKEN_TIMESTAMP = 374,
+    TOKEN_TRUE = 375,
+    TOKEN_TUPLESAMPLE = 376,
+    TOKEN_UNBOUNDED = 377,
+    TOKEN_UNIQUE = 378,
+    TOKEN_UPDATE = 379,
+    TOKEN_USING = 380,
+    TOKEN_VALUES = 381,
+    TOKEN_VARCHAR = 382,
+    TOKEN_WHEN = 383,
+    TOKEN_WHERE = 384,
+    TOKEN_WINDOW = 385,
+    TOKEN_WITH = 386,
+    TOKEN_YEAR = 387,
+    TOKEN_YEARMONTH = 388,
+    TOKEN_EOF = 389,
+    TOKEN_LEX_ERROR = 390
   };
 #endif
 
@@ -184,7 +186,7 @@ extern int quickstep_yydebug;
 
 union YYSTYPE
 {
-#line 120 "../SqlParser.ypp" /* yacc.c:1915  */
+#line 121 "../SqlParser.ypp" /* yacc.c:1909  */
 
   quickstep::ParseString *string_value_;
 
@@ -216,6 +218,8 @@ union YYSTYPE
   quickstep::ParseSelectionItem *selection_item_;
   quickstep::ParseSelectionList *selection_list_;
 
+  quickstep::ParseSetOperation *set_operation_;
+
   quickstep::ParseTableReference *table_reference_;
   quickstep::PtrList<quickstep::ParseTableReference> *table_reference_list_;
   quickstep::ParseTableReferenceSignature *table_reference_signature_;
@@ -243,7 +247,7 @@ union YYSTYPE
   quickstep::PtrVector<quickstep::ParseString> *command_argument_list_;
 
   quickstep::ParseStatement *statement_;
-  quickstep::ParseStatementSelect *select_statement_;
+  quickstep::ParseStatementSetOperation *set_operation_statement_;
   quickstep::ParseStatementUpdate *update_statement_;
   quickstep::ParseStatementInsert *insert_statement_;
   quickstep::ParseStatementDelete *delete_statement_;
@@ -284,7 +288,7 @@ union YYSTYPE
 
   quickstep::ParsePriority *opt_priority_clause_;
 
-#line 288 "SqlParser_gen.hpp" /* yacc.c:1915  */
+#line 292 "SqlParser_gen.hpp" /* yacc.c:1909  */
 };
 
 typedef union YYSTYPE YYSTYPE;

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5b7b5cb8/parser/tests/Aggregate.test
----------------------------------------------------------------------
diff --git a/parser/tests/Aggregate.test b/parser/tests/Aggregate.test
index e7b8945..5fc5228 100644
--- a/parser/tests/Aggregate.test
+++ b/parser/tests/Aggregate.test
@@ -17,50 +17,54 @@
 
 SELECT AGG(*), AGG(), AGG(a, b, c) FROM test
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  | | +-FunctionCall[name=AGG,is_star=true]
-  | +-SelectListItem
-  | | +-FunctionCall[name=AGG]
-  | +-SelectListItem
-  |   +-FunctionCall[name=AGG]
-  |     +-AttributeReference[attribute_name=a]
-  |     +-AttributeReference[attribute_name=b]
-  |     +-AttributeReference[attribute_name=c]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      | | +-FunctionCall[name=AGG,is_star=true]
+      | +-SelectListItem
+      | | +-FunctionCall[name=AGG]
+      | +-SelectListItem
+      |   +-FunctionCall[name=AGG]
+      |     +-AttributeReference[attribute_name=a]
+      |     +-AttributeReference[attribute_name=b]
+      |     +-AttributeReference[attribute_name=c]
+      +-from_clause=
+        +-TableReference[table=test]
 ==
 
 SELECT AGG()+1, AGG()*2+1+AGG(a, b)/AGG(c, d) FROM test
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  | | +-Add
-  | |   +-left_operand=FunctionCall[name=AGG]
-  | |   +-right_operand=Literal
-  | |     +-NumericLiteral[numeric_string=1,float_like=false]
-  | +-SelectListItem
-  |   +-Add
-  |     +-left_operand=Add
-  |     | +-left_operand=Multiply
-  |     | | +-left_operand=FunctionCall[name=AGG]
-  |     | | +-right_operand=Literal
-  |     | |   +-NumericLiteral[numeric_string=2,float_like=false]
-  |     | +-right_operand=Literal
-  |     |   +-NumericLiteral[numeric_string=1,float_like=false]
-  |     +-right_operand=Divide
-  |       +-left_operand=FunctionCall[name=AGG]
-  |       | +-AttributeReference[attribute_name=a]
-  |       | +-AttributeReference[attribute_name=b]
-  |       +-right_operand=FunctionCall[name=AGG]
-  |         +-AttributeReference[attribute_name=c]
-  |         +-AttributeReference[attribute_name=d]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      | | +-Add
+      | |   +-left_operand=FunctionCall[name=AGG]
+      | |   +-right_operand=Literal
+      | |     +-NumericLiteral[numeric_string=1,float_like=false]
+      | +-SelectListItem
+      |   +-Add
+      |     +-left_operand=Add
+      |     | +-left_operand=Multiply
+      |     | | +-left_operand=FunctionCall[name=AGG]
+      |     | | +-right_operand=Literal
+      |     | |   +-NumericLiteral[numeric_string=2,float_like=false]
+      |     | +-right_operand=Literal
+      |     |   +-NumericLiteral[numeric_string=1,float_like=false]
+      |     +-right_operand=Divide
+      |       +-left_operand=FunctionCall[name=AGG]
+      |       | +-AttributeReference[attribute_name=a]
+      |       | +-AttributeReference[attribute_name=b]
+      |       +-right_operand=FunctionCall[name=AGG]
+      |         +-AttributeReference[attribute_name=c]
+      |         +-AttributeReference[attribute_name=d]
+      +-from_clause=
+        +-TableReference[table=test]
 ==
 
 # Function calls as arguments of another function calls.
@@ -68,25 +72,27 @@ SelectStatement
 # the query is not valid. The query resolver will capture the error.
 SELECT AGG(AGG(AGG()+1)*2, AGG(*)/2.0) FROM test
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  |   +-FunctionCall[name=AGG]
-  |     +-Multiply
-  |     | +-left_operand=FunctionCall[name=AGG]
-  |     | | +-Add
-  |     | |   +-left_operand=FunctionCall[name=AGG]
-  |     | |   +-right_operand=Literal
-  |     | |     +-NumericLiteral[numeric_string=1,float_like=false]
-  |     | +-right_operand=Literal
-  |     |   +-NumericLiteral[numeric_string=2,float_like=false]
-  |     +-Divide
-  |       +-left_operand=FunctionCall[name=AGG,is_star=true]
-  |       +-right_operand=Literal
-  |         +-NumericLiteral[numeric_string=2.0,float_like=true]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      |   +-FunctionCall[name=AGG]
+      |     +-Multiply
+      |     | +-left_operand=FunctionCall[name=AGG]
+      |     | | +-Add
+      |     | |   +-left_operand=FunctionCall[name=AGG]
+      |     | |   +-right_operand=Literal
+      |     | |     +-NumericLiteral[numeric_string=1,float_like=false]
+      |     | +-right_operand=Literal
+      |     |   +-NumericLiteral[numeric_string=2,float_like=false]
+      |     +-Divide
+      |       +-left_operand=FunctionCall[name=AGG,is_star=true]
+      |       +-right_operand=Literal
+      |         +-NumericLiteral[numeric_string=2.0,float_like=true]
+      +-from_clause=
+        +-TableReference[table=test]
 ==
 
 SELECT AGG(*, a) FROM test
@@ -98,93 +104,101 @@ SELECT AGG(*, a) FROM test
 
 SELECT AGG()+1 FROM test GROUP BY a+1, AGG()+1 HAVING AGG()*2>1
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  |   +-Add
-  |     +-left_operand=FunctionCall[name=AGG]
-  |     +-right_operand=Literal
-  |       +-NumericLiteral[numeric_string=1,float_like=false]
-  +-group_by=GroupBy
-  | +-Add
-  | | +-left_operand=AttributeReference[attribute_name=a]
-  | | +-right_operand=Literal
-  | |   +-NumericLiteral[numeric_string=1,float_like=false]
-  | +-Add
-  |   +-left_operand=FunctionCall[name=AGG]
-  |   +-right_operand=Literal
-  |     +-NumericLiteral[numeric_string=1,float_like=false]
-  +-having=HAVING
-  | +-Greater
-  |   +-left_operand=Multiply
-  |   | +-left_operand=FunctionCall[name=AGG]
-  |   | +-right_operand=Literal
-  |   |   +-NumericLiteral[numeric_string=2,float_like=false]
-  |   +-right_operand=Literal
-  |     +-NumericLiteral[numeric_string=1,float_like=false]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      |   +-Add
+      |     +-left_operand=FunctionCall[name=AGG]
+      |     +-right_operand=Literal
+      |       +-NumericLiteral[numeric_string=1,float_like=false]
+      +-group_by=GroupBy
+      | +-Add
+      | | +-left_operand=AttributeReference[attribute_name=a]
+      | | +-right_operand=Literal
+      | |   +-NumericLiteral[numeric_string=1,float_like=false]
+      | +-Add
+      |   +-left_operand=FunctionCall[name=AGG]
+      |   +-right_operand=Literal
+      |     +-NumericLiteral[numeric_string=1,float_like=false]
+      +-having=HAVING
+      | +-Greater
+      |   +-left_operand=Multiply
+      |   | +-left_operand=FunctionCall[name=AGG]
+      |   | +-right_operand=Literal
+      |   |   +-NumericLiteral[numeric_string=2,float_like=false]
+      |   +-right_operand=Literal
+      |     +-NumericLiteral[numeric_string=1,float_like=false]
+      +-from_clause=
+        +-TableReference[table=test]
 ==
 
 SELECT 1 FROM test HAVING AGG() > 1 AND 1=1
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  |   +-Literal
-  |     +-NumericLiteral[numeric_string=1,float_like=false]
-  +-having=HAVING
-  | +-And
-  |   +-Greater
-  |   | +-left_operand=FunctionCall[name=AGG]
-  |   | +-right_operand=Literal
-  |   |   +-NumericLiteral[numeric_string=1,float_like=false]
-  |   +-Equal
-  |     +-left_operand=Literal
-  |     | +-NumericLiteral[numeric_string=1,float_like=false]
-  |     +-right_operand=Literal
-  |       +-NumericLiteral[numeric_string=1,float_like=false]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      |   +-Literal
+      |     +-NumericLiteral[numeric_string=1,float_like=false]
+      +-having=HAVING
+      | +-And
+      |   +-Greater
+      |   | +-left_operand=FunctionCall[name=AGG]
+      |   | +-right_operand=Literal
+      |   |   +-NumericLiteral[numeric_string=1,float_like=false]
+      |   +-Equal
+      |     +-left_operand=Literal
+      |     | +-NumericLiteral[numeric_string=1,float_like=false]
+      |     +-right_operand=Literal
+      |       +-NumericLiteral[numeric_string=1,float_like=false]
+      +-from_clause=
+        +-TableReference[table=test]
 ==
 
 SELECT 1 FROM test GROUP BY AGG()+1, AGG()/AGG()
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  |   +-Literal
-  |     +-NumericLiteral[numeric_string=1,float_like=false]
-  +-group_by=GroupBy
-  | +-Add
-  | | +-left_operand=FunctionCall[name=AGG]
-  | | +-right_operand=Literal
-  | |   +-NumericLiteral[numeric_string=1,float_like=false]
-  | +-Divide
-  |   +-left_operand=FunctionCall[name=AGG]
-  |   +-right_operand=FunctionCall[name=AGG]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      |   +-Literal
+      |     +-NumericLiteral[numeric_string=1,float_like=false]
+      +-group_by=GroupBy
+      | +-Add
+      | | +-left_operand=FunctionCall[name=AGG]
+      | | +-right_operand=Literal
+      | |   +-NumericLiteral[numeric_string=1,float_like=false]
+      | +-Divide
+      |   +-left_operand=FunctionCall[name=AGG]
+      |   +-right_operand=FunctionCall[name=AGG]
+      +-from_clause=
+        +-TableReference[table=test]
 ==
 
 SELECT AGG(DISTINCT x), AGG(y) FROM test GROUP BY z
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  | | +-FunctionCall[name=AGG,is_distinct=true]
-  | |   +-AttributeReference[attribute_name=x]
-  | +-SelectListItem
-  |   +-FunctionCall[name=AGG]
-  |     +-AttributeReference[attribute_name=y]
-  +-group_by=GroupBy
-  | +-AttributeReference[attribute_name=z]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      | | +-FunctionCall[name=AGG,is_distinct=true]
+      | |   +-AttributeReference[attribute_name=x]
+      | +-SelectListItem
+      |   +-FunctionCall[name=AGG]
+      |     +-AttributeReference[attribute_name=y]
+      +-group_by=GroupBy
+      | +-AttributeReference[attribute_name=z]
+      +-from_clause=
+        +-TableReference[table=test]
 ==
 
 SELECT AGG(DISTINCT FUN(x) + y) * AGG(z)
@@ -192,29 +206,31 @@ FROM test
 GROUP BY z
 HAVING AGG(DISTINCT w) + AGG(s) > 1
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectList
-  | +-SelectListItem
-  |   +-Multiply
-  |     +-left_operand=FunctionCall[name=AGG,is_distinct=true]
-  |     | +-Add
-  |     |   +-left_operand=FunctionCall[name=FUN]
-  |     |   | +-AttributeReference[attribute_name=x]
-  |     |   +-right_operand=AttributeReference[attribute_name=y]
-  |     +-right_operand=FunctionCall[name=AGG]
-  |       +-AttributeReference[attribute_name=z]
-  +-group_by=GroupBy
-  | +-AttributeReference[attribute_name=z]
-  +-having=HAVING
-  | +-Greater
-  |   +-left_operand=Add
-  |   | +-left_operand=FunctionCall[name=AGG,is_distinct=true]
-  |   | | +-AttributeReference[attribute_name=w]
-  |   | +-right_operand=FunctionCall[name=AGG]
-  |   |   +-AttributeReference[attribute_name=s]
-  |   +-right_operand=Literal
-  |     +-NumericLiteral[numeric_string=1,float_like=false]
-  +-from_clause=
-    +-TableReference[table=test]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectList
+      | +-SelectListItem
+      |   +-Multiply
+      |     +-left_operand=FunctionCall[name=AGG,is_distinct=true]
+      |     | +-Add
+      |     |   +-left_operand=FunctionCall[name=FUN]
+      |     |   | +-AttributeReference[attribute_name=x]
+      |     |   +-right_operand=AttributeReference[attribute_name=y]
+      |     +-right_operand=FunctionCall[name=AGG]
+      |       +-AttributeReference[attribute_name=z]
+      +-group_by=GroupBy
+      | +-AttributeReference[attribute_name=z]
+      +-having=HAVING
+      | +-Greater
+      |   +-left_operand=Add
+      |   | +-left_operand=FunctionCall[name=AGG,is_distinct=true]
+      |   | | +-AttributeReference[attribute_name=w]
+      |   | +-right_operand=FunctionCall[name=AGG]
+      |   |   +-AttributeReference[attribute_name=s]
+      |   +-right_operand=Literal
+      |     +-NumericLiteral[numeric_string=1,float_like=false]
+      +-from_clause=
+        +-TableReference[table=test]
 ==

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5b7b5cb8/parser/tests/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/parser/tests/CMakeLists.txt b/parser/tests/CMakeLists.txt
index 9b461ec..63bcd1c 100644
--- a/parser/tests/CMakeLists.txt
+++ b/parser/tests/CMakeLists.txt
@@ -68,6 +68,10 @@ add_test(quickstep_parser_tests_ParserTest_select
          quickstep_parser_tests_ParserTest
          "${CMAKE_CURRENT_SOURCE_DIR}/Select.test"
          "${CMAKE_CURRENT_BINARY_DIR}/Select.test")
+add_test(quickstep_parser_tests_ParserTest_setoperation
+         quickstep_parser_tests_ParserTest
+         "${CMAKE_CURRENT_SOURCE_DIR}/SetOperation.test"
+         "${CMAKE_CURRENT_BINARY_DIR}/SetOperation.test")
 add_test(quickstep_parser_tests_ParserTest_tpch
          quickstep_parser_tests_ParserTest
          "${CMAKE_CURRENT_SOURCE_DIR}/TPCH.test"

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/5b7b5cb8/parser/tests/Join.test
----------------------------------------------------------------------
diff --git a/parser/tests/Join.test b/parser/tests/Join.test
index 63edeb4..d8ac83f 100644
--- a/parser/tests/Join.test
+++ b/parser/tests/Join.test
@@ -20,26 +20,31 @@ FROM a JOIN b ON a.w = b.w
        JOIN c ON a.x = c.x
        JOIN d ON a.y = d.y;
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectStar
-  +-from_clause=
-    +-JoinedTable[join_type=InnerJoin]
-      +-left_table=JoinedTable[join_type=InnerJoin]
-      | +-left_table=JoinedTable[join_type=InnerJoin]
-      | | +-left_table=TableReference[table=a]
-      | | +-right_table=TableReference[table=b]
-      | | +-join_predicate=Equal
-      | |   +-left_operand=AttributeReference[attribute_name=w,relation_name=a]
-      | |   +-right_operand=AttributeReference[attribute_name=w,relation_name=b]
-      | +-right_table=TableReference[table=c]
-      | +-join_predicate=Equal
-      |   +-left_operand=AttributeReference[attribute_name=x,relation_name=a]
-      |   +-right_operand=AttributeReference[attribute_name=x,relation_name=c]
-      +-right_table=TableReference[table=d]
-      +-join_predicate=Equal
-        +-left_operand=AttributeReference[attribute_name=y,relation_name=a]
-        +-right_operand=AttributeReference[attribute_name=y,relation_name=d]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectStar
+      +-from_clause=
+        +-JoinedTable[join_type=InnerJoin]
+          +-left_table=JoinedTable[join_type=InnerJoin]
+          | +-left_table=JoinedTable[join_type=InnerJoin]
+          | | +-left_table=TableReference[table=a]
+          | | +-right_table=TableReference[table=b]
+          | | +-join_predicate=Equal
+          | |   +-left_operand=AttributeReference[attribute_name=w,
+          | |   | relation_name=a]
+          | |   +-right_operand=AttributeReference[attribute_name=w,
+          | |     relation_name=b]
+          | +-right_table=TableReference[table=c]
+          | +-join_predicate=Equal
+          |   +-left_operand=AttributeReference[attribute_name=x,relation_name=a]
+          |   +-right_operand=AttributeReference[attribute_name=x,
+          |     relation_name=c]
+          +-right_table=TableReference[table=d]
+          +-join_predicate=Equal
+            +-left_operand=AttributeReference[attribute_name=y,relation_name=a]
+            +-right_operand=AttributeReference[attribute_name=y,relation_name=d]
 ==
 
 SELECT *
@@ -50,30 +55,36 @@ WHERE a1.x > b1.x
   AND a1.y > c1.y
   AND a1.z > d1.z;
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectStar
-  +-from_clause=
-    +-JoinedTable[join_type=InnerJoin]
-      +-left_table=JoinedTable[join_type=InnerJoin]
-      | +-left_table=JoinedTable[join_type=InnerJoin]
-      | | +-left_table=TableReference[table=a]
-      | | | +-table_signature=TableSignature[table_alias=a1]
-      | | +-right_table=TableReference[table=b]
-      | | | +-table_signature=TableSignature[table_alias=b1]
-      | | +-join_predicate=Equal
-      | |   +-left_operand=AttributeReference[attribute_name=w,relation_name=a1]
-      | |   +-right_operand=AttributeReference[attribute_name=w,relation_name=b1]
-      | +-right_table=TableReference[table=c]
-      | | +-table_signature=TableSignature[table_alias=c1]
-      | +-join_predicate=Equal
-      |   +-left_operand=AttributeReference[attribute_name=x,relation_name=a1]
-      |   +-right_operand=AttributeReference[attribute_name=x,relation_name=c1]
-      +-right_table=TableReference[table=d]
-      | +-table_signature=TableSignature[table_alias=d1]
-      +-join_predicate=Equal
-        +-left_operand=AttributeReference[attribute_name=y,relation_name=a1]
-        +-right_operand=AttributeReference[attribute_name=y,relation_name=d1]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectStar
+      +-from_clause=
+        +-JoinedTable[join_type=InnerJoin]
+          +-left_table=JoinedTable[join_type=InnerJoin]
+          | +-left_table=JoinedTable[join_type=InnerJoin]
+          | | +-left_table=TableReference[table=a]
+          | | | +-table_signature=TableSignature[table_alias=a1]
+          | | +-right_table=TableReference[table=b]
+          | | | +-table_signature=TableSignature[table_alias=b1]
+          | | +-join_predicate=Equal
+          | |   +-left_operand=AttributeReference[attribute_name=w,
+          | |   | relation_name=a1]
+          | |   +-right_operand=AttributeReference[attribute_name=w,
+          | |     relation_name=b1]
+          | +-right_table=TableReference[table=c]
+          | | +-table_signature=TableSignature[table_alias=c1]
+          | +-join_predicate=Equal
+          |   +-left_operand=AttributeReference[attribute_name=x,
+          |   | relation_name=a1]
+          |   +-right_operand=AttributeReference[attribute_name=x,
+          |     relation_name=c1]
+          +-right_table=TableReference[table=d]
+          | +-table_signature=TableSignature[table_alias=d1]
+          +-join_predicate=Equal
+            +-left_operand=AttributeReference[attribute_name=y,relation_name=a1]
+            +-right_operand=AttributeReference[attribute_name=y,relation_name=d1]
 ==
 
 SELECT *
@@ -81,82 +92,97 @@ FROM a LEFT OUTER JOIN b ON a.w = b.w
        RIGHT OUTER JOIN c ON a.x = c.x
        FULL OUTER JOIN d ON a.y = d.y;
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectStar
-  +-from_clause=
-    +-JoinedTable[join_type=FullOuterJoin]
-      +-left_table=JoinedTable[join_type=RightOuterJoin]
-      | +-left_table=JoinedTable[join_type=LeftOuterJoin]
-      | | +-left_table=TableReference[table=a]
-      | | +-right_table=TableReference[table=b]
-      | | +-join_predicate=Equal
-      | |   +-left_operand=AttributeReference[attribute_name=w,relation_name=a]
-      | |   +-right_operand=AttributeReference[attribute_name=w,relation_name=b]
-      | +-right_table=TableReference[table=c]
-      | +-join_predicate=Equal
-      |   +-left_operand=AttributeReference[attribute_name=x,relation_name=a]
-      |   +-right_operand=AttributeReference[attribute_name=x,relation_name=c]
-      +-right_table=TableReference[table=d]
-      +-join_predicate=Equal
-        +-left_operand=AttributeReference[attribute_name=y,relation_name=a]
-        +-right_operand=AttributeReference[attribute_name=y,relation_name=d]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectStar
+      +-from_clause=
+        +-JoinedTable[join_type=FullOuterJoin]
+          +-left_table=JoinedTable[join_type=RightOuterJoin]
+          | +-left_table=JoinedTable[join_type=LeftOuterJoin]
+          | | +-left_table=TableReference[table=a]
+          | | +-right_table=TableReference[table=b]
+          | | +-join_predicate=Equal
+          | |   +-left_operand=AttributeReference[attribute_name=w,
+          | |   | relation_name=a]
+          | |   +-right_operand=AttributeReference[attribute_name=w,
+          | |     relation_name=b]
+          | +-right_table=TableReference[table=c]
+          | +-join_predicate=Equal
+          |   +-left_operand=AttributeReference[attribute_name=x,relation_name=a]
+          |   +-right_operand=AttributeReference[attribute_name=x,
+          |     relation_name=c]
+          +-right_table=TableReference[table=d]
+          +-join_predicate=Equal
+            +-left_operand=AttributeReference[attribute_name=y,relation_name=a]
+            +-right_operand=AttributeReference[attribute_name=y,relation_name=d]
 ==
 
 SELECT *
 FROM a INNER JOIN b ON (a.w = b.w OR a.x > b.y);
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectStar
-  +-from_clause=
-    +-JoinedTable[join_type=InnerJoin]
-      +-left_table=TableReference[table=a]
-      +-right_table=TableReference[table=b]
-      +-join_predicate=Or
-        +-Equal
-        | +-left_operand=AttributeReference[attribute_name=w,relation_name=a]
-        | +-right_operand=AttributeReference[attribute_name=w,relation_name=b]
-        +-Greater
-          +-left_operand=AttributeReference[attribute_name=x,relation_name=a]
-          +-right_operand=AttributeReference[attribute_name=y,relation_name=b]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectStar
+      +-from_clause=
+        +-JoinedTable[join_type=InnerJoin]
+          +-left_table=TableReference[table=a]
+          +-right_table=TableReference[table=b]
+          +-join_predicate=Or
+            +-Equal
+            | +-left_operand=AttributeReference[attribute_name=w,relation_name=a]
+            | +-right_operand=AttributeReference[attribute_name=w,
+            |   relation_name=b]
+            +-Greater
+              +-left_operand=AttributeReference[attribute_name=x,relation_name=a]
+              +-right_operand=AttributeReference[attribute_name=y,
+                relation_name=b]
 ==
 
 SELECT *
 FROM b LEFT JOIN c ON b.x = c.x JOIN d ON c.y = d.y;
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectStar
-  +-from_clause=
-    +-JoinedTable[join_type=InnerJoin]
-      +-left_table=JoinedTable[join_type=LeftOuterJoin]
-      | +-left_table=TableReference[table=b]
-      | +-right_table=TableReference[table=c]
-      | +-join_predicate=Equal
-      |   +-left_operand=AttributeReference[attribute_name=x,relation_name=b]
-      |   +-right_operand=AttributeReference[attribute_name=x,relation_name=c]
-      +-right_table=TableReference[table=d]
-      +-join_predicate=Equal
-        +-left_operand=AttributeReference[attribute_name=y,relation_name=c]
-        +-right_operand=AttributeReference[attribute_name=y,relation_name=d]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectStar
+      +-from_clause=
+        +-JoinedTable[join_type=InnerJoin]
+          +-left_table=JoinedTable[join_type=LeftOuterJoin]
+          | +-left_table=TableReference[table=b]
+          | +-right_table=TableReference[table=c]
+          | +-join_predicate=Equal
+          |   +-left_operand=AttributeReference[attribute_name=x,relation_name=b]
+          |   +-right_operand=AttributeReference[attribute_name=x,
+          |     relation_name=c]
+          +-right_table=TableReference[table=d]
+          +-join_predicate=Equal
+            +-left_operand=AttributeReference[attribute_name=y,relation_name=c]
+            +-right_operand=AttributeReference[attribute_name=y,relation_name=d]
 ==
 
 SELECT *
 FROM b LEFT JOIN (c JOIN d ON c.y = d.y) ON b.x = c.x;
 --
-SelectStatement
-+-select_query=Select
-  +-select_clause=SelectStar
-  +-from_clause=
-    +-JoinedTable[join_type=LeftOuterJoin]
-      +-left_table=TableReference[table=b]
-      +-right_table=JoinedTable[join_type=InnerJoin]
-      | +-left_table=TableReference[table=c]
-      | +-right_table=TableReference[table=d]
-      | +-join_predicate=Equal
-      |   +-left_operand=AttributeReference[attribute_name=y,relation_name=c]
-      |   +-right_operand=AttributeReference[attribute_name=y,relation_name=d]
-      +-join_predicate=Equal
-        +-left_operand=AttributeReference[attribute_name=x,relation_name=b]
-        +-right_operand=AttributeReference[attribute_name=x,relation_name=c]
+SetOperationStatement
++-set_operation_query=SetOperation[set_operation_type=Select]
+  +-children=
+    +-Select
+      +-select_clause=SelectStar
+      +-from_clause=
+        +-JoinedTable[join_type=LeftOuterJoin]
+          +-left_table=TableReference[table=b]
+          +-right_table=JoinedTable[join_type=InnerJoin]
+          | +-left_table=TableReference[table=c]
+          | +-right_table=TableReference[table=d]
+          | +-join_predicate=Equal
+          |   +-left_operand=AttributeReference[attribute_name=y,relation_name=c]
+          |   +-right_operand=AttributeReference[attribute_name=y,
+          |     relation_name=d]
+          +-join_predicate=Equal
+            +-left_operand=AttributeReference[attribute_name=x,relation_name=b]
+            +-right_operand=AttributeReference[attribute_name=x,relation_name=c]