You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2018/04/27 07:09:52 UTC

phoenix git commit: PHOENIX-4551 Possible ColumnAlreadyExistsException is thrown from delete when autocommit off (Rajeshbabu)

Repository: phoenix
Updated Branches:
  refs/heads/4.x-HBase-1.1 b3653cc1c -> 00de48a52


PHOENIX-4551 Possible ColumnAlreadyExistsException is thrown from delete when autocommit off (Rajeshbabu)


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/00de48a5
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/00de48a5
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/00de48a5

Branch: refs/heads/4.x-HBase-1.1
Commit: 00de48a5297e4ab40ab6013a35d81da2570f4258
Parents: b3653cc
Author: James Taylor <jt...@salesforce.com>
Authored: Fri Apr 27 00:09:13 2018 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Fri Apr 27 00:09:42 2018 -0700

----------------------------------------------------------------------
 .../org/apache/phoenix/end2end/DeleteIT.java    | 30 +++++++++++++++++++-
 .../apache/phoenix/compile/DeleteCompiler.java  | 17 +++++++----
 2 files changed, 40 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/00de48a5/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
index c31fdd9..689bf20 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
@@ -774,6 +774,35 @@ public class DeleteIT extends ParallelStatsDisabledIT {
         }
 
     }
+    
+
+    @Test
+    public void testClientSideDeleteShouldNotFailWhenSameColumnPresentInMultipleIndexes()
+            throws Exception {
+        String tableName = generateUniqueName();
+        String indexName1 = generateUniqueName();
+        String indexName2 = generateUniqueName();
+        String ddl =
+                "CREATE TABLE IF NOT EXISTS "
+                        + tableName
+                        + " (pk1 DECIMAL NOT NULL, v1 VARCHAR, v2 VARCHAR CONSTRAINT PK PRIMARY KEY (pk1))";
+        String idx1 = "CREATE INDEX " + indexName1 + " ON " + tableName + "(v1)";
+        String idx2 = "CREATE INDEX " + indexName2 + " ON " + tableName + "(v1, v2)";
+        try (Connection conn = DriverManager.getConnection(getUrl())) {
+            conn.createStatement().execute(ddl);
+            conn.createStatement().execute(idx1);
+            conn.createStatement().execute(idx2);
+            Statement stmt = conn.createStatement();
+            stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES (1,'value', 'value2')");
+            conn.commit();
+            conn.setAutoCommit(false);
+            try {
+                conn.createStatement().execute("DELETE FROM " + tableName + " WHERE pk1 > 0");
+            } catch (Exception e) {
+                fail("Should not throw any exception");
+            }
+        }
+    }
 
     @Test
     public void testDeleteShouldNotFailWhenTheRowsMoreThanMaxMutationSize() throws Exception {
@@ -808,4 +837,3 @@ public class DeleteIT extends ParallelStatsDisabledIT {
     }
 }
 
-

http://git-wip-us.apache.org/repos/asf/phoenix/blob/00de48a5/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 b35135f..5f9c76c 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
@@ -25,6 +25,7 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -469,7 +470,7 @@ public class DeleteCompiler {
         for (PTable index : clientSideIndexes) {
             selectColumnCount += index.getPKColumns().size() - pkColumnCount;
         }
-        List<PColumn> projectedColumns = Lists.newArrayListWithExpectedSize(selectColumnCount + pkColumnOffset);
+        Set<PColumn> projectedColumns = new LinkedHashSet<PColumn>(selectColumnCount + pkColumnOffset);
         List<AliasedNode> aliasedNodes = Lists.newArrayListWithExpectedSize(selectColumnCount);
         for (int i = isSalted ? 1 : 0; i < pkColumnOffset; i++) {
             PColumn column = table.getPKColumns().get(i);
@@ -490,8 +491,10 @@ public class DeleteCompiler {
                     String columnName = columnInfo.getSecond();
                     boolean hasNoColumnFamilies = table.getColumnFamilies().isEmpty();
                     PColumn column = hasNoColumnFamilies ? table.getColumnForColumnName(columnName) : table.getColumnFamily(familyName).getPColumnForColumnName(columnName);
-                    projectedColumns.add(column);
-                    aliasedNodes.add(FACTORY.aliasedNode(null, FACTORY.column(hasNoColumnFamilies ? null : TableName.create(null, familyName), '"' + columnName + '"', null)));
+                    if(!projectedColumns.contains(column)) {
+                        projectedColumns.add(column);
+                        aliasedNodes.add(FACTORY.aliasedNode(null, FACTORY.column(hasNoColumnFamilies ? null : TableName.create(null, familyName), '"' + columnName + '"', null)));
+                    }
                 }
             }
         }
@@ -600,9 +603,11 @@ public class DeleteCompiler {
             final DeletingParallelIteratorFactory parallelIteratorFactory = parallelIteratorFactoryToBe;
             List<PColumn> adjustedProjectedColumns = Lists.newArrayListWithExpectedSize(projectedColumns.size());
             final int offset = table.getBucketNum() == null ? 0 : 1;
-            for (int i = 0; i < projectedColumns.size(); i++) {
-                final int position = i;
-                adjustedProjectedColumns.add(new DelegateColumn(projectedColumns.get(i)) {
+            Iterator<PColumn> projectedColsItr = projectedColumns.iterator();
+            int i = 0;
+            while(projectedColsItr.hasNext()) {
+                final int position = i++;
+                adjustedProjectedColumns.add(new DelegateColumn(projectedColsItr.next()) {
                     @Override
                     public int getPosition() {
                         return position + offset;