Repository: phoenix Updated Branches: refs/heads/4.2 383e484bc -> 83bd94a9e
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/83bd94a9 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/83bd94a9 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/83bd94a9 Branch: refs/heads/4.2 Commit: 83bd94a9e95e87b9fbabf7b54152777a1997cbfd Parents: 383e484 Author: maryannxue <maryann...@apache.org> Authored: Wed Nov 26 13:20:47 2014 -0500 Committer: maryannxue <maryann...@apache.org> Committed: Wed Nov 26 13:20:47 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/83bd94a9/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 9391965..95ff349 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 @@ -982,5 +982,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/83bd94a9/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 2d7de4d..eb5c7f6 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? }