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 2014/01/29 05:59:22 UTC

git commit: TAJO-497: Rearrange reserved and non-reserved keywords. (sirpkt via hyunsik)

Updated Branches:
  refs/heads/master 32775bb5e -> b0d81a590


TAJO-497: Rearrange reserved and non-reserved keywords. (sirpkt via 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/b0d81a59
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/b0d81a59
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/b0d81a59

Branch: refs/heads/master
Commit: b0d81a590bb45c37f838eae93663736767040c02
Parents: 32775bb
Author: Hyunsik Choi <hy...@apache.org>
Authored: Wed Jan 29 13:58:51 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Wed Jan 29 13:58:51 2014 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |   2 +
 .../org/apache/tajo/engine/parser/SQLLexer.g4   | 132 ++++----------
 .../org/apache/tajo/engine/parser/SQLParser.g4  | 179 ++++++++++++++++---
 .../apache/tajo/engine/parser/SQLAnalyzer.java  |  63 +++++--
 .../tajo/engine/query/TestCreateTable.java      | 122 +++++++++++++
 5 files changed, 360 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/b0d81a59/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index da42b26..1f78565 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -125,6 +125,8 @@ Release 0.8.0 - unreleased
 
   IMPROVEMENTS
 
+    TAJO-497: Rearrange reserved and non-reserved keywords. (sirpkt via hyunsik)
+
     TAJO-475: Table partition catalog recap. (Min Zhou and hyunsik)
 
     TAJO-539: Change some EvalNode::eval to directly return a Datum value.

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/b0d81a59/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLLexer.g4
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLLexer.g4 b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLLexer.g4
index 2151387..1ceaca8 100644
--- a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLLexer.g4
+++ b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLLexer.g4
@@ -136,60 +136,36 @@ ELSE : E L S E;
 EXCEPT : E X C E P T;
 
 FALSE : F A L S E;
-FILTER : F I L T E R;
-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;
-GROUPING : G R O U P I N G;
 
 HAVING : H A V I N G;
-HASH : H A S H;
 
 ILIKE : I L I K E;
 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;
 LEADING : L E A D I N G;
 LEFT : L E F T;
 LIKE : L I K E;
 LIMIT : L I M I T;
-LIST : L I S 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;
-NULLIF : N U L L I F;
-
-MAX : M A X;
-MIN : M I N;
 
 ON : O N;
 OUTER : O U T E R;
 OR : O R;
 ORDER : O R D E R;
-OVERWRITE : O V E R W R I T E;
-
-PRECISION : P R E C I S I ON;
-
-RANGE : R A N G E;
-REGEXP : R E G E X P;
 RIGHT : R I G H T;
-RLIKE : R L I K E;
-
-SET : S E T;
 SELECT : S E L E C T;
 SOME : S O M E;
 SYMMETRIC : S Y M M E T R I C;
@@ -201,19 +177,12 @@ 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;
 
-VAR_SAMP : V A R UNDERLINE S A M P;
-VAR_POP : V A R UNDERLINE P O P;
-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;
-
 /*
 ===============================================================================
   Non Reserved Keywords
@@ -245,32 +214,56 @@ EXISTS : E X I S T S;
 EXTERNAL : E X T E R N A L;
 EXTRACT : E X T R A C T;
 
-LESS : L E S S;
 
+FILTER : F I L T E R;
+FIRST : F I R S T;
+FORMAT : F O R M A T;
 FUSION : F U S I O N;
 
+GROUPING : G R O U P I N G;
+
+HASH : H A S H;
 HOUR : H O U R;
 
+INDEX : I N D E X;
+INSERT : I N S E R T;
 INTERSECTION : I N T E R S E C T I O N;
 ISODOW : I S O D O W;
 ISOYEAR : I S O Y E A R;
 
+LAST : L A S T;
+LESS : L E S S;
+LIST : L I S T;
+LOCATION : L O C A T I O N;
+
+MAX : M A X;
 MAXVALUE : M A X V A L U E;
 MICROSECONDS : M I C R O S E C O N D S;
 MILLENNIUM : M I L L E N N I U M;
 MILLISECONDS : M I L L I S E C O N D S;
+MIN : M I N;
 MINUTE : M I N U T E;
 MONTH : M O N T H;
 
+NATIONAL : N A T I O N A L;
+NULLIF : N U L L I F;
+
+OVERWRITE : O V E R W R I T E;
+
 PARTITION : P A R T I T I O N;
 PARTITIONS : P A R T I T I O N S;
+PRECISION : P R E C I S I O N;
 PURGE : P U R G E;
 
 QUARTER : Q U A R T E R;
 
+RANGE : R A N G E;
+REGEXP : R E G E X P;
+RLIKE : R L I K E;
 ROLLUP : R O L L U P;
 
 SECOND : S E C O N D;
+SET : S E T;
 SIMILAR : S I M I L A R;
 STDDEV_POP : S T D D E V UNDERLINE P O P;
 STDDEV_SAMP : S T D D E V UNDERLINE S A M P;
@@ -285,77 +278,19 @@ TIMEZONE_MINUTE: T I M E Z O N E UNDERLINE M I N U T E;
 TRIM : T R I M;
 TO : T O;
 
+UNKNOWN : U N K N O W N;
+
 VALUES : V A L U E S;
+VAR_SAMP : V A R UNDERLINE S A M P;
+VAR_POP : V A R UNDERLINE P O P;
+VARYING : V A R Y I N G;
 
 WEEK : W E E K;
 
 YEAR : Y E A R;
 
-Nonreserved_keywords
-  : AVG
-  | BETWEEN
-  | BY
-
-  | CENTURY
-  | CHARACTER
-  | COALESCE
-  | COLLECT
-  | COLUMN
-  | COUNT
-  | CUBE
-  | DAY
-  | DEC
-  | DECADE
-  | DOW
-  | DOY
-  | DROP
-  | EPOCH
-  | EVERY
-  | EXISTS
-  | EXTERNAL
-  | EXTRACT
-  | FUSION
-  | HASH
-  | INTERSECTION
-  | ISODOW
-  | ISOYEAR
-
-  | LESS
-  | LIST
-
-  | MAXVALUE
-  | MICROSECONDS
-  | MILLENNIUM
-  | MILLISECONDS
-  | MINUTE
-  | MONTH
-
-  | PARTITION
-  | PARTITIONS
-  | QUARTER
-  | ROLLUP
-
-  | SECOND
-  | SIMILAR
-  | STDDEV_POP
-  | STDDEV_SAMP
-  | SUBPARTITION
-  | SUM
-
-  | TABLESPACE
-  | THAN
-  | TIMEZONE
-  | TIMEZONE_HOUR
-  | TIMEZONE_MINUTE
-  | TRIM
-  | TO
-
-  | VALUES
-
-  | WEEK
-
-  | YEAR
-  ;
+ZONE : Z O N E;
+
 
 /*
 ===============================================================================
@@ -469,8 +404,7 @@ LineComment
 */
 
 Identifier
-  : Nonreserved_keywords
-  | Regular_Identifier
+  : Regular_Identifier
   ;
 
 fragment

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/b0d81a59/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
index 0b7ced0..ab6bff6 100644
--- a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
+++ b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
@@ -59,16 +59,16 @@ schema_statement
   ;
 
 index_statement
-  : CREATE (u=UNIQUE)? INDEX n=Identifier ON t=table_name (m=method_specifier)?
+  : CREATE (u=UNIQUE)? INDEX n=identifier ON t=table_name (m=method_specifier)?
     LEFT_PAREN s=sort_specifier_list RIGHT_PAREN p=param_clause?
   ;
 
 create_table_statement
-  : CREATE EXTERNAL TABLE table_name table_elements USING file_type=Identifier
+  : CREATE EXTERNAL TABLE table_name table_elements USING file_type=identifier
     (param_clause)? (table_partitioning_clauses)? (LOCATION path=Character_String_Literal)
-  | CREATE TABLE table_name table_elements (USING file_type=Identifier)?
+  | CREATE TABLE table_name table_elements (USING file_type=identifier)?
     (param_clause)? (table_partitioning_clauses)? (AS query_expression)?
-  | CREATE TABLE table_name (USING file_type=Identifier)?
+  | CREATE TABLE table_name (USING file_type=identifier)?
     (param_clause)? (table_partitioning_clauses)? AS query_expression
   ;
 
@@ -77,7 +77,7 @@ table_elements
   ;
 
 field_element
-  : name=Identifier field_type
+  : name=identifier field_type
   ;
 
 field_type
@@ -93,7 +93,7 @@ param
   ;
 
 method_specifier
-  : USING m=Identifier
+  : USING m=identifier
   ;
 
 table_space_specifier
@@ -101,7 +101,7 @@ table_space_specifier
   ;
 
 table_space_name
-  : Identifier
+  : identifier
   ;
 
 table_partitioning_clauses
@@ -158,7 +158,7 @@ column_partitions
   ;
 
 partition_name
-  : Identifier
+  : identifier
   ;
 
 /*
@@ -173,6 +173,135 @@ drop_table_statement
 
 /*
 ===============================================================================
+  5.2 <token and separator>
+
+  Specifying lexical units (tokens and separators) that participate in SQL language
+===============================================================================
+*/
+
+identifier
+  : Identifier
+  | nonreserved_keywords
+  ;
+
+nonreserved_keywords
+  : AVG
+  | BETWEEN
+  | BY
+  | CENTURY
+  | CHARACTER
+  | COALESCE
+  | COLLECT
+  | COLUMN
+  | COUNT
+  | CUBE
+  | DAY
+  | DEC
+  | DECADE
+  | DOW
+  | DOY
+  | DROP
+  | EPOCH
+  | EVERY
+  | EXISTS
+  | EXTERNAL
+  | EXTRACT
+  | FILTER
+  | FIRST
+  | FORMAT
+  | FUSION
+  | GROUPING
+  | HASH
+  | INDEX
+  | INSERT
+  | INTERSECTION
+  | ISODOW
+  | ISOYEAR
+  | LAST
+  | LESS
+  | LIST
+  | LOCATION
+  | MAX
+  | MAXVALUE
+  | MICROSECONDS
+  | MILLENNIUM
+  | MILLISECONDS
+  | MIN
+  | MINUTE
+  | MONTH
+  | NATIONAL
+  | NULLIF
+  | OVERWRITE
+  | PARTITION
+  | PARTITIONS
+  | PRECISION
+  | PURGE
+  | QUARTER
+  | RANGE
+  | REGEXP
+  | RLIKE
+  | ROLLUP
+  | SECOND
+  | SET
+  | SIMILAR
+  | STDDEV_POP
+  | STDDEV_SAMP
+  | SUBPARTITION
+  | SUM
+  | TABLESPACE
+  | THAN
+  | TIMEZONE
+  | TIMEZONE_HOUR
+  | TIMEZONE_MINUTE
+  | TRIM
+  | TO
+  | UNKNOWN
+  | VALUES
+  | VAR_POP
+  | VAR_SAMP
+  | VARYING
+  | WEEK
+  | YEAR
+  | ZONE
+
+  | BIGINT
+  | BIT
+  | BLOB
+  | BOOL
+  | BOOLEAN
+  | BYTEA
+  | CHAR
+  | DATE
+  | DECIMAL
+  | DOUBLE
+  | FLOAT
+  | FLOAT4
+  | FLOAT8
+  | INET4
+  | INT
+  | INT1
+  | INT2
+  | INT4
+  | INT8
+  | INTEGER
+  | NCHAR
+  | NUMERIC
+  | NVARCHAR
+  | REAL
+  | SMALLINT
+  | TEXT
+  | TIME
+  | TIMESTAMP
+  | TIMESTAMPTZ
+  | TIMETZ
+  | TINYINT
+  | VARBINARY
+  | VARBIT
+  | VARCHAR
+  ;
+
+/*
+===============================================================================
   5.3 <literal>
 ===============================================================================
 */
@@ -773,12 +902,12 @@ named_columns_join
   ;
 
 table_primary
-  : table_or_query_name ((AS)? alias=Identifier)? (LEFT_PAREN column_name_list RIGHT_PAREN)?
-  | derived_table (AS)? name=Identifier (LEFT_PAREN column_name_list RIGHT_PAREN)?
+  : table_or_query_name ((AS)? alias=identifier)? (LEFT_PAREN column_name_list RIGHT_PAREN)?
+  | derived_table (AS)? name=identifier (LEFT_PAREN column_name_list RIGHT_PAREN)?
   ;
 
 column_name_list
-  :  Identifier  ( COMMA Identifier  )*
+  :  identifier  ( COMMA identifier  )*
   ;
 
 derived_table
@@ -812,23 +941,27 @@ grouping_element_list
   ;
 
 grouping_element
-  : ordinary_grouping_set
-  | rollup_list
+  : rollup_list
   | cube_list
   | empty_grouping_set
+  | ordinary_grouping_set
   ;
 
 ordinary_grouping_set
-  : row_value_predicand_list
+  : row_value_predicand
   | LEFT_PAREN row_value_predicand_list RIGHT_PAREN
   ;
 
+ordinary_grouping_set_list
+  : ordinary_grouping_set (COMMA ordinary_grouping_set)*
+  ;
+
 rollup_list
-  : ROLLUP LEFT_PAREN c=ordinary_grouping_set RIGHT_PAREN
+  : ROLLUP LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN
   ;
 
 cube_list
-  : CUBE LEFT_PAREN c=ordinary_grouping_set RIGHT_PAREN
+  : CUBE LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN
   ;
 
 empty_grouping_set
@@ -895,11 +1028,11 @@ explicit_table
 
 table_or_query_name
   : table_name
-  | Identifier
+  | identifier
   ;
 
 table_name
-  : Identifier  ( DOT  Identifier (  DOT Identifier )? )?
+  : identifier  ( DOT  identifier (  DOT identifier )? )?
   ;
 
 query_specification
@@ -913,7 +1046,7 @@ select_list
 
 select_sublist
   : derived_column
-  | asterisked_qualifier=Identifier DOT MULTIPLY
+  | asterisked_qualifier=identifier DOT MULTIPLY
   ;
 
 set_qualifier
@@ -926,11 +1059,11 @@ derived_column
   ;
 
 column_reference
-  : (tb_name=Identifier DOT)? name=Identifier
+  : (tb_name=identifier DOT)? name=identifier
   ;
 
 as_clause
-  : (AS)? Identifier
+  : (AS)? identifier
   ;
 
 column_reference_list
@@ -1156,7 +1289,7 @@ function_names_for_reserved_words
   ;
 
 function_name
-  : Identifier
+  : identifier
   | function_names_for_reserved_words
   ;
 
@@ -1204,5 +1337,5 @@ null_ordering
 
 insert_statement
   : INSERT (OVERWRITE)? INTO table_name (LEFT_PAREN column_name_list RIGHT_PAREN)? query_expression
-  | INSERT (OVERWRITE)? INTO LOCATION path=Character_String_Literal (USING file_type=Identifier (param_clause)?)? query_expression
+  | INSERT (OVERWRITE)? INTO LOCATION path=Character_String_Literal (USING file_type=identifier (param_clause)?)? query_expression
   ;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/b0d81a59/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
index daa8f8d..493f892 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
@@ -31,9 +31,7 @@ import org.apache.tajo.algebra.LiteralValue.LiteralType;
 import org.apache.tajo.engine.parser.SQLParser.*;
 import org.apache.tajo.storage.CSVFile;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static org.apache.tajo.algebra.Aggregation.GroupElement;
 import static org.apache.tajo.algebra.CreateTable.*;
@@ -275,23 +273,37 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
 
     // If grouping group is not empty
     if (ctx.grouping_element_list().grouping_element().get(0).empty_grouping_set() == null) {
-      GroupElement [] groups = new GroupElement[ctx.grouping_element_list().
-          grouping_element().size()];
-      for (int i = 0; i < groups.length; i++) {
+      int elementSize = ctx.grouping_element_list().grouping_element().size();
+      ArrayList<GroupElement> groups = new ArrayList<GroupElement>(elementSize + 1);
+      ArrayList<Expr> ordinaryExprs = null;
+      int groupSize = 1;
+      groups.add(null);
+
+      for (int i = 0; i < elementSize; i++) {
         SQLParser.Grouping_elementContext element =
             ctx.grouping_element_list().grouping_element().get(i);
         if (element.ordinary_grouping_set() != null) {
-          groups[i] = new GroupElement(GroupType.OrdinaryGroup,
-              getRowValuePredicands(element.ordinary_grouping_set().row_value_predicand_list()));
+          if (ordinaryExprs == null) {
+            ordinaryExprs = new ArrayList<Expr>();
+          }
+          Collections.addAll(ordinaryExprs, getRowValuePredicandsFromOrdinaryGroupingSet(element.ordinary_grouping_set()));
         } else if (element.rollup_list() != null) {
-          groups[i] = new GroupElement(GroupType.Rollup,
-              getRowValuePredicands(element.rollup_list().c.row_value_predicand_list()));
+          groupSize++;
+          groups.add(new GroupElement(GroupType.Rollup,
+              getRowValuePredicandsFromOrdinaryGroupingSetList(element.rollup_list().c)));
         } else if (element.cube_list() != null) {
-          groups[i] = new GroupElement(GroupType.Cube,
-              getRowValuePredicands(element.cube_list().c.row_value_predicand_list()));
+          groupSize++;
+          groups.add(new GroupElement(GroupType.Cube,
+              getRowValuePredicandsFromOrdinaryGroupingSetList(element.cube_list().c)));
         }
       }
-      clause.setGroups(groups);
+
+      if (ordinaryExprs != null) {
+        groups.set(0, new GroupElement(GroupType.OrdinaryGroup, ordinaryExprs.toArray(new Expr[ordinaryExprs.size()])));
+        clause.setGroups(groups.subList(0, groupSize).toArray(new GroupElement[groupSize]));
+      } else if (groupSize > 1) {
+        clause.setGroups(groups.subList(1, groupSize).toArray(new GroupElement[groupSize - 1]));
+      }
     }
 
     return clause;
@@ -384,6 +396,25 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     return join;
   }
 
+  private Expr [] getRowValuePredicandsFromOrdinaryGroupingSetList(Ordinary_grouping_set_listContext ctx) {
+    ArrayList<Expr> rowValuePredicands = new ArrayList<Expr>();
+    for (int i = 0; i < ctx.ordinary_grouping_set().size(); i++) {
+      Collections.addAll(rowValuePredicands, getRowValuePredicandsFromOrdinaryGroupingSet(ctx.ordinary_grouping_set(i)));
+    }
+    return rowValuePredicands.toArray(new Expr[rowValuePredicands.size()]);
+  }
+
+  private Expr [] getRowValuePredicandsFromOrdinaryGroupingSet(Ordinary_grouping_setContext ctx) {
+    ArrayList<Expr> rowValuePredicands = new ArrayList<Expr>();
+    if (ctx.row_value_predicand() != null) {
+      rowValuePredicands.add(visitRow_value_predicand(ctx.row_value_predicand()));
+    }
+    if (ctx.row_value_predicand_list() != null) {
+      Collections.addAll(rowValuePredicands, getRowValuePredicands(ctx.row_value_predicand_list()));
+    }
+    return rowValuePredicands.toArray(new Expr[rowValuePredicands.size()]);
+  }
+
   private Expr [] getRowValuePredicands(Row_value_predicand_listContext ctx) {
     Expr [] rowValuePredicands = new Expr[ctx.row_value_predicand().size()];
     for (int i = 0; i < rowValuePredicands.length; i++) {
@@ -833,7 +864,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
   public NamedExpr visitDerived_column(SQLParser.Derived_columnContext ctx) {
     NamedExpr target = new NamedExpr(visitValue_expression(ctx.value_expression()));
     if (ctx.as_clause() != null) {
-      target.setAlias(ctx.as_clause().Identifier().getText());
+      target.setAlias(ctx.as_clause().identifier().getText());
     }
     return target;
   }
@@ -1197,9 +1228,9 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
       insertExpr.setTableName(ctx.table_name().getText());
 
       if (ctx.column_name_list() != null) {
-        String [] targetColumns = new String[ctx.column_name_list().Identifier().size()];
+        String [] targetColumns = new String[ctx.column_name_list().identifier().size()];
         for (int i = 0; i < targetColumns.length; i++) {
-          targetColumns[i] = ctx.column_name_list().Identifier().get(i).getText();
+          targetColumns[i] = ctx.column_name_list().identifier().get(i).getText();
         }
 
         insertExpr.setTargetColumns(targetColumns);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/b0d81a59/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
index f6930ba..f39ceb8 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
@@ -37,4 +37,126 @@ public class TestCreateTable extends QueryTestCaseBase {
     String tableName = executeDDL("table1_ddl.sql", "table1.tbl", "table1");
     assertTableExists(tableName);
   }
+
+  @Test
+  public final void testNonreservedKeywordTableNames() throws Exception {
+    String tableName = null;
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "filter");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "first");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "format");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "grouping");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "hash");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "index");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "insert");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "last");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "location");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "max");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "min");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "national");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "nullif");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "overwrite");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "precision");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "range");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "regexp");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "rlike");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "set");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "unknown");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "var_pop");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "var_samp");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "varying");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "zone");
+    assertTableExists(tableName);
+
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "bigint");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "bit");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "blob");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "bool");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "boolean");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "bytea");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "char");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "date");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "decimal");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "double");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "float");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "float4");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "float8");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "inet4");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "int");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "int1");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "int2");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "int4");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "int8");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "integer");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "nchar");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "numeric");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "nvarchar");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "real");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "smallint");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "text");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "time");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "timestamp");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "timestamptz");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "timetz");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "tinyint");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "varbinary");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "varbit");
+    assertTableExists(tableName);
+    tableName = executeDDL("table1_ddl.sql", "table1.tbl", "varchar");
+    assertTableExists(tableName);
+  }
 }