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++;
}