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;