You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by td...@apache.org on 2018/01/19 18:03:16 UTC
[08/50] [abbrv] phoenix git commit: PHOENIX-4373 Local index variable
length key can have trailing nulls while upserting
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/b2d5b4d7
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/b2d5b4d7
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/b2d5b4d7
Branch: refs/heads/system-catalog
Commit: b2d5b4d75d4698981b291fecfac3efa3fb6e2649
Parents: 1d8a6bc
Author: Vincent Poon <vi...@apache.org>
Authored: Tue Nov 14 10:47:46 2017 -0800
Committer: Vincent Poon <vi...@apache.org>
Committed: Tue Nov 14 10:47:46 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/b2d5b4d7/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/b2d5b4d7/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/b2d5b4d7/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 3603ce7..bc3e289 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));