http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryIT.java index d3bbe23..1084f14 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryIT.java @@ -62,15 +62,15 @@ import org.junit.Test; */ public class QueryIT extends BaseQueryIT { - public QueryIT(String indexDDL) { - super(indexDDL); + public QueryIT(String indexDDL, boolean mutable, boolean columnEncoded) { + super(indexDDL, mutable, columnEncoded); } @Test public void testIntFilter() throws Exception { String updateStmt = - "upsert into " + - "ATABLE(" + + "upsert into " + tableName + + " (" + " ORGANIZATION_ID, " + " ENTITY_ID, " + " A_INTEGER) " + @@ -89,10 +89,10 @@ public class QueryIT extends BaseQueryIT { url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 6); props = PropertiesUtil.deepCopy(TEST_PROPERTIES); upsertConn = DriverManager.getConnection(url, props); - analyzeTable(upsertConn, "ATABLE"); + analyzeTable(upsertConn, tableName); upsertConn.close(); - String query = "SELECT entity_id FROM aTable WHERE organization_id=? and a_integer >= ?"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and a_integer >= ?"; props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); PreparedStatement statement = conn.prepareStatement(query); @@ -101,19 +101,19 @@ public class QueryIT extends BaseQueryIT { ResultSet rs = statement.executeQuery(); assertValueEqualsResultSet(rs, Arrays.<Object>asList(ROW7, ROW8, ROW9)); - query = "SELECT entity_id FROM aTable WHERE organization_id=? and a_integer < 2"; + query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and a_integer < 2"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); rs = statement.executeQuery(); assertValueEqualsResultSet(rs, Arrays.<Object>asList(ROW1, ROW4)); - query = "SELECT entity_id FROM aTable WHERE organization_id=? and a_integer <= 2"; + query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and a_integer <= 2"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); rs = statement.executeQuery(); assertValueEqualsResultSet(rs, Arrays.<Object>asList(ROW1, ROW2, ROW4)); - query = "SELECT entity_id FROM aTable WHERE organization_id=? and a_integer >=9"; + query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and a_integer >=9"; statement = conn.prepareStatement(query); statement.setString(1, tenantId); rs = statement.executeQuery(); @@ -124,13 +124,8 @@ public class QueryIT extends BaseQueryIT { } @Test - public void testEmptyStringValue() throws Exception { - testNoStringValue(""); - } - - @Test public void testToDateOnString() throws Exception { // TODO: test more conversion combinations - String query = "SELECT a_string FROM aTable WHERE organization_id=? and a_integer = 5"; + String query = "SELECT a_string FROM " + tableName + " WHERE organization_id=? and a_integer = 5"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -151,7 +146,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testColumnOnBothSides() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id=? and a_string = b_string"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and a_string = b_string"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -167,50 +162,9 @@ public class QueryIT extends BaseQueryIT { } } - private void testNoStringValue(String value) throws Exception { - String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 10); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection upsertConn = DriverManager.getConnection(url, props); - upsertConn.setAutoCommit(true); // Test auto commit - // Insert all rows at ts - PreparedStatement stmt = upsertConn.prepareStatement( - "upsert into ATABLE VALUES (?, ?, ?)"); // without specifying columns - stmt.setString(1, tenantId); - stmt.setString(2, ROW5); - stmt.setString(3, value); - stmt.execute(); // should commit too - upsertConn.close(); - - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 20)); - Connection conn1 = DriverManager.getConnection(getUrl(), props); - analyzeTable(conn1, "ATABLE"); - conn1.close(); - - String query = "SELECT a_string, b_string FROM aTable WHERE organization_id=? and a_integer = 5"; - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - statement.setString(1, tenantId); - ResultSet rs = statement.executeQuery(); - assertTrue (rs.next()); - assertEquals(null, rs.getString(1)); - assertTrue(rs.wasNull()); - assertEquals(C_VALUE, rs.getString("B_string")); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testNullStringValue() throws Exception { - testNoStringValue(null); - } - @Test public void testDateInList() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE a_date IN (?,?) AND a_integer < 4"; + String query = "SELECT entity_id FROM " + tableName + " WHERE a_date IN (?,?) AND a_integer < 4"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -230,8 +184,8 @@ public class QueryIT extends BaseQueryIT { @Test public void testTimestamp() throws Exception { String updateStmt = - "upsert into " + - "ATABLE(" + + "upsert into " + tableName + + " (" + " ORGANIZATION_ID, " + " ENTITY_ID, " + " A_TIMESTAMP) " + @@ -251,12 +205,12 @@ public class QueryIT extends BaseQueryIT { url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 15); Connection conn1 = DriverManager.getConnection(url, props); - analyzeTable(conn1, "ATABLE"); + analyzeTable(conn1, tableName); conn1.close(); updateStmt = - "upsert into " + - "ATABLE(" + + "upsert into " + tableName + + " (" + " ORGANIZATION_ID, " + " ENTITY_ID, " + " A_TIMESTAMP," + @@ -276,7 +230,7 @@ public class QueryIT extends BaseQueryIT { assertTrue(compare(CompareOp.GREATER, new ImmutableBytesWritable(ts2), new ImmutableBytesWritable(ts1))); assertFalse(compare(CompareOp.GREATER, new ImmutableBytesWritable(ts1), new ImmutableBytesWritable(ts1))); - String query = "SELECT entity_id, a_timestamp, a_time FROM aTable WHERE organization_id=? and a_timestamp > ?"; + String query = "SELECT entity_id, a_timestamp, a_time FROM " + tableName + " WHERE organization_id=? and a_timestamp > ?"; props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); try { @@ -296,7 +250,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testSimpleInListStatement() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND a_integer IN (2,4)"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND a_integer IN (2,4)"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -312,7 +266,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testPartiallyQualifiedRVCInList() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE (a_integer,a_string) IN ((2,'a'),(5,'b'))"; + String query = "SELECT entity_id FROM " + tableName + " WHERE (a_integer,a_string) IN ((2,'a'),(5,'b'))"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -327,7 +281,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testFullyQualifiedRVCInList() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE (a_integer,a_string, organization_id,entity_id) IN ((2,'a',:1,:2),(5,'b',:1,:3))"; + String query = "SELECT entity_id FROM " + tableName + " WHERE (a_integer,a_string, organization_id,entity_id) IN ((2,'a',:1,:2),(5,'b',:1,:3))"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -345,7 +299,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testOneInListStatement() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND b_string IN (?)"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND b_string IN (?)"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -369,7 +323,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testMixedTypeInListStatement() throws Exception { - String query = "SELECT entity_id FROM ATABLE WHERE organization_id=? AND x_long IN (5, ?)"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? AND x_long IN (5, ?)"; String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(url, props); @@ -391,7 +345,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testIsNull() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE X_DECIMAL is null"; + String query = "SELECT entity_id FROM " + tableName + " WHERE X_DECIMAL is null"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -418,7 +372,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testIsNotNull() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE X_DECIMAL is not null"; + String query = "SELECT entity_id FROM " + tableName + " WHERE X_DECIMAL is not null"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -442,11 +396,11 @@ public class QueryIT extends BaseQueryIT { int counter=0; String[] answers = new String[]{"00D300000000XHP5bar","a5bar","15bar","5bar","5bar"}; String[] queries = new String[] { - "SELECT organization_id || 5 || 'bar' FROM atable limit 1", - "SELECT a_string || 5 || 'bar' FROM atable order by a_string limit 1", - "SELECT a_integer||5||'bar' FROM atable order by a_integer limit 1", - "SELECT x_decimal||5||'bar' FROM atable limit 1", - "SELECT x_long||5||'bar' FROM atable limit 1" + "SELECT organization_id || 5 || 'bar' FROM " + tableName + " limit 1", + "SELECT a_string || 5 || 'bar' FROM " + tableName + " order by a_string limit 1", + "SELECT a_integer||5||'bar' FROM " + tableName + " order by a_integer limit 1", + "SELECT x_decimal||5||'bar' FROM " + tableName + " limit 1", + "SELECT x_long||5||'bar' FROM " + tableName + " limit 1" }; for (String query : queries) { @@ -468,7 +422,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testRowKeySingleIn() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id=? and entity_id IN (?,?,?)"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and entity_id IN (?,?,?)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -494,7 +448,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testRowKeyMultiIn() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id=? and entity_id IN (?,?,?) and a_string IN (?,?)"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and entity_id IN (?,?,?) and a_string IN (?,?)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -519,7 +473,7 @@ public class QueryIT extends BaseQueryIT { @Test public void testColumnAliasMapping() throws Exception { - String query = "SELECT a.a_string, aTable.b_string FROM aTable a WHERE ?=organization_id and 5=a_integer ORDER BY a_string, b_string"; + String query = "SELECT a.a_string, " + tableName + ".b_string FROM " + tableName + " a WHERE ?=organization_id and 5=a_integer ORDER BY a_string, b_string"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props);
http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadIsolationLevelIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadIsolationLevelIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadIsolationLevelIT.java index 1573533..8b320fa 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadIsolationLevelIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadIsolationLevelIT.java @@ -42,7 +42,7 @@ public class ReadIsolationLevelIT extends BaseClientManagedTimeIT { protected static void initTableValues(long ts, byte[][] splits) throws Exception { String tenantId = getOrganizationId(); - ensureTableCreated(getUrl(),ATABLE_NAME, ATABLE_NAME, splits, ts-2); + ensureTableCreated(getUrl(),ATABLE_NAME, ATABLE_NAME, splits, ts-2, null); Properties props = new Properties(); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/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 f35484d..b7d67f2 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 @@ -66,7 +66,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorInWhereWithEqualsExpression() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND (a_integer, x_integer) = (7, 5)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -91,7 +91,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorInWhereWithGreaterThanExpression() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND (a_integer, x_integer) >= (4, 4)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -107,7 +107,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { count++; } // we have 6 values for a_integer present in the atable where a >= 4. x_integer is null for a_integer = 4. So the query should have returned 5 rows. - assertTrue(count == 5); + assertEquals(5, count); } finally { conn.close(); } @@ -117,7 +117,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorInWhereWithUnEqualNumberArgs() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND (a_integer, x_integer, y_integer) >= (7, 5)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -143,7 +143,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testBindVarsInRowValueConstructor() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND (a_integer, x_integer) = (?, ?)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -170,7 +170,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorOnLHSAndLiteralExpressionOnRHS() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND (a_integer, x_integer) >= 7"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -194,7 +194,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorOnRHSLiteralExpressionOnLHS() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND 7 <= (a_integer, x_integer)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -218,7 +218,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorOnLHSBuiltInFunctionOperatingOnIntegerLiteralRHS() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND (a_integer, x_integer) >= to_number('7')"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -242,7 +242,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorOnRHSWithBuiltInFunctionOperatingOnIntegerLiteralOnLHS() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND to_number('7') <= (a_integer, x_integer)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -266,7 +266,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorOnLHSWithBuiltInFunctionOperatingOnColumnRefOnRHS() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts - 1, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts - 1, getUrl(), null); String upsertQuery = "UPSERT INTO aTable(organization_id, entity_id, a_string) values (?, ?, ?)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); @@ -332,7 +332,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRowValueConstructorOnRHSWithBuiltInFunctionOperatingOnColumnRefOnLHS() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts - 1, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts - 1, getUrl(), null); String upsertQuery = "UPSERT INTO aTable(organization_id, entity_id, a_string) values (?, ?, ?)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); @@ -654,7 +654,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRVCWithNonLeadingPkColsOfTypesIntegerAndString() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, a_string FROM aTable WHERE ?=organization_id AND (a_integer, a_string) <= (5, 'a')"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -680,7 +680,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRVCWithNonLeadingPkColsOfTypesTimeStampAndString() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String updateStmt = "upsert into " + "ATABLE(" + @@ -724,7 +724,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testNestedRVCBasic() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); //all the three queries should return the same rows. String[] queries = {"SELECT organization_id, entity_id, a_string FROM aTable WHERE ((organization_id, entity_id), a_string) >= ((?, ?), ?)", "SELECT organization_id, entity_id, a_string FROM aTable WHERE (organization_id, entity_id, a_string) >= (?, ?, ?)", @@ -762,7 +762,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRVCWithInListClausePossibleNullValues() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); //we have a row present in aTable where x_integer = 5 and y_integer = NULL which gets translated to 0 when retriving from HBase. String query = "SELECT x_integer, y_integer FROM aTable WHERE ? = organization_id AND (x_integer, y_integer) IN ((5))"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); @@ -784,7 +784,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRVCWithInListClauseUsingSubsetOfPKColsInOrder() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); // Though we have a row present in aTable where organization_id = tenantId and x_integer = 5, // we'd also need to have an entity_id that is null (which we don't have). String query = "SELECT organization_id, entity_id FROM aTable WHERE (organization_id, entity_id) IN (('" + tenantId + "')) AND x_integer = 5"; @@ -814,7 +814,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { public void testRVCWithCeilAndFloorNeededForDecimal() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT a_integer, x_integer FROM aTable WHERE ?=organization_id AND (a_integer, x_integer) < (8.6, 4.5) AND (a_integer, x_integer) > (6.8, 4)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -841,7 +841,7 @@ public class RowValueConstructorIT extends BaseClientManagedTimeIT { String tenantId = getOrganizationId(); Date dateUpserted = DateUtil.parseDate("2012-01-01 14:25:28"); dateUpserted = new Date(dateUpserted.getTime() + 660); // this makes the dateUpserted equivalent to 2012-01-01 14:25:28.660 - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), dateUpserted, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), dateUpserted, ts, getUrl(), null); String query = "SELECT a_integer, a_date FROM aTable WHERE ?=organization_id AND (a_integer, a_date) <= (9, ?) AND (a_integer, a_date) >= (6, ?)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ScanQueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ScanQueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ScanQueryIT.java index 9b28bad..b0ce8cd 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ScanQueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ScanQueryIT.java @@ -20,7 +20,6 @@ package org.apache.phoenix.end2end; import static org.apache.phoenix.util.TestUtil.A_VALUE; import static org.apache.phoenix.util.TestUtil.B_VALUE; import static org.apache.phoenix.util.TestUtil.C_VALUE; -import static org.apache.phoenix.util.TestUtil.E_VALUE; import static org.apache.phoenix.util.TestUtil.ROW1; import static org.apache.phoenix.util.TestUtil.ROW2; import static org.apache.phoenix.util.TestUtil.ROW3; @@ -39,10 +38,8 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.util.Arrays; import java.util.Collection; import java.util.HashSet; -import java.util.List; import java.util.Properties; import java.util.Set; @@ -53,7 +50,6 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; -import com.google.common.collect.Lists; import com.google.common.primitives.Doubles; import com.google.common.primitives.Floats; @@ -66,13 +62,13 @@ public class ScanQueryIT extends BaseQueryIT { return QueryIT.data(); } - public ScanQueryIT(String indexDDL) { - super(indexDDL); + public ScanQueryIT(String indexDDL, boolean mutable, boolean columnEncoded) { + super(indexDDL, mutable, columnEncoded); } @Test public void testScan() throws Exception { - String query = "SELECT a_string, /* comment ok? */ b_string FROM aTable WHERE ?=organization_id and 5=a_integer"; + String query = "SELECT a_string, /* comment ok? */ b_string FROM " + tableName + " WHERE ?=organization_id and 5=a_integer"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -91,7 +87,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testScanByByteValue() throws Exception { - String query = "SELECT a_string, b_string, a_byte FROM aTable WHERE ?=organization_id and 1=a_byte"; + String query = "SELECT a_string, b_string, a_byte FROM " + tableName + " WHERE ?=organization_id and 1=a_byte"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -111,7 +107,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testScanByShortValue() throws Exception { - String query = "SELECT a_string, b_string, a_short FROM aTable WHERE ?=organization_id and 128=a_short"; + String query = "SELECT a_string, b_string, a_short FROM " + tableName + " WHERE ?=organization_id and 128=a_short"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -131,7 +127,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testScanByFloatValue() throws Exception { - String query = "SELECT a_string, b_string, a_float FROM aTable WHERE ?=organization_id and ?=a_float"; + String query = "SELECT a_string, b_string, a_float FROM " + tableName + " WHERE ?=organization_id and ?=a_float"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -152,7 +148,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testScanByUnsignedFloatValue() throws Exception { - String query = "SELECT a_string, b_string, a_unsigned_float FROM aTable WHERE ?=organization_id and ?=a_unsigned_float"; + String query = "SELECT a_string, b_string, a_unsigned_float FROM " + tableName + " WHERE ?=organization_id and ?=a_unsigned_float"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -173,7 +169,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testScanByDoubleValue() throws Exception { - String query = "SELECT a_string, b_string, a_double FROM aTable WHERE ?=organization_id and ?=a_double"; + String query = "SELECT a_string, b_string, a_double FROM " + tableName + " WHERE ?=organization_id and ?=a_double"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -194,7 +190,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testScanByUnsigned_DoubleValue() throws Exception { - String query = "SELECT a_string, b_string, a_unsigned_double FROM aTable WHERE ?=organization_id and ?=a_unsigned_double"; + String query = "SELECT a_string, b_string, a_unsigned_double FROM " + tableName + " WHERE ?=organization_id and ?=a_unsigned_double"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -215,7 +211,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testAllScan() throws Exception { - String query = "SELECT ALL a_string, b_string FROM aTable WHERE ?=organization_id and 5=a_integer"; + String query = "SELECT ALL a_string, b_string FROM " + tableName + " WHERE ?=organization_id and 5=a_integer"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -234,7 +230,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testDistinctScan() throws Exception { - String query = "SELECT DISTINCT a_string FROM aTable WHERE organization_id=?"; + String query = "SELECT DISTINCT a_string FROM " + tableName + " WHERE organization_id=?"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -256,7 +252,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testDistinctLimitScan() throws Exception { - String query = "SELECT DISTINCT a_string FROM aTable WHERE organization_id=? LIMIT 1"; + String query = "SELECT DISTINCT a_string FROM " + tableName + " WHERE organization_id=? LIMIT 1"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -274,7 +270,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testInListSkipScan() throws Exception { - String query = "SELECT entity_id, b_string FROM aTable WHERE organization_id=? and entity_id IN (?,?)"; + String query = "SELECT entity_id, b_string FROM " + tableName + " WHERE organization_id=? and entity_id IN (?,?)"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -301,7 +297,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testUnboundRangeScan1() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id <= ?"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id <= ?"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -335,7 +331,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testUnboundRangeScan2() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id >= ?"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id >= ?"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -369,7 +365,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testUpperLowerBoundRangeScan() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id=? and substr(entity_id,1,3) > '00A' and substr(entity_id,1,3) < '00C'"; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and substr(entity_id,1,3) > '00A' and substr(entity_id,1,3) < '00C'"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -393,7 +389,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testUpperBoundRangeScan() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id=? and substr(entity_id,1,3) >= '00B' "; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and substr(entity_id,1,3) >= '00B' "; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -419,7 +415,7 @@ public class ScanQueryIT extends BaseQueryIT { @Test public void testLowerBoundRangeScan() throws Exception { - String query = "SELECT entity_id FROM aTable WHERE organization_id=? and substr(entity_id,1,3) < '00B' "; + String query = "SELECT entity_id FROM " + tableName + " WHERE organization_id=? and substr(entity_id,1,3) < '00B' "; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 Connection conn = DriverManager.getConnection(getUrl(), props); @@ -440,57 +436,4 @@ public class ScanQueryIT extends BaseQueryIT { conn.close(); } } - - @SuppressWarnings("unchecked") - @Test - public void testPointInTimeLimitedScan() throws Exception { - // Override value that was set at creation time - String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 1); // Run query at timestamp 5 - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection upsertConn = DriverManager.getConnection(url, props); - String upsertStmt = - "upsert into " + - "ATABLE(" + - " ORGANIZATION_ID, " + - " ENTITY_ID, " + - " A_INTEGER) " + - "VALUES (?, ?, ?)"; - upsertConn.setAutoCommit(true); // Test auto commit - // Insert all rows at ts - PreparedStatement stmt = upsertConn.prepareStatement(upsertStmt); - stmt.setString(1, tenantId); - stmt.setString(2, ROW1); - stmt.setInt(3, 6); - stmt.execute(); // should commit too - upsertConn.close(); - - // Override value again, but should be ignored since it's past the SCN - url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 3); - upsertConn = DriverManager.getConnection(url, props); - upsertConn.setAutoCommit(true); // Test auto commit - // Insert all rows at ts - stmt = upsertConn.prepareStatement(upsertStmt); - stmt.setString(1, tenantId); - stmt.setString(2, ROW1); - stmt.setInt(3, 0); - stmt.execute(); // should commit too - upsertConn.close(); - - String query = "SELECT a_integer,b_string FROM atable WHERE organization_id=? and a_integer <= 5 limit 2"; - props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); - Connection conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement statement = conn.prepareStatement(query); - statement.setString(1, tenantId); - ResultSet rs = statement.executeQuery(); - List<List<Object>> expectedResultsA = Lists.newArrayList( - Arrays.<Object>asList(2, C_VALUE), - Arrays.<Object>asList( 3, E_VALUE)); - List<List<Object>> expectedResultsB = Lists.newArrayList( - Arrays.<Object>asList( 5, C_VALUE), - Arrays.<Object>asList(4, B_VALUE)); - // Since we're not ordering and we may be using a descending index, we don't - // know which rows we'll get back. - assertOneOfValuesEqualsResultSet(rs, expectedResultsA,expectedResultsB); - conn.close(); - } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java index 85fc9d7..040c92c 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StatsCollectorIT.java @@ -40,6 +40,10 @@ import java.util.Random; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HRegionLocation; +import org.apache.hadoop.hbase.client.HTableInterface; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.client.ResultScanner; +import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; @@ -48,6 +52,7 @@ import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.query.QueryServicesOptions; import org.apache.phoenix.schema.PTable; +import org.apache.phoenix.schema.PTableImpl; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.PTableType; import org.apache.phoenix.schema.stats.GuidePostsKey; @@ -58,6 +63,7 @@ import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.TestUtil; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -68,20 +74,54 @@ import com.google.common.collect.Maps; @RunWith(Parameterized.class) public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { private final String tableDDLOptions; + private final boolean columnEncoded; private String tableName; private String schemaName; private String fullTableName; private String physicalTableName; private final boolean userTableNamespaceMapped; + private final boolean mutable; - public StatsCollectorIT(boolean transactional, boolean userTableNamespaceMapped) { - this.tableDDLOptions= transactional ? " TRANSACTIONAL=true" : ""; + public StatsCollectorIT(boolean mutable, boolean transactional, boolean userTableNamespaceMapped, boolean columnEncoded) { + StringBuilder sb = new StringBuilder(); + if (transactional) { + sb.append("TRANSACTIONAL=true"); + } + if (!columnEncoded) { + if (sb.length()>0) { + sb.append(","); + } + sb.append("COLUMN_ENCODED_BYTES=0"); + } else { + if (sb.length()>0) { + sb.append(","); + } + sb.append("COLUMN_ENCODED_BYTES=4"); + } + if (!mutable) { + if (sb.length()>0) { + sb.append(","); + } + sb.append("IMMUTABLE_ROWS=true"); + if (!columnEncoded) { + sb.append(",IMMUTABLE_STORAGE_SCHEME="+PTableImpl.ImmutableStorageScheme.ONE_CELL_PER_COLUMN); + } + } + this.tableDDLOptions = sb.toString(); this.userTableNamespaceMapped = userTableNamespaceMapped; + this.columnEncoded = columnEncoded; + this.mutable = mutable; } - @Parameters(name="transactional = {0}, isUserTableNamespaceMapped = {1}") + @Parameters(name="columnEncoded = {0}, mutable = {1}, transactional = {2}, isUserTableNamespaceMapped = {3}") public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] {{false,true}, {false, false}, {true, false}, {true, true}}); + return Arrays.asList(new Boolean[][] { + { false, false, false, false }, { false, false, false, true }, { false, false, true, false }, { false, false, true, true }, + // no need to test non column encoded mutable case and this is the same as non column encoded immutable + //{ false, true, false, false }, { false, true, false, true }, { false, true, true, false }, { false, true, true, true }, + { true, false, false, false }, { true, false, false, true }, { true, false, true, false }, { true, false, true, true }, + { true, true, false, false }, { true, true, false, true }, { true, true, true, false }, { true, true, true, true } + }); } @BeforeClass @@ -147,25 +187,28 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { "CREATE TABLE " + fullTableName +" ( k VARCHAR PRIMARY KEY, a.v1 VARCHAR, b.v2 VARCHAR ) " + tableDDLOptions + (tableDDLOptions.isEmpty() ? "" : ",") + "SALT_BUCKETS = 3"); conn.createStatement().execute("UPSERT INTO " + fullTableName + "(k,v1) VALUES('a','123456789')"); conn.createStatement().execute("UPDATE STATISTICS " + fullTableName); + ResultSet rs; String explainPlan; rs = conn.createStatement().executeQuery("EXPLAIN SELECT v2 FROM " + fullTableName + " WHERE v2='foo'"); explainPlan = QueryUtil.getExplainPlan(rs); + // if we are using the ONE_CELL_PER_COLUMN_FAMILY storage scheme, we will have the single kv even though there are no values for col family v2 + String stats = columnEncoded && !mutable ? "4-CHUNK 1 ROWS 38 BYTES" : "3-CHUNK 0 ROWS 0 BYTES"; assertEquals( - "CLIENT 3-CHUNK 0 ROWS 0 BYTES PARALLEL 3-WAY FULL SCAN OVER " + physicalTableName + "\n" + + "CLIENT " + stats + " PARALLEL 3-WAY FULL SCAN OVER " + physicalTableName + "\n" + " SERVER FILTER BY B.V2 = 'foo'\n" + "CLIENT MERGE SORT", explainPlan); rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + fullTableName); explainPlan = QueryUtil.getExplainPlan(rs); assertEquals( - "CLIENT 4-CHUNK 1 ROWS 34 BYTES PARALLEL 3-WAY FULL SCAN OVER " + physicalTableName + "\n" + + "CLIENT 4-CHUNK 1 ROWS " + (columnEncoded ? "28" : "34") + " BYTES PARALLEL 3-WAY FULL SCAN OVER " + physicalTableName + "\n" + "CLIENT MERGE SORT", explainPlan); rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + fullTableName + " WHERE k = 'a'"); explainPlan = QueryUtil.getExplainPlan(rs); assertEquals( - "CLIENT 1-CHUNK 1 ROWS 202 BYTES PARALLEL 1-WAY POINT LOOKUP ON 1 KEY OVER " + physicalTableName + "\n" + + "CLIENT 1-CHUNK 1 ROWS " + (columnEncoded ? "204" : "202") + " BYTES PARALLEL 1-WAY POINT LOOKUP ON 1 KEY OVER " + physicalTableName + "\n" + "CLIENT MERGE SORT", explainPlan); @@ -368,11 +411,13 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { } @Test + @Ignore //TODO remove this once https://issues.apache.org/jira/browse/TEPHRA-208 is fixed public void testCompactUpdatesStats() throws Exception { testCompactUpdatesStats(0, fullTableName); } @Test + @Ignore //TODO remove this once https://issues.apache.org/jira/browse/TEPHRA-208 is fixed public void testCompactUpdatesStatsWithMinStatsUpdateFreq() throws Exception { testCompactUpdatesStats(QueryServicesOptions.DEFAULT_STATS_UPDATE_FREQ_MS, fullTableName); } @@ -390,6 +435,7 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { Connection conn = getConnection(statsUpdateFreq); PreparedStatement stmt; conn.createStatement().execute("CREATE TABLE " + tableName + "(k CHAR(1) PRIMARY KEY, v INTEGER, w INTEGER) " + + (!tableDDLOptions.isEmpty() ? tableDDLOptions + "," : "") + HColumnDescriptor.KEEP_DELETED_CELLS + "=" + Boolean.FALSE); stmt = conn.prepareStatement("UPSERT INTO " + tableName + " VALUES(?,?,?)"); for (int i = 0; i < nRows; i++) { @@ -399,11 +445,13 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { stmt.executeUpdate(); } conn.commit(); + compactTable(conn, physicalTableName); - if (statsUpdateFreq == null) { + + if (statsUpdateFreq != 0) { invalidateStats(conn, tableName); } else { - // Confirm that when we have a non zero MIN_STATS_UPDATE_FREQ_MS_ATTRIB, after we run + // Confirm that when we have a non zero STATS_UPDATE_FREQ_MS_ATTRIB, after we run // UPDATATE STATISTICS, the new statistics are faulted in as expected. List<KeyRange>keyRanges = getAllSplits(conn, tableName); assertNotEquals(nRows+1, keyRanges.size()); @@ -419,20 +467,40 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { conn.commit(); assertEquals(5, nDeletedRows); + Scan scan = new Scan(); + scan.setRaw(true); + PhoenixConnection phxConn = conn.unwrap(PhoenixConnection.class); + try (HTableInterface htable = phxConn.getQueryServices().getTable(Bytes.toBytes(tableName))) { + ResultScanner scanner = htable.getScanner(scan); + Result result; + while ((result = scanner.next())!=null) { + System.out.println(result); + } + } + compactTable(conn, physicalTableName); - if (statsUpdateFreq == null) { - invalidateStats(conn, tableName); + + scan = new Scan(); + scan.setRaw(true); + phxConn = conn.unwrap(PhoenixConnection.class); + try (HTableInterface htable = phxConn.getQueryServices().getTable(Bytes.toBytes(tableName))) { + ResultScanner scanner = htable.getScanner(scan); + Result result; + while ((result = scanner.next())!=null) { + System.out.println(result); + } } - keyRanges = getAllSplits(conn, tableName); - if (statsUpdateFreq != null) { + if (statsUpdateFreq != 0) { + invalidateStats(conn, tableName); + } else { assertEquals(nRows+1, keyRanges.size()); - // If we've set MIN_STATS_UPDATE_FREQ_MS_ATTRIB, an UPDATE STATISTICS will invalidate the cache + // If we've set STATS_UPDATE_FREQ_MS_ATTRIB, an UPDATE STATISTICS will invalidate the cache // and force us to pull over the new stats int rowCount = conn.createStatement().executeUpdate("UPDATE STATISTICS " + tableName); assertEquals(5, rowCount); - keyRanges = getAllSplits(conn, tableName); } + keyRanges = getAllSplits(conn, tableName); assertEquals(nRows/2+1, keyRanges.size()); ResultSet rs = conn.createStatement().executeQuery("SELECT SUM(GUIDE_POSTS_ROW_COUNT) FROM " + PhoenixDatabaseMetaData.SYSTEM_STATS_NAME + " WHERE PHYSICAL_NAME='" + physicalTableName + "'"); @@ -447,7 +515,8 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { PreparedStatement stmt; conn.createStatement().execute( "CREATE TABLE " + fullTableName - + "(k VARCHAR PRIMARY KEY, a.v INTEGER, b.v INTEGER, c.v INTEGER NULL, d.v INTEGER NULL) "); + + "(k VARCHAR PRIMARY KEY, a.v INTEGER, b.v INTEGER, c.v INTEGER NULL, d.v INTEGER NULL) " + + tableDDLOptions ); stmt = conn.prepareStatement("UPSERT INTO " + fullTableName + " VALUES(?,?, ?, ?, ?)"); byte[] val = new byte[250]; for (int i = 0; i < nRows; i++) { @@ -473,7 +542,7 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { List<KeyRange> keyRanges = getAllSplits(conn, fullTableName); assertEquals(26, keyRanges.size()); rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + fullTableName); - assertEquals("CLIENT 26-CHUNK 25 ROWS 12420 BYTES PARALLEL 1-WAY FULL SCAN OVER " + physicalTableName, + assertEquals("CLIENT 26-CHUNK 25 ROWS " + (columnEncoded ? ( mutable ? "12530" : "13902" ) : "12420") + " BYTES PARALLEL 1-WAY FULL SCAN OVER " + physicalTableName, QueryUtil.getExplainPlan(rs)); ConnectionQueryServices services = conn.unwrap(PhoenixConnection.class).getQueryServices(); @@ -485,7 +554,8 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { + QueryServices.STATS_GUIDEPOST_WIDTH_BYTES_ATTRIB + "\"=" + Long.toString(1000); conn.createStatement().execute(query); keyRanges = getAllSplits(conn, fullTableName); - assertEquals(12, keyRanges.size()); + boolean oneCellPerColFamliyStorageScheme = !mutable && columnEncoded; + assertEquals(oneCellPerColFamliyStorageScheme ? 13 : 12, keyRanges.size()); rs = conn .createStatement() @@ -496,25 +566,25 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { assertTrue(rs.next()); assertEquals("A", rs.getString(1)); assertEquals(24, rs.getInt(2)); - assertEquals(12144, rs.getInt(3)); - assertEquals(11, rs.getInt(4)); + assertEquals(columnEncoded ? ( mutable ? 12252 : 13624 ) : 12144, rs.getInt(3)); + assertEquals(oneCellPerColFamliyStorageScheme ? 12 : 11, rs.getInt(4)); assertTrue(rs.next()); assertEquals("B", rs.getString(1)); - assertEquals(20, rs.getInt(2)); - assertEquals(5540, rs.getInt(3)); - assertEquals(5, rs.getInt(4)); + assertEquals(oneCellPerColFamliyStorageScheme ? 24 : 20, rs.getInt(2)); + assertEquals(columnEncoded ? ( mutable ? 5600 : 6972 ) : 5540, rs.getInt(3)); + assertEquals(oneCellPerColFamliyStorageScheme ? 6 : 5, rs.getInt(4)); assertTrue(rs.next()); assertEquals("C", rs.getString(1)); assertEquals(24, rs.getInt(2)); - assertEquals(6652, rs.getInt(3)); + assertEquals(columnEncoded ? ( mutable ? 6724 : 6988 ) : 6652, rs.getInt(3)); assertEquals(6, rs.getInt(4)); assertTrue(rs.next()); assertEquals("D", rs.getString(1)); assertEquals(24, rs.getInt(2)); - assertEquals(6652, rs.getInt(3)); + assertEquals(columnEncoded ? ( mutable ? 6724 : 6988 ) : 6652, rs.getInt(3)); assertEquals(6, rs.getInt(4)); assertFalse(rs.next()); @@ -539,7 +609,7 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { Connection conn = getConnection(); String ddl = "CREATE TABLE " + fullTableName + " (t_id VARCHAR NOT NULL,\n" + "k1 INTEGER NOT NULL,\n" + "k2 INTEGER NOT NULL,\n" + "C3.k3 INTEGER,\n" + "C2.v1 VARCHAR,\n" - + "CONSTRAINT pk PRIMARY KEY (t_id, k1, k2)) split on ('e','j','o')"; + + "CONSTRAINT pk PRIMARY KEY (t_id, k1, k2)) " + tableDDLOptions + " split on ('e','j','o')"; conn.createStatement().execute(ddl); String[] strings = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" }; @@ -559,7 +629,7 @@ public class StatsCollectorIT extends BaseUniqueNamesOwnClusterIT { int startIndex = r.nextInt(strings.length); int endIndex = r.nextInt(strings.length - startIndex) + startIndex; long rows = endIndex - startIndex; - long c2Bytes = rows * 35; + long c2Bytes = rows * (columnEncoded ? ( mutable ? 37 : 48 ) : 35); String physicalTableName = SchemaUtil.getPhysicalHBaseTableName(fullTableName, userTableNamespaceMapped, PTableType.TABLE).getString(); rs = conn.createStatement().executeQuery( "SELECT COLUMN_FAMILY,SUM(GUIDE_POSTS_ROW_COUNT),SUM(GUIDE_POSTS_WIDTH) from SYSTEM.STATS where PHYSICAL_NAME = '" http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java index bb13f1b..a37903f 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java @@ -22,29 +22,38 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; -import java.sql.SQLException; import java.sql.Statement; +import java.util.Arrays; +import java.util.Collection; import java.util.Properties; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.util.Bytes; +import org.apache.phoenix.expression.KeyValueColumnExpression; +import org.apache.phoenix.expression.SingleCellColumnExpression; +import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr; +import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.query.QueryConstants; -import org.apache.phoenix.query.QueryServices; +import org.apache.phoenix.schema.PColumn; +import org.apache.phoenix.schema.PTable; +import org.apache.phoenix.schema.PTable.ImmutableStorageScheme; +import org.apache.phoenix.schema.PTableImpl; +import org.apache.phoenix.schema.PTableKey; +import org.apache.phoenix.schema.tuple.ResultTuple; +import org.apache.phoenix.schema.types.PVarchar; +import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.PhoenixRuntime; -import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.TestUtil; -import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; /** * Tests to demonstrate and verify the STORE_NULLS option on a table, @@ -52,74 +61,104 @@ import org.junit.Test; * functionality allows having row-level versioning (similar to how KEEP_DELETED_CELLS works), but * also allows permanently deleting a row. */ +@RunWith(Parameterized.class) public class StoreNullsIT extends ParallelStatsDisabledIT { - private static final Log LOG = LogFactory.getLog(StoreNullsIT.class); - private String WITH_NULLS; - private String WITHOUT_NULLS; - private String IMMUTABLE_WITH_NULLS; - private String IMMUTABLE_WITHOUT_NULLS; - private Connection conn; - private Statement stmt; - - @Before - public void setUp() throws SQLException { - WITH_NULLS = generateUniqueName(); - WITHOUT_NULLS = generateUniqueName(); - IMMUTABLE_WITH_NULLS = generateUniqueName(); - IMMUTABLE_WITHOUT_NULLS = generateUniqueName(); - conn = DriverManager.getConnection(getUrl()); - conn.setAutoCommit(true); - - stmt = conn.createStatement(); - stmt.execute("CREATE TABLE " + WITH_NULLS + " (" + - "id SMALLINT NOT NULL PRIMARY KEY, " + - "name VARCHAR) " + - "STORE_NULLS = true, VERSIONS = 1000, KEEP_DELETED_CELLS = false"); - stmt.execute("CREATE TABLE " + WITHOUT_NULLS + " (" + - "id SMALLINT NOT NULL PRIMARY KEY, " + - "name VARCHAR) " + - "VERSIONS = 1000, KEEP_DELETED_CELLS = false"); - stmt.execute("CREATE TABLE " + IMMUTABLE_WITH_NULLS + " (" - + "id SMALLINT NOT NULL PRIMARY KEY, name VARCHAR) " - + "STORE_NULLS = true, VERSIONS = 1, KEEP_DELETED_CELLS = false, IMMUTABLE_ROWS=true"); - stmt.execute("CREATE TABLE " + IMMUTABLE_WITHOUT_NULLS + " (" - + "id SMALLINT NOT NULL PRIMARY KEY, name VARCHAR) " - + "VERSIONS = 1, KEEP_DELETED_CELLS = false, IMMUTABLE_ROWS=true"); + private final boolean mutable; + private final boolean columnEncoded; + private final boolean storeNulls; + private final String ddlFormat; + + private String dataTableName; + + public StoreNullsIT(boolean mutable, boolean columnEncoded, boolean storeNulls) { + this.mutable = mutable; + this.columnEncoded = columnEncoded; + this.storeNulls = storeNulls; + + StringBuilder sb = new StringBuilder("CREATE TABLE %s (id SMALLINT NOT NULL PRIMARY KEY, name VARCHAR) VERSIONS = 1000, KEEP_DELETED_CELLS = false "); + if (!columnEncoded) { + sb.append(",").append("COLUMN_ENCODED_BYTES=0"); + } + if (!mutable) { + sb.append(",").append("IMMUTABLE_ROWS=true"); + if (!columnEncoded) { + sb.append(",IMMUTABLE_STORAGE_SCHEME="+PTableImpl.ImmutableStorageScheme.ONE_CELL_PER_COLUMN); + } + } + if (storeNulls) { + sb.append(",").append("STORE_NULLS=true"); + } + this.ddlFormat = sb.toString(); } - - @After - public void tearDown() throws SQLException { - stmt.close(); - conn.close(); + + @Parameters(name="StoreNullsIT_mutable={0}, columnEncoded={1}, storeNulls={2}") // name is used by failsafe as file name in reports + public static Collection<Boolean[]> data() { + return Arrays.asList(new Boolean[][] { + { false, false, false }, { false, false, true }, + { false, true, false }, { false, true, true }, + { true, false, false }, { true, false, true }, + { true, true, false }, { true, true, true }}); + } + + + @Before + public void setupTableNames() throws Exception { + dataTableName = generateUniqueName(); } @Test - public void testStoringNulls() throws SQLException, InterruptedException, IOException { - stmt.executeUpdate("UPSERT INTO " + IMMUTABLE_WITH_NULLS + " VALUES (1, 'v1')"); - stmt.executeUpdate("UPSERT INTO " + IMMUTABLE_WITHOUT_NULLS + " VALUES (1, 'v1')"); - stmt.executeUpdate("UPSERT INTO " + IMMUTABLE_WITH_NULLS + " VALUES (2, null)"); - stmt.executeUpdate("UPSERT INTO " + IMMUTABLE_WITHOUT_NULLS + " VALUES (2, null)"); - - ensureNullsNotStored(IMMUTABLE_WITH_NULLS); - ensureNullsNotStored(IMMUTABLE_WITHOUT_NULLS); + public void testStoringNullsForImmutableTables() throws Exception { + try (Connection conn = DriverManager.getConnection(getUrl()); + Statement stmt = conn.createStatement()) { + conn.setAutoCommit(true); + stmt.execute(String.format(ddlFormat, dataTableName)); + stmt.executeUpdate("UPSERT INTO " + dataTableName + " VALUES (1, 'v1')"); + stmt.executeUpdate("UPSERT INTO " + dataTableName + " VALUES (2, null)"); + TestUtil.doMajorCompaction(conn, dataTableName); + ensureNullsStoredCorrectly(conn); + } } - private void ensureNullsNotStored(String tableName) throws IOException { - tableName = SchemaUtil.normalizeIdentifier(tableName); - HTable htable = new HTable(getUtility().getConfiguration(), tableName); + private void ensureNullsStoredCorrectly(Connection conn) throws Exception { + ResultSet rs1 = conn.createStatement().executeQuery("SELECT NAME FROM "+dataTableName); + rs1.next(); + assertEquals("v1", rs1.getString(1)); + rs1.next(); + assertNull(rs1.getString(1)); + rs1.next(); + + HTable htable = new HTable(getUtility().getConfiguration(), dataTableName); Scan s = new Scan(); s.setRaw(true); ResultScanner scanner = htable.getScanner(s); // first row has a value for name Result rs = scanner.next(); - assertTrue(rs.containsColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, Bytes.toBytes("NAME"))); - assertTrue(rs.size() == 2); - // 2nd row has not + PTable table = conn.unwrap(PhoenixConnection.class).getTable(new PTableKey(null, dataTableName)); + PColumn nameColumn = table.getColumnForColumnName("NAME"); + byte[] qualifier = table.getImmutableStorageScheme()== ImmutableStorageScheme.SINGLE_CELL_ARRAY_WITH_OFFSETS ? QueryConstants.SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES : nameColumn.getColumnQualifierBytes(); + assertTrue(rs.containsColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, qualifier)); + assertTrue(rs.size() == 2); // 2 because it also includes the empty key value column + KeyValueColumnExpression colExpression = table.getImmutableStorageScheme() == ImmutableStorageScheme.SINGLE_CELL_ARRAY_WITH_OFFSETS ? new SingleCellColumnExpression(nameColumn, "NAME", table.getEncodingScheme()) : new KeyValueColumnExpression(nameColumn); + ImmutableBytesPtr ptr = new ImmutableBytesPtr(); + colExpression.evaluate(new ResultTuple(rs), ptr); + assertEquals(new ImmutableBytesPtr(PVarchar.INSTANCE.toBytes("v1")), ptr); rs = scanner.next(); - assertFalse(rs.containsColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, Bytes.toBytes("NAME"))); - // and no delete marker either - assertTrue(rs.size() == 1); + + if ( !mutable && !columnEncoded // we don't issue a put with empty value for immutable tables with cols stored per key value + || (mutable && !storeNulls)) { // for this case we use a delete to represent the null + assertFalse(rs.containsColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, qualifier)); + assertEquals(1, rs.size()); + } + else { + assertTrue(rs.containsColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, qualifier)); + assertEquals(2, rs.size()); + } + // assert null stored correctly + ptr = new ImmutableBytesPtr(); + if (colExpression.evaluate(new ResultTuple(rs), ptr)) { + assertEquals(new ImmutableBytesPtr(ByteUtil.EMPTY_BYTE_ARRAY), ptr); + } assertNull(scanner.next()); scanner.close(); htable.close(); @@ -127,93 +166,80 @@ public class StoreNullsIT extends ParallelStatsDisabledIT { @Test public void testQueryingHistory() throws Exception { - stmt.executeUpdate("UPSERT INTO " + WITH_NULLS + " VALUES (1, 'v1')"); - stmt.executeUpdate("UPSERT INTO " + WITHOUT_NULLS + " VALUES (1, 'v1')"); - - Thread.sleep(10L); - long afterFirstInsert = System.currentTimeMillis(); - Thread.sleep(10L); - - stmt.executeUpdate("UPSERT INTO " + WITH_NULLS + " VALUES (1, null)"); - stmt.executeUpdate("UPSERT INTO " + WITHOUT_NULLS + " VALUES (1, null)"); - Thread.sleep(10L); - - TestUtil.doMajorCompaction(conn, WITH_NULLS); - TestUtil.doMajorCompaction(conn, WITHOUT_NULLS); - - Properties historicalProps = new Properties(); - historicalProps.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, + try (Connection conn = DriverManager.getConnection(getUrl()); + Statement stmt = conn.createStatement()) { + conn.setAutoCommit(true); + stmt.execute(String.format(ddlFormat, dataTableName)); + stmt.executeUpdate("UPSERT INTO " + dataTableName + " VALUES (1, 'v1')"); + Thread.sleep(10L); + long afterFirstInsert = System.currentTimeMillis(); + Thread.sleep(10L); + + stmt.executeUpdate("UPSERT INTO " + dataTableName + " VALUES (1, null)"); + Thread.sleep(10L); + + TestUtil.doMajorCompaction(conn, dataTableName); + + Properties historicalProps = new Properties(); + historicalProps.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(afterFirstInsert)); - Connection historicalConn = DriverManager.getConnection(getUrl(), historicalProps); - Statement historicalStmt = historicalConn.createStatement(); - - ResultSet rs = historicalStmt.executeQuery( - "SELECT name FROM " + WITH_NULLS + " WHERE id = 1"); - assertTrue(rs.next()); - assertEquals("v1", rs.getString(1)); - rs.close(); - - // The single null wipes out all history for a field if STORE_NULLS is not enabled - rs = historicalStmt.executeQuery("SELECT name FROM " + WITHOUT_NULLS + " WHERE id = 1"); - assertTrue(rs.next()); - assertNull(rs.getString(1)); - rs.close(); + Connection historicalConn = DriverManager.getConnection(getUrl(), historicalProps); + Statement historicalStmt = historicalConn.createStatement(); + ResultSet rs = historicalStmt.executeQuery( "SELECT name FROM " + dataTableName + " WHERE id = 1"); + + if (storeNulls || !mutable) { // store nulls is set to true if the table is immutable + assertTrue(rs.next()); + assertEquals("v1", rs.getString(1)); + rs.close(); + } + else { + // The single null wipes out all history for a field if STORE_NULLS is not enabled + assertTrue(rs.next()); + assertNull(rs.getString(1)); + } + + rs.close(); + historicalStmt.close(); + historicalConn.close(); + } - historicalStmt.close(); - historicalConn.close(); } // Row deletes should work in the same way regardless of what STORE_NULLS is set to @Test public void testDeletes() throws Exception { - stmt.executeUpdate("UPSERT INTO " + WITH_NULLS + " VALUES (1, 'v1')"); - stmt.executeUpdate("UPSERT INTO " + WITHOUT_NULLS + " VALUES (1, 'v1')"); - - Thread.sleep(10L); - long afterFirstInsert = System.currentTimeMillis(); - Thread.sleep(10L); - - stmt.executeUpdate("DELETE FROM " + WITH_NULLS + " WHERE id = 1"); - stmt.executeUpdate("DELETE FROM " + WITHOUT_NULLS + " WHERE id = 1"); - Thread.sleep(10L); - - TestUtil.doMajorCompaction(conn, WITH_NULLS); - TestUtil.doMajorCompaction(conn, WITHOUT_NULLS); - - Properties historicalProps = new Properties(); - historicalProps.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, - Long.toString(afterFirstInsert)); - Connection historicalConn = DriverManager.getConnection(getUrl(), historicalProps); - Statement historicalStmt = historicalConn.createStatement(); - - // The row should be completely gone for both tables now - - ResultSet rs = historicalStmt.executeQuery( - "SELECT name FROM " + WITH_NULLS + " WHERE id = 1"); - assertFalse(rs.next()); - rs.close(); - - rs = historicalStmt.executeQuery("SELECT name FROM " + WITHOUT_NULLS + " WHERE id = 1"); - assertFalse(rs.next()); - rs.close(); - } - - @Test - public void testSetStoreNullsDefaultViaConfig() throws SQLException { - Properties props = new Properties(); - props.setProperty(QueryServices.DEFAULT_STORE_NULLS_ATTRIB, "true"); - Connection storeNullsConn = DriverManager.getConnection(getUrl(), props); - - Statement stmt = storeNullsConn.createStatement(); - stmt.execute("CREATE TABLE with_nulls_default (" + - "id smallint primary key," + - "name varchar)"); - - ResultSet rs = stmt.executeQuery("SELECT store_nulls FROM SYSTEM.CATALOG " + - "WHERE table_name = 'WITH_NULLS_DEFAULT' AND store_nulls is not null"); - assertTrue(rs.next()); - assertTrue(rs.getBoolean(1)); + try (Connection conn = DriverManager.getConnection(getUrl()); + Statement stmt = conn.createStatement()) { + conn.setAutoCommit(true); + stmt.execute(String.format(ddlFormat, dataTableName)); + stmt.executeUpdate("UPSERT INTO " + dataTableName + " VALUES (1, 'v1')"); + + Thread.sleep(10L); + long afterFirstInsert = System.currentTimeMillis(); + Thread.sleep(10L); + + stmt.executeUpdate("DELETE FROM " + dataTableName + " WHERE id = 1"); + Thread.sleep(10L); + + TestUtil.doMajorCompaction(conn, dataTableName); + + Properties historicalProps = new Properties(); + historicalProps.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, + Long.toString(afterFirstInsert)); + Connection historicalConn = DriverManager.getConnection(getUrl(), historicalProps); + Statement historicalStmt = historicalConn.createStatement(); + + // The row should be completely gone for both tables now + + ResultSet rs = historicalStmt.executeQuery( + "SELECT name FROM " + dataTableName + " WHERE id = 1"); + assertFalse(rs.next()); + rs.close(); + + rs = historicalStmt.executeQuery("SELECT name FROM " + dataTableName + " WHERE id = 1"); + assertFalse(rs.next()); + rs.close(); + } } - } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsPropIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsPropIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsPropIT.java new file mode 100644 index 0000000..26ff629 --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsPropIT.java @@ -0,0 +1,51 @@ +/* + * 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; + +import static org.junit.Assert.assertTrue; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import org.apache.phoenix.query.QueryServices; +import org.junit.Test; + +public class StoreNullsPropIT extends ParallelStatsDisabledIT { + + @Test + public void testSetStoreNullsDefaultViaConfig() throws SQLException { + Properties props = new Properties(); + props.setProperty(QueryServices.DEFAULT_STORE_NULLS_ATTRIB, "true"); + Connection storeNullsConn = DriverManager.getConnection(getUrl(), props); + + Statement stmt = storeNullsConn.createStatement(); + stmt.execute("CREATE TABLE with_nulls_default (" + + "id smallint primary key," + + "name varchar)"); + + ResultSet rs = stmt.executeQuery("SELECT store_nulls FROM SYSTEM.CATALOG " + + "WHERE table_name = 'WITH_NULLS_DEFAULT' AND store_nulls is not null"); + assertTrue(rs.next()); + assertTrue(rs.getBoolean(1)); + } + +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java index 6b394c1..f9ef0c2 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SysTableNamespaceMappedStatsCollectorIT.java @@ -27,8 +27,8 @@ import com.google.common.collect.Maps; public class SysTableNamespaceMappedStatsCollectorIT extends StatsCollectorIT { - public SysTableNamespaceMappedStatsCollectorIT(boolean transactional, boolean userTableNamespaceMapped) { - super(transactional, userTableNamespaceMapped); + public SysTableNamespaceMappedStatsCollectorIT(boolean mutable, boolean transactional, boolean userTableNamespaceMapped, boolean columnEncoded) { + super(mutable, transactional, userTableNamespaceMapped, columnEncoded); } @BeforeClass http://git-wip-us.apache.org/repos/asf/phoenix/blob/3c7ff99b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TopNIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TopNIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TopNIT.java index ca1cd86..39e8cb6 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TopNIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TopNIT.java @@ -50,7 +50,7 @@ public class TopNIT extends BaseClientManagedTimeIT { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT entity_id FROM aTable ORDER BY b_string, entity_id LIMIT 5"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -80,7 +80,7 @@ public class TopNIT extends BaseClientManagedTimeIT { public void testDescMultiOrderByExpr() throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "SELECT entity_id FROM aTable ORDER BY b_string || entity_id desc LIMIT 5"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2 @@ -119,7 +119,7 @@ public class TopNIT extends BaseClientManagedTimeIT { private void testTopNDelete(boolean autoCommit) throws Exception { long ts = nextTimestamp(); String tenantId = getOrganizationId(); - initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl()); + initATableValues(ATABLE_NAME, tenantId, getDefaultSplits(tenantId), null, ts, getUrl(), null); String query = "DELETE FROM aTable ORDER BY b_string, entity_id LIMIT 5"; Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at timestamp 2