You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ss...@apache.org on 2017/09/05 20:40:02 UTC

[3/4] phoenix git commit: PHOENIX-4068 Atomic Upsert salted table with error(java.lang.NullPointerException)

PHOENIX-4068 Atomic Upsert salted table with error(java.lang.NullPointerException)


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

Branch: refs/heads/4.x-HBase-1.1
Commit: 63779600dd0d2df3df5d443de631fd6f00dd0304
Parents: cb12016
Author: Sergey Soldatov <ss...@apache.org>
Authored: Thu Aug 10 22:06:49 2017 -0700
Committer: Sergey Soldatov <ss...@apache.org>
Committed: Tue Sep 5 13:39:42 2017 -0700

----------------------------------------------------------------------
 .../phoenix/end2end/OnDuplicateKeyIT.java       | 33 +++++++++++++++++++-
 .../apache/phoenix/compile/UpsertCompiler.java  |  9 +++---
 .../phoenix/index/PhoenixIndexBuilder.java      |  3 +-
 3 files changed, 39 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/63779600/phoenix-core/src/it/java/org/apache/phoenix/end2end/OnDuplicateKeyIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OnDuplicateKeyIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OnDuplicateKeyIT.java
index 2477f56..f1ee0e7 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OnDuplicateKeyIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OnDuplicateKeyIT.java
@@ -21,6 +21,7 @@ import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.sql.Connection;
 import java.sql.Date;
@@ -549,6 +550,36 @@ public class OnDuplicateKeyIT extends ParallelStatsDisabledIT {
 
         conn.close();
     }
-    
+    @Test
+    public void testDuplicateUpdateWithSaltedTable() throws Exception {
+        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+        final Connection conn = DriverManager.getConnection(getUrl(), props);
+        String tableName = generateUniqueName();
+        try {
+            String ddl = "create table " + tableName + " (id varchar not null,id1 varchar not null, counter1 bigint, counter2 bigint CONSTRAINT pk PRIMARY KEY (id,id1)) SALT_BUCKETS=6";
+            conn.createStatement().execute(ddl);
+            createIndex(conn, tableName);
+            String dml = "UPSERT INTO " + tableName + " (id,id1, counter1, counter2) VALUES ('abc','123', 0, 0) ON DUPLICATE KEY UPDATE counter1 = counter1 + 1, counter2 = counter2 + 1";
+            conn.createStatement().execute(dml);
+            conn.commit();
+            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName);
+            assertTrue(rs.next());
+            assertEquals("0",rs.getString(3));
+            assertEquals("0",rs.getString(4));
+            conn.createStatement().execute(dml);
+            conn.commit();
+            rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName);
+            assertTrue(rs.next());
+            assertEquals("1",rs.getString(3));
+            assertEquals("1",rs.getString(4));
+
+        } catch (Exception e) {
+            fail();
+        } finally {
+            conn.close();
+        }
+    }
+
+
 }
     

http://git-wip-us.apache.org/repos/asf/phoenix/blob/63779600/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
index 0d09e9d..c384292 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
@@ -916,15 +916,16 @@ public class UpsertCompiler {
             }
             if (onDupKeyPairs.isEmpty()) { // ON DUPLICATE KEY IGNORE
                 onDupKeyBytesToBe = PhoenixIndexBuilder.serializeOnDupKeyIgnore();
-            } else {                       // ON DUPLICATE KEY UPDATE
-                int position = 1;
+            } else {                       // ON DUPLICATE KEY UPDATE;
+                int position = table.getBucketNum() == null ? 0 : 1;
                 UpdateColumnCompiler compiler = new UpdateColumnCompiler(context);
                 int nColumns = onDupKeyPairs.size();
                 List<Expression> updateExpressions = Lists.newArrayListWithExpectedSize(nColumns);
                 LinkedHashSet<PColumn> updateColumns = Sets.newLinkedHashSetWithExpectedSize(nColumns + 1);
                 updateColumns.add(new PColumnImpl(
-                        table.getPKColumns().get(0).getName(), // Use first PK column name as we know it won't conflict with others
-                        null, PVarbinary.INSTANCE, null, null, false, 0, SortOrder.getDefault(), 0, null, false, null, false, false, null));
+                        table.getPKColumns().get(position).getName(), // Use first PK column name as we know it won't conflict with others
+                        null, PVarbinary.INSTANCE, null, null, false, position, SortOrder.getDefault(), 0, null, false, null, false, false, null));
+                position++;
                 for (Pair<ColumnName,ParseNode> columnPair : onDupKeyPairs) {
                     ColumnName colName = columnPair.getFirst();
                     PColumn updateColumn = resolver.resolveColumn(null, colName.getFamilyName(), colName.getColumnName()).getColumn();

http://git-wip-us.apache.org/repos/asf/phoenix/blob/63779600/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexBuilder.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexBuilder.java b/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexBuilder.java
index 1c05155..679c5df 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexBuilder.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexBuilder.java
@@ -224,11 +224,12 @@ public class PhoenixIndexBuilder extends NonTxIndexBuilder {
                     Collections.sort(flattenedCells,KeyValue.COMPARATOR);
                 }
                 PRow row = table.newRow(GenericKeyValueBuilder.INSTANCE, ts, ptr, false);
+                int adjust = table.getBucketNum() == null ? 1 : 2;
                 for (int i = 0; i < expressions.size(); i++) {
                     Expression expression = expressions.get(i);
                     ptr.set(ByteUtil.EMPTY_BYTE_ARRAY);
                     expression.evaluate(tuple, ptr);
-                    PColumn column = table.getColumns().get(i + 1);
+                    PColumn column = table.getColumns().get(i + adjust);
                     Object value = expression.getDataType().toObject(ptr, column.getSortOrder());
                     // We are guaranteed that the two column will have the
                     // same type.