You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2013/06/18 06:44:26 UTC

[2/2] git commit: TAJO-72: Rename NQL.g to SQL.g. (hyunsik)

TAJO-72: Rename NQL.g to SQL.g. (hyunsik)


Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/669f2933
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/669f2933
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/669f2933

Branch: refs/heads/master
Commit: 669f29330017fe5155bb1ca95c654b109131f430
Parents: 30f2713
Author: Hyunsik Choi <hy...@apache.org>
Authored: Tue Jun 18 13:43:02 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Tue Jun 18 13:43:02 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |    5 +-
 .../src/main/antlr3/tajo/engine/parser/NQL.g    |  993 -----------------
 .../src/main/antlr3/tajo/engine/parser/SQL.g    |  993 +++++++++++++++++
 .../main/java/tajo/engine/parser/ParseUtil.java |   36 +-
 .../java/tajo/engine/parser/QueryAnalyzer.java  |  244 ++---
 .../java/tajo/engine/parser/TestNQLParser.java  | 1034 ------------------
 .../java/tajo/engine/parser/TestSQLParser.java  | 1034 ++++++++++++++++++
 7 files changed, 2171 insertions(+), 2168 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/669f2933/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 763ebe2..79bf45b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -10,11 +10,14 @@ Release 0.2.0 - unreleased
 
   IMPROVEMENTS
 
+    TAJO-72: Rename NQL.g to SQL.g. (hyunsik)
+
     TAJO-71: Case-insensitive parser. (hyunsik)
 
     TAJO-40: Adopt YarnClient to GlobalEngine. (jihoon)
 
