PHOENIX-4292 Filters on Tables and Views with composite PK of VARCHAR fields with sort direction DESC do not work (addendum)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/87f8b1ed Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/87f8b1ed Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/87f8b1ed Branch: refs/heads/4.x-HBase-1.1 Commit: 87f8b1ed0f64f2504fdf6b084f81ad7f98641c77 Parents: 3f453e1 Author: Thomas D'Silva <tdsi...@apache.org> Authored: Mon Oct 23 20:19:15 2017 -0700 Committer: James Taylor <jtay...@salesforce.com> Committed: Wed Nov 15 10:41:23 2017 -0800 ---------------------------------------------------------------------- .../java/org/apache/phoenix/end2end/ViewIT.java | 202 ++++++++++++------- 1 file changed, 129 insertions(+), 73 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/87f8b1ed/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java index 66e2430..5c0d100 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java @@ -791,77 +791,133 @@ public class ViewIT extends BaseViewIT { assertArrayEquals(expectedPKs, actualPKs); } - @Test - public void testCompositeDescPK() throws SQLException { - Properties props = new Properties(); - try (Connection globalConn = DriverManager.getConnection(getUrl(), props)) { - String tableName = generateUniqueName(); - String viewName = generateUniqueName(); - - // create global base table - globalConn.createStatement().execute("CREATE TABLE " + tableName - + " (TENANT_ID CHAR(15) NOT NULL, KEY_PREFIX CHAR(3) NOT NULL, CREATED_DATE DATE, CREATED_BY CHAR(15), SYSTEM_MODSTAMP DATE CONSTRAINT PK PRIMARY KEY (TENANT_ID, KEY_PREFIX)) VERSIONS=1, MULTI_TENANT=true, IMMUTABLE_ROWS=TRUE, REPLICATION_SCOPE=1"); - - // create various tenant specific views - globalConn.createStatement() - .execute("CREATE VIEW " + viewName - + " (pk1 VARCHAR(10) NOT NULL, pk2 VARCHAR(10) NOT NULL, col1 DATE, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM " - + tableName + " WHERE KEY_PREFIX = 'abc' "); - - String tenantId = "tenantId"; - Properties tenantProps = new Properties(); - tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId); - // create a tenant specific view - try (Connection tenantConn = DriverManager.getConnection(getUrl(), tenantProps)) { - // upsert rows - tenantConn.createStatement().execute("UPSERT INTO " + viewName - + " (pk1, pk2, col1, col3) VALUES ('testa', 'testb', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); - tenantConn.createStatement().execute("UPSERT INTO " + viewName - + " (pk1, pk2, col1, col3) VALUES ('testa', 'testc', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); - tenantConn.createStatement().execute("UPSERT INTO " + viewName - + " (pk1, pk2, col1, col3) VALUES ('testa', 'testd', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); - tenantConn.createStatement().execute("UPSERT INTO " + viewName - + " (pk1, pk2, col1, col3) VALUES ('testa', 'teste', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); - tenantConn.createStatement().execute("UPSERT INTO " + viewName - + " (pk1, pk2, col1, col3) VALUES ('testb', 'testa', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); - tenantConn.commit(); - - // run queries - ResultSet rs = tenantConn.createStatement() - .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 = 'testa'"); - assertTrue(rs.next()); - assertEquals(4, rs.getLong(1)); - assertFalse(rs.next()); - - rs = tenantConn.createStatement().executeQuery("SELECT count(*) FROM " + viewName); - assertTrue(rs.next()); - assertEquals(5, rs.getLong(1)); - assertFalse(rs.next()); - - rs = tenantConn.createStatement() - .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 >= 'testa'"); - assertTrue(rs.next()); - assertEquals(5, rs.getLong(1)); - assertFalse(rs.next()); - - rs = tenantConn.createStatement() - .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 <= 'testa'"); - assertTrue(rs.next()); - assertEquals(4, rs.getLong(1)); - assertFalse(rs.next()); - - rs = tenantConn.createStatement() - .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 > 'testa'"); - assertTrue(rs.next()); - assertEquals(1, rs.getLong(1)); - assertFalse(rs.next()); - - rs = tenantConn.createStatement() - .executeQuery("SELECT count(*) FROM " + viewName + " WHERE pk1 < 'testa'"); - assertTrue(rs.next()); - assertEquals(0, rs.getLong(1)); - assertFalse(rs.next()); - } - } - } + @Test + public void testCompositeDescPK() throws SQLException { + Properties props = new Properties(); + try (Connection globalConn = DriverManager.getConnection(getUrl(), props)) { + String tableName = generateUniqueName(); + String viewName1 = generateUniqueName(); + String viewName2 = generateUniqueName(); + String viewName3 = generateUniqueName(); + String viewName4 = generateUniqueName(); + + // create global base table + globalConn.createStatement().execute("CREATE TABLE " + tableName + + " (TENANT_ID CHAR(15) NOT NULL, KEY_PREFIX CHAR(3) NOT NULL, CREATED_DATE DATE, CREATED_BY CHAR(15), SYSTEM_MODSTAMP DATE CONSTRAINT PK PRIMARY KEY (TENANT_ID, KEY_PREFIX)) VERSIONS=1, MULTI_TENANT=true, IMMUTABLE_ROWS=TRUE, REPLICATION_SCOPE=1"); + + String tenantId = "tenantId"; + Properties tenantProps = new Properties(); + tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId); + // create a tenant specific view + try (Connection tenantConn = DriverManager.getConnection(getUrl(), tenantProps)) { + // create various tenant specific views + // view with composite PK with multiple PK values of VARCHAR values DESC + tenantConn.createStatement() + .execute("CREATE VIEW " + viewName1 + + " (pk1 VARCHAR(10) NOT NULL, pk2 VARCHAR(10) NOT NULL, col1 DATE, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM " + + tableName + " WHERE KEY_PREFIX = 'abc' "); + // view with composite PK with single pk value DESC + tenantConn.createStatement() + .execute("CREATE VIEW " + viewName2 + + " (pk1 VARCHAR(10) NOT NULL, pk2 VARCHAR(10) NOT NULL, col1 DATE, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM " + + tableName + " WHERE KEY_PREFIX = 'abc' "); + + // upsert rows + upsertRows(viewName1, tenantConn); + upsertRows(viewName2, tenantConn); + + // run queries + String[] whereClauses = + new String[] { "pk1 = 'testa'", "", "pk1 >= 'testa'", "pk1 <= 'testa'", + "pk1 > 'testa'", "pk1 < 'testa'" }; + long[] expectedArray = new long[] { 4, 5, 5, 4, 1, 0 }; + validate(viewName1, tenantConn, whereClauses, expectedArray); + validate(viewName2, tenantConn, whereClauses, expectedArray); + + // view with composite PK with multiple Date PK values DESC + tenantConn.createStatement() + .execute("CREATE VIEW " + viewName3 + + " (pk1 DATE(10) NOT NULL, pk2 DATE(10) NOT NULL, col1 VARCHAR(10), col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC)) AS SELECT * FROM " + + tableName + " WHERE KEY_PREFIX = 'ab3' "); + + tenantConn.createStatement().execute("UPSERT INTO " + viewName3 + + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:00:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName3 + + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:01:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName3 + + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:02:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName3 + + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:03:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName3 + + " (pk1, pk2, col1, col3) VALUES (TO_DATE('2017-10-16 23:00:00', 'yyyy-MM-dd HH:mm:ss'), TO_DATE('2017-10-16 21:04:00', 'yyyy-MM-dd HH:mm:ss'), 'txt1', 10)"); + tenantConn.commit(); + + String[] view3WhereClauses = + new String[] { + "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", "", + "pk1 >= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", + "pk1 <= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", + "pk1 > TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", + "pk1 < TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')" }; + validate(viewName3, tenantConn, view3WhereClauses, expectedArray); + + tenantConn.createStatement() + .execute("CREATE VIEW " + viewName4 + + " (pk1 DATE(10) NOT NULL, pk2 DECIMAL NOT NULL, pk3 VARCHAR(10) NOT NULL, col3 DECIMAL CONSTRAINT PK PRIMARY KEY (pk1 DESC, pk2 DESC, pk3 DESC)) AS SELECT * FROM " + + tableName + " WHERE KEY_PREFIX = 'ab4' "); + + tenantConn.createStatement().execute("UPSERT INTO " + viewName4 + + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 1, 'txt1', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName4 + + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 2, 'txt2', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName4 + + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 3, 'txt3', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName4 + + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 4, 'txt4', 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName4 + + " (pk1, pk2, pk3, col3) VALUES (TO_DATE('2017-10-16 23:00:00', 'yyyy-MM-dd HH:mm:ss'), 1, 'txt1', 10)"); + tenantConn.commit(); + + String[] view4WhereClauses = + new String[] { + "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", + "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss') AND pk2 = 2", + "pk1 = TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss') AND pk2 > 2", + "", "pk1 >= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", + "pk1 <= TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", + "pk1 > TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')", + "pk1 < TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss')" }; + long[] view4ExpectedArray = new long[] { 4, 1, 2, 5, 5, 4, 1, 0 }; + validate(viewName4, tenantConn, view4WhereClauses, view4ExpectedArray); + + } + } + } + + private void validate(String viewName, Connection tenantConn, String[] whereClauseArray, + long[] expectedArray) throws SQLException { + for (int i = 0; i < whereClauseArray.length; ++i) { + String where = !whereClauseArray[i].isEmpty() ? (" WHERE " + whereClauseArray[i]) : ""; + ResultSet rs = + tenantConn.createStatement() + .executeQuery("SELECT count(*) FROM " + viewName + where); + assertTrue(rs.next()); + assertEquals(expectedArray[i], rs.getLong(1)); + assertFalse(rs.next()); + } + } + + private void upsertRows(String viewName1, Connection tenantConn) throws SQLException { + tenantConn.createStatement().execute("UPSERT INTO " + viewName1 + + " (pk1, pk2, col1, col3) VALUES ('testa', 'testb', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName1 + + " (pk1, pk2, col1, col3) VALUES ('testa', 'testc', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName1 + + " (pk1, pk2, col1, col3) VALUES ('testa', 'testd', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName1 + + " (pk1, pk2, col1, col3) VALUES ('testa', 'teste', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); + tenantConn.createStatement().execute("UPSERT INTO " + viewName1 + + " (pk1, pk2, col1, col3) VALUES ('testb', 'testa', TO_DATE('2017-10-16 22:00:00', 'yyyy-MM-dd HH:mm:ss'), 10)"); + tenantConn.commit(); + } }