You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2015/10/18 00:28:16 UTC
phoenix git commit: 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)
Repository: phoenix
Updated Branches:
refs/heads/master 416c860f7 -> c0fb05034
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/c0fb0503
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/c0fb0503
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/c0fb0503
Branch: refs/heads/master
Commit: c0fb05034a1a0131afc8f67c03655d5f0f163dba
Parents: 416c860
Author: James Taylor <jt...@salesforce.com>
Authored: Sat Oct 17 15:25:00 2015 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Sat Oct 17 15:25:00 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/c0fb0503/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/c0fb0503/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();