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/03/22 07:07:04 UTC
[1/2] phoenix git commit: PHOENIX-1753 Query with RVC that doesn't
lead with the row key can return incorrect results
Repository: phoenix
Updated Branches:
refs/heads/3.0 5b453e39b -> 7ccd2542c
PHOENIX-1753 Query with RVC that doesn't lead with the row key can return incorrect results
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/decb89d3
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/decb89d3
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/decb89d3
Branch: refs/heads/3.0
Commit: decb89d3241349e9c11c516dc985a5430a6206ad
Parents: 5b453e3
Author: James Taylor <jt...@salesforce.com>
Authored: Thu Mar 19 18:54:57 2015 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Sat Mar 21 23:02:04 2015 -0700
----------------------------------------------------------------------
.../phoenix/end2end/RowValueConstructorIT.java | 33 +++++++++++++++++++-
.../apache/phoenix/compile/WhereOptimizer.java | 4 +++
.../phoenix/compile/WhereOptimizerTest.java | 16 ++++++++++
3 files changed, 52 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/decb89d3/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 8d67fa4..3859785 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
@@ -1362,6 +1362,37 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT {
conn.close();
}
-
+ @Test
+ public void testRVCWithRowKeyNotLeading() throws Exception {
+ String ddl = "CREATE TABLE sorttest4 (rownum BIGINT primary key, name varchar(16), age integer)";
+ Connection conn = nextConnection(getUrl());
+ conn.createStatement().execute(ddl);
+ conn.close();
+ conn = nextConnection(getUrl());
+ String dml = "UPSERT INTO sorttest4 (rownum, name, age) values (?, ?, ?)";
+ PreparedStatement stmt = conn.prepareStatement(dml);
+ stmt.setInt(1, 1);
+ stmt.setString(2, "A");
+ stmt.setInt(3, 1);
+ stmt.executeUpdate();
+ stmt.setInt(1, 2);
+ stmt.setString(2, "B");
+ stmt.setInt(3, 2);
+ stmt.executeUpdate();
+ conn.commit();
+ conn.close();
+ // the below query should only return one record -> (1, "A", 1)
+ String query = "SELECT rownum, name, age FROM sorttest4 where (age, rownum) < (2, 2)";
+ conn = nextConnection(getUrl());
+ ResultSet rs = conn.createStatement().executeQuery(query);
+ int numRecords = 0;
+ while (rs.next()) {
+ assertEquals(1, rs.getInt(1));
+ assertEquals("A", rs.getString(2));
+ assertEquals(1, rs.getInt(3));
+ numRecords++;
+ }
+ assertEquals(1, numRecords);
+ }
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/decb89d3/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 bc9e8e8..ea08721 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,6 +541,10 @@ 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;
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/decb89d3/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java
index b334013..0d0903e 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java
@@ -1248,6 +1248,22 @@ public class WhereOptimizerTest extends BaseConnectionlessQueryTest {
}
@Test
+ public void testRVCExpressionWithNonFirstLeadingColOfRowKey() throws SQLException {
+ String old_value = "value";
+ String orgId = getOrganizationId();
+
+ String query = "select * from entity_history where (old_value, organization_id) >= (?,?)";
+ List<Object> binds = Arrays.<Object>asList(old_value, orgId);
+ StatementContext context = compileStatement(query, binds);
+ Scan scan = context.getScan();
+ Filter filter = scan.getFilter();
+ assertNotNull(filter);
+ assertTrue(filter instanceof SingleKeyValueComparisonFilter);
+ assertArrayEquals(HConstants.EMPTY_START_ROW, scan.getStartRow());
+ assertArrayEquals(HConstants.EMPTY_END_ROW, scan.getStopRow());
+ }
+
+ @Test
public void testMultiRVCExpressionsCombinedWithAnd() throws SQLException {
String lowerTenantId = "000000000000001";
String lowerParentId = "000000000000002";
[2/2] phoenix git commit: PHOENIX-1703 Fail connection when server
minor version is less than client minor version
Posted by ja...@apache.org.
PHOENIX-1703 Fail connection when server minor version is less than client minor version
Conflicts:
phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/7ccd2542
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/7ccd2542
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/7ccd2542
Branch: refs/heads/3.0
Commit: 7ccd2542cd16f8c10aada5e407f1745819d06a03
Parents: decb89d
Author: James Taylor <jt...@salesforce.com>
Authored: Thu Mar 19 22:23:20 2015 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Sat Mar 21 23:05:31 2015 -0700
----------------------------------------------------------------------
.../org/apache/phoenix/util/MetaDataUtil.java | 14 ++++++++++----
.../org/apache/phoenix/util/MetaDataUtilTest.java | 18 ++++++++++--------
2 files changed, 20 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7ccd2542/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java
index 608bfc2..b1ecc47 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java
@@ -65,21 +65,22 @@ public class MetaDataUtil {
public static final byte[] VIEW_INDEX_SEQUENCE_PREFIX_BYTES = Bytes.toBytes(VIEW_INDEX_SEQUENCE_PREFIX);
public static final String VIEW_INDEX_ID_COLUMN_NAME = "_INDEX_ID";
- public static boolean areClientAndServerCompatible(long version) {
+ public static boolean areClientAndServerCompatible(long serverHBaseAndPhoenixVersion) {
// As of 3.0, we allow a client and server to differ for the minor version.
// Care has to be taken to upgrade the server before the client, as otherwise
// the client may call expressions that don't yet exist on the server.
// Differing by the patch version has always been allowed.
// Only differing by the major version is not allowed.
- return areClientAndServerCompatible(MetaDataUtil.decodePhoenixVersion(version), MetaDataProtocol.PHOENIX_MAJOR_VERSION);
+ return areClientAndServerCompatible(MetaDataUtil.decodePhoenixVersion(serverHBaseAndPhoenixVersion), MetaDataProtocol.PHOENIX_MAJOR_VERSION, MetaDataProtocol.PHOENIX_MINOR_VERSION);
}
// Default scope for testing
- static boolean areClientAndServerCompatible(int version, int pMajor) {
+ static boolean areClientAndServerCompatible(int serverVersion, int clientMajorVersion, int clientMinorVersion) {
// A server and client with the same major and minor version number must be compatible.
// So it's important that we roll the PHOENIX_MAJOR_VERSION or PHOENIX_MINOR_VERSION
// when we make an incompatible change.
- return VersionUtil.encodeMaxMinorVersion(pMajor) >= version && VersionUtil.encodeMinMinorVersion(pMajor) <= version;
+ return VersionUtil.encodeMinPatchVersion(clientMajorVersion, clientMinorVersion) <= serverVersion && // Minor major and minor cannot be ahead of server
+ VersionUtil.encodeMaxMinorVersion(clientMajorVersion) >= serverVersion; // Major version must at least be up to server version
}
// Given the encoded integer representing the phoenix version in the encoded version value.
@@ -115,6 +116,11 @@ public class MetaDataUtil {
return major + "." + minor + "." + patch;
}
+ public static int encodePhoenixVersion() {
+ return VersionUtil.encodeVersion(MetaDataProtocol.PHOENIX_MAJOR_VERSION, MetaDataProtocol.PHOENIX_MINOR_VERSION,
+ MetaDataProtocol.PHOENIX_PATCH_NUMBER);
+ }
+
public static long encodeHBaseAndPhoenixVersions(String hbaseVersion) {
return (((long) VersionUtil.encodeVersion(hbaseVersion)) << (Byte.SIZE * 5)) |
(((long) VersionUtil.encodeVersion(MetaDataProtocol.PHOENIX_MAJOR_VERSION, MetaDataProtocol.PHOENIX_MINOR_VERSION,
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7ccd2542/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java b/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java
index f0334f5..25b2cc1 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java
@@ -46,14 +46,16 @@ public class MetaDataUtilTest {
@Test
public void testCompatibility() {
- assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,1), 1));
- assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,10), 1));
- assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,0), 1));
- assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,255), 1));
- assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,2,0), 2));
- assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,10,36), 2));
- assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 4));
- assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 2));
+ assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,1), 1, 2));
+ assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,10), 1, 1));
+ assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,0), 1, 2));
+ assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,255), 1, 2));
+ assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,2,0), 2, 0));
+ assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,10,36), 2, 9));
+ assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 4, 0));
+ assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 2, 0));
+ assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 3, 2));
+ assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 3, 5));
}
/**