Repository: phoenix Updated Branches: refs/heads/4.x-HBase-1.1 96dd70062 -> e40907780
PHOENIX-3054 Counting zero null rows returns an empty result set Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/e4090778 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/e4090778 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/e4090778 Branch: refs/heads/4.x-HBase-1.1 Commit: e4090778046fb166e25f24374f3137e24a598e5b Parents: 96dd700 Author: Ankit Singhal <ankitsingha...@gmail.com> Authored: Tue Sep 6 11:15:38 2016 +0530 Committer: Ankit Singhal <ankitsingha...@gmail.com> Committed: Tue Sep 6 11:15:38 2016 +0530 ---------------------------------------------------------------------- .../phoenix/end2end/AggregateQueryIT.java | 36 ++++++++++++++++++++ .../phoenix/end2end/index/ViewIndexIT.java | 25 +++++--------- .../apache/phoenix/execute/BaseQueryPlan.java | 7 +++- .../iterate/MergeSortResultIterator.java | 2 +- 4 files changed, 52 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/e4090778/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java index f23b5eb..01cc2c1 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AggregateQueryIT.java @@ -191,6 +191,42 @@ public class AggregateQueryIT extends BaseQueryIT { conn.close(); } } + + + @Test + public void testCountWithNoScanRanges() throws Exception { + String query = "SELECT count(1) FROM aTable WHERE organization_id = 'not_existing_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); + try { + PreparedStatement statement = conn.prepareStatement(query); + ResultSet rs = statement.executeQuery(); + assertTrue(rs.next()); + assertEquals(0, rs.getLong(1)); + assertFalse(rs.next()); + query = "SELECT count(1) FROM aTable WHERE organization_id = 'not_existing_organization_id' having count(*)>0"; + rs = conn.prepareStatement(query).executeQuery(); + assertFalse(rs.next()); + query = "SELECT count(1) FROM aTable WHERE organization_id = 'not_existing_organization_id' limit 1 offset 1"; + rs = conn.prepareStatement(query).executeQuery(); + assertFalse(rs.next()); + query = "SELECT count(1),123 FROM aTable WHERE organization_id = 'not_existing_organization_id'"; + rs = conn.prepareStatement(query).executeQuery(); + assertTrue(rs.next()); + assertEquals(0, rs.getLong(1)); + assertEquals("123", rs.getString(2)); + assertFalse(rs.next()); + query = "SELECT count(1),sum(x_decimal) FROM aTable WHERE organization_id = 'not_existing_organization_id'"; + rs = conn.prepareStatement(query).executeQuery(); + assertTrue(rs.next()); + assertEquals(0, rs.getLong(1)); + assertEquals(null, rs.getBigDecimal(2)); + assertFalse(rs.next()); + } finally { + conn.close(); + } + } @Test public void testCountIsNotNull() throws Exception { http://git-wip-us.apache.org/repos/asf/phoenix/blob/e4090778/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java index d97a749..c985fc9 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java @@ -39,17 +39,14 @@ import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.phoenix.compile.QueryPlan; import org.apache.phoenix.end2end.BaseHBaseManagedTimeTableReuseIT; import org.apache.phoenix.end2end.Shadower; -import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.PNameFactory; -import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -133,24 +130,20 @@ public class ViewIndexIT extends BaseHBaseManagedTimeTableReuseIT { conn1.createStatement().execute("CREATE VIEW " + viewName + " AS SELECT * FROM " + tableName); conn1.createStatement().execute("CREATE INDEX " + indexName + " ON " + viewName + " (v1)"); conn2.createStatement().executeQuery("SELECT * FROM " + tableName).next(); - String query = "SELECT sequence_schema, sequence_name, current_value, increment_by FROM SYSTEM.\"SEQUENCE\" WHERE sequence_schema like '%" - + schemaName + "%'"; - ResultSet rs = conn1.prepareStatement(query).executeQuery(); - assertTrue(rs.next()); - assertEquals(MetaDataUtil.getViewIndexSequenceSchemaName(PNameFactory.newName(tableName), isNamespaceMapped), - rs.getString("sequence_schema")); - assertEquals(MetaDataUtil.getViewIndexSequenceName(PNameFactory.newName(tableName), null, isNamespaceMapped), - rs.getString("sequence_name")); - assertEquals(-32767, rs.getInt("current_value")); - assertEquals(1, rs.getInt("increment_by")); - assertFalse(rs.next()); + String sequenceName = getViewIndexSequenceName(PNameFactory.newName(tableName), null, isNamespaceMapped); + String sequenceSchemaName = getViewIndexSequenceSchemaName(PNameFactory.newName(tableName), isNamespaceMapped); + String seqName = getViewIndexSequenceName(PNameFactory.newName(tableName), null, !isNamespaceMapped); + String seqSchemaName = getViewIndexSequenceSchemaName(PNameFactory.newName(tableName), !isNamespaceMapped); + verifySequence(null, sequenceName, sequenceSchemaName, true); + // Check other format of sequence is not there as Sequences format is different for views/indexes created on + // table which are namespace mapped and which are not. + verifySequence(null, seqName, seqSchemaName, false); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); conn1.createStatement().execute("DROP VIEW " + viewName); conn1.createStatement().execute("DROP TABLE "+ tableName); admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); assertFalse("View index table should be deleted.", admin.tableExists(TableName.valueOf(viewIndexPhysicalTableName))); - String sequenceName = getViewIndexSequenceName(PNameFactory.newName(tableName), PNameFactory.newName("a"), isNamespaceMapped); - String sequenceSchemaName = getViewIndexSequenceSchemaName(PNameFactory.newName(tableName), isNamespaceMapped); + verifySequence(null, sequenceName, sequenceSchemaName, false); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/e4090778/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java index b573f07..1e09079 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java @@ -217,7 +217,12 @@ public abstract class BaseQueryPlan implements QueryPlan { } public final ResultIterator iterator(final List<? extends SQLCloseable> dependencies, ParallelScanGrouper scanGrouper, Scan scan) throws SQLException { - if (context.getScanRanges() == ScanRanges.NOTHING) { + /* + * For aggregate queries, we still need to let the AggregationPlan to + * proceed so that we can give proper aggregates even if there are no + * row to be scanned. + */ + if (context.getScanRanges() == ScanRanges.NOTHING && !getStatement().isAggregate()) { return ResultIterator.EMPTY_ITERATOR; } http://git-wip-us.apache.org/repos/asf/phoenix/blob/e4090778/phoenix-core/src/main/java/org/apache/phoenix/iterate/MergeSortResultIterator.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/MergeSortResultIterator.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/MergeSortResultIterator.java index 961e766..d094bec 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/MergeSortResultIterator.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/MergeSortResultIterator.java @@ -70,7 +70,7 @@ public abstract class MergeSortResultIterator implements PeekingResultIterator { private PriorityQueue<MaterializedComparableResultIterator> getMinHeap() throws SQLException { if (minHeap == null) { List<PeekingResultIterator> iterators = resultIterators.getIterators(); - minHeap = new PriorityQueue<MaterializedComparableResultIterator>(iterators.size()); + minHeap = new PriorityQueue<MaterializedComparableResultIterator>(Math.max(1, iterators.size())); for (PeekingResultIterator itr : iterators) { if (itr.peek() == null) { itr.close();