-    TAJO-69: Add .reviewboardrc file to the ignore lists of Rat and .gitignore. (hyunsik)
+    TAJO-69: Add .reviewboardrc file to the ignore lists of Rat and .gitignore. 
+    (hyunsik)
 
     TAJO-66: Support compiling and running Tajo with Java7 (Tejas Patil via hsaputra)
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/669f2933/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/NQL.g
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/NQL.g b/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/NQL.g
deleted file mode 100644
index 6507722..0000000
--- a/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/NQL.g
+++ /dev/null
@@ -1,993 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-grammar NQL;
-
-options {
-	language=Java;
-	backtrack=true;
-	memoize=true;
-	output=AST;
-	ASTLabelType=CommonTree;
-}
-
-tokens {
-  ALL;
-  COLUMN;
-  COUNT_VAL;
-  COUNT_ROWS;
-  CREATE_INDEX;
-  CREATE_TABLE;
-  DROP_TABLE;
-  DESC_TABLE;
-  EMPTY_GROUPING_SET;
-  FIELD_NAME;
-  FIELD_DEF;
-  FUNCTION;
-  FUNC_ARGS;
-  GROUP_BY;
-  NULL_ORDER;
-  ORDER;
-  ORDER_BY;
-  PARAM;
-  PARAMS;
-  SEL_LIST;
-  SESSION_CLEAR;
-  SET_QUALIFIER;
-  SHOW_TABLE;
-  SHOW_FUNCTION;
-  SORT_KEY;
-  SORT_SPECIFIERS;
-  STORE;
-  STORE_TYPE;
-  TABLE_DEF;
-  TARGET_FIELDS;
-  VALUES;
-}
-
-@header {
-package tajo.engine.parser;
-
-import java.util.List;
-import java.util.ArrayList;
-import tajo.engine.query.exception.TQLParseError;
-}
-
-@lexer::header {
-package tajo.engine.parser;
-
-import tajo.engine.query.exception.TQLParseError;
-}
-
-@lexer::members {
-   @Override
-   public void reportError(RecognitionException e) {
-    throw new TQLParseError(getErrorHeader(e));
-   }
-}
-
-@members {
-   @Override
-   public void reportError(RecognitionException e) {
-     throw new TQLParseError(getErrorHeader(e));
-   }
-
-   @Override
-   public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
-     String hdr = getErrorHeader(e);
-     String msg = getErrorMessage(e, tokenNames);
-     throw new TQLParseError(hdr + ":" + msg);
-   }
-}
-
-/*
-===============================================================================
-  Tokens for Case Insensitive Keywords
-===============================================================================
-*/
-fragment A
-	:	'A' | 'a';
-
-fragment B
-	:	'B' | 'b';
-
-fragment C
-	:	'C' | 'c';
-
-fragment D
-	:	'D' | 'd';
-
-fragment E
-	:	'E' | 'e';
-
-fragment F
-	:	'F' | 'f';
-
-fragment G
-	:	'G' | 'g';
-
-fragment H
-	:	'H' | 'h';
-
-fragment I
-	:	'I' | 'i';
-
-fragment J
-	:	'J' | 'j';
-
-fragment K
-	:	'K' | 'k';
-
-fragment L
-	:	'L' | 'l';
-
-fragment M
-	:	'M' | 'm';
-
-fragment N
-	:	'N' | 'n';
-
-fragment O
-	:	'O' | 'o';
-
-fragment P
-	:	'P' | 'p';
-
-fragment Q
-	:	'Q' | 'q';
-
-fragment R
-	:	'R' | 'r';
-
-fragment S
-	:	'S' | 's';
-
-fragment T
-	:	'T' | 't';
-
-fragment U
-	:	'U' | 'u';
-
-fragment V
-	:	'V' | 'v';
-
-fragment W
-	:	'W' | 'w';
-
-fragment X
-	:	'X' | 'x';
-
-fragment Y
-	:	'Y' | 'y';
-
-fragment Z
-	:	'Z' | 'z';
-
-/*
-===============================================================================
-  Reserved Keywords
-===============================================================================
-*/
-
-AS : A S;
-ALL : A L L;
-AND : A N D;
-ASC : A S C;
-
-BY : B Y;
-
-CASE : C A S E;
-CHARACTER : C H A R A C T E R;
-COUNT : C O U N T;
-COPY : C O P Y;
-CREATE : C R E A T E;
-CROSS : C R O S S;
-CUBE : C U B E;
-
-DESC : D E S C;
-DISTINCT : D I S T I N C T;
-DROP : D R O P;
-
-END : E N D;
-ELSE : E L S E;
-EXCEPT : E X C E P T;
-EXTERNAL : E X T E R N A L;
-FALSE : F A L S E;
-FIRST : F I R S T;
-FORMAT : F O R M A T;
-FULL : F U L L;
-FROM : F R O M;
-
-GROUP : G R O U P;
-
-HAVING : H A V I N G;
-
-IN : I N;
-INDEX : I N D E X;
-INNER : I N N E R;
-INSERT : I N S E R T;
-INTERSECT : I N T E R S E C T;
-INTO : I N T O;
-IS : I S;
-
-JOIN : J O I N;
-
-LAST : L A S T;
-LEFT : L E F T;
-LIKE : L I K E;
-LIMIT : L I M I T;
-LOCATION : L O C A T I O N;
-
-NATIONAL : N A T I O N A L;
-NATURAL : N A T U R A L;
-NOT : N O T;
-NULL : N U L L;
-
-ON : O N;
-OUTER : O U T E R;
-OR : O R;
-ORDER : O R D E R;
-
-PRECISION : P R E C I S I ON;
-
-RIGHT : R I G H T;
-ROLLUP : R O L L U P;
-
-SET : S E T;
-SELECT : S E L E C T;
-
-TABLE : T A B L E;
-THEN : T H E N;
-TRUE : T R U E;
-
-UNION : U N I O N;
-UNIQUE : U N I Q U E;
-UNKNOWN : U N K N O W N;
-USING : U S I N G;
-
-VALUES : V A L U E S;
-VARYING : V A R Y I N G;
-
-WHEN : W H E N;
-WHERE : W H E R E;
-WITH : W I T H;
-
-ZONE : Z O N E;
-
-/*
-===============================================================================
-  Data Type Tokens
-===============================================================================
-*/
-BOOLEAN : B O O L E A N;
-BOOL : B O O L;
-BIT : B I T;
-VARBIT : V A R B I T;
-
-INT1 : I N T '1';
-INT2 : I N T '2';
-INT4 : I N T '4';
-INT8 : I N T '8';
-
-TINYINT : T I N Y I N T; // alias for INT1
-SMALLINT : S M A L L I N T; // alias for INT2
-INT : I N T; // alias for INT4
-INTEGER : I N T E G E R; // alias - INT4
-BIGINT : B I G I N T; // alias for INT8
-
-FLOAT4 : F L O A T '4';
-FLOAT8 : F L O A T '8';
-
-REAL : R E A L; // alias for FLOAT4
-FLOAT : F L O A T; // alias for FLOAT8
-DOUBLE : D O U B L E; // alias for FLOAT8
-
-NUMERIC : N U M E R I C;
-DECIMAL : D E C I M A L; // alias for number
-
-CHAR : C H A R;
-VARCHAR : V A R C H A R;
-NCHAR : N C H A R;
-NVARCHAR : N V A R C H A R;
-
-DATE : D A T E;
-TIME : T I M E;
-TIMETZ : T I M E T Z;
-TIMESTAMP : T I M E S T A M P;
-TIMESTAMPTZ : T I M E S T A M P T Z;
-
-TEXT : T E X T;
-
-BINARY : B I N A R Y;
-VARBINARY : V A R B I N A R Y;
-BLOB : B L O B;
-BYTEA : B Y T E A; // alias for BLOB
-
-INET4 : I N E T '4';
-
-/*
-===============================================================================
-  SQL Main
-===============================================================================
-*/
-sql
-  : statement EOF
-  ;
-
-statement
-  : sessionStatement
-  | controlStatement
-  | dataStatement
-  | dataChangeStatement
-  | schemaStatement
-  | indexStatement
-  ;
-
-sessionStatement
-  : 'session' 'clear' -> ^(SESSION_CLEAR)
-  ;
-
-controlStatement
-  : '\\' 't' (table)? -> ^(SHOW_TABLE table?)
-  | '\\' 'd' table -> ^(DESC_TABLE table)
-  | '\\' 'f' -> ^(SHOW_FUNCTION)
-  ;
-
-dataStatement
-  : query_expression
-  | set_stmt
-  | copyStatement
-  ;
-
-dataChangeStatement
-  : insertStmt
-  ;
-
-schemaStatement
-  : createTableStatement
-  | DROP TABLE table -> ^(DROP_TABLE table)
-  ;
-
-indexStatement
-  : CREATE (u=UNIQUE)? INDEX n=Identifier ON t=table (m=method_specifier)? LEFT_PAREN s=sort_specifier_list RIGHT_PAREN p=param_clause?-> ^(CREATE_INDEX $u? $m? $p? $n $t $s)
-  ;
-
-createTableStatement
-  : CREATE EXTERNAL TABLE t=table def=tableElements USING f=Identifier p=param_clause? (LOCATION path=Character_String_Literal)
-      -> ^(CREATE_TABLE $t EXTERNAL ^(TABLE_DEF $def) ^(USING $f) $p? ^(LOCATION $path))
-  | CREATE TABLE t=table (def=tableElements)? (USING s=Identifier)? (p=param_clause)? (AS q=query_expression)?
-      -> ^(CREATE_TABLE $t ^(TABLE_DEF $def)? ^(USING $s)? $p? ^(AS $q)?)
-  ;
-
-copyStatement
-  : COPY t=table FROM path=string_value_expr FORMAT s=Identifier (p=param_clause)? -> ^(COPY $t $path $s $p?)
-  ;
-
-tableElements
-  : LEFT_PAREN fieldElement (COMMA fieldElement)* RIGHT_PAREN -> fieldElement+
-  ;
-
-fieldElement
-  : Identifier fieldType -> ^(FIELD_DEF Identifier fieldType)
-  ;
-
-fieldType
-  : dataType
-  ;
-
-precision_param
-  : LEFT_PAREN! NUMBER RIGHT_PAREN!
-  | LEFT_PAREN! NUMBER COMMA! NUMBER RIGHT_PAREN!
-  ;
-type_length
-  : LEFT_PAREN! NUMBER RIGHT_PAREN!
-  ;
-
-boolean_type
-  : BOOLEAN
-  | BOOL -> BOOLEAN
-  ;
-bit_type
-  : BIT type_length? -> BIT
-  ;
-varbit_type
-  : VARBIT type_length? -> VARBIT
-  | BIT VARYING type_length? -> VARBIT
-  ;
-int1_type
-  : INT1
-  | TINYINT -> INT1
-  ;
-int2_type
-  : INT2
-  | SMALLINT -> INT2
-  ;
-int4_type
-  : INT4
-  | INT -> INT4
-  | INTEGER -> INT4
-  ;
-int8_type
-  : INT8
-  | BIGINT -> INT8
-  ;
-float4_type
-  : FLOAT4
-  | REAL -> FLOAT4
-  ;
-float_type : FLOAT type_length? -> ^(FLOAT type_length?);
-float8_type
-  : FLOAT8
-  | DOUBLE -> FLOAT8
-  | DOUBLE PRECISION -> FLOAT8
-  ;
-number_type
-  : NUMERIC (precision_param)? -> NUMERIC
-  | DECIMAL (precision_param)? -> NUMERIC
-  ;
-char_type
-  : CHAR type_length? -> CHAR
-  | CHARACTER type_length? -> CHAR
-  ;
-varchar_type
-  : VARCHAR type_length? -> VARCHAR
-  | CHARACTER VARYING type_length? -> VARCHAR
-  ;
-nchar_type
-  : NCHAR type_length? -> NCHAR
-  | NATIONAL CHARACTER type_length? -> NCHAR
-  ;
-nvarchar_type
-  : NVARCHAR type_length? -> NVARCHAR
-  | NATIONAL CHARACTER VARYING type_length? -> NVARCHAR
-  ;
-timetz_type
-  : TIMETZ
-  | TIME WITH TIME ZONE -> TIMETZ
-  ;
-timestamptz_type
-  : TIMESTAMPTZ
-  | TIMESTAMP WITH TIME ZONE -> TIMESTAMPTZ
-  ;
-binary_type
-  : BINARY type_length?
-  ;
-varbinary_type
-  : VARBINARY type_length?
-  | BINARY VARYING type_length?
-  ;
-blob_type
-  : BLOB
-  | BYTEA -> BLOB
-  ;
-
-dataType
-  : boolean_type
-  | bit_type
-  | varbit_type
-  | int1_type
-  | int2_type
-  | int4_type
-  | int8_type
-  | float4_type
-  | float_type
-  | float8_type
-  | number_type
-  | char_type
-  | varchar_type
-  | nchar_type
-  | nvarchar_type
-  | DATE
-  | TIME
-  | timetz_type
-  | TIMESTAMP
-  | timestamptz_type
-  | TEXT
-  | binary_type
-  | varbinary_type
-  | blob_type
-  | INET4
-  ;
-
-query_expression
-  : query_expression_body
-  ;
-
-query_expression_body
-  : non_join_query_expression
-  | joined_table
-  ;
-
-non_join_query_expression
-  : (non_join_query_term | joined_table (UNION | EXCEPT)^ (ALL|DISTINCT)? query_term) ((UNION | EXCEPT)^ (ALL|DISTINCT)? query_term)*
-  ;
-
-query_term
-  : non_join_query_term
-  | joined_table
-  ;
-
-non_join_query_term
-  : ( non_join_query_primary | joined_table INTERSECT^ (ALL|DISTINCT)? query_primary) (INTERSECT^ (ALL|DISTINCT)? query_primary)*
-  ;
-
-query_primary
-  : non_join_query_primary
-  | joined_table
-  ;
-
-non_join_query_primary
-  : simple_table
-  | LEFT_PAREN non_join_query_expression RIGHT_PAREN
-  ;
-
-simple_table
-options {k=1;}
-  : query_specification
-  ;
-
-query_specification
-  : SELECT setQualifier? selectList from_clause? where_clause? groupby_clause? having_clause? orderby_clause? limit_clause?
-  -> ^(SELECT from_clause? setQualifier? selectList where_clause? groupby_clause? having_clause? orderby_clause? limit_clause?)
-  ;
-
-insertStmt
-  : INSERT 'into' table (LEFT_PAREN column_reference RIGHT_PAREN)? 'values' array
-  -> ^(INSERT ^(TABLE table) ^(VALUES array) ^(TARGET_FIELDS column_reference)?)
-  ;
-
-selectList
-  : MULTIPLY -> ^(SEL_LIST ALL)
-  | derivedColumn (COMMA derivedColumn)* -> ^(SEL_LIST derivedColumn+)
-  ;
-
-setQualifier
-  : DISTINCT -> ^(SET_QUALIFIER DISTINCT)
-  | ALL -> ^(SET_QUALIFIER ALL)
-  ;
-
-derivedColumn
-  : bool_expr asClause? -> ^(COLUMN bool_expr asClause?)
-  ;
-
-fieldName
-	:	(t=Identifier DOT)? b=Identifier -> ^(FIELD_NAME $b $t?)
-	;
-
-asClause
-  : (AS)? fieldName
-  ;
-
-column_reference
-	:	fieldName (COMMA fieldName)* -> fieldName+
-	;
-
-table
-  : Identifier
-  ;
-
-// TODO - to be improved
-funcCall
-	: Identifier LEFT_PAREN funcArgs? RIGHT_PAREN -> ^(FUNCTION[$Identifier.text] funcArgs?)
-	| COUNT LEFT_PAREN funcArgs RIGHT_PAREN -> ^(COUNT_VAL funcArgs)
-	| COUNT LEFT_PAREN MULTIPLY RIGHT_PAREN -> ^(COUNT_ROWS)
-	;
-
-funcArgs
-  : bool_expr (COMMA bool_expr)* -> bool_expr+
-  ;
-
-from_clause
-  : FROM^ table_reference_list
-  ;
-
-table_reference_list
-  :table_reference (COMMA table_reference)* -> table_reference+
-  ;
-
-table_reference
-  : table_primary
-  | joined_table
-  ;
-
-joined_table
-  : table_primary (cross_join | qualified_join | natural_join | union_join)+
-  ;
-
-joined_table_prim
-  : cross_join
-  | qualified_join
-  | natural_join
-  | union_join
-  ;
-
-cross_join
-  : CROSS JOIN r=table_primary -> ^(JOIN CROSS $r)
-  ;
-
-qualified_join
-  : (t=join_type)? JOIN r=table_primary s=join_specification -> ^(JOIN $t? $r $s)
-  ;
-
-natural_join
-  : NATURAL (t=join_type)? JOIN r=table_primary -> ^(JOIN NATURAL $t? $r)
-  ;
-
-union_join
-  : UNION JOIN r=table_primary -> ^(JOIN UNION $r)
-  ;
-
-join_type
-  : INNER
-  | t=outer_join_type OUTER -> ^(OUTER $t)
-  | t=outer_join_type -> ^(OUTER $t)
-  ;
-
-outer_join_type
-  : LEFT
-  | RIGHT
-  | FULL
-  ;
-
-join_specification
-  : join_condition
-  | named_columns_join
-  ;
-
-join_condition
-  : ON^ search_condition
-  ;
-
-named_columns_join
-  : USING LEFT_PAREN f=column_reference RIGHT_PAREN -> ^(USING $f)
-  ;
-
-table_primary
-  : table ((AS)? a=Identifier)? -> ^(TABLE table ($a)?)
-  ;
-
-where_clause
-  : WHERE^ search_condition
-  ;
-
-groupby_clause
-  : GROUP BY g=grouping_element_list -> ^(GROUP_BY $g)
-  ;
-
-grouping_element_list
-  : grouping_element (COMMA grouping_element)* -> grouping_element+
-  ;
-
-grouping_element
-  : ordinary_grouping_set
-  | rollup_list
-  | cube_list
-  | empty_grouping_set
-  ;
-
-ordinary_grouping_set
-  : column_reference
-  | LEFT_PAREN! column_reference RIGHT_PAREN!
-  ;
-
-rollup_list
-  : ROLLUP LEFT_PAREN c=ordinary_grouping_set RIGHT_PAREN -> ^(ROLLUP $c)
-  ;
-
-cube_list
-  : CUBE LEFT_PAREN c=ordinary_grouping_set RIGHT_PAREN -> ^(CUBE $c)
-  ;
-
-empty_grouping_set
-  : LEFT_PAREN RIGHT_PAREN -> ^(EMPTY_GROUPING_SET)
-  ;
-
-having_clause
-  : HAVING^ bool_expr
-  ;
-
-orderby_clause
-  : ORDER BY sort_specifier_list -> ^(ORDER_BY sort_specifier_list)
-  ;
-
-sort_specifier_list
-  : sort_specifier (COMMA sort_specifier)* -> ^(SORT_SPECIFIERS sort_specifier+)
-  ;
-
-sort_specifier
-  : fn=fieldName a=order_specification? o=null_ordering? -> ^(SORT_KEY $fn $a? $o?)
-  ;
-
-order_specification
-  : ASC -> ^(ORDER ASC)
-  | DESC -> ^(ORDER DESC)
-  ;
-
-limit_clause
-  : LIMIT e=expr -> ^(LIMIT $e)
-  ;
-
-null_ordering
-  : NULL FIRST -> ^(NULL_ORDER FIRST)
-  | NULL LAST -> ^(NULL_ORDER LAST)
-  ;
-
-set_stmt
-	:	SET (UNION|INTERSECT|EXCEPT) table
-	;
-
-search_condition
-	:	bool_expr
-	;
-
-param_clause
-  : WITH LEFT_PAREN param (COMMA param)* RIGHT_PAREN -> ^(PARAMS param+)
-  ;
-
-param
-  : k=Character_String_Literal EQUAL v=bool_expr -> ^(PARAM $k $v)
-  ;
-
-method_specifier
-  : USING m=Identifier -> ^(USING[$m.text])
-  ;
-
-bool_expr
-	:	and_predicate (OR^ and_predicate)*
-	;
-
-and_predicate
-  :	boolean_factor (AND^ boolean_factor)*
-	;
-
-boolean_factor
-  : boolean_test
-  | NOT boolean_test -> ^(NOT boolean_test)
-  ;
-
-boolean_test
-  : boolean_primary is_clause?
-  ;
-
-is_clause
-  : IS NOT? t=truth_value -> ^(IS NOT? $t)
-  ;
-
-
-truth_value
-  : TRUE | FALSE | UNKNOWN
-  ;
-
-boolean_primary
-  : predicate
-  | expr
-  | LEFT_PAREN! bool_expr RIGHT_PAREN!
-  | case_expression
-  ;
-
-predicate
-  : comparison_predicate
-  | in_predicate
-  | like_predicate
-  | null_predicate
-  ;
-
-in_predicate
-	:	expr NOT? IN array -> ^(IN expr array NOT?)
-	;
-
-like_predicate
-  : f=fieldName NOT? LIKE s=string_value_expr -> ^(LIKE NOT? $f $s)
-  ;
-
-null_predicate
-  : f=expr IS (n=NOT)? NULL -> ^(IS $f NULL $n?)
-  ;
-
-comparison_predicate
-	:	expr EQUAL^ expr
-	|	expr NOT_EQUAL^ expr
-	|	expr LTH^ expr
-	|	expr LEQ^ expr
-	|	expr GTH^ expr
-	|	expr GEQ^ expr
-	;
-
-expr
-	:	multExpr ((PLUS|MINUS)^ multExpr)*
-	;
-
-multExpr
-  :	atom ((MULTIPLY|DIVIDE|MODULAR)^ atom)*
-	;
-
-array
-  : LEFT_PAREN literal (COMMA literal )* RIGHT_PAREN -> literal+
-  ;
-
-atom
-  :	literal
-	| fieldName
-	|	LEFT_PAREN! expr RIGHT_PAREN!
-	| funcCall
-	;
-
-literal
-  : string_value_expr
-  | signed_numerical_literal
-  | NULL
-  ;
-
-string_value_expr
-  : Character_String_Literal
-  ;
-
-signed_numerical_literal
-  : sign? unsigned_numerical_literal
-  ;
-
-unsigned_numerical_literal
-  : NUMBER
-  | REAL_NUMBER
-  ;
-
-sign
-  : PLUS | MINUS
-  ;
-
-////////////////////////////////
-// Case Statement
-////////////////////////////////
-case_expression
-  : case_specification
-  ;
-
-case_specification
-  : searched_case
-  ;
-
-searched_case
-  : CASE^ (searched_when_clause)+ (else_clause)? END!
-  ;
-
-searched_when_clause
-  : WHEN c=search_condition THEN r=result -> ^(WHEN $c $r)
-  ;
-
-else_clause
-  : ELSE r=result -> ^(ELSE $r)
-  ;
-
-result
-  : bool_expr
-  ;
-
-// Operators
-ASSIGN  : ':=';
-EQUAL  : '=';
-SEMI_COLON :  ';';
-COMMA : ',';
-NOT_EQUAL  : '<>' | '!=' | '~='| '^=' ;
-LTH : '<' ;
-LEQ : '<=';
-GTH   : '>';
-GEQ   : '>=';
-LEFT_PAREN :  '(';  
-RIGHT_PAREN : ')';
-PLUS  : '+';
-MINUS : '-';
-MULTIPLY: '*';
-DIVIDE  : '/';
-MODULAR : '%';
-DOT : '.';
-
-NUMBER : Digit+;
-
-fragment
-Digit : '0'..'9';
-
-REAL_NUMBER
-    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
-    |   '.' ('0'..'9')+ EXPONENT?
-    |   ('0'..'9')+ EXPONENT
-    ;
-
-COMMENT
-    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
-    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
-    ;
-
-/*
-===============================================================================
- Identifiers
-===============================================================================
-*/
-
-// Regular Expressions for Tokens
-Identifier  : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|Digit|'_'|':')*
-    ;
-
-/*
-===============================================================================
- Literal
-===============================================================================
-*/
-
-// Some Unicode Character Ranges
-fragment
-Control_Characters                  :   '\u0001' .. '\u001F';
-fragment
-Extended_Control_Characters         :   '\u0080' .. '\u009F';
-
-Character_String_Literal
-    : Quote ( ESC_SEQ | ~('\\'|Quote) )* Quote {setText(getText().substring(1, getText().length()-1));}
-    | Double_Quote ( ESC_SEQ | ~('\\'|Double_Quote) )* Double_Quote {setText(getText().substring(1, getText().length()-1));}
-    ;
-
-Quote
-  : '\'';
-
-Double_Quote
-  : '"';
-
-fragment
-EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
-
-fragment
-HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
-
-fragment
-ESC_SEQ
-    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
-    |   UNICODE_ESC
-    |   OCTAL_ESC
-    ;
-
-fragment
-OCTAL_ESC
-    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
-    |   '\\' ('0'..'7') ('0'..'7')
-    |   '\\' ('0'..'7')
-    ;
-
-fragment
-UNICODE_ESC
-    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
-    ;
-
-
-/*
-===============================================================================
- Whitespace Tokens
-===============================================================================
-*/
-
-Space : ' '
-{
-	$channel = HIDDEN;
-};
-
-White_Space :	( Control_Characters  | Extended_Control_Characters )+
-{
-	$channel = HIDDEN;
-};
-
-
-BAD : . {
-  skip();
-} ;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/669f2933/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/SQL.g
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/SQL.g b/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/SQL.g
new file mode 100644
index 0000000..c88d767
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/antlr3/tajo/engine/parser/SQL.g
@@ -0,0 +1,993 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+grammar SQL;
+
+options {
+	language=Java;
+	backtrack=true;
+	memoize=true;
+	output=AST;
+	ASTLabelType=CommonTree;
+}
+
+tokens {
+  ALL;
+  COLUMN;
+  COUNT_VAL;
+  COUNT_ROWS;
+  CREATE_INDEX;
+  CREATE_TABLE;
+  DROP_TABLE;
+  DESC_TABLE;
+  EMPTY_GROUPING_SET;
+  FIELD_NAME;
+  FIELD_DEF;
+  FUNCTION;
+  FUNC_ARGS;
+  GROUP_BY;
+  NULL_ORDER;
+  ORDER;
+  ORDER_BY;
+  PARAM;
+  PARAMS;
+  SEL_LIST;
+  SESSION_CLEAR;
+  SET_QUALIFIER;
+  SHOW_TABLE;
+  SHOW_FUNCTION;
+  SORT_KEY;
+  SORT_SPECIFIERS;
+  STORE;
+  STORE_TYPE;
+  TABLE_DEF;
+  TARGET_FIELDS;
+  VALUES;
+}
+
+@header {
+package tajo.engine.parser;
+
+import java.util.List;
+import java.util.ArrayList;
+import tajo.engine.query.exception.TQLParseError;
+}
+
+@lexer::header {
+package tajo.engine.parser;
+
+import tajo.engine.query.exception.TQLParseError;
+}
+
+@lexer::members {
+   @Override
+   public void reportError(RecognitionException e) {
+    throw new TQLParseError(getErrorHeader(e));
+   }
+}
+
+@members {
+   @Override
+   public void reportError(RecognitionException e) {
+     throw new TQLParseError(getErrorHeader(e));
+   }
+
+   @Override
+   public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
+     String hdr = getErrorHeader(e);
+     String msg = getErrorMessage(e, tokenNames);
+     throw new TQLParseError(hdr + ":" + msg);
+   }
+}
+
+/*
+===============================================================================
+  Tokens for Case Insensitive Keywords
+===============================================================================
+*/
+fragment A
+	:	'A' | 'a';
+
+fragment B
+	:	'B' | 'b';
+
+fragment C
+	:	'C' | 'c';
+
+fragment D
+	:	'D' | 'd';
+
+fragment E
+	:	'E' | 'e';
+
+fragment F
+	:	'F' | 'f';
+
+fragment G
+	:	'G' | 'g';
+
+fragment H
+	:	'H' | 'h';
+
+fragment I
+	:	'I' | 'i';
+
+fragment J
+	:	'J' | 'j';
+
+fragment K
+	:	'K' | 'k';
+
+fragment L
+	:	'L' | 'l';
+
+fragment M
+	:	'M' | 'm';
+
+fragment N
+	:	'N' | 'n';
+
+fragment O
+	:	'O' | 'o';
+
+fragment P
+	:	'P' | 'p';
+
+fragment Q
+	:	'Q' | 'q';
+
+fragment R
+	:	'R' | 'r';
+
+fragment S
+	:	'S' | 's';
+
+fragment T
+	:	'T' | 't';
+
+fragment U
+	:	'U' | 'u';
+
+fragment V
+	:	'V' | 'v';
+
+fragment W
+	:	'W' | 'w';
+
+fragment X
+	:	'X' | 'x';
+
+fragment Y
+	:	'Y' | 'y';
+
+fragment Z
+	:	'Z' | 'z';
+
+/*
+===============================================================================
+  Reserved Keywords
+===============================================================================
+*/
+
+AS : A S;
+ALL : A L L;
+AND : A N D;
+ASC : A S C;
+
+BY : B Y;
+
+CASE : C A S E;
+CHARACTER : C H A R A C T E R;
+COUNT : C O U N T;
+COPY : C O P Y;
+CREATE : C R E A T E;
+CROSS : C R O S S;
+CUBE : C U B E;
+
+DESC : D E S C;
+DISTINCT : D I S T I N C T;
+DROP : D R O P;
+
+END : E N D;
+ELSE : E L S E;
+EXCEPT : E X C E P T;
+EXTERNAL : E X T E R N A L;
+FALSE : F A L S E;
+FIRST : F I R S T;
+FORMAT : F O R M A T;
+FULL : F U L L;
+FROM : F R O M;
+
+GROUP : G R O U P;
+
+HAVING : H A V I N G;
+
+IN : I N;
+INDEX : I N D E X;
+INNER : I N N E R;
+INSERT : I N S E R T;
+INTERSECT : I N T E R S E C T;
+INTO : I N T O;
+IS : I S;
+
+JOIN : J O I N;
+
+LAST : L A S T;
+LEFT : L E F T;
+LIKE : L I K E;
+LIMIT : L I M I T;
+LOCATION : L O C A T I O N;
+
+NATIONAL : N A T I O N A L;
+NATURAL : N A T U R A L;
+NOT : N O T;
+NULL : N U L L;
+
+ON : O N;
+OUTER : O U T E R;
+OR : O R;
+ORDER : O R D E R;
+
+PRECISION : P R E C I S I ON;
+
+RIGHT : R I G H T;
+ROLLUP : R O L L U P;
+
+SET : S E T;
+SELECT : S E L E C T;
+
+TABLE : T A B L E;
+THEN : T H E N;
+TRUE : T R U E;
+
+UNION : U N I O N;
+UNIQUE : U N I Q U E;
+UNKNOWN : U N K N O W N;
+USING : U S I N G;
+
+VALUES : V A L U E S;
+VARYING : V A R Y I N G;
+
+WHEN : W H E N;
+WHERE : W H E R E;
+WITH : W I T H;
+
+ZONE : Z O N E;
+
+/*
+===============================================================================
+  Data Type Tokens
+===============================================================================
+*/
+BOOLEAN : B O O L E A N;
+BOOL : B O O L;
+BIT : B I T;
+VARBIT : V A R B I T;
+
+INT1 : I N T '1';
+INT2 : I N T '2';
+INT4 : I N T '4';
+INT8 : I N T '8';
+
+TINYINT : T I N Y I N T; // alias for INT1
+SMALLINT : S M A L L I N T; // alias for INT2
+INT : I N T; // alias for INT4
+INTEGER : I N T E G E R; // alias - INT4
+BIGINT : B I G I N T; // alias for INT8
+
+FLOAT4 : F L O A T '4';
+FLOAT8 : F L O A T '8';
+
+REAL : R E A L; // alias for FLOAT4
+FLOAT : F L O A T; // alias for FLOAT8
+DOUBLE : D O U B L E; // alias for FLOAT8
+
+NUMERIC : N U M E R I C;
+DECIMAL : D E C I M A L; // alias for number
+
+CHAR : C H A R;
+VARCHAR : V A R C H A R;
+NCHAR : N C H A R;
+NVARCHAR : N V A R C H A R;
+
+DATE : D A T E;
+TIME : T I M E;
+TIMETZ : T I M E T Z;
+TIMESTAMP : T I M E S T A M P;
+TIMESTAMPTZ : T I M E S T A M P T Z;
+
+TEXT : T E X T;
+
+BINARY : B I N A R Y;
+VARBINARY : V A R B I N A R Y;
+BLOB : B L O B;
+BYTEA : B Y T E A; // alias for BLOB
+
+INET4 : I N E T '4';
+
+/*
+===============================================================================
+  SQL Main
+===============================================================================
+*/
+sql
+  : statement EOF
+  ;
+
+statement
+  : sessionStatement
+  | controlStatement
+  | dataStatement
+  | dataChangeStatement
+  | schemaStatement
+  | indexStatement
+  ;
+
+sessionStatement
+  : 'session' 'clear' -> ^(SESSION_CLEAR)
+  ;
+
+controlStatement
+  : '\\' 't' (table)? -> ^(SHOW_TABLE table?)
+  | '\\' 'd' table -> ^(DESC_TABLE table)
+  | '\\' 'f' -> ^(SHOW_FUNCTION)
+  ;
+
+dataStatement
+  : query_expression
+  | set_stmt
+  | copyStatement
+  ;
+
+dataChangeStatement
+  : insertStmt
+  ;
+
+schemaStatement
+  : createTableStatement
+  | DROP TABLE table -> ^(DROP_TABLE table)
+  ;
+
+indexStatement
+  : CREATE (u=UNIQUE)? INDEX n=Identifier ON t=table (m=method_specifier)? LEFT_PAREN s=sort_specifier_list RIGHT_PAREN p=param_clause?-> ^(CREATE_INDEX $u? $m? $p? $n $t $s)
+  ;
+
+createTableStatement
+  : CREATE EXTERNAL TABLE t=table def=tableElements USING f=Identifier p=param_clause? (LOCATION path=Character_String_Literal)
+      -> ^(CREATE_TABLE $t EXTERNAL ^(TABLE_DEF $def) ^(USING $f) $p? ^(LOCATION $path))
+  | CREATE TABLE t=table (def=tableElements)? (USING s=Identifier)? (p=param_clause)? (AS q=query_expression)?
+      -> ^(CREATE_TABLE $t ^(TABLE_DEF $def)? ^(USING $s)? $p? ^(AS $q)?)
+  ;
+
+copyStatement
+  : COPY t=table FROM path=string_value_expr FORMAT s=Identifier (p=param_clause)? -> ^(COPY $t $path $s $p?)
+  ;
+
+tableElements
+  : LEFT_PAREN fieldElement (COMMA fieldElement)* RIGHT_PAREN -> fieldElement+
+  ;
+
+fieldElement
+  : Identifier fieldType -> ^(FIELD_DEF Identifier fieldType)
+  ;
+
+fieldType
+  : dataType
+  ;
+
+precision_param
+  : LEFT_PAREN! NUMBER RIGHT_PAREN!
+  | LEFT_PAREN! NUMBER COMMA! NUMBER RIGHT_PAREN!
+  ;
+type_length
+  : LEFT_PAREN! NUMBER RIGHT_PAREN!
+  ;
+
+boolean_type
+  : BOOLEAN
+  | BOOL -> BOOLEAN
+  ;
+bit_type
+  : BIT type_length? -> BIT
+  ;
+varbit_type
+  : VARBIT type_length? -> VARBIT
+  | BIT VARYING type_length? -> VARBIT
+  ;
+int1_type
+  : INT1
+  | TINYINT -> INT1
+  ;
+int2_type
+  : INT2
+  | SMALLINT -> INT2
+  ;
+int4_type
+  : INT4
+  | INT -> INT4
+  | INTEGER -> INT4
+  ;
+int8_type
+  : INT8
+  | BIGINT -> INT8
+  ;
+float4_type
+  : FLOAT4
+  | REAL -> FLOAT4
+  ;
+float_type : FLOAT type_length? -> ^(FLOAT type_length?);
+float8_type
+  : FLOAT8
+  | DOUBLE -> FLOAT8
+  | DOUBLE PRECISION -> FLOAT8
+  ;
+number_type
+  : NUMERIC (precision_param)? -> NUMERIC
+  | DECIMAL (precision_param)? -> NUMERIC
+  ;
+char_type
+  : CHAR type_length? -> CHAR
+  | CHARACTER type_length? -> CHAR
+  ;
+varchar_type
+  : VARCHAR type_length? -> VARCHAR
+  | CHARACTER VARYING type_length? -> VARCHAR
+  ;
+nchar_type
+  : NCHAR type_length? -> NCHAR
+  | NATIONAL CHARACTER type_length? -> NCHAR
+  ;
+nvarchar_type
+  : NVARCHAR type_length? -> NVARCHAR
+  | NATIONAL CHARACTER VARYING type_length? -> NVARCHAR
+  ;
+timetz_type
+  : TIMETZ
+  | TIME WITH TIME ZONE -> TIMETZ
+  ;
+timestamptz_type
+  : TIMESTAMPTZ
+  | TIMESTAMP WITH TIME ZONE -> TIMESTAMPTZ
+  ;
+binary_type
+  : BINARY type_length?
+  ;
+varbinary_type
+  : VARBINARY type_length?
+  | BINARY VARYING type_length?
+  ;
+blob_type
+  : BLOB
+  | BYTEA -> BLOB
+  ;
+
+dataType
+  : boolean_type
+  | bit_type
+  | varbit_type
+  | int1_type
+  | int2_type
+  | int4_type
+  | int8_type
+  | float4_type
+  | float_type
+  | float8_type
+  | number_type
+  | char_type
+  | varchar_type
+  | nchar_type
+  | nvarchar_type
+  | DATE
+  | TIME
+  | timetz_type
+  | TIMESTAMP
+  | timestamptz_type
+  | TEXT
+  | binary_type
+  | varbinary_type
+  | blob_type
+  | INET4
+  ;
+
+query_expression
+  : query_expression_body
+  ;
+
+query_expression_body
+  : non_join_query_expression
+  | joined_table
+  ;
+
+non_join_query_expression
+  : (non_join_query_term | joined_table (UNION | EXCEPT)^ (ALL|DISTINCT)? query_term) ((UNION | EXCEPT)^ (ALL|DISTINCT)? query_term)*
+  ;
+
+query_term
+  : non_join_query_term
+  | joined_table
+  ;
+
+non_join_query_term
+  : ( non_join_query_primary | joined_table INTERSECT^ (ALL|DISTINCT)? query_primary) (INTERSECT^ (ALL|DISTINCT)? query_primary)*
+  ;
+
+query_primary
+  : non_join_query_primary
+  | joined_table
+  ;
+
+non_join_query_primary
+  : simple_table
+  | LEFT_PAREN non_join_query_expression RIGHT_PAREN
+  ;
+
+simple_table
+options {k=1;}
+  : query_specification
+  ;
+
+query_specification
+  : SELECT setQualifier? selectList from_clause? where_clause? groupby_clause? having_clause? orderby_clause? limit_clause?
+  -> ^(SELECT from_clause? setQualifier? selectList where_clause? groupby_clause? having_clause? orderby_clause? limit_clause?)
+  ;
+
+insertStmt
+  : INSERT 'into' table (LEFT_PAREN column_reference RIGHT_PAREN)? 'values' array
+  -> ^(INSERT ^(TABLE table) ^(VALUES array) ^(TARGET_FIELDS column_reference)?)
+  ;
+
+selectList
+  : MULTIPLY -> ^(SEL_LIST ALL)
+  | derivedColumn (COMMA derivedColumn)* -> ^(SEL_LIST derivedColumn+)
+  ;
+
+setQualifier
+  : DISTINCT -> ^(SET_QUALIFIER DISTINCT)
+  | ALL -> ^(SET_QUALIFIER ALL)
+  ;
+
+derivedColumn
+  : bool_expr asClause? -> ^(COLUMN bool_expr asClause?)
+  ;
+
+fieldName
+	:	(t=Identifier DOT)? b=Identifier -> ^(FIELD_NAME $b $t?)
+	;
+
+asClause
+  : (AS)? fieldName
+  ;
+
+column_reference
+	:	fieldName (COMMA fieldName)* -> fieldName+
+	;
+
+table
+  : Identifier
+  ;
+
+// TODO - to be improved
+funcCall
+	: Identifier LEFT_PAREN funcArgs? RIGHT_PAREN -> ^(FUNCTION[$Identifier.text] funcArgs?)
+	| COUNT LEFT_PAREN funcArgs RIGHT_PAREN -> ^(COUNT_VAL funcArgs)
+	| COUNT LEFT_PAREN MULTIPLY RIGHT_PAREN -> ^(COUNT_ROWS)
+	;
+
+funcArgs
+  : bool_expr (COMMA bool_expr)* -> bool_expr+
+  ;
+
+from_clause
+  : FROM^ table_reference_list
+  ;
+
+table_reference_list
+  :table_reference (COMMA table_reference)* -> table_reference+
+  ;
+
+table_reference
+  : table_primary
+  | joined_table
+  ;
+
+joined_table
+  : table_primary (cross_join | qualified_join | natural_join | union_join)+
+  ;
+
+joined_table_prim
+  : cross_join
+  | qualified_join
+  | natural_join
+  | union_join
+  ;
+
+cross_join
+  : CROSS JOIN r=table_primary -> ^(JOIN CROSS $r)
+  ;
+
+qualified_join
+  : (t=join_type)? JOIN r=table_primary s=join_specification -> ^(JOIN $t? $r $s)
+  ;
+
+natural_join
+  : NATURAL (t=join_type)? JOIN r=table_primary -> ^(JOIN NATURAL $t? $r)
+  ;
+
+union_join
+  : UNION JOIN r=table_primary -> ^(JOIN UNION $r)
+  ;
+
+join_type
+  : INNER
+  | t=outer_join_type OUTER -> ^(OUTER $t)
+  | t=outer_join_type -> ^(OUTER $t)
+  ;
+
+outer_join_type
+  : LEFT
+  | RIGHT
+  | FULL
+  ;
+
+join_specification
+  : join_condition
+  | named_columns_join
+  ;
+
+join_condition
+  : ON^ search_condition
+  ;
+
+named_columns_join
+  : USING LEFT_PAREN f=column_reference RIGHT_PAREN -> ^(USING $f)
+  ;
+
+table_primary
+  : table ((AS)? a=Identifier)? -> ^(TABLE table ($a)?)
+  ;
+
+where_clause
+  : WHERE^ search_condition
+  ;
+
+groupby_clause
+  : GROUP BY g=grouping_element_list -> ^(GROUP_BY $g)
+  ;
+
+grouping_element_list
+  : grouping_element (COMMA grouping_element)* -> grouping_element+
+  ;
+
+grouping_element
+  : ordinary_grouping_set
+  | rollup_list
+  | cube_list
+  | empty_grouping_set
+  ;
+
+ordinary_grouping_set
+  : column_reference
+  | LEFT_PAREN! column_reference RIGHT_PAREN!
+  ;
+
+rollup_list
+  : ROLLUP LEFT_PAREN c=ordinary_grouping_set RIGHT_PAREN -> ^(ROLLUP $c)
+  ;
+
+cube_list
+  : CUBE LEFT_PAREN c=ordinary_grouping_set RIGHT_PAREN -> ^(CUBE $c)
+  ;
+
+empty_grouping_set
+  : LEFT_PAREN RIGHT_PAREN -> ^(EMPTY_GROUPING_SET)
+  ;
+
+having_clause
+  : HAVING^ bool_expr
+  ;
+
+orderby_clause
+  : ORDER BY sort_specifier_list -> ^(ORDER_BY sort_specifier_list)
+  ;
+
+sort_specifier_list
+  : sort_specifier (COMMA sort_specifier)* -> ^(SORT_SPECIFIERS sort_specifier+)
+  ;
+
+sort_specifier
+  : fn=fieldName a=order_specification? o=null_ordering? -> ^(SORT_KEY $fn $a? $o?)
+  ;
+
+order_specification
+  : ASC -> ^(ORDER ASC)
+  | DESC -> ^(ORDER DESC)
+  ;
+
+limit_clause
+  : LIMIT e=expr -> ^(LIMIT $e)
+  ;
+
+null_ordering
+  : NULL FIRST -> ^(NULL_ORDER FIRST)
+  | NULL LAST -> ^(NULL_ORDER LAST)
+  ;
+
+set_stmt
+	:	SET (UNION|INTERSECT|EXCEPT) table
+	;
+
+search_condition
+	:	bool_expr
+	;
+
+param_clause
+  : WITH LEFT_PAREN param (COMMA param)* RIGHT_PAREN -> ^(PARAMS param+)
+  ;
+
+param
+  : k=Character_String_Literal EQUAL v=bool_expr -> ^(PARAM $k $v)
+  ;
+
+method_specifier
+  : USING m=Identifier -> ^(USING[$m.text])
+  ;
+
+bool_expr
+	:	and_predicate (OR^ and_predicate)*
+	;
+
+and_predicate
+  :	boolean_factor (AND^ boolean_factor)*
+	;
+
+boolean_factor
+  : boolean_test
+  | NOT boolean_test -> ^(NOT boolean_test)
+  ;
+
+boolean_test
+  : boolean_primary is_clause?
+  ;
+
+is_clause
+  : IS NOT? t=truth_value -> ^(IS NOT? $t)
+  ;
+
+
+truth_value
+  : TRUE | FALSE | UNKNOWN
+  ;
+
+boolean_primary
+  : predicate
+  | expr
+  | LEFT_PAREN! bool_expr RIGHT_PAREN!
+  | case_expression
+  ;
+
+predicate
+  : comparison_predicate
+  | in_predicate
+  | like_predicate
+  | null_predicate
+  ;
+
+in_predicate
+	:	expr NOT? IN array -> ^(IN expr array NOT?)
+	;
+
+like_predicate
+  : f=fieldName NOT? LIKE s=string_value_expr -> ^(LIKE NOT? $f $s)
+  ;
+
+null_predicate
+  : f=expr IS (n=NOT)? NULL -> ^(IS $f NULL $n?)
+  ;
+
+comparison_predicate
+	:	expr EQUAL^ expr
+	|	expr NOT_EQUAL^ expr
+	|	expr LTH^ expr
+	|	expr LEQ^ expr
+	|	expr GTH^ expr
+	|	expr GEQ^ expr
+	;
+
+expr
+	:	multExpr ((PLUS|MINUS)^ multExpr)*
+	;
+
+multExpr
+  :	atom ((MULTIPLY|DIVIDE|MODULAR)^ atom)*
+	;
+
+array
+  : LEFT_PAREN literal (COMMA literal )* RIGHT_PAREN -> literal+
+  ;
+
+atom
+  :	literal
+	| fieldName
+	|	LEFT_PAREN! expr RIGHT_PAREN!
+	| funcCall
+	;
+
+literal
+  : string_value_expr
+  | signed_numerical_literal
+  | NULL
+  ;
+
+string_value_expr
+  : Character_String_Literal
+  ;
+
+signed_numerical_literal
+  : sign? unsigned_numerical_literal
+  ;
+
+unsigned_numerical_literal
+  : NUMBER
+  | REAL_NUMBER
+  ;
+
+sign
+  : PLUS | MINUS
+  ;
+
+////////////////////////////////
+// Case Statement
+////////////////////////////////
+case_expression
+  : case_specification
+  ;
+
+case_specification
+  : searched_case
+  ;
+
+searched_case
+  : CASE^ (searched_when_clause)+ (else_clause)? END!
+  ;
+
+searched_when_clause
+  : WHEN c=search_condition THEN r=result -> ^(WHEN $c $r)
+  ;
+
+else_clause
+  : ELSE r=result -> ^(ELSE $r)
+  ;
+
+result
+  : bool_expr
+  ;
+
+// Operators
+ASSIGN  : ':=';
+EQUAL  : '=';
+SEMI_COLON :  ';';
+COMMA : ',';
+NOT_EQUAL  : '<>' | '!=' | '~='| '^=' ;
+LTH : '<' ;
+LEQ : '<=';
+GTH   : '>';
+GEQ   : '>=';
+LEFT_PAREN :  '(';  
+RIGHT_PAREN : ')';
+PLUS  : '+';
+MINUS : '-';
+MULTIPLY: '*';
+DIVIDE  : '/';
+MODULAR : '%';
+DOT : '.';
+
+NUMBER : Digit+;
+
+fragment
+Digit : '0'..'9';
+
+REAL_NUMBER
+    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
+    |   '.' ('0'..'9')+ EXPONENT?
+    |   ('0'..'9')+ EXPONENT
+    ;
+
+COMMENT
+    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
+    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
+    ;
+
+/*
+===============================================================================
+ Identifiers
+===============================================================================
+*/
+
+// Regular Expressions for Tokens
+Identifier  : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|Digit|'_'|':')*
+    ;
+
+/*
+===============================================================================
+ Literal
+===============================================================================
+*/
+
+// Some Unicode Character Ranges
+fragment
+Control_Characters                  :   '\u0001' .. '\u001F';
+fragment
+Extended_Control_Characters         :   '\u0080' .. '\u009F';
+
+Character_String_Literal
+    : Quote ( ESC_SEQ | ~('\\'|Quote) )* Quote {setText(getText().substring(1, getText().length()-1));}
+    | Double_Quote ( ESC_SEQ | ~('\\'|Double_Quote) )* Double_Quote {setText(getText().substring(1, getText().length()-1));}
+    ;
+
+Quote
+  : '\'';
+
+Double_Quote
+  : '"';
+
+fragment
+EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
+
+fragment
+HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
+
+fragment
+ESC_SEQ
+    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
+    |   UNICODE_ESC
+    |   OCTAL_ESC
+    ;
+
+fragment
+OCTAL_ESC
+    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7')
+    ;
+
+fragment
+UNICODE_ESC
+    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
+    ;
+
+
+/*
+===============================================================================
+ Whitespace Tokens
+===============================================================================
+*/
+
+Space : ' '
+{
+	$channel = HIDDEN;
+};
+
+White_Space :	( Control_Characters  | Extended_Control_Characters )+
+{
+	$channel = HIDDEN;
+};
+
+
+BAD : . {
+  skip();
+} ;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/669f2933/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/ParseUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/ParseUtil.java b/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/ParseUtil.java
index 75db55a..482d02d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/ParseUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/ParseUtil.java
@@ -29,9 +29,9 @@ public class ParseUtil {
 
   public static boolean isConstant(final Tree tree) {
     switch (tree.getType()) {
-      case NQLParser.NUMBER:
-      case NQLParser.REAL:
-      case NQLParser.Character_String_Literal:
+      case SQLParser.NUMBER:
+      case SQLParser.REAL:
+      case SQLParser.Character_String_Literal:
         return true;
       default:
         return false;
@@ -40,35 +40,35 @@ public class ParseUtil {
 
   public static EvalNode.Type getTypeByParseCode(int parseCode) {
     switch(parseCode) {
-      case NQLParser.AND:
+      case SQLParser.AND:
         return EvalNode.Type.AND;
-      case NQLParser.OR:
+      case SQLParser.OR:
         return EvalNode.Type.OR;
-      case NQLParser.LIKE:
+      case SQLParser.LIKE:
         return EvalNode.Type.LIKE;
-      case NQLParser.EQUAL:
+      case SQLParser.EQUAL:
         return EvalNode.Type.EQUAL;
-      case NQLParser.NOT_EQUAL:
+      case SQLParser.NOT_EQUAL:
         return EvalNode.Type.NOT_EQUAL;
-      case NQLParser.LTH:
+      case SQLParser.LTH:
         return EvalNode.Type.LTH;
-      case NQLParser.LEQ:
+      case SQLParser.LEQ:
         return EvalNode.Type.LEQ;
-      case NQLParser.GTH:
+      case SQLParser.GTH:
         return EvalNode.Type.GTH;
-      case NQLParser.GEQ:
+      case SQLParser.GEQ:
         return EvalNode.Type.GEQ;
-      case NQLParser.NOT:
+      case SQLParser.NOT:
         return EvalNode.Type.NOT;
-      case NQLParser.PLUS:
+      case SQLParser.PLUS:
         return EvalNode.Type.PLUS;
-      case NQLParser.MINUS:
+      case SQLParser.MINUS:
         return EvalNode.Type.MINUS;
-      case NQLParser.MULTIPLY:
+      case SQLParser.MULTIPLY:
         return EvalNode.Type.MULTIPLY;
-      case NQLParser.DIVIDE:
+      case SQLParser.DIVIDE:
         return EvalNode.Type.DIVIDE;
-      case NQLParser.MODULAR:
+      case SQLParser.MODULAR:
         return EvalNode.Type.MODULAR;
       default: throw new InvalidEvalException("We does not support " + parseCode + " type AST yet");
     }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/669f2933/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/QueryAnalyzer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/QueryAnalyzer.java b/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/QueryAnalyzer.java
index b1a55d1..f50beda 100644
--- a/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/QueryAnalyzer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/tajo/engine/parser/QueryAnalyzer.java
@@ -129,7 +129,7 @@ public final class QueryAnalyzer {
 
     if ((ast.getChildCount() - idx) > 1) {
       idx++;
-      if (ast.getChild(idx).getType() == NQLParser.PARAMS) {
+      if (ast.getChild(idx).getType() == SQLParser.PARAMS) {
         Options options = parseParams((CommonTree) ast.getChild(idx));
         stmt.setParams(options);
       }
@@ -163,28 +163,28 @@ public final class QueryAnalyzer {
     while(idx < ast.getChildCount()) {
       node = (CommonTree) ast.getChild(idx);
       switch (node.getType()) {
-        case NQLParser.EXTERNAL:
+        case SQLParser.EXTERNAL:
           external = true;
           break;
 
-        case NQLParser.TABLE_DEF:
+        case SQLParser.TABLE_DEF:
           tableDef = parseCreateTableDef(node);
           break;
 
-        case NQLParser.FORMAT:
-        case NQLParser.USING:
+        case SQLParser.FORMAT:
+        case SQLParser.USING:
           storeType = CatalogUtil.getStoreType(node.getChild(0).getText());
           break;
 
-        case NQLParser.PARAMS:
+        case SQLParser.PARAMS:
           options = parseParams(node);
           break;
 
-        case NQLParser.AS:
+        case SQLParser.AS:
           selectStmt = parseSelectStatement(context, (CommonTree) node.getChild(0));
           break;
 
-        case NQLParser.LOCATION:
+        case SQLParser.LOCATION:
           location = new Path(node.getChild(0).getText());
           break;
 
@@ -236,18 +236,18 @@ public final class QueryAnalyzer {
     for (int i = 0; i < ast.getChildCount(); i++) {
       Tree child = ast.getChild(i).getChild(1);
       switch(child.getType()) {
-        case NQLParser.BOOLEAN: type = Type.BOOLEAN; break;
-        case NQLParser.BIT: type = Type.BIT; break;
+        case SQLParser.BOOLEAN: type = Type.BOOLEAN; break;
+        case SQLParser.BIT: type = Type.BIT; break;
 
-        case NQLParser.INT1:
-        case NQLParser.INT2:
+        case SQLParser.INT1:
+        case SQLParser.INT2:
           type = Type.INT2;
           break;
 
-        case NQLParser.INT4: type = Type.INT4; break;
-        case NQLParser.INT8: type = Type.INT8; break;
-        case NQLParser.FLOAT4: type = Type.FLOAT4; break;
-        case NQLParser.FLOAT:
+        case SQLParser.INT4: type = Type.INT4; break;
+        case SQLParser.INT8: type = Type.INT8; break;
+        case SQLParser.FLOAT4: type = Type.FLOAT4; break;
+        case SQLParser.FLOAT:
           if (child.getChildCount() > 0) {
             int length = Integer.valueOf(child.getChild(0).getText());
             if (length < 1 || length > 53) {
@@ -262,20 +262,20 @@ public final class QueryAnalyzer {
             type = Type.FLOAT8;
           }
           break;
-        case NQLParser.FLOAT8:
+        case SQLParser.FLOAT8:
           type = Type.FLOAT8; break;
-        case NQLParser.TEXT: type = Type.TEXT; break;
-        case NQLParser.BLOB: type = Type.BLOB; break;
-        case NQLParser.INET4: type = Type.INET4;
+        case SQLParser.TEXT: type = Type.TEXT; break;
+        case SQLParser.BLOB: type = Type.BLOB; break;
+        case SQLParser.INET4: type = Type.INET4;
           break;
 
-        case NQLParser.CHAR:
-        case NQLParser.NCHAR:
-        case NQLParser.NUMERIC:
-        case NQLParser.VARCHAR:
-        case NQLParser.NVARCHAR:
-        case NQLParser.BINARY:
-        case NQLParser.VARBINARY:
+        case SQLParser.CHAR:
+        case SQLParser.NCHAR:
+        case SQLParser.NUMERIC:
+        case SQLParser.VARCHAR:
+        case SQLParser.NVARCHAR:
+        case SQLParser.BINARY:
+        case SQLParser.VARBINARY:
           throw new NotImplementedException("ERROR: " + child.toString() +
               " type is not supported yet");
 
@@ -296,13 +296,13 @@ public final class QueryAnalyzer {
     ParseTree right;
 
     switch (ast.getType()) {
-      case NQLParser.UNION:
+      case SQLParser.UNION:
         type = StatementType.UNION;
         break;
-      case NQLParser.EXCEPT:
+      case SQLParser.EXCEPT:
         type = StatementType.EXCEPT;
         break;
-      case NQLParser.INTERSECT:
+      case SQLParser.INTERSECT:
         type = StatementType.INTERSECT;
         break;
       default:
@@ -313,10 +313,10 @@ public final class QueryAnalyzer {
     left = parseQueryTree(context, (CommonTree) ast.getChild(idx));
     idx++;
     int nodeType = ast.getChild(idx).getType();
-    if (nodeType == NQLParser.ALL) {
+    if (nodeType == SQLParser.ALL) {
       distinct = true;
       idx++;
-    } else if (nodeType == NQLParser.DISTINCT) {
+    } else if (nodeType == SQLParser.DISTINCT) {
       distinct = false;
       idx++;
     }
@@ -334,37 +334,37 @@ public final class QueryAnalyzer {
       node = (CommonTree) ast.getChild(cur);
 
       switch (node.getType()) {
-        case NQLParser.FROM:
+        case SQLParser.FROM:
           parseFromClause(context, block, node);
           break;
 
-        case NQLParser.SET_QUALIFIER:
+        case SQLParser.SET_QUALIFIER:
           parseSetQualifier(block, node);
           break;
 
-        case NQLParser.SEL_LIST:
+        case SQLParser.SEL_LIST:
           parseSelectList(context, block, node);
           break;
 
-        case NQLParser.WHERE:
+        case SQLParser.WHERE:
           parseWhereClause(context, block, node);
           break;
 
-        case NQLParser.GROUP_BY:
+        case SQLParser.GROUP_BY:
           parseGroupByClause(context, block, node);
           break;
 
-        case NQLParser.HAVING:
+        case SQLParser.HAVING:
           parseHavingClause(context, block, node);
           break;
 
-        case NQLParser.ORDER_BY:
+        case SQLParser.ORDER_BY:
           SortSpec[] sortKeys = parseSortSpecifiers(context, block,
               (CommonTree) node.getChild(0));
           block.setSortKeys(sortKeys);
           break;
 
-        case NQLParser.LIMIT:
+        case SQLParser.LIMIT:
           block.setLimit(parseLimitClause(context, block, node));
           break;
 
@@ -379,7 +379,7 @@ public final class QueryAnalyzer {
   private void parseSetQualifier(final QueryBlock block, final CommonTree ast) {
     int idx = 0;
 
-    if (ast.getChild(idx).getType() == NQLParser.DISTINCT) {
+    if (ast.getChild(idx).getType() == SQLParser.DISTINCT) {
       block.setDistinct();
     }
   }
@@ -398,20 +398,20 @@ public final class QueryAnalyzer {
     int idx = 0;
     boolean unique = false;
     // the below things are optional
-    if (ast.getChild(idx).getType() == NQLParser.UNIQUE) {
+    if (ast.getChild(idx).getType() == SQLParser.UNIQUE) {
       unique = true;
       idx++;
     }
 
     IndexMethod method = null;
-    if (ast.getChild(idx).getType() == NQLParser.USING) {
+    if (ast.getChild(idx).getType() == SQLParser.USING) {
       method = getIndexMethod(ast.getChild(idx).getText());
       idx++;
     }
 
     // It's optional, so it can be null if there is no params clause.
     Options params = null;
-    if (ast.getChild(idx).getType() == NQLParser.PARAMS) {
+    if (ast.getChild(idx).getType() == SQLParser.PARAMS) {
       params = parseParams((CommonTree) ast.getChild(idx));
       idx++;
     }
@@ -458,13 +458,13 @@ public final class QueryAnalyzer {
 
       switch (node.getType()) {
 
-        case NQLParser.TABLE:
+        case SQLParser.TABLE:
           // table (AS ID)?
           // 0 - a table name, 1 - table alias
           table = parseTable(node);
           block.addFromTable(table, true);
           break;
-        case NQLParser.JOIN:
+        case SQLParser.JOIN:
           QueryBlock.JoinClause newJoin = parseExplicitJoinClause(context, block, node);
           if (isPrevJoin) {
             newJoin.setLeft(joinClause);
@@ -496,17 +496,17 @@ public final class QueryAnalyzer {
     JoinClause joinClause;
 
     switch (parsedJoinType) {
-      case NQLParser.CROSS:
-      case NQLParser.UNION:
+      case SQLParser.CROSS:
+      case SQLParser.UNION:
         joinClause = parseCrossAndUnionJoin(context, block, ast);
         break;
 
-      case NQLParser.NATURAL:
+      case SQLParser.NATURAL:
         joinClause = parseNaturalJoinClause(context, block, ast);
         break;
 
-      case NQLParser.INNER:
-      case NQLParser.OUTER:
+      case SQLParser.INNER:
+      case SQLParser.OUTER:
         joinClause = parseQualifiedJoinClause(context, block, ast, 0);
         break;
 
@@ -530,26 +530,26 @@ public final class QueryAnalyzer {
     int childIdx = idx;
     JoinClause join = null;
 
-    if (ast.getChild(childIdx).getType() == NQLParser.TABLE) { // default join
+    if (ast.getChild(childIdx).getType() == SQLParser.TABLE) { // default join
       join = new JoinClause(JoinType.INNER);
       join.setRight(parseTable((CommonTree) ast.getChild(childIdx)));
       block.addFromTable(join.getRight(), true);
 
     } else {
 
-      if (ast.getChild(childIdx).getType() == NQLParser.INNER) {
+      if (ast.getChild(childIdx).getType() == SQLParser.INNER) {
         join = new JoinClause(JoinType.INNER);
 
-      } else if (ast.getChild(childIdx).getType() == NQLParser.OUTER) {
+      } else if (ast.getChild(childIdx).getType() == SQLParser.OUTER) {
 
         switch (ast.getChild(childIdx).getChild(0).getType()) {
-          case NQLParser.LEFT:
+          case SQLParser.LEFT:
             join = new JoinClause(JoinType.LEFT_OUTER);
             break;
-          case NQLParser.RIGHT:
+          case SQLParser.RIGHT:
             join = new JoinClause(JoinType.RIGHT_OUTER);
             break;
-          case NQLParser.FULL:
+          case SQLParser.FULL:
             join = new JoinClause(JoinType.FULL_OUTER);
             break;
           default:
@@ -567,11 +567,11 @@ public final class QueryAnalyzer {
     if (ast.getChildCount() > childIdx) {
       CommonTree joinQual = (CommonTree) ast.getChild(childIdx);
 
-      if (joinQual.getType() == NQLParser.ON) {
+      if (joinQual.getType() == SQLParser.ON) {
         EvalNode joinCond = parseJoinCondition(context, block, joinQual);
         join.setJoinQual(joinCond);
 
-      } else if (joinQual.getType() == NQLParser.USING) {
+      } else if (joinQual.getType() == SQLParser.USING) {
         Column[] joinColumns = parseJoinColumns(context, block, joinQual);
         join.setJoinColumns(joinColumns);
       }
@@ -584,16 +584,16 @@ public final class QueryAnalyzer {
                                             final QueryBlock block, Tree ast) {
     JoinType joinType;
 
-    if (ast.getChild(0).getType() == NQLParser.CROSS) {
+    if (ast.getChild(0).getType() == SQLParser.CROSS) {
       joinType = JoinType.CROSS_JOIN;
-    } else if (ast.getChild(0).getType() == NQLParser.UNION) {
+    } else if (ast.getChild(0).getType() == SQLParser.UNION) {
       joinType = JoinType.UNION;
     } else {
       throw new IllegalStateException("Neither the AST has cross join or union join:\n" + ast.toStringTree());
     }
 
     JoinClause join = new JoinClause(joinType);
-    Preconditions.checkState(ast.getChild(1).getType() == NQLParser.TABLE);
+    Preconditions.checkState(ast.getChild(1).getType() == SQLParser.TABLE);
     join.setRight(parseTable((CommonTree) ast.getChild(1)));
     block.addFromTable(join.getRight(), true);
 
@@ -652,7 +652,7 @@ public final class QueryAnalyzer {
   private void parseSelectList(final PlanningContext context,
                                final QueryBlock block, final CommonTree ast) {
 
-    if (ast.getChild(0).getType() == NQLParser.ALL) {
+    if (ast.getChild(0).getType() == SQLParser.ALL) {
       block.setProjectAll();
     } else {
       CommonTree node;
@@ -696,7 +696,7 @@ public final class QueryAnalyzer {
 
     int idx = 0;
 
-    if (ast.getChild(idx).getType() == NQLParser.EMPTY_GROUPING_SET) {
+    if (ast.getChild(idx).getType() == SQLParser.EMPTY_GROUPING_SET) {
       clause.setEmptyGroupSet();
     } else {
       // the remain ones are grouping fields.
@@ -707,19 +707,19 @@ public final class QueryAnalyzer {
       for (; idx < ast.getChildCount(); idx++) {
         group = ast.getChild(idx);
         switch (group.getType()) {
-          case NQLParser.CUBE:
+          case SQLParser.CUBE:
             columns = parseColumnReferences(context, block, (CommonTree) group);
             GroupElement cube = new GroupElement(GroupType.CUBE, columns);
             clause.addGroupSet(cube);
             break;
 
-          case NQLParser.ROLLUP:
+          case SQLParser.ROLLUP:
             columns = parseColumnReferences(context, block, (CommonTree) group);
             GroupElement rollup = new GroupElement(GroupType.ROLLUP, columns);
             clause.addGroupSet(rollup);
             break;
 
-          case NQLParser.FIELD_NAME:
+          case SQLParser.FIELD_NAME:
             column = checkAndGetColumnByAST(context, block, (CommonTree) group);
             columnRefs.add(column);
             break;
@@ -794,13 +794,13 @@ public final class QueryAnalyzer {
           child = node.getChild(j);
 
           // AST: ^(ORDER ASC) | ^(ORDER DESC)
-          if (child.getType() == NQLParser.ORDER) {
-            if (child.getChild(0).getType() == NQLParser.DESC) {
+          if (child.getType() == SQLParser.ORDER) {
+            if (child.getChild(0).getType() == SQLParser.DESC) {
               sortKeys[i].setDescOrder();
             }
-          } else if (child.getType() == NQLParser.NULL_ORDER) {
+          } else if (child.getType() == SQLParser.NULL_ORDER) {
             // AST: ^(NULL_ORDER FIRST) | ^(NULL_ORDER LAST)
-            if (child.getChild(0).getType() == NQLParser.FIRST) {
+            if (child.getChild(0).getType() == SQLParser.FIRST) {
               sortKeys[i].setNullFirst();
             }
           }
@@ -830,7 +830,7 @@ public final class QueryAnalyzer {
   private Column checkAndGetColumnByAST(final PlanningContext context,
                                         final ParseTree tree,
                                         final CommonTree fieldNode) {
-    Preconditions.checkArgument(NQLParser.FIELD_NAME == fieldNode.getType());
+    Preconditions.checkArgument(SQLParser.FIELD_NAME == fieldNode.getType());
 
     String columnName = fieldNode.getChild(0).getText();
     String tableName = null;
@@ -943,9 +943,9 @@ public final class QueryAnalyzer {
 
   private static CommonTree parseTree(final String query) {
     ANTLRStringStream input = new ANTLRStringStream(query);
-    NQLLexer lexer = new NQLLexer(input);
+    SQLLexer lexer = new SQLLexer(input);
     CommonTokenStream tokens = new CommonTokenStream(lexer);
-    NQLParser parser = new NQLParser(tokens);
+    SQLParser parser = new SQLParser(tokens);
 
     CommonTree ast;
     try {
@@ -959,31 +959,31 @@ public final class QueryAnalyzer {
 
   private static StatementType getCmdType(final CommonTree ast) {
     switch (ast.getType()) {
-      case NQLParser.STORE:
+      case SQLParser.STORE:
         return StatementType.STORE;
-      case NQLParser.SELECT:
+      case SQLParser.SELECT:
         return StatementType.SELECT;
-      case NQLParser.UNION:
+      case SQLParser.UNION:
         return StatementType.UNION;
-      case NQLParser.EXCEPT:
+      case SQLParser.EXCEPT:
         return StatementType.EXCEPT;
-      case NQLParser.INTERSECT:
+      case SQLParser.INTERSECT:
         return StatementType.INTERSECT;
-      case NQLParser.INSERT:
+      case SQLParser.INSERT:
         return StatementType.INSERT;
-      case NQLParser.COPY:
+      case SQLParser.COPY:
         return StatementType.COPY;
-      case NQLParser.CREATE_INDEX:
+      case SQLParser.CREATE_INDEX:
         return StatementType.CREATE_INDEX;
-      case NQLParser.CREATE_TABLE:
+      case SQLParser.CREATE_TABLE:
         return StatementType.CREATE_TABLE;
-      case NQLParser.DROP_TABLE:
+      case SQLParser.DROP_TABLE:
         return StatementType.DROP_TABLE;
-      case NQLParser.SHOW_TABLE:
+      case SQLParser.SHOW_TABLE:
         return StatementType.SHOW_TABLES;
-      case NQLParser.DESC_TABLE:
+      case SQLParser.DESC_TABLE:
         return StatementType.DESC_TABLE;
-      case NQLParser.SHOW_FUNCTION:
+      case SQLParser.SHOW_FUNCTION:
         return StatementType.SHOW_FUNCTION;
       default:
         return null;
@@ -1010,52 +1010,52 @@ public final class QueryAnalyzer {
     switch(ast.getType()) {
 
       // constants
-      case NQLParser.NUMBER:
+      case SQLParser.NUMBER:
         return new ConstEval(DatumFactory.createInt4(
             Integer.valueOf(ast.getText())));
 
-      case NQLParser.REAL_NUMBER:
+      case SQLParser.REAL_NUMBER:
         return new ConstEval(DatumFactory.createFloat4(
             Float.valueOf(ast.getText())));
 
-      case NQLParser.Character_String_Literal:
+      case SQLParser.Character_String_Literal:
         return new ConstEval(DatumFactory.createText(ast.getText()));
 
       // unary expression
-      case NQLParser.NOT:
+      case SQLParser.NOT:
         return new NotEval(createEvalTree(context, tree, ast.getChild(0)));
 
       // binary expressions
-      case NQLParser.LIKE:
+      case SQLParser.LIKE:
         return parseLike(context, tree, ast);
 
-      case NQLParser.IS:
+      case SQLParser.IS:
         return parseIsNullPredicate(context, tree, ast);
 
-      case NQLParser.AND:
-      case NQLParser.OR:
-      case NQLParser.EQUAL:
-      case NQLParser.NOT_EQUAL:
-      case NQLParser.LTH:
-      case NQLParser.LEQ:
-      case NQLParser.GTH:
-      case NQLParser.GEQ:
-      case NQLParser.PLUS:
-      case NQLParser.MINUS:
-      case NQLParser.MULTIPLY:
-      case NQLParser.DIVIDE:
-      case NQLParser.MODULAR:
+      case SQLParser.AND:
+      case SQLParser.OR:
+      case SQLParser.EQUAL:
+      case SQLParser.NOT_EQUAL:
+      case SQLParser.LTH:
+      case SQLParser.LEQ:
+      case SQLParser.GTH:
+      case SQLParser.GEQ:
+      case SQLParser.PLUS:
+      case SQLParser.MINUS:
+      case SQLParser.MULTIPLY:
+      case SQLParser.DIVIDE:
+      case SQLParser.MODULAR:
         return parseBinaryExpr(context, tree, ast);
 
       // others
-      case NQLParser.COLUMN:
+      case SQLParser.COLUMN:
         return createEvalTree(context, tree, ast.getChild(0));
 
-      case NQLParser.FIELD_NAME:
+      case SQLParser.FIELD_NAME:
         Column column = checkAndGetColumnByAST(context, tree, (CommonTree) ast);
         return new FieldEval(column);
 
-      case NQLParser.FUNCTION:
+      case SQLParser.FUNCTION:
         String signature = ast.getText();
 
         EvalNode [] givenArgs = new EvalNode[ast.getChildCount()];
@@ -1087,7 +1087,7 @@ public final class QueryAnalyzer {
         }
 
         break;
-      case NQLParser.COUNT_VAL:
+      case SQLParser.COUNT_VAL:
         // Getting the first argument
         EvalNode colRef = createEvalTree(context, tree, ast.getChild(0));
 
@@ -1102,7 +1102,7 @@ public final class QueryAnalyzer {
         }
         break;
 
-      case NQLParser.COUNT_ROWS:
+      case SQLParser.COUNT_ROWS:
         FunctionDesc countRows = catalog.getFunction("count", new DataType [] {});
         tree.setAggregation();
         try {
@@ -1113,7 +1113,7 @@ public final class QueryAnalyzer {
         }
         break;
 
-      case NQLParser.CASE:
+      case SQLParser.CASE:
         return parseCaseWhen(context, tree, ast);
 
       default:
@@ -1125,16 +1125,16 @@ public final class QueryAnalyzer {
                                          QueryBlock block, Tree tree) {
     boolean not;
 
-    Preconditions.checkArgument(tree.getType() == NQLParser.IS, "The AST is not IS (NOT) NULL clause");
+    Preconditions.checkArgument(tree.getType() == SQLParser.IS, "The AST is not IS (NOT) NULL clause");
     int idx = 0;
 
     FieldEval field = (FieldEval) createEvalTree(context, block,
         tree.getChild(idx++));
     Preconditions.checkArgument(
-        tree.getChild(idx++).getType() == NQLParser.NULL,
+        tree.getChild(idx++).getType() == SQLParser.NULL,
         "We does not support another kind of IS clause yet");
     not = tree.getChildCount() == (idx + 1)
-        && tree.getChild(idx).getType() == NQLParser.NOT;
+        && tree.getChild(idx).getType() == SQLParser.NOT;
 
     return new IsNullEval(not, field);
   }
@@ -1172,7 +1172,7 @@ public final class QueryAnalyzer {
     Tree when;
 
     for (; idx < tree.getChildCount() &&
-        tree.getChild(idx).getType() == NQLParser.WHEN; idx++) {
+        tree.getChild(idx).getType() == SQLParser.WHEN; idx++) {
 
       when = tree.getChild(idx);
       cond = createEvalTree(context, block, when.getChild(0));
@@ -1181,7 +1181,7 @@ public final class QueryAnalyzer {
     }
 
     if (tree.getChild(idx) != null &&
-        tree.getChild(idx).getType() == NQLParser.ELSE) {
+        tree.getChild(idx).getType() == SQLParser.ELSE) {
       EvalNode elseResult = createEvalTree(context, block,
           tree.getChild(idx).getChild(0));
       caseEval.setElseResult(elseResult);
@@ -1238,7 +1238,7 @@ public final class QueryAnalyzer {
     for (int i = 0; i < 2; i++) {
       if (ParseUtil.isConstant(tree.getChild(i))) {
         constId = i;
-      } else if (tree.getChild(i).getType() == NQLParser.FIELD_NAME) {
+      } else if (tree.getChild(i).getType() == SQLParser.FIELD_NAME) {
         fieldId = i;
       }
     }
@@ -1251,17 +1251,17 @@ public final class QueryAnalyzer {
       Tree constAst = tree.getChild(constId);
 
       switch (tree.getChild(constId).getType()) {
-        case NQLParser.NUMBER:
+        case SQLParser.NUMBER:
           exprs[constId] = parseDigitByTypeInfer(context, block, constAst,
               exprs[fieldId].getValueType()[0]);
           break;
 
-        case NQLParser.REAL_NUMBER:
+        case SQLParser.REAL_NUMBER:
           exprs[constId] = parseRealByTypeInfer(context, block, constAst,
               exprs[fieldId].getValueType()[0]);
           break;
 
-        case NQLParser.Character_String_Literal:
+        case SQLParser.Character_String_Literal:
           exprs[constId] = parseStringByTypeInfer(context, block, constAst,
               exprs[fieldId].getValueType()[0]);
           break;
@@ -1298,7 +1298,7 @@ public final class QueryAnalyzer {
     int idx = 0;
 
     boolean not = false;
-    if (tree.getChild(idx).getType() == NQLParser.NOT) {
+    if (tree.getChild(idx).getType() == SQLParser.NOT) {
       not = true;
       idx++;
     }