Repository: tajo
Updated Branches:
  refs/heads/master a89b52337 -> 6947bc5a9


TAJO-1653: Add 'INSERT INTO VALUES' statement for OLTP-like storages.

Closes #832


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

Branch: refs/heads/master
Commit: 6947bc5a9f3e8590f1177c64354e5646b222c56d
Parents: a89b523
Author: Hyunsik Choi <[email protected]>
Authored: Thu Oct 22 22:33:30 2015 -0700
Committer: Hyunsik Choi <[email protected]>
Committed: Thu Oct 22 22:33:30 2015 -0700

----------------------------------------------------------------------
 CHANGES                                         |  3 +
 .../tajo/engine/query/TestInsertQuery.java      | 39 ++++++++---
 .../queries/TestSQLAnalyzer/insert_values_1.sql |  1 +
 .../TestSQLAnalyzer/insert_values_1.result      | 72 ++++++++++++++++++++
 .../apache/tajo/master/exec/QueryExecutor.java  |  2 +-
 .../org/apache/tajo/parser/sql/SQLAnalyzer.java | 12 +++-
 .../org/apache/tajo/parser/sql/SQLParser.g4     | 12 ++--
 7 files changed, 126 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/6947bc5a/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index d38dcdf..3cc6c83 100644
--- a/CHANGES
+++ b/CHANGES
@@ -56,6 +56,9 @@ Release 0.12.0 - unreleased
 
   SUB TASKS
 
+    TAJO-1653: Add 'INSERT INTO VALUES' statement for OLTP-like storages.
+    (hyunsik)
+
     TAJO-1936: NPE when calling the query result REST api(DaeMyung Kang)
 
     TAJO-1909: Eliminate remained explicit diamond expressions.

http://git-wip-us.apache.org/repos/asf/tajo/blob/6947bc5a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
 
b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
index d0088a5..328eda5 100644
--- 
a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
+++ 
b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
@@ -627,16 +627,14 @@ public class TestInsertQuery extends QueryTestCaseBase {
     executeString("DROP TABLE table1 PURGE");
   }
 
