http://git-wip-us.apache.org/repos/asf/phoenix/blob/678563f5/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java index 578a3af..792d08f 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java @@ -17,17 +17,7 @@ */ package org.apache.phoenix.end2end; -import static org.apache.phoenix.util.TestUtil.ROW1; -import static org.apache.phoenix.util.TestUtil.ROW2; -import static org.apache.phoenix.util.TestUtil.ROW3; -import static org.apache.phoenix.util.TestUtil.ROW4; -import static org.apache.phoenix.util.TestUtil.ROW5; -import static org.apache.phoenix.util.TestUtil.ROW6; -import static org.apache.phoenix.util.TestUtil.ROW7; -import static org.apache.phoenix.util.TestUtil.ROW8; -import static org.apache.phoenix.util.TestUtil.ROW9; import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; -import static org.apache.phoenix.util.TestUtil.assertResultSet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -40,83 +30,10 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; -import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.util.PropertiesUtil; import org.junit.Test; - -public class OrderByIT extends ParallelStatsDisabledIT { - - @Test - public void testMultiOrderByExpr() throws Exception { - String tenantId = getOrganizationId(); - String tableName = initATableValues(tenantId, getDefaultSplits(tenantId), getUrl()); - String query = "SELECT entity_id FROM " + tableName + " ORDER BY b_string, entity_id"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue (rs.next()); - assertEquals(ROW1,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW4,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW7,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW2,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW5,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW8,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW3,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW6,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW9,rs.getString(1)); - - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - - @Test - public void testDescMultiOrderByExpr() throws Exception { - String tenantId = getOrganizationId(); - String tableName = initATableValues(tenantId, getDefaultSplits(tenantId), getUrl()); - String query = "SELECT entity_id FROM " + tableName + " ORDER BY b_string || entity_id desc"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue (rs.next()); - assertEquals(ROW9,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW6,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW3,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW8,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW5,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW2,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW7,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW4,rs.getString(1)); - assertTrue (rs.next()); - assertEquals(ROW1,rs.getString(1)); - - assertFalse(rs.next()); - } finally { - conn.close(); - } - } +public class OrderByIT extends BaseOrderByIT { @Test public void testOrderByWithPosition() throws Exception { @@ -151,8 +68,8 @@ public class OrderByIT extends ParallelStatsDisabledIT { assertTrue(rs.next()); assertEquals(1,rs.getInt(1)); assertTrue(rs.next()); - assertEquals(1,rs.getInt(1)); - assertFalse(rs.next()); + assertEquals(1,rs.getInt(1)); + assertFalse(rs.next()); query = "select a_string x, col1 y from " + tableName + " order by x"; rs = conn.createStatement().executeQuery(query); @@ -163,9 +80,9 @@ public class OrderByIT extends ParallelStatsDisabledIT { assertEquals("b",rs.getString(1)); assertEquals(20,rs.getInt(2)); assertTrue(rs.next()); - assertEquals("c",rs.getString(1)); + assertEquals("c",rs.getString(1)); assertEquals(30,rs.getInt(2)); - assertFalse(rs.next()); + assertFalse(rs.next()); query = "select * from " + tableName + " order by 2"; rs = conn.createStatement().executeQuery(query); @@ -173,113 +90,12 @@ public class OrderByIT extends ParallelStatsDisabledIT { assertEquals("b",rs.getString(1)); assertEquals(20,rs.getInt(2)); assertTrue(rs.next()); - assertEquals("c",rs.getString(1)); - assertEquals(30,rs.getInt(2)); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals(40,rs.getInt(2)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - - @Test - public void testColumnFamily() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - conn.setAutoCommit(false); - - try { - String tableName = generateUniqueName(); - String ddl = "CREATE TABLE " + tableName + - " (a_string varchar not null, cf1.a integer, cf1.b varchar, col1 integer, cf2.c varchar, cf2.d integer, col2 integer" + - " CONSTRAINT pk PRIMARY KEY (a_string))\n"; - createTestTable(getUrl(), ddl); - String dml = "UPSERT INTO " + tableName + " VALUES(?,?,?,?,?,?,?)"; - PreparedStatement stmt = conn.prepareStatement(dml); - stmt.setString(1, "a"); - stmt.setInt(2, 40); - stmt.setString(3, "aa"); - stmt.setInt(4, 10); - stmt.setString(5, "bb"); - stmt.setInt(6, 20); - stmt.setInt(7, 1); - stmt.execute(); - stmt.setString(1, "c"); - stmt.setInt(2, 30); - stmt.setString(3, "cc"); - stmt.setInt(4, 50); - stmt.setString(5, "dd"); - stmt.setInt(6, 60); - stmt.setInt(7, 3); - stmt.execute(); - stmt.setString(1, "b"); - stmt.setInt(2, 40); - stmt.setString(3, "bb"); - stmt.setInt(4, 5); - stmt.setString(5, "aa"); - stmt.setInt(6, 80); - stmt.setInt(7, 2); - stmt.execute(); - conn.commit(); - - String query = "select * from " + tableName + " order by 2, 5"; - ResultSet rs = conn.createStatement().executeQuery(query); - assertTrue(rs.next()); assertEquals("c",rs.getString(1)); assertEquals(30,rs.getInt(2)); - assertEquals("cc",rs.getString(3)); - assertEquals(50,rs.getInt(4)); - assertEquals("dd",rs.getString(5)); - assertEquals(60,rs.getInt(6)); - assertEquals(3,rs.getInt(7)); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); - assertEquals(40,rs.getInt(2)); - assertEquals("bb",rs.getString(3)); - assertEquals(5,rs.getInt(4)); - assertEquals("aa",rs.getString(5)); - assertEquals(80,rs.getInt(6)); - assertEquals(2,rs.getInt(7)); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals(40,rs.getInt(2)); - assertEquals("aa",rs.getString(3)); - assertEquals(10,rs.getInt(4)); - assertEquals("bb",rs.getString(5)); - assertEquals(20,rs.getInt(6)); - assertEquals(1,rs.getInt(7)); - assertFalse(rs.next()); - - query = "select * from " + tableName + " order by 7"; - rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals(40,rs.getInt(2)); - assertEquals("aa",rs.getString(3)); - assertEquals(10,rs.getInt(4)); - assertEquals("bb",rs.getString(5)); - assertEquals(20,rs.getInt(6)); - assertEquals(1,rs.getInt(7)); - assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); + assertEquals("a",rs.getString(1)); assertEquals(40,rs.getInt(2)); - assertEquals("bb",rs.getString(3)); - assertEquals(5,rs.getInt(4)); - assertEquals("aa",rs.getString(5)); - assertEquals(80,rs.getInt(6)); - assertEquals(2,rs.getInt(7)); - assertTrue(rs.next()); - assertEquals("c",rs.getString(1)); - assertEquals(30,rs.getInt(2)); - assertEquals("cc",rs.getString(3)); - assertEquals(50,rs.getInt(4)); - assertEquals("dd",rs.getString(5)); - assertEquals(60,rs.getInt(6)); - assertEquals(3,rs.getInt(7)); - assertFalse(rs.next()); + assertFalse(rs.next()); } finally { conn.close(); } @@ -343,19 +159,19 @@ public class OrderByIT extends ParallelStatsDisabledIT { String query = "select t1.* from " + tableName1 + " t1 join " + tableName2 + " t2 on t1.a_string = t2.a_string order by 3"; ResultSet rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); + assertEquals("a",rs.getString(1)); assertEquals(40,rs.getInt(2)); assertEquals("aa",rs.getString(3)); assertEquals(10,rs.getInt(4)); assertEquals("bb",rs.getString(5)); assertEquals(20,rs.getInt(6)); assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); + assertEquals("b",rs.getString(1)); assertEquals(40,rs.getInt(2)); assertEquals("bb",rs.getString(3)); assertEquals(5,rs.getInt(4)); assertEquals("aa",rs.getString(5)); - assertEquals(80,rs.getInt(6)); + assertEquals(80,rs.getInt(6)); assertTrue(rs.next()); assertEquals("c",rs.getString(1)); assertEquals(30,rs.getInt(2)); @@ -363,20 +179,20 @@ public class OrderByIT extends ParallelStatsDisabledIT { assertEquals(50,rs.getInt(4)); assertEquals("dd",rs.getString(5)); assertEquals(60,rs.getInt(6)); - assertFalse(rs.next()); + assertFalse(rs.next()); query = "select t1.a_string, t2.col1 from " + tableName1 + " t1 join " + tableName2 + " t2 on t1.a_string = t2.a_string order by 2"; rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); - assertEquals("b",rs.getString(1)); + assertEquals("b",rs.getString(1)); assertEquals(20,rs.getInt(2)); assertTrue(rs.next()); - assertEquals("c",rs.getString(1)); + assertEquals("c",rs.getString(1)); assertEquals(30,rs.getInt(2)); assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); + assertEquals("a",rs.getString(1)); assertEquals(40,rs.getInt(2)); - assertFalse(rs.next()); + assertFalse(rs.next()); } finally { conn.close(); } @@ -441,24 +257,24 @@ public class OrderByIT extends ParallelStatsDisabledIT { String query = "select a_string, cf2.d from " + tableName1 + " union all select * from " + tableName2 + " order by 2"; ResultSet rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); - assertEquals("bb",rs.getString(1)); + assertEquals("bb",rs.getString(1)); assertEquals(10,rs.getInt(2)); assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals(20,rs.getInt(2)); + assertEquals("a",rs.getString(1)); + assertEquals(20,rs.getInt(2)); assertTrue(rs.next()); assertEquals("cc",rs.getString(1)); assertEquals(30,rs.getInt(2)); assertTrue(rs.next()); - assertEquals("aa",rs.getString(1)); + assertEquals("aa",rs.getString(1)); assertEquals(40,rs.getInt(2)); assertTrue(rs.next()); - assertEquals("c",rs.getString(1)); - assertEquals(60,rs.getInt(2)); + assertEquals("c",rs.getString(1)); + assertEquals(60,rs.getInt(2)); assertTrue(rs.next()); assertEquals("b",rs.getString(1)); assertEquals(80,rs.getInt(2)); - assertFalse(rs.next()); + assertFalse(rs.next()); } finally { conn.close(); } @@ -514,7 +330,8 @@ public class OrderByIT extends ParallelStatsDisabledIT { conn.close(); } } - + + @Test public void testOrderByRVC() throws Exception { Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); @@ -546,636 +363,102 @@ public class OrderByIT extends ParallelStatsDisabledIT { } @Test - public void testAggregateOrderBy() throws Exception { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String tableName = generateUniqueName(); - String ddl = "create table " + tableName + " (ID VARCHAR NOT NULL PRIMARY KEY, VAL1 VARCHAR, VAL2 INTEGER)"; - conn.createStatement().execute(ddl); - - conn.createStatement().execute("upsert into " + tableName + " values ('ABC','aa123', 11)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABD','ba124', 1)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABE','cf125', 13)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABF','dan126', 4)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABG','elf127', 15)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABH','fan128', 6)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAA','get211', 100)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAB','hat212', 7)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAC','aap12', 2)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAD','ball12', 3)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAE','inn2110', 13)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAF','key2112', 40)"); - conn.commit(); - - ResultSet rs; - PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class); - rs = stmt.executeQuery("select distinct ID, VAL1, VAL2 from " + tableName + " where ID in ('ABC','ABD','ABE','ABF','ABG','ABH','AAA', 'AAB', 'AAC','AAD','AAE','AAF') order by VAL1"); - assertFalse(stmt.getQueryPlan().getOrderBy().getOrderByExpressions().isEmpty()); - assertTrue(rs.next()); - assertEquals("ABC", rs.getString(1)); - assertEquals("aa123", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("aap12", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("ba124", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("ball12", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("cf125", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("dan126", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("elf127", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("fan128", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("get211", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("hat212", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("inn2110", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("AAF", rs.getString(1)); - assertEquals("key2112", rs.getString(2)); - assertFalse(rs.next()); - } - - @Test - public void testAggregateOptimizedOutOrderBy() throws Exception { + public void testColumnFamily() throws Exception { Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(getUrl(), props); - String tableName = generateUniqueName(); - String ddl = "create table " + tableName + " (K1 VARCHAR NOT NULL, K2 VARCHAR NOT NULL, VAL1 VARCHAR, VAL2 INTEGER, CONSTRAINT pk PRIMARY KEY(K1,K2))"; - conn.createStatement().execute(ddl); - - conn.createStatement().execute("upsert into " + tableName + " values ('ABC','ABC','aa123', 11)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABD','ABC','ba124', 1)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABE','ABC','cf125', 13)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABF','ABC','dan126', 4)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABG','ABC','elf127', 15)"); - conn.createStatement().execute("upsert into " + tableName + " values ('ABH','ABC','fan128', 6)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAA','ABC','get211', 100)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAB','ABC','hat212', 7)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAC','ABC','aap12', 2)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAD','ABC','ball12', 3)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAE','ABC','inn2110', 13)"); - conn.createStatement().execute("upsert into " + tableName + " values ('AAF','ABC','key2112', 40)"); - conn.commit(); - - ResultSet rs; - PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class); - rs = stmt.executeQuery("select distinct K2, VAL1, VAL2 from " + tableName + " where K2 = 'ABC' order by VAL1"); - assertTrue(stmt.getQueryPlan().getOrderBy().getOrderByExpressions().isEmpty()); - assertTrue(rs.next()); - assertEquals("ABC", rs.getString(1)); - assertEquals("aa123", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("aap12", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("ba124", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("ball12", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("cf125", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("dan126", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("elf127", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("fan128", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("get211", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("hat212", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("inn2110", rs.getString(2)); - assertTrue(rs.next()); - assertEquals("ABC", rs.getString(1)); - assertEquals("key2112", rs.getString(2)); - assertFalse(rs.next()); - } - - @Test - public void testNullsLastWithDesc() throws Exception { - Connection conn=null; - try { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - - String tableName=generateUniqueName(); - String sql="CREATE TABLE "+tableName+" ( "+ - "ORGANIZATION_ID VARCHAR,"+ - "CONTAINER_ID VARCHAR,"+ - "ENTITY_ID VARCHAR NOT NULL,"+ - "CONSTRAINT TEST_PK PRIMARY KEY ( "+ - "ORGANIZATION_ID DESC,"+ - "CONTAINER_ID DESC,"+ - "ENTITY_ID"+ - "))"; - conn.createStatement().execute(sql); - - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES ('a',null,'11')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (null,'2','22')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES ('c','3','33')"); - conn.commit(); - - //-----ORGANIZATION_ID - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID ASC NULLS FIRST"; - ResultSet rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{null,"a"},{"3","c"},}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{"3","c"},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{"3","c"},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{null,"a"},{"2",null}}); - - //----CONTAINER_ID - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{"2",null},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{"3","c"},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{"3","c"},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{"2",null},{null,"a"}}); - - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (null,null,'44')"); - conn.commit(); - - //-----ORGANIZATION_ID ASC CONTAINER_ID ASC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS FIRST,CONTAINER_ID NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{"2",null},{null,"a"},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS FIRST,CONTAINER_ID NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{null,null},{null,"a"},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS LAST,CONTAINER_ID NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{"3","c"},{null,null},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS LAST,CONTAINER_ID NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{"3","c"},{"2",null},{null,null}}); - - - //-----ORGANIZATION_ID ASC CONTAINER_ID DESC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS FIRST,CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{"2",null},{null,"a"},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS FIRST,CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{null,null},{null,"a"},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS LAST,CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{"3","c"},{null,null},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID NULLS LAST,CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{"3","c"},{"2",null},{null,null}}); - - //-----ORGANIZATION_ID DESC CONTAINER_ID ASC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS FIRST,CONTAINER_ID NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{"2",null},{"3","c"},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS FIRST,CONTAINER_ID NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{null,null},{"3","c"},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS LAST,CONTAINER_ID NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{null,"a"},{null,null},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS LAST,CONTAINER_ID NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{null,"a"},{"2",null},{null,null}}); - - //-----ORGANIZATION_ID DESC CONTAINER_ID DESC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS FIRST,CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{"2",null},{"3","c"},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS FIRST,CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{null,null},{"3","c"},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS LAST,CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{null,"a"},{null,null},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by ORGANIZATION_ID DESC NULLS LAST,CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{null,"a"},{"2",null},{null,null}}); - - //-----CONTAINER_ID ASC ORGANIZATION_ID ASC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID NULLS FIRST,ORGANIZATION_ID NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{null,"a"},{"2",null},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID NULLS FIRST,ORGANIZATION_ID NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{null,null},{"2",null},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID NULLS LAST,ORGANIZATION_ID NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{"3","c"},{null,null},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID NULLS LAST,ORGANIZATION_ID NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{"3","c"},{null,"a"},{null,null}}); - - //-----CONTAINER_ID ASC ORGANIZATION_ID DESC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID ASC NULLS FIRST,ORGANIZATION_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{null,"a"},{"2",null},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID ASC NULLS FIRST,ORGANIZATION_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{null,null},{"2",null},{"3","c"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID ASC NULLS LAST,ORGANIZATION_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{"3","c"},{null,null},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID ASC NULLS LAST,ORGANIZATION_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"2",null},{"3","c"},{null,"a"},{null,null}}); - - //-----CONTAINER_ID DESC ORGANIZATION_ID ASC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS FIRST,ORGANIZATION_ID ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{null,"a"},{"3","c"},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS FIRST,ORGANIZATION_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{null,null},{"3","c"},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS LAST,ORGANIZATION_ID ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{"2",null},{null,null},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS LAST,ORGANIZATION_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{"2",null},{null,"a"},{null,null}}); - - //-----CONTAINER_ID DESC ORGANIZATION_ID DESC - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS FIRST,ORGANIZATION_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,null},{null,"a"},{"3","c"},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS FIRST,ORGANIZATION_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{null,"a"},{null,null},{"3","c"},{"2",null}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS LAST,ORGANIZATION_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{"2",null},{null,null},{null,"a"}}); - - sql="SELECT CONTAINER_ID,ORGANIZATION_ID FROM "+tableName+" order by CONTAINER_ID DESC NULLS LAST,ORGANIZATION_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new String[][]{{"3","c"},{"2",null},{null,"a"},{null,null}}); - } finally { - if(conn!=null) { - conn.close(); - } - } - } - - @Test - public void testOrderByReverseOptimization() throws Exception { - for(boolean salted: new boolean[]{true,false}) { - doTestOrderByReverseOptimization(salted,true,true,true); - doTestOrderByReverseOptimization(salted,true,true,false); - doTestOrderByReverseOptimization(salted,true,false,true); - doTestOrderByReverseOptimization(salted,true,false,false); - doTestOrderByReverseOptimization(salted,false,true,true); - doTestOrderByReverseOptimization(salted,false,true,false); - doTestOrderByReverseOptimization(salted,false,false,true); - doTestOrderByReverseOptimization(salted,false,false,false); - } - } - - private void doTestOrderByReverseOptimization(boolean salted,boolean desc1,boolean desc2,boolean desc3) throws Exception { - Connection conn = null; - try { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String tableName=generateUniqueName(); - String sql="CREATE TABLE "+tableName+" ( "+ - "ORGANIZATION_ID INTEGER NOT NULL,"+ - "CONTAINER_ID INTEGER NOT NULL,"+ - "SCORE INTEGER NOT NULL,"+ - "ENTITY_ID INTEGER NOT NULL,"+ - "CONSTRAINT TEST_PK PRIMARY KEY ( "+ - "ORGANIZATION_ID" +(desc1 ? " DESC" : "" )+","+ - "CONTAINER_ID"+(desc2 ? " DESC" : "" )+","+ - "SCORE"+(desc3 ? " DESC" : "" )+","+ - "ENTITY_ID"+ - ")) "+(salted ? "SALT_BUCKETS =4" : "split on(4)"); - conn.createStatement().execute(sql); - - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (1,1,1,1)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (2,2,2,2)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (3,3,3,3)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (4,4,4,4)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (5,5,5,5)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (6,6,6,6)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (1,1,1,11)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (2,2,2,22)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (3,3,3,33)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (4,4,4,44)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (5,5,5,55)"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (6,6,6,66)"); - conn.commit(); - - //groupBy orderPreserving orderBy asc asc - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC, CONTAINER_ID ASC"; - ResultSet rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{1,1},{2,2},{3,3},{4,4},{5,5},{6,6}}); - - //groupBy orderPreserving orderBy asc desc - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC, CONTAINER_ID desc"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{1,1},{2,2},{3,3},{4,4},{5,5},{6,6}}); - - //groupBy orderPreserving orderBy desc asc - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC, CONTAINER_ID DESC"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{6,6},{5,5},{4,4},{3,3},{2,2},{1,1}}); - - //groupBy orderPreserving orderBy desc desc - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC, CONTAINER_ID DESC"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{6,6},{5,5},{4,4},{3,3},{2,2},{1,1}}); - - //groupBy not orderPreserving orderBy asc asc - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC, SCORE ASC"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{1,1},{2,2},{3,3},{4,4},{5,5},{6,6}}); - - //groupBy not orderPreserving orderBy asc desc - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC, SCORE ASC"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{1,1},{2,2},{3,3},{4,4},{5,5},{6,6}}); - - //groupBy not orderPreserving orderBy desc asc - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC, SCORE DESC"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{6,6},{5,5},{4,4},{3,3},{2,2},{1,1}}); - - //groupBy not orderPreserving orderBy desc desc - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC, SCORE DESC"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{6,6},{5,5},{4,4},{3,3},{2,2},{1,1}}); - } finally { - if(conn!=null) { - conn.close(); - } - } - } - - @Test - public void testOrderByReverseOptimizationWithNullsLast() throws Exception{ - for(boolean salted: new boolean[]{true,false}) { - doTestOrderByReverseOptimizationWithNullsLast(salted,true,true,true); - doTestOrderByReverseOptimizationWithNullsLast(salted,true,true,false); - doTestOrderByReverseOptimizationWithNullsLast(salted,true,false,true); - doTestOrderByReverseOptimizationWithNullsLast(salted,true,false,false); - doTestOrderByReverseOptimizationWithNullsLast(salted,false,true,true); - doTestOrderByReverseOptimizationWithNullsLast(salted,false,true,false); - doTestOrderByReverseOptimizationWithNullsLast(salted,false,false,true); - doTestOrderByReverseOptimizationWithNullsLast(salted,false,false,false); - } - } + conn.setAutoCommit(false); - private void doTestOrderByReverseOptimizationWithNullsLast(boolean salted,boolean desc1,boolean desc2,boolean desc3) throws Exception { - Connection conn = null; try { - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String tableName=generateUniqueName(); - String sql="CREATE TABLE "+tableName+" ( "+ - "ORGANIZATION_ID VARCHAR,"+ - "CONTAINER_ID VARCHAR,"+ - "SCORE VARCHAR,"+ - "ENTITY_ID VARCHAR NOT NULL,"+ - "CONSTRAINT TEST_PK PRIMARY KEY ( "+ - "ORGANIZATION_ID" +(desc1 ? " DESC" : "" )+","+ - "CONTAINER_ID"+(desc2 ? " DESC" : "" )+","+ - "SCORE"+(desc3 ? " DESC" : "" )+","+ - "ENTITY_ID"+ - ")) "+(salted ? "SALT_BUCKETS =4" : "split on('4')"); - conn.createStatement().execute(sql); - - for(int i=1;i<=6;i++) { - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (null,'"+i+"','"+i+"','"+i+"')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (null,'"+i+"',null,'"+i+"')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (null,null,'"+i+"','"+i+"')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (null,null,null,'"+i+"')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES ('"+i+"','"+i+"','"+i+"','"+i+"')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES ('"+i+"','"+i+"',null,'"+i+"')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES ('"+i+"',null,'"+i+"','"+i+"')"); - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES ('"+i+"',null,null,'"+i+"')"); - } - conn.createStatement().execute("UPSERT INTO "+tableName+" VALUES (null,null,null,'66')"); + String tableName = generateUniqueName(); + String ddl = "CREATE TABLE " + tableName + + " (a_string varchar not null, cf1.a integer, cf1.b varchar, col1 integer, cf2.c varchar, cf2.d integer, col2 integer" + + " CONSTRAINT pk PRIMARY KEY (a_string))\n"; + createTestTable(getUrl(), ddl); + String dml = "UPSERT INTO " + tableName + " VALUES(?,?,?,?,?,?,?)"; + PreparedStatement stmt = conn.prepareStatement(dml); + stmt.setString(1, "a"); + stmt.setInt(2, 40); + stmt.setString(3, "aa"); + stmt.setInt(4, 10); + stmt.setString(5, "bb"); + stmt.setInt(6, 20); + stmt.setInt(7, 1); + stmt.execute(); + stmt.setString(1, "c"); + stmt.setInt(2, 30); + stmt.setString(3, "cc"); + stmt.setInt(4, 50); + stmt.setString(5, "dd"); + stmt.setInt(6, 60); + stmt.setInt(7, 3); + stmt.execute(); + stmt.setString(1, "b"); + stmt.setInt(2, 40); + stmt.setString(3, "bb"); + stmt.setInt(4, 5); + stmt.setString(5, "aa"); + stmt.setInt(6, 80); + stmt.setInt(7, 2); + stmt.execute(); conn.commit(); - //groupBy orderPreserving orderBy asc asc - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS FIRST, CONTAINER_ID ASC NULLS FIRST"; - ResultSet rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS FIRST, CONTAINER_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null},{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS LAST, CONTAINER_ID ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"},{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS LAST, CONTAINER_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null}}); - - //groupBy orderPreserving orderBy asc desc - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS FIRST, CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS FIRST, CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null},{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS LAST, CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"},{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID ASC NULLS LAST, CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null}}); - - //groupBy orderPreserving orderBy desc asc - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS FIRST, CONTAINER_ID ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS FIRST, CONTAINER_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null},{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS LAST, CONTAINER_ID ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"},{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS LAST, CONTAINER_ID ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null}}); - - //groupBy orderPreserving orderBy desc desc - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS FIRST, CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS FIRST, CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null},{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS LAST, CONTAINER_ID DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"},{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"}}); - - sql="SELECT ORGANIZATION_ID,CONTAINER_ID FROM "+tableName+" group by ORGANIZATION_ID, CONTAINER_ID ORDER BY ORGANIZATION_ID DESC NULLS LAST, CONTAINER_ID DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null}}); - - //-----groupBy not orderPreserving-- - - //groupBy not orderPreserving orderBy asc asc - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS FIRST, SCORE ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS FIRST, SCORE ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null},{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS LAST, SCORE ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"},{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS LAST, SCORE ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null}}); - - //groupBy not orderPreserving orderBy asc desc - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS FIRST, SCORE DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS FIRST, SCORE DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null},{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS LAST, SCORE DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1",null},{"1","1"},{"2",null},{"2","2"},{"3",null},{"3","3"},{"4",null},{"4","4"},{"5",null},{"5","5"},{"6",null},{"6","6"},{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID ASC NULLS LAST, SCORE DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1","1"},{"1",null},{"2","2"},{"2",null},{"3","3"},{"3",null},{"4","4"},{"4",null},{"5","5"},{"5",null},{"6","6"},{"6",null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null}}); - - //groupBy not orderPreserving orderBy desc asc - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS FIRST, SCORE ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS FIRST, SCORE ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null},{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS LAST, SCORE ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"},{null,null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS LAST, SCORE ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null},{null,"1"},{null,"2"},{null,"3"},{null,"4"},{null,"5"},{null,"6"},{null,null}}); - - //groupBy not orderPreserving orderBy desc desc - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS FIRST, SCORE DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS FIRST, SCORE DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null},{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS LAST, SCORE DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6",null},{"6","6"},{"5",null},{"5","5"},{"4",null},{"4","4"},{"3",null},{"3","3"},{"2",null},{"2","2"},{"1",null},{"1","1"},{null,null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"}}); - - sql="SELECT ORGANIZATION_ID,SCORE FROM "+tableName+" group by ORGANIZATION_ID, SCORE ORDER BY ORGANIZATION_ID DESC NULLS LAST, SCORE DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6","6"},{"6",null},{"5","5"},{"5",null},{"4","4"},{"4",null},{"3","3"},{"3",null},{"2","2"},{"2",null},{"1","1"},{"1",null},{null,"6"},{null,"5"},{null,"4"},{null,"3"},{null,"2"},{null,"1"},{null,null}}); - - //-------test only one return column---------------------------------- - - sql="SELECT SCORE FROM "+tableName+" group by SCORE ORDER BY SCORE ASC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null},{"1"},{"2"},{"3"},{"4"},{"5"},{"6"}}); - - sql="SELECT SCORE FROM "+tableName+" group by SCORE ORDER BY SCORE ASC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"1"},{"2"},{"3"},{"4"},{"5"},{"6"},{null}}); - - sql="SELECT SCORE FROM "+tableName+" group by SCORE ORDER BY SCORE DESC NULLS FIRST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{null},{"6"},{"5"},{"4"},{"3"},{"2"},{"1"}}); + String query = "select * from " + tableName + " order by 2, 5"; + ResultSet rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals("c",rs.getString(1)); + assertEquals(30,rs.getInt(2)); + assertEquals("cc",rs.getString(3)); + assertEquals(50,rs.getInt(4)); + assertEquals("dd",rs.getString(5)); + assertEquals(60,rs.getInt(6)); + assertEquals(3,rs.getInt(7)); + assertTrue(rs.next()); + assertEquals("b",rs.getString(1)); + assertEquals(40,rs.getInt(2)); + assertEquals("bb",rs.getString(3)); + assertEquals(5,rs.getInt(4)); + assertEquals("aa",rs.getString(5)); + assertEquals(80,rs.getInt(6)); + assertEquals(2,rs.getInt(7)); + assertTrue(rs.next()); + assertEquals("a",rs.getString(1)); + assertEquals(40,rs.getInt(2)); + assertEquals("aa",rs.getString(3)); + assertEquals(10,rs.getInt(4)); + assertEquals("bb",rs.getString(5)); + assertEquals(20,rs.getInt(6)); + assertEquals(1,rs.getInt(7)); + assertFalse(rs.next()); - sql="SELECT SCORE FROM "+tableName+" group by SCORE ORDER BY SCORE DESC NULLS LAST"; - rs=conn.prepareStatement(sql).executeQuery(); - assertResultSet(rs, new Object[][]{{"6"},{"5"},{"4"},{"3"},{"2"},{"1"},{null}}); + query = "select * from " + tableName + " order by 7"; + rs = conn.createStatement().executeQuery(query); + assertTrue(rs.next()); + assertEquals("a",rs.getString(1)); + assertEquals(40,rs.getInt(2)); + assertEquals("aa",rs.getString(3)); + assertEquals(10,rs.getInt(4)); + assertEquals("bb",rs.getString(5)); + assertEquals(20,rs.getInt(6)); + assertEquals(1,rs.getInt(7)); + assertTrue(rs.next()); + assertEquals("b",rs.getString(1)); + assertEquals(40,rs.getInt(2)); + assertEquals("bb",rs.getString(3)); + assertEquals(5,rs.getInt(4)); + assertEquals("aa",rs.getString(5)); + assertEquals(80,rs.getInt(6)); + assertEquals(2,rs.getInt(7)); + assertTrue(rs.next()); + assertEquals("c",rs.getString(1)); + assertEquals(30,rs.getInt(2)); + assertEquals("cc",rs.getString(3)); + assertEquals(50,rs.getInt(4)); + assertEquals("dd",rs.getString(5)); + assertEquals(60,rs.getInt(6)); + assertEquals(3,rs.getInt(7)); + assertFalse(rs.next()); } finally { - if(conn!=null) { - conn.close(); - } + conn.close(); } } - -} \ No newline at end of file +}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/678563f5/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelStatsDisabledIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelStatsDisabledIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelStatsDisabledIT.java index 98939da..561aee5 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelStatsDisabledIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParallelStatsDisabledIT.java @@ -18,12 +18,26 @@ package org.apache.phoenix.end2end; +import org.apache.commons.lang.StringUtils; import org.apache.phoenix.query.BaseTest; +import org.apache.phoenix.util.QueryBuilder; +import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.experimental.categories.Category; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + + + /** * Base class for tests whose methods run in parallel with statistics disabled. * You must create unique names using {@link #generateUniqueName()} for each @@ -41,4 +55,30 @@ public abstract class ParallelStatsDisabledIT extends BaseTest { public static void tearDownMiniCluster() throws Exception { BaseTest.tearDownMiniClusterIfBeyondThreshold(); } + + protected ResultSet executeQuery(Connection conn, QueryBuilder queryBuilder) throws SQLException { + PreparedStatement statement = conn.prepareStatement(queryBuilder.build()); + ResultSet rs = statement.executeQuery(); + return rs; + } + + protected ResultSet executeQueryThrowsException(Connection conn, QueryBuilder queryBuilder, + String expectedPhoenixExceptionMsg, String expectedSparkExceptionMsg) { + ResultSet rs = null; + try { + rs = executeQuery(conn, queryBuilder); + fail(); + } + catch(Exception e) { + assertTrue(e.getMessage().contains(expectedPhoenixExceptionMsg)); + } + return rs; + } + + protected void validateQueryPlan(Connection conn, QueryBuilder queryBuilder, String expectedPhoenixPlan, String expectedSparkPlan) throws SQLException { + if (StringUtils.isNotBlank(expectedPhoenixPlan)) { + ResultSet rs = conn.createStatement().executeQuery("EXPLAIN " + queryBuilder.build()); + assertEquals(expectedPhoenixPlan, QueryUtil.getExplainPlan(rs)); + } + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/678563f5/phoenix-core/src/it/java/org/apache/phoenix/end2end/salted/BaseSaltedTableIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/salted/BaseSaltedTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/salted/BaseSaltedTableIT.java new file mode 100644 index 0000000..3051cd6 --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/salted/BaseSaltedTableIT.java @@ -0,0 +1,474 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.end2end.salted; + +import static org.apache.phoenix.util.TestUtil.TABLE_WITH_SALTING; +import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Properties; + +import org.apache.phoenix.end2end.ParallelStatsDisabledIT; +import org.apache.phoenix.util.PropertiesUtil; +import org.apache.phoenix.util.QueryBuilder; +import org.apache.phoenix.util.QueryUtil; +import org.junit.Test; + +import com.google.common.collect.Lists; + +public abstract class BaseSaltedTableIT extends ParallelStatsDisabledIT { + + protected static String initTableValues(byte[][] splits) throws Exception { + String tableName = generateUniqueName(); + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + + // Rows we inserted: + // 1ab123abc111 + // 1abc456abc111 + // 1de123abc111 + // 2abc123def222 + // 3abc123ghi333 + // 4abc123jkl444 + try { + // Upsert with no column specifies. + ensureTableCreated(getUrl(), tableName, TABLE_WITH_SALTING, splits, null, null); + String query = "UPSERT INTO " + tableName + " VALUES(?,?,?,?,?)"; + PreparedStatement stmt = conn.prepareStatement(query); + stmt.setInt(1, 1); + stmt.setString(2, "ab"); + stmt.setString(3, "123"); + stmt.setString(4, "abc"); + stmt.setInt(5, 111); + stmt.execute(); + conn.commit(); + + stmt.setInt(1, 1); + stmt.setString(2, "abc"); + stmt.setString(3, "456"); + stmt.setString(4, "abc"); + stmt.setInt(5, 111); + stmt.execute(); + conn.commit(); + + // Test upsert when statement explicitly specifies the columns to upsert into. + query = "UPSERT INTO " + tableName + + " (a_integer, a_string, a_id, b_string, b_integer) " + + " VALUES(?,?,?,?,?)"; + stmt = conn.prepareStatement(query); + + stmt.setInt(1, 1); + stmt.setString(2, "de"); + stmt.setString(3, "123"); + stmt.setString(4, "abc"); + stmt.setInt(5, 111); + stmt.execute(); + conn.commit(); + + stmt.setInt(1, 2); + stmt.setString(2, "abc"); + stmt.setString(3, "123"); + stmt.setString(4, "def"); + stmt.setInt(5, 222); + stmt.execute(); + conn.commit(); + + // Test upsert when order of column is shuffled. + query = "UPSERT INTO " + tableName + + " (a_string, a_integer, a_id, b_string, b_integer) " + + " VALUES(?,?,?,?,?)"; + stmt = conn.prepareStatement(query); + stmt.setString(1, "abc"); + stmt.setInt(2, 3); + stmt.setString(3, "123"); + stmt.setString(4, "ghi"); + stmt.setInt(5, 333); + stmt.execute(); + conn.commit(); + + stmt.setString(1, "abc"); + stmt.setInt(2, 4); + stmt.setString(3, "123"); + stmt.setString(4, "jkl"); + stmt.setInt(5, 444); + stmt.execute(); + conn.commit(); + } finally { + conn.close(); + } + return tableName; + } + + @Test + public void testSelectValueNoWhereClause() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + String tableName = initTableValues(null); + // "SELECT * FROM " + tableName; + QueryBuilder queryBuilder = new QueryBuilder() + .setSelectColumns( + Lists.newArrayList("A_INTEGER", "A_STRING", "A_ID", "B_STRING", "B_INTEGER")) + .setFullTableName(tableName); + ResultSet rs = executeQuery(conn, queryBuilder); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("ab", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("456", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("de", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("def", rs.getString(4)); + assertEquals(222, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(3, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("ghi", rs.getString(4)); + assertEquals(333, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(4, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("jkl", rs.getString(4)); + assertEquals(444, rs.getInt(5)); + + assertFalse(rs.next()); + } finally { + conn.close(); + } + } + + @Test + public void testSelectValueWithFullyQualifiedWhereClause() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + String tableName = initTableValues(null); + PreparedStatement stmt; + ResultSet rs; + + // Variable length slot with bounded ranges. + QueryBuilder queryBuilder = new QueryBuilder() + .setSelectColumns( + Lists.newArrayList("A_INTEGER", "A_STRING", "A_ID", "B_STRING", "B_INTEGER")) + .setFullTableName(tableName) + .setWhereClause("a_integer = 1 AND a_string >= 'ab' AND a_string < 'de' AND a_id = '123'"); + rs = executeQuery(conn, queryBuilder); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("ab", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + assertFalse(rs.next()); + + // all single slots with one value. + queryBuilder.setWhereClause("a_integer = 1 AND a_string = 'ab' AND a_id = '123'"); + rs = executeQuery(conn, queryBuilder); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("ab", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + assertFalse(rs.next()); + + // all single slots with multiple values. + queryBuilder.setWhereClause("a_integer in (2, 4) AND a_string = 'abc' AND a_id = '123'"); + rs = executeQuery(conn, queryBuilder); + + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("def", rs.getString(4)); + assertEquals(222, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(4, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("jkl", rs.getString(4)); + assertEquals(444, rs.getInt(5)); + assertFalse(rs.next()); + + queryBuilder.setWhereClause("A_INTEGER in (1,2,3,4) AND A_STRING in ('a', 'abc', 'de') AND A_ID = '123'"); + queryBuilder.setSelectColumns(Lists.newArrayList("A_INTEGER", "A_STRING", "A_ID")); + rs = executeQuery(conn, queryBuilder); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("de", rs.getString(2)); + + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + + assertTrue(rs.next()); + assertEquals(3, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + + assertTrue(rs.next()); + assertEquals(4, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertFalse(rs.next()); + + // fixed length slot with bounded ranges. + queryBuilder.setWhereClause("A_INTEGER > 1 AND A_INTEGER < 4 AND A_STRING = 'abc' AND A_ID = '123'"); + queryBuilder.setSelectColumns(Lists.newArrayList("A_STRING", "A_ID", "A_INTEGER")); + rs = executeQuery(conn, queryBuilder); + assertTrue(rs.next()); + assertEquals("abc", rs.getString(1)); + assertEquals("123", rs.getString(2)); + + assertTrue(rs.next()); + assertEquals("abc", rs.getString(1)); + assertEquals("123", rs.getString(2)); + assertFalse(rs.next()); + + // fixed length slot with unbound ranges. + queryBuilder.setWhereClause("A_INTEGER > 1 AND A_STRING = 'abc' AND A_ID = '123'"); + queryBuilder.setSelectColumns(Lists.newArrayList("B_STRING", "B_INTEGER", "A_INTEGER", "A_STRING", "A_ID")); + rs = executeQuery(conn, queryBuilder); + assertTrue(rs.next()); + assertEquals("def", rs.getString(1)); + assertEquals(222, rs.getInt(2)); + + assertTrue(rs.next()); + assertEquals("ghi", rs.getString(1)); + assertEquals(333, rs.getInt(2)); + + assertTrue(rs.next()); + assertEquals("jkl", rs.getString(1)); + assertEquals(444, rs.getInt(2)); + assertFalse(rs.next()); + + // Variable length slot with unbounded ranges. + queryBuilder.setWhereClause("A_INTEGER = 1 AND A_STRING > 'ab' AND A_ID = '123'"); + queryBuilder.setSelectColumns( + Lists.newArrayList("A_INTEGER", "A_STRING", "A_ID", "B_STRING", "B_INTEGER")); + rs = executeQuery(conn, queryBuilder); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("de", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + assertFalse(rs.next()); + + } finally { + conn.close(); + } + } + + @Test + public void testSelectValueWithNotFullyQualifiedWhereClause() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + String tableName = initTableValues(null); + + // Where without fully qualified key, point query. + String query = "SELECT * FROM " + tableName + " WHERE a_integer = ? AND a_string = ?"; + PreparedStatement stmt = conn.prepareStatement(query); + + stmt.setInt(1, 1); + stmt.setString(2, "abc"); + ResultSet rs = stmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("456", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + assertFalse(rs.next()); + + // Where without fully qualified key, range query. + query = "SELECT * FROM " + tableName + " WHERE a_integer >= 2"; + stmt = conn.prepareStatement(query); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("def", rs.getString(4)); + assertEquals(222, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(3, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("ghi", rs.getString(4)); + assertEquals(333, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(4, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("jkl", rs.getString(4)); + assertEquals(444, rs.getInt(5)); + assertFalse(rs.next()); + + // With point query. + query = "SELECT a_string FROM " + tableName + " WHERE a_string = ?"; + stmt = conn.prepareStatement(query); + stmt.setString(1, "de"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + assertEquals("de", rs.getString(1)); + assertFalse(rs.next()); + + query = "SELECT a_id FROM " + tableName + " WHERE a_id = ?"; + stmt = conn.prepareStatement(query); + stmt.setString(1, "456"); + rs = stmt.executeQuery(); + assertTrue(rs.next()); + assertEquals("456", rs.getString(1)); + assertFalse(rs.next()); + } finally { + conn.close(); + } + } + + @Test + public void testSelectWithGroupBy() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + String tableName = initTableValues(null); + + String query = "SELECT a_integer FROM " + tableName + " GROUP BY a_integer"; + PreparedStatement stmt = conn.prepareStatement(query); + ResultSet rs = stmt.executeQuery(); + int count = 0; + while (rs.next()) { + count++; + } + assertEquals("Group by does not return the right count.", count, 4); + } finally { + conn.close(); + } + } + + @Test + public void testLimitScan() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + String tableName = initTableValues(null); + + String query = "SELECT a_integer FROM " + tableName + " WHERE a_string='abc' LIMIT 1"; + PreparedStatement stmt = conn.prepareStatement(query); + ResultSet rs = stmt.executeQuery(); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertFalse(rs.next()); + } finally { + conn.close(); + } + } + + @Test + public void testSelectWithOrderByRowKey() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + Connection conn = DriverManager.getConnection(getUrl(), props); + try { + String tableName = initTableValues(null); + + String query = "SELECT * FROM " + tableName + " ORDER BY a_integer, a_string, a_id"; + PreparedStatement statement = conn.prepareStatement(query); + ResultSet explainPlan = statement.executeQuery("EXPLAIN " + query); + // Confirm that ORDER BY in row key order will be optimized out for salted table + assertEquals("CLIENT PARALLEL 4-WAY FULL SCAN OVER " + tableName + "\n" + + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(explainPlan)); + ResultSet rs = statement.executeQuery(); + + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("ab", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("456", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertEquals("de", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("abc", rs.getString(4)); + assertEquals(111, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(2, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("def", rs.getString(4)); + assertEquals(222, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(3, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("ghi", rs.getString(4)); + assertEquals(333, rs.getInt(5)); + + assertTrue(rs.next()); + assertEquals(4, rs.getInt(1)); + assertEquals("abc", rs.getString(2)); + assertEquals("123", rs.getString(3)); + assertEquals("jkl", rs.getString(4)); + assertEquals(444, rs.getInt(5)); + + assertFalse(rs.next()); + } finally { + conn.close(); + } + } +}