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 ;