-  @Test
-  public final void testInsertOverwriteTableWithNonFromQuery() throws 
Exception {
-    String tableName = 
CatalogUtil.normalizeIdentifier("InsertOverwriteWithEvalQuery");
+  public final void testInsertOverwriteAllValues(String rawTableName, String 
query) throws Exception {
+    String tableName = CatalogUtil.normalizeIdentifier(rawTableName);
     ResultSet res = executeString("create table " + tableName +" (col1 int4, 
col2 float4, col3 text)");
     res.close();
     CatalogService catalog = testingCluster.getMaster().getCatalog();
     assertTrue(catalog.existsTable(getCurrentDatabase(), tableName));
 
-    res = executeString("insert overwrite into " + tableName
-        + " select 1::INT4, 2.1::FLOAT4, 'test'; ");
+    res = executeString(query);
 
     res.close();
 
@@ -658,13 +656,24 @@ public class TestInsertQuery extends QueryTestCaseBase {
   }
 
   @Test
-  public final void testInsertOverwriteTableWithNonFromQuery2() throws 
Exception {
-    String tableName = 
CatalogUtil.normalizeIdentifier("InsertOverwriteWithEvalQuery2");
+  public final void testInsertOverwriteAllValues1() throws Exception {
+    String tbName = getMethodName();
+    testInsertOverwriteAllValues(tbName, "insert overwrite into " + tbName + " 
select 1::INT4, 2.1::FLOAT4, 'test'; ");
+  }
+
+  @Test
+  public final void testInsertOverwriteAllValues2() throws Exception {
+    String tbName = getMethodName();
+    testInsertOverwriteAllValues(tbName, "insert overwrite into " + tbName + " 
VALUES(1::INT4, 2.1::FLOAT4, 'test');");
+  }
+
+  public final void testInsertOverwriteSomeValues(String rawTableName, String 
sql) throws Exception {
+    String tableName = CatalogUtil.normalizeIdentifier(rawTableName);
     ResultSet res = executeString("create table " + tableName +" (col1 int4, 
col2 float4, col3 text)");
     res.close();
     CatalogService catalog = testingCluster.getMaster().getCatalog();
     assertTrue(catalog.existsTable(getCurrentDatabase(), tableName));
-    res = executeString("insert overwrite into " + tableName + " (col1, col3) 
select 1::INT4, 'test';");
+    res = executeString(sql);
     res.close();
 
     TableDesc desc = catalog.getTableDesc(getCurrentDatabase(), tableName);
@@ -686,6 +695,20 @@ public class TestInsertQuery extends QueryTestCaseBase {
   }
 
   @Test
+  public final void testInsertOverwriteTableSomeValues1() throws Exception {
+    String tbName = getMethodName();
+    testInsertOverwriteSomeValues(tbName,
+        "insert overwrite into " + tbName + " (col1, col3) select 1::INT4, 
'test'");
+  }
+
+  @Test
+  public final void testInsertOverwriteTableSomeValues2() throws Exception {
+    String tbName = getMethodName();
+    testInsertOverwriteSomeValues(tbName,
+        "insert overwrite into " + tbName + " (col1, col3) VALUES(1::INT4, 
'test')");
+  }
+
+  @Test
   public final void testInsertOverwritePathWithNonFromQuery() throws Exception 
{
     ResultSet res = executeString("insert overwrite into location " +
         "'/tajo-data/testInsertOverwritePathWithNonFromQuery' " +

http://git-wip-us.apache.org/repos/asf/tajo/blob/6947bc5a/tajo-core-tests/src/test/resources/queries/TestSQLAnalyzer/insert_values_1.sql
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/queries/TestSQLAnalyzer/insert_values_1.sql
 
b/tajo-core-tests/src/test/resources/queries/TestSQLAnalyzer/insert_values_1.sql
new file mode 100644
index 0000000..5fe137d
--- /dev/null
+++ 
b/tajo-core-tests/src/test/resources/queries/TestSQLAnalyzer/insert_values_1.sql
@@ -0,0 +1 @@
+INSERT INTO table1 VALUES (1, 2.3, "str", date '1980-04-01', time '01:50:00', 
timestamp '1980-04-1 01:50:00');

http://git-wip-us.apache.org/repos/asf/tajo/blob/6947bc5a/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/insert_values_1.result
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/insert_values_1.result
 
b/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/insert_values_1.result
new file mode 100644
index 0000000..70249a7
--- /dev/null
+++ 
b/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/insert_values_1.result
@@ -0,0 +1,72 @@
+{
+  "IsOverwrite": false,
+  "TableName": "table1",
+  "SubPlan": {
+    "IsDistinct": false,
+    "Projections": [
+      {
+        "Expr": {
+          "Value": "1",
+          "ValueType": "Unsigned_Integer",
+          "OpType": "Literal"
+        },
+        "OpType": "Target"
+      },
+      {
+        "Expr": {
+          "Value": "2.3",
+          "ValueType": "Unsigned_Float",
+          "OpType": "Literal"
+        },
+        "OpType": "Target"
+      },
+      {
+        "Expr": {
+          "ColumnName": "str",
+          "OpType": "Column"
+        },
+        "OpType": "Target"
+      },
+      {
+        "Expr": {
+          "Date": {
+            "Year": "1980",
+            "Month": "04",
+            "Day": "01"
+          },
+          "OpType": "DateLiteral"
+        },
+        "OpType": "Target"
+      },
+      {
+        "Expr": {
+          "Time": {
+            "Hour": "01",
+            "Minute": "50",
+            "Second": "00"
+          },
+          "OpType": "TimeLiteral"
+        },
+        "OpType": "Target"
+      },
+      {
+        "Expr": {
+          "Date": {
+            "Year": "1980",
+            "Month": "04",
+            "Day": "1"
+          },
+          "Time": {
+            "Hour": "01",
+            "Minute": "50",
+            "Second": "00"
+          },
+          "OpType": "TimestampLiteral"
+        },
+        "OpType": "Target"
+      }
+    ],
+    "OpType": "Projection"
+  },
+  "OpType": "Insert"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/6947bc5a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java 
b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
index 83ceb3e..e260c00 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
@@ -470,7 +470,7 @@ public class QueryExecutor {
         taskAttemptContext = new TaskAttemptContext(queryContext, null, null, 
null, null);
         taskAttemptContext.setOutputPath(new Path(finalOutputUri));
 
-        EvalExprExec evalExprExec = new EvalExprExec(taskAttemptContext, 
(EvalExprNode) insertNode.getChild());
+        EvalExprExec evalExprExec = new EvalExprExec(taskAttemptContext, 
insertNode.getChild());
         InsertRowsExec exec = new InsertRowsExec(taskAttemptContext, 
insertNode, evalExprExec);
 
         try {

http://git-wip-us.apache.org/repos/asf/tajo/blob/6947bc5a/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java 
b/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
index 7b49d05..2745a2f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
+++ b/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
@@ -41,6 +41,7 @@ import org.apache.tajo.storage.StorageConstants;
 import org.apache.tajo.util.StringUtils;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static org.apache.tajo.algebra.Aggregation.GroupElement;
 import static org.apache.tajo.algebra.CreateTable.*;
@@ -1670,7 +1671,16 @@ public class SQLAnalyzer extends 
SQLParserBaseVisitor<Expr> {
       }
     }
 
-    insertExpr.setSubQuery(visitQuery_expression(ctx.query_expression()));
+    if (checkIfExist(ctx.VALUES())) {
+      List<NamedExpr> values = ctx.row_value_predicand().stream()
+          .map(value -> new NamedExpr(visitRow_value_predicand(value)))
+          .collect(Collectors.toList());
+      Projection projection = new Projection();
+      projection.setNamedExprs(values.toArray(new NamedExpr[values.size()]));
+      insertExpr.setSubQuery(projection);
+    } else {
+      insertExpr.setSubQuery(visitQuery_expression(ctx.query_expression()));
+    }
 
     Preconditions.checkState(insertExpr.hasTableName() || 
insertExpr.hasLocation(),
         "Either a table name or a location should be given.");

http://git-wip-us.apache.org/repos/asf/tajo/blob/6947bc5a/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
----------------------------------------------------------------------
diff --git 
a/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4 
b/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
index 6837314..f0de08a 100644
--- a/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
+++ b/tajo-sql-parser/src/main/antlr4/org/apache/tajo/parser/sql/SQLParser.g4
@@ -951,7 +951,7 @@ parenthesized_boolean_value_expression
 
 /*
 ===============================================================================
-  7.2 <row value expression>
+  7.2 <row value expression> (p293)
 ===============================================================================
 */
 row_value_expression
@@ -959,10 +959,6 @@ row_value_expression
   | explicit_row_value_constructor
   ;
 
-row_value_special_case
-  : nonparenthesized_value_expression_primary
-  ;
-
 explicit_row_value_constructor
   : NULL
   ;
@@ -978,6 +974,10 @@ row_value_constructor_predicand
 //  | explicit_row_value_constructor
   ;
 
+row_value_special_case
+  : nonparenthesized_value_expression_primary
+  ;
+
 /*
 ===============================================================================
   7.4 <table expression>
@@ -1606,6 +1606,8 @@ null_ordering
 
 insert_statement
   : INSERT (OVERWRITE)? INTO table_name (LEFT_PAREN column_reference_list 
RIGHT_PAREN)? query_expression
+  | INSERT (OVERWRITE)? INTO table_name (LEFT_PAREN column_reference_list 
RIGHT_PAREN)? VALUES
+    LEFT_PAREN row_value_predicand (COMMA row_value_predicand)* RIGHT_PAREN
   | INSERT (OVERWRITE)? INTO LOCATION path=Character_String_Literal (USING 
storage_type=identifier (param_clause)?)? query_expression
   ;
 

Reply via email to