You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/05/07 18:36:04 UTC
[5/6] tajo git commit: TAJO-1556: "insert into select" with reordered
column list does not work.
TAJO-1556: "insert into select" with reordered column list does not work.
Closes #546
Signed-off-by: Jihoon Son <ji...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/9b3824b5
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/9b3824b5
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/9b3824b5
Branch: refs/heads/index_support
Commit: 9b3824b5f0c64af42bfcf0a6bb8d3555c22c5746
Parents: 04167bd
Author: Yongjin Choi <su...@gmail.com>
Authored: Wed May 6 18:41:51 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed May 6 18:42:29 2015 +0900
----------------------------------------------------------------------
CHANGES | 3 +++
.../java/org/apache/tajo/catalog/Schema.java | 12 ++++++---
.../tajo/engine/planner/TestLogicalPlanner.java | 23 +++++++++++++++--
.../tajo/engine/query/TestInsertQuery.java | 19 ++++++++++++++
.../TestInsertQuery/nation_diff_col_order.ddl | 1 +
.../testInsertWithDifferentColumnOrder.sql | 1 +
.../testInsertWithDifferentColumnOrder.result | 27 ++++++++++++++++++++
.../org/apache/tajo/plan/LogicalPlanner.java | 9 ++++---
8 files changed, 86 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index ebd88cd..a8074cd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -111,6 +111,9 @@ Release 0.11.0 - unreleased
BUG FIXES
+ TAJO-1556: "insert into select" with reordered column list does not work.
+ (Contributed by Yongjin Choi, Committed by jihoon)
+
TAJO-1534: DelimitedTextFile return null instead of a NullDatum. (jinho)
TAJO-1574: Fix NPE on natural join.
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
index fcbd177..054cc2c 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
@@ -157,13 +157,19 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
}
public Column getColumn(Column column) {
+ int idx = getIndex(column);
+ return idx >= 0 ? fields.get(idx) : null;
+ }
+
+ public int getIndex(Column column) {
if (!contains(column)) {
- return null;
+ return -1;
}
+
if (column.hasQualifier()) {
- return fields.get(fieldsByQualifiedName.get(column.getQualifiedName()));
+ return fieldsByQualifiedName.get(column.getQualifiedName());
} else {
- return fields.get(fieldsByName.get(column.getSimpleName()).get(0));
+ return fieldsByName.get(column.getSimpleName()).get(0);
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
index 0b59bc7..af0aa6a 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
@@ -1106,7 +1106,7 @@ public class TestLogicalPlanner {
// Table descriptions
//
// employee (name text, empid int4, deptname text)
- // dept (deptname text, nameger text)
+ // dept (deptname text, manager text)
// score (deptname text, score inet4)
static final String [] insertStatements = {
@@ -1115,7 +1115,8 @@ public class TestLogicalPlanner {
"insert into employee (name, deptname) select * from dept", // 2
"insert into location '/tmp/data' select name, empid from employee", // 3
"insert overwrite into employee (name, deptname) select * from dept", // 4
- "insert overwrite into LOCATION '/tmp/data' select * from dept" // 5
+ "insert overwrite into LOCATION '/tmp/data' select * from dept", // 5
+ "insert into employee (deptname, name) select deptname, manager from dept" // 6
};
@Test
@@ -1198,6 +1199,24 @@ public class TestLogicalPlanner {
assertTrue(insertNode.hasPath());
}
+ @Test
+ public final void testInsertInto6() throws PlanningException {
+ QueryContext qc = new QueryContext(util.getConfiguration(), session);
+
+ Expr expr = sqlAnalyzer.parse(insertStatements[6]);
+ LogicalPlan plan = planner.createPlan(qc, expr);
+ assertEquals(1, plan.getQueryBlocks().size());
+ InsertNode insertNode = getInsertNode(plan);
+
+ ProjectionNode subquery = insertNode.getChild();
+ Target[] targets = subquery.getTargets();
+ // targets MUST be manager, NULL as empid, deptname
+ assertEquals(targets[0].getNamedColumn().getQualifiedName(), "default.dept.manager");
+ assertEquals(targets[1].getAlias(), "empid");
+ assertEquals(targets[1].getEvalTree().getType(), EvalType.CONST);
+ assertEquals(targets[2].getNamedColumn().getQualifiedName(), "default.dept.deptname");
+ }
+
private static InsertNode getInsertNode(LogicalPlan plan) {
LogicalRootNode root = plan.getRootBlock().getRoot();
assertEquals(NodeType.INSERT, root.getChild().getType());
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
index 4a1f601..b3e3402 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInsertQuery.java
@@ -817,4 +817,23 @@ public class TestInsertQuery extends QueryTestCaseBase {
assertNotNull(resultDatas);
assertEquals(expected, resultDatas);
}
+
+ @Test
+ public final void testInsertWithDifferentColumnOrder() throws Exception {
+ ResultSet res = executeFile("nation_diff_col_order.ddl");
+ res.close();
+
+ CatalogService catalog = testingCluster.getMaster().getCatalog();
+ assertTrue(catalog.existsTable(getCurrentDatabase(), "nation_diff"));
+
+ try {
+ res = executeFile("testInsertWithDifferentColumnOrder.sql");
+ res.close();
+
+ res = executeString("select * from nation_diff");
+ assertResultSet(res);
+ } finally {
+ executeString("drop table nation_diff purge;");
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/tajo-core/src/test/resources/queries/TestInsertQuery/nation_diff_col_order.ddl
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestInsertQuery/nation_diff_col_order.ddl b/tajo-core/src/test/resources/queries/TestInsertQuery/nation_diff_col_order.ddl
new file mode 100644
index 0000000..6998304
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestInsertQuery/nation_diff_col_order.ddl
@@ -0,0 +1 @@
+create table nation_diff (n_nationkey int8, n_name text, n_regionkey int8, n_comment text);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/tajo-core/src/test/resources/queries/TestInsertQuery/testInsertWithDifferentColumnOrder.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestInsertQuery/testInsertWithDifferentColumnOrder.sql b/tajo-core/src/test/resources/queries/TestInsertQuery/testInsertWithDifferentColumnOrder.sql
new file mode 100644
index 0000000..ad360f9
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestInsertQuery/testInsertWithDifferentColumnOrder.sql
@@ -0,0 +1 @@
+insert overwrite into nation_diff (n_comment, n_name) select n_comment, n_name from default.nation;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/tajo-core/src/test/resources/results/TestInsertQuery/testInsertWithDifferentColumnOrder.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestInsertQuery/testInsertWithDifferentColumnOrder.result b/tajo-core/src/test/resources/results/TestInsertQuery/testInsertWithDifferentColumnOrder.result
new file mode 100644
index 0000000..4cd3b81
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestInsertQuery/testInsertWithDifferentColumnOrder.result
@@ -0,0 +1,27 @@
+n_nationkey,n_name,n_regionkey,n_comment
+-------------------------------
+null,ALGERIA,null, haggle. carefully final deposits detect slyly agai
+null,ARGENTINA,null,al foxes promise slyly according to the regular accounts. bold requests alon
+null,BRAZIL,null,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special
+null,CANADA,null,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold
+null,EGYPT,null,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d
+null,ETHIOPIA,null,ven packages wake quickly. regu
+null,FRANCE,null,refully final requests. regular, ironi
+null,GERMANY,null,l platelets. regular accounts x-ray: unusual, regular acco
+null,INDIA,null,ss excuses cajole slyly across the packages. deposits print aroun
+null,INDONESIA,null, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull
+null,IRAN,null,efully alongside of the slyly final dependencies.
+null,IRAQ,null,nic deposits boost atop the quickly final requests? quickly regula
+null,JAPAN,null,ously. final, express gifts cajole a
+null,JORDAN,null,ic deposits are blithely about the carefully regular pa
+null,KENYA,null, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t
+null,MOROCCO,null,rns. blithely bold courts among the closely regular packages use furiously bold platelets?
+null,MOZAMBIQUE,null,s. ironic, unusual asymptotes wake blithely r
+null,PERU,null,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun
+null,CHINA,null,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos
+null,ROMANIA,null,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account
+null,SAUDI ARABIA,null,ts. silent requests haggle. closely express packages sleep across the blithely
+null,VIETNAM,null,hely enticingly express accounts. even, final
+null,RUSSIA,null, requests against the platelets use never according to the quickly regular pint
+null,UNITED KINGDOM,null,eans boost carefully special requests. accounts are. carefull
+null,UNITED STATES,null,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/9b3824b5/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
index d1c1a15..e0b4f7e 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
@@ -1524,7 +1524,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
// we use only a sequence of preceding columns of target table's schema
// as target columns.
//
- // For example, consider a target table and an 'insert into' query are give as follows:
+ // For example, consider a target table and an 'insert into' query are given as follows:
//
// CREATE TABLE TB1 (col1 int, col2 int, col3 long);
// || ||
@@ -1586,11 +1586,12 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
// Modifying projected columns by adding NULL constants
// It is because that table appender does not support target columns to be written.
List<Target> targets = TUtil.newList();
- for (int i = 0, j = 0; i < tableSchema.size(); i++) {
+ for (int i = 0; i < tableSchema.size(); i++) {
Column column = tableSchema.getColumn(i);
- if(targetColumns.contains(column) && j < projectionNode.getTargets().length) {
- targets.add(projectionNode.getTargets()[j++]);
+ int idxInProjectionNode = targetColumns.getIndex(column);
+ if (idxInProjectionNode >= 0 && idxInProjectionNode < projectionNode.getTargets().length) {
+ targets.add(projectionNode.getTargets()[idxInProjectionNode]);
} else {
targets.add(new Target(new ConstEval(NullDatum.get()), column.getSimpleName()));
}