You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by la...@apache.org on 2019/07/16 22:39:22 UTC

[phoenix] branch 4.x-HBase-1.5 updated: PHOENIX-5290 HashJoinMoreIT is flapping.

This is an automated email from the ASF dual-hosted git repository.

larsh pushed a commit to branch 4.x-HBase-1.5
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/4.x-HBase-1.5 by this push:
     new f3318a9  PHOENIX-5290 HashJoinMoreIT is flapping.
f3318a9 is described below

commit f3318a97af8c71fc50b0332f46bd297b465983eb
Author: Lars Hofhansl <la...@apache.org>
AuthorDate: Tue Jul 16 15:39:57 2019 -0700

    PHOENIX-5290 HashJoinMoreIT is flapping.
---
 .../phoenix/end2end/RowValueConstructorIT.java     | 32 ++++++++++++++++++++++
 .../org/apache/phoenix/compile/WhereOptimizer.java |  8 ++++--
 .../org/apache/phoenix/schema/types/PVarchar.java  |  2 +-
 3 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
index fb04261..390d831 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java
@@ -51,6 +51,7 @@ import java.sql.Timestamp;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.phoenix.jdbc.PhoenixPreparedStatement;
 import org.apache.phoenix.util.DateUtil;
 import org.apache.phoenix.util.PhoenixRuntime;
 import org.apache.phoenix.util.PropertiesUtil;
@@ -1691,6 +1692,37 @@ public class RowValueConstructorIT extends ParallelStatsDisabledIT {
         }
     }
 
+    @Test
+    public void testTrailingSeparator() throws Exception {
+        Connection conn = null;
+        try {
+            conn = DriverManager.getConnection(getUrl());
+            conn.createStatement().execute("CREATE TABLE test2961 (\n"
+                    + "ACCOUNT_ID VARCHAR NOT NULL,\n" + "BUCKET_ID VARCHAR NOT NULL,\n"
+                    + "OBJECT_ID VARCHAR NOT NULL,\n" + "OBJECT_VERSION VARCHAR NOT NULL,\n"
+                    + "LOC VARCHAR,\n"
+                    + "CONSTRAINT PK PRIMARY KEY (ACCOUNT_ID, BUCKET_ID, OBJECT_ID, OBJECT_VERSION DESC))");
+
+            String sql = "SELECT  OBJ.ACCOUNT_ID from  test2961 as OBJ where "
+                    + "(OBJ.ACCOUNT_ID, OBJ.BUCKET_ID, OBJ.OBJECT_ID, OBJ.OBJECT_VERSION) IN "
+                    + "((?,?,?,?),(?,?,?,?))";
+
+            PhoenixPreparedStatement statement = conn.prepareStatement(sql)
+                    .unwrap(PhoenixPreparedStatement.class);
+            statement.setString(1, new String(new char[] { (char) 3 }));
+            statement.setString(2, new String(new char[] { (char) 55 }));
+            statement.setString(3, new String(new char[] { (char) 39 }));
+            statement.setString(4, new String(new char[] { (char) 0 }));
+            statement.setString(5, new String(new char[] { (char) 83 }));
+            statement.setString(6, new String(new char[] { (char) 15 }));
+            statement.setString(7, new String(new char[] { (char) 55 }));
+            statement.setString(8, new String(new char[] { (char) 147 }));
+            statement.optimizeQuery(sql);
+        } finally {
+            conn.close();
+        }
+    }
+
     private StringBuilder generateQueryToTest(int numItemsInClause, String fullViewName) {
         StringBuilder querySb =
                 new StringBuilder("SELECT OBJECT_ID,OBJECT_DATA2,OBJECT_DATA FROM " + fullViewName);
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
index b845a09..0964d9d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
@@ -347,7 +347,9 @@ public class WhereOptimizer {
         byte[] lowerRange = KeyRange.UNBOUND;
         boolean lowerInclusive = false;
         // Lower range of trailing part of RVC must be true, so we can form a new range to intersect going forward
-        if (!range.lowerUnbound() && Bytes.startsWith(range.getLowerRange(), clippedResult.getLowerRange())) {
+        if (!range.lowerUnbound()
+                && range.getLowerRange().length > clippedResult.getLowerRange().length
+                && Bytes.startsWith(range.getLowerRange(), clippedResult.getLowerRange())) {
             lowerRange = range.getLowerRange();
             int offset = clippedResult.getLowerRange().length + separatorLength;
             ptr.set(lowerRange, offset, lowerRange.length - offset);
@@ -356,7 +358,9 @@ public class WhereOptimizer {
         }
         byte[] upperRange = KeyRange.UNBOUND;
         boolean upperInclusive = false;
-        if (!range.upperUnbound() && Bytes.startsWith(range.getUpperRange(), clippedResult.getUpperRange())) {
+        if (!range.upperUnbound()
+                && range.getUpperRange().length > clippedResult.getUpperRange().length
+                && Bytes.startsWith(range.getUpperRange(), clippedResult.getUpperRange())) {
             upperRange = range.getUpperRange();
             int offset = clippedResult.getUpperRange().length + separatorLength;
             ptr.set(upperRange, offset, upperRange.length - offset);
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java
index a99925c..bee0d56 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java
@@ -175,7 +175,7 @@ public class PVarchar extends PDataType<String> {
             sampleChars = new char[length];
         }
         for (int i = 0; i < length; i++) {
-            sampleChars[i] = (char) RANDOM.get().nextInt(Byte.MAX_VALUE);
+            sampleChars[i] = (char) (RANDOM.get().nextInt(Byte.MAX_VALUE-2) + 1);
         }
         return new String(sampleChars);
     }