PHOENIX-2327 Row value constructors failed on the index, when len(table's pks) > 2 and table's 1st pk is index's last pk (Chunhui Liu, James Taylor)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/4cefba24 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/4cefba24 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/4cefba24 Branch: refs/heads/4.x-HBase-1.0 Commit: 4cefba2411cb3a9fe96c3e7ad2da1a697d107812 Parents: f6a3e13 Author: James Taylor <[email protected]> Authored: Sat Oct 17 15:25:00 2015 -0700 Committer: James Taylor <[email protected]> Committed: Sat Oct 17 17:43:06 2015 -0700 ---------------------------------------------------------------------- .../phoenix/end2end/RowValueConstructorIT.java | 61 ++++++++++++++++++++ .../apache/phoenix/compile/WhereOptimizer.java | 7 +-- 2 files changed, 64 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/4cefba24/phoenix-core/src/it/java/org/apache/phoenix/end2end/RowValueConstructorIT.java ---------------------------------------------------------------------- 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 749da5d..fef105c 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 @@ -1591,4 +1591,65 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { assertFalse(rs.next()); } + + /** + * PHOENIX-2327 + * + * Table's pks are (pk1, pk2, ... , pkn), n >= 3 + * Index's pks are (pk2, ... , pkn, pk1), n >= 3 + * RVC is (pk2, ... , pkn, pk1), n >= 3 + * + * Expalin select * from t where (pk2, ... , pkn, pk1) > ('201', ..., 'n01', '101') and pk[2-n] = '[2-n]03' + * + * You will Get "DEGENERATE SCAN OVER TABLE_NAME" + * + * @throws java.lang.Exception + */ + @Test + public void testRVCLastPkIsTable1stPkIndex() throws Exception { + Connection conn = nextConnection(getUrl()); + String tableName = "t"; + String ddl = "CREATE TABLE " + tableName + + " (k1 VARCHAR, k2 VARCHAR, k3 VARCHAR, k4 VARCHAR," + + " CONSTRAINT pk PRIMARY KEY (k1,k2,k3,k4))"; + conn.createStatement().execute(ddl); + + conn = nextConnection(getUrl()); + ddl = "CREATE INDEX " + tableName + "_idx" + + " ON " + tableName + " (k2, k3, k4, k1)"; + conn.createStatement().execute(ddl); + + conn = nextConnection(getUrl()); + String upsert = "UPSERT INTO " + tableName + " VALUES(?, ?, ?, ?)"; + PreparedStatement stmt = conn.prepareStatement(upsert); + for (int i = 0; i < 5; i++) { + stmt.setString(1, "10" + i); + stmt.setString(2, "20" + i); + stmt.setString(3, "30" + i); + stmt.setString(4, "40" + i); + stmt.execute(); + } + conn.commit(); + + conn = nextConnection(getUrl()); + String query = "SELECT k1, k2, k3, k4 FROM " + tableName + " WHERE k2 = '203'"; + ResultSet rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals("103", rs.getString(1)); + assertEquals("203", rs.getString(2)); + assertEquals("303", rs.getString(3)); + assertEquals("403", rs.getString(4)); + + conn = nextConnection(getUrl()); + query = "SELECT k1, k2, k3, k4 FROM " + tableName + + " WHERE (k2, k3, k4, k1) > ('201', '301', '401', '101')" + + " AND k2 = '203'"; + rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals("103", rs.getString(1)); + assertEquals("203", rs.getString(2)); + assertEquals("303", rs.getString(3)); + assertEquals("403", rs.getString(4)); + } + } http://git-wip-us.apache.org/repos/asf/phoenix/blob/4cefba24/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java ---------------------------------------------------------------------- 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 0a71bfb..99986a2 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 @@ -541,10 +541,6 @@ public class WhereOptimizer { int span = position - initialPosition; return new SingleKeySlot(new RowValueConstructorKeyPart(table.getPKColumns().get(initialPosition), rvc, span, childSlots), initialPosition, span, EVERYTHING_RANGES); } - // If we don't clear the child list, we end up passing some of - // the child expressions of previous matches up the tree, causing - // those expressions to form the scan start/stop key. PHOENIX-1753 - childSlots.clear(); return null; } @@ -1118,6 +1114,9 @@ public class WhereOptimizer { // If they don't intersect, we cannot have a match for the RVC, so filter it out. // Otherwise, we keep it. for (KeyRange keyRange : this.getKeyRanges()) { + if (keyRange == KeyRange.EVERYTHING_RANGE) { + return this; + } assert(keyRange.isSingleKey()); byte[] key = keyRange.getLowerRange(); int position = this.getPKPosition();
