Repository: phoenix Updated Branches: refs/heads/4.x-HBase-1.2 f4489cfc1 -> f0af02259
PHOENIX-4373 Local index variable length key can have trailing nulls while upserting Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/f0af0225 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/f0af0225 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/f0af0225 Branch: refs/heads/4.x-HBase-1.2 Commit: f0af02259a0f68eb520004d4f42a7e65954037a7 Parents: f4489cf Author: Vincent Poon <[email protected]> Authored: Tue Nov 14 10:47:46 2017 -0800 Committer: Vincent Poon <[email protected]> Committed: Tue Nov 14 10:52:19 2017 -0800 ---------------------------------------------------------------------- .../org/apache/phoenix/end2end/IndexToolIT.java | 40 ++++++++++++++++++++ .../org/apache/phoenix/compile/ScanRanges.java | 11 ++++-- .../apache/phoenix/compile/UpsertCompiler.java | 3 +- 3 files changed, 50 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/f0af0225/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java index 913a147..a9128ab 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java @@ -209,6 +209,46 @@ public class IndexToolIT extends BaseTest { } } + @Test + public void testSaltedVariableLengthPK() throws Exception { + String schemaName = generateUniqueName(); + String dataTableName = generateUniqueName(); + String dataTableFullName = SchemaUtil.getTableName(schemaName, dataTableName); + String indexTableName = generateUniqueName(); + try (Connection conn = + DriverManager.getConnection(getUrl(), PropertiesUtil.deepCopy(TEST_PROPERTIES))) { + String dataDDL = + "CREATE TABLE " + dataTableFullName + "(\n" + + "ID VARCHAR NOT NULL PRIMARY KEY,\n" + + "\"info\".CAR_NUM VARCHAR(18) NULL,\n" + + "\"info\".CAP_DATE VARCHAR NULL,\n" + "\"info\".ORG_ID BIGINT NULL,\n" + + "\"info\".ORG_NAME VARCHAR(255) NULL\n" + ") SALT_BUCKETS=3"; + conn.createStatement().execute(dataDDL); + + String upsert = + "UPSERT INTO " + dataTableFullName + + "(ID,CAR_NUM,CAP_DATE,ORG_ID,ORG_NAME) VALUES('1','car1','2016-01-01 00:00:00',11,'orgname1')"; + conn.createStatement().execute(upsert); + conn.commit(); + + String indexDDL = + String.format( + "CREATE %s INDEX %s on %s (\"info\".CAR_NUM,\"info\".CAP_DATE) ASYNC", + (localIndex ? "LOCAL" : ""), indexTableName, dataTableFullName); + conn.createStatement().execute(indexDDL); + + runIndexTool(directApi, useSnapshot, schemaName, dataTableName, indexTableName); + + ResultSet rs = + conn.createStatement().executeQuery( + "SELECT ORG_ID,CAP_DATE,CAR_NUM,ORG_NAME FROM " + dataTableFullName + + " WHERE CAR_NUM='car1' AND CAP_DATE>='2016-01-01' AND CAP_DATE<='2016-05-02' LIMIT 10"); + assertTrue(rs.next()); + int orgId = rs.getInt(1); + assertEquals(11, orgId); + } + } + public static void assertExplainPlan(boolean localIndex, String actualExplainPlan, String dataTableFullName, String indexTableFullName) { String expectedExplainPlan; http://git-wip-us.apache.org/repos/asf/phoenix/blob/f0af0225/phoenix-core/src/main/java/org/apache/phoenix/compile/ScanRanges.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ScanRanges.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ScanRanges.java index 1b94cff..817c1bc 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ScanRanges.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ScanRanges.java @@ -207,13 +207,18 @@ public class ScanRanges { } public static byte[] prefixKey(byte[] key, int keyOffset, byte[] prefixKey, int prefixKeyOffset) { - if (key.length > 0) { - byte[] newKey = new byte[key.length + prefixKeyOffset]; + return prefixKey(key, keyOffset, key.length, prefixKey, prefixKeyOffset); + } + + public static byte[] prefixKey(byte[] key, int keyOffset, int keyLength, byte[] prefixKey, + int prefixKeyOffset) { + if (keyLength > 0) { + byte[] newKey = new byte[keyLength + prefixKeyOffset]; int totalKeyOffset = keyOffset + prefixKeyOffset; if (prefixKey.length >= totalKeyOffset) { // otherwise it's null padded System.arraycopy(prefixKey, 0, newKey, 0, totalKeyOffset); } - System.arraycopy(key, keyOffset, newKey, totalKeyOffset, key.length - keyOffset); + System.arraycopy(key, keyOffset, newKey, totalKeyOffset, keyLength - keyOffset); return newKey; } return key; http://git-wip-us.apache.org/repos/asf/phoenix/blob/f0af0225/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 6445894..9eaaf62 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 @@ -162,7 +162,8 @@ public class UpsertCompiler { .getRegionInfo().getEndKey().length] : region.getRegionInfo() .getStartKey(); if (regionPrefix.length != 0) { - ptr.set(ScanRanges.prefixKey(ptr.get(), 0, regionPrefix, regionPrefix.length)); + ptr.set(ScanRanges.prefixKey(ptr.get(), 0, ptr.getLength(), regionPrefix, + regionPrefix.length)); } } mutation.put(ptr, new RowMutationState(columnValues, statement.getConnection().getStatementExecutionCounter(), rowTsColInfo, onDupKeyBytes));
