You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by an...@apache.org on 2016/09/06 05:28:47 UTC

phoenix git commit: PHOENIX-3054 Counting zero null rows returns an empty result set

Repository: phoenix
Updated Branches:
  refs/heads/master fce0f1033 -> 7827178b7


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/7827178b
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/7827178b
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/7827178b

Branch: refs/heads/master
Commit: 7827178b7addbd336d5a5c3b12a4e1b764f0f74a
Parents: fce0f10
Author: Ankit Singhal <an...@gmail.com>
Authored: Tue Sep 6 10:58:33 2016 +0530
Committer: Ankit Singhal <an...@gmail.com>
Committed: Tue Sep 6 10:58:33 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/7827178b/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/7827178b/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/7827178b/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/7827178b/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();