Repository: phoenix Updated Branches: refs/heads/4.0 a3850e7fc -> 856c6bc5d
PHOENIX-1431 DELETE using Subqueries Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/856c6bc5 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/856c6bc5 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/856c6bc5 Branch: refs/heads/4.0 Commit: 856c6bc5d1eb4029b8a071b12d69b4d3f466f15a Parents: a3850e7 Author: maryannxue <[email protected]> Authored: Wed Nov 26 13:03:57 2014 -0500 Committer: maryannxue <[email protected]> Committed: Wed Nov 26 13:03:57 2014 -0500 ---------------------------------------------------------------------- .../org/apache/phoenix/end2end/SubqueryIT.java | 39 ++++++++++++++++++++ .../apache/phoenix/compile/DeleteCompiler.java | 8 +++- 2 files changed, 46 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/856c6bc5/phoenix-core/src/it/java/org/apache/phoenix/end2end/SubqueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SubqueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SubqueryIT.java index 0e5dcc0..8e7e6e9 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SubqueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SubqueryIT.java @@ -994,5 +994,44 @@ public class SubqueryIT extends BaseHBaseManagedTimeIT { } } + @Test + public void testSubqueryWithDelete() throws Exception { + String tempTable = "TEMP_SUBQUERY_TABLE"; + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + conn.setAutoCommit(true); + try { + conn.createStatement().execute("CREATE TABLE " + tempTable + + " (item_id varchar not null primary key, " + + " name varchar)"); + conn.createStatement().execute("UPSERT INTO " + tempTable + "(item_id, name)" + + " SELECT \"item_id\", name FROM " + JOIN_ITEM_TABLE_FULL_NAME); + + String query = "SELECT count(*) FROM " + JOIN_ITEM_TABLE_FULL_NAME; + PreparedStatement statement = conn.prepareStatement(query); + ResultSet rs = statement.executeQuery(); + assertTrue (rs.next()); + assertEquals(rs.getInt(1), 7); + assertFalse(rs.next()); + + conn.createStatement().execute("DELETE FROM " + tempTable + " WHERE item_id IN (" + + " SELECT \"item_id\" FROM " + JOIN_ORDER_TABLE_FULL_NAME + ")"); + + query = "SELECT name FROM " + tempTable + " ORDER BY item_id"; + statement = conn.prepareStatement(query); + rs = statement.executeQuery(); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "T4"); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "T5"); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "INVALID-1"); + + assertFalse(rs.next()); + } finally { + conn.close(); + } + } + } http://git-wip-us.apache.org/repos/asf/phoenix/blob/856c6bc5/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java index 92abd77..b04d6e3 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java @@ -37,6 +37,7 @@ import org.apache.phoenix.coprocessor.MetaDataProtocol.MetaDataMutationResult; import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.exception.SQLExceptionInfo; import org.apache.phoenix.execute.AggregatePlan; +import org.apache.phoenix.execute.BaseQueryPlan; import org.apache.phoenix.execute.MutationState; import org.apache.phoenix.filter.SkipScanFilter; import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr; @@ -323,6 +324,11 @@ public class DeleteCompiler { delete.getOrderBy(), delete.getLimit(), delete.getBindCount(), false, false); select = StatementNormalizer.normalize(select, resolver); + SelectStatement transformedSelect = SubqueryRewriter.transform(select, resolver, connection); + if (transformedSelect != select) { + resolver = FromCompiler.getResolverForQuery(transformedSelect, connection); + select = StatementNormalizer.normalize(transformedSelect, resolver); + } parallelIteratorFactory = hasLimit ? null : new DeletingParallelIteratorFactory(connection); QueryOptimizer optimizer = new QueryOptimizer(services); queryPlans = Lists.newArrayList(mayHaveImmutableIndexes @@ -395,7 +401,7 @@ public class DeleteCompiler { for (int i = 0; i < tableRefs.length; i++) { final TableRef tableRef = tableRefs[i]; final QueryPlan plan = queryPlans.get(i); - if (!plan.getTableRef().equals(tableRef)) { + if (!plan.getTableRef().equals(tableRef) || !(plan instanceof BaseQueryPlan)) { runOnServer = false; noQueryReqd = false; // FIXME: why set this to false in this case? }
