PHOENIX-2900 Unable to find hash cache once a salted table 's first region has split
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/5369c3d7 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/5369c3d7 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/5369c3d7 Branch: refs/heads/encodecolumns Commit: 5369c3d781762e177217bd24a30cf2e9b7fb9bdd Parents: 0b39a52 Author: James Taylor <[email protected]> Authored: Sun Jul 24 09:30:31 2016 -0700 Committer: James Taylor <[email protected]> Committed: Sun Jul 24 09:57:37 2016 -0700 ---------------------------------------------------------------------- .../org/apache/phoenix/compile/ScanRanges.java | 5 ++- .../phoenix/compile/QueryCompilerTest.java | 42 ++++++++++++++++++++ .../phoenix/compile/SaltedScanRangesTest.java | 8 ++++ 3 files changed, 54 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/5369c3d7/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 f3d5bba..95eee60 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 @@ -419,7 +419,10 @@ public class ScanRanges { return true; } - return intersectScan(null, regionStartKey, regionEndKey, 0, false) == HAS_INTERSECTION; + boolean crossesSaltBoundary = isSalted && ScanUtil.crossesPrefixBoundary(regionEndKey, + ScanUtil.getPrefix(regionStartKey, SaltingUtil.NUM_SALTING_BYTES), + SaltingUtil.NUM_SALTING_BYTES); + return intersectScan(null, regionStartKey, regionEndKey, 0, crossesSaltBoundary) == HAS_INTERSECTION; } public SkipScanFilter getSkipScanFilter() { http://git-wip-us.apache.org/repos/asf/phoenix/blob/5369c3d7/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java index 7aab048..c91b855 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java @@ -41,6 +41,7 @@ import java.util.Iterator; import java.util.List; import java.util.Properties; +import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter; @@ -48,6 +49,7 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.compile.OrderByCompiler.OrderBy; import org.apache.phoenix.coprocessor.BaseScannerRegionObserver; import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.execute.HashJoinPlan; import org.apache.phoenix.expression.Expression; import org.apache.phoenix.expression.LiteralExpression; import org.apache.phoenix.expression.aggregator.Aggregator; @@ -2385,4 +2387,44 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest { conn.close(); } } + + @Test + public void testSaltTableJoin() throws Exception{ + + PhoenixConnection conn = (PhoenixConnection)DriverManager.getConnection(getUrl()); + try { + conn.createStatement().execute("drop table if exists SALT_TEST2900"); + + conn.createStatement().execute( + "create table SALT_TEST2900"+ + "("+ + "id UNSIGNED_INT not null primary key,"+ + "appId VARCHAR"+ + ")SALT_BUCKETS=2"); + + + + conn.createStatement().execute("drop table if exists RIGHT_TEST2900 "); + conn.createStatement().execute( + "create table RIGHT_TEST2900"+ + "("+ + "appId VARCHAR not null primary key,"+ + "createTime VARCHAR"+ + ")"); + + + String sql="select * from SALT_TEST2900 a inner join RIGHT_TEST2900 b on a.appId=b.appId where a.id>=3 and a.id<=5"; + HashJoinPlan plan = (HashJoinPlan)getQueryPlan(sql, Collections.emptyList()); + ScanRanges ranges=plan.getContext().getScanRanges(); + + List<HRegionLocation> regionLocations= + conn.getQueryServices().getAllTableRegions(Bytes.toBytes("SALT_TEST2900")); + for (HRegionLocation regionLocation : regionLocations) { + assertTrue(ranges.intersectRegion(regionLocation.getRegionInfo().getStartKey(), + regionLocation.getRegionInfo().getEndKey(), false)); + } + } finally { + conn.close(); + } + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/5369c3d7/phoenix-core/src/test/java/org/apache/phoenix/compile/SaltedScanRangesTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/SaltedScanRangesTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/SaltedScanRangesTest.java index f8eb3a0..d89f024 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/compile/SaltedScanRangesTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/SaltedScanRangesTest.java @@ -151,6 +151,14 @@ public class SaltedScanRangesTest { KeyRange.getKeyRange(ByteUtil.concat(new byte[]{1}, Bytes.toBytes("f")), ByteUtil.concat(new byte[]{1}, Bytes.toBytes("g"))), true, false)); + testCases.addAll( + foreach(new KeyRange[][]{{ + PVarchar.INSTANCE.getKeyRange(Bytes.toBytes("c"), true, KeyRange.UNBOUND, false), + }}, + new int[] {1}, + KeyRange.getKeyRange(new byte[]{1,0},new byte[]{2,0}), + false, + true)); return testCases; }
