You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by pb...@apache.org on 2019/05/01 07:36:41 UTC

[phoenix] 03/12: PhoenixResultSet#next() closes the result set if scanner returns null

This is an automated email from the ASF dual-hosted git repository.

pboado pushed a commit to branch 5.x-cdh6
in repository https://gitbox.apache.org/repos/asf/phoenix.git

commit 5d37370c7c48558f924dce32a6f2c9c5dd52efe6
Author: s.kadam <s....@salesforce.com>
AuthorDate: Thu Apr 18 22:05:21 2019 +0100

    PhoenixResultSet#next() closes the result set if scanner returns null
---
 .../org/apache/phoenix/end2end/QueryLoggerIT.java  | 193 +++++++++++----------
 .../org/apache/phoenix/jdbc/PhoenixResultSet.java  |   4 +-
 2 files changed, 102 insertions(+), 95 deletions(-)

diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryLoggerIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryLoggerIT.java
index 208eddd..8a08d37 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryLoggerIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryLoggerIT.java
@@ -103,44 +103,47 @@ public class QueryLoggerIT extends BaseUniqueNamesOwnClusterIT {
         Connection conn = DriverManager.getConnection(getUrl(),props);
         assertEquals(conn.unwrap(PhoenixConnection.class).getLogLevel(),LogLevel.DEBUG);
         String query = "SELECT * FROM " + tableName;
-        ResultSet rs = conn.createStatement().executeQuery(query);
-        StatementContext context = ((PhoenixResultSet)rs).getContext();
-        String queryId = context.getQueryLogger().getQueryId();
-        while (rs.next()) {
-            rs.getString(1);
-            rs.getString(2);
+        StatementContext context;
+        try (ResultSet rs = conn.createStatement().executeQuery(query)) {
+            context = ((PhoenixResultSet) rs).getContext();
+            while (rs.next()) {
+                rs.getString(1);
+                rs.getString(2);
+            }
         }
-        ResultSet explainRS = conn.createStatement().executeQuery("Explain " + query);
+        String queryId = context.getQueryLogger().getQueryId();
 
         String logQuery = "SELECT * FROM " + SYSTEM_CATALOG_SCHEMA + ".\"" + SYSTEM_LOG_TABLE + "\"";
         int delay = 5000;
 
         // sleep for sometime to let query log committed
         Thread.sleep(delay);
-        rs = conn.createStatement().executeQuery(logQuery);
-        boolean foundQueryLog = false;
+        try (ResultSet explainRS = conn.createStatement().executeQuery("Explain " + query);
+             ResultSet rs = conn.createStatement().executeQuery(logQuery)) {
+            boolean foundQueryLog = false;
 
-        while (rs.next()) {
-            if (rs.getString(QUERY_ID).equals(queryId)) {
-                foundQueryLog = true;
-                assertEquals(rs.getString(BIND_PARAMETERS), null);
-                assertEquals(rs.getString(USER), System.getProperty("user.name"));
-                assertEquals(rs.getString(CLIENT_IP), InetAddress.getLocalHost().getHostAddress());
-                assertEquals(rs.getString(EXPLAIN_PLAN), QueryUtil.getExplainPlan(explainRS));
-                assertEquals(rs.getString(GLOBAL_SCAN_DETAILS), context.getScan().toJSON());
-                assertEquals(rs.getLong(NO_OF_RESULTS_ITERATED), 10);
-                assertEquals(rs.getString(QUERY), query);
-                assertEquals(rs.getString(QUERY_STATUS), QueryStatus.COMPLETED.toString());
-                assertEquals(rs.getString(TENANT_ID), null);
-                assertTrue(rs.getString(SCAN_METRICS_JSON)==null);
-                assertEquals(rs.getString(EXCEPTION_TRACE),null);
-            }else{
-                //confirm we are not logging system queries
-                assertFalse(rs.getString(QUERY).toString().contains(SYSTEM_CATALOG_SCHEMA));
+            while (rs.next()) {
+                if (rs.getString(QUERY_ID).equals(queryId)) {
+                    foundQueryLog = true;
+                    assertEquals(rs.getString(BIND_PARAMETERS), null);
+                    assertEquals(rs.getString(USER), System.getProperty("user.name"));
+                    assertEquals(rs.getString(CLIENT_IP), InetAddress.getLocalHost().getHostAddress());
+                    assertEquals(rs.getString(EXPLAIN_PLAN), QueryUtil.getExplainPlan(explainRS));
+                    assertEquals(rs.getString(GLOBAL_SCAN_DETAILS), context.getScan().toJSON());
+                    assertEquals(rs.getLong(NO_OF_RESULTS_ITERATED), 10);
+                    assertEquals(rs.getString(QUERY), query);
+                    assertEquals(rs.getString(QUERY_STATUS), QueryStatus.COMPLETED.toString());
+                    assertEquals(rs.getString(TENANT_ID), null);
+                    assertTrue(rs.getString(SCAN_METRICS_JSON) == null);
+                    assertEquals(rs.getString(EXCEPTION_TRACE), null);
+                } else {
+                    //confirm we are not logging system queries
+                    assertFalse(rs.getString(QUERY).toString().contains(SYSTEM_CATALOG_SCHEMA));
+                }
             }
+            assertTrue(foundQueryLog);
+            conn.close();
         }
-        assertTrue(foundQueryLog);
-        conn.close();
     }
     
     @Test
@@ -155,12 +158,12 @@ public class QueryLoggerIT extends BaseUniqueNamesOwnClusterIT {
         String query = "SELECT * FROM " + tableName;
         int count=100;
         for (int i = 0; i < count; i++) {
-            ResultSet rs = conn.createStatement().executeQuery(query);
-            while(rs.next()){
-                
+            try (ResultSet rs = conn.createStatement().executeQuery(query)) {
+                while (rs.next()) {
+
+                }
             }
         }
-        
         String logQuery = "SELECT * FROM " + SYSTEM_CATALOG_SCHEMA + ".\"" + SYSTEM_LOG_TABLE + "\"";
         
         int delay = 5000;
@@ -187,37 +190,39 @@ public class QueryLoggerIT extends BaseUniqueNamesOwnClusterIT {
         Connection conn = DriverManager.getConnection(getUrl(),props);
         assertEquals(conn.unwrap(PhoenixConnection.class).getLogLevel(),LogLevel.INFO);
         String query = "SELECT * FROM " + tableName;
-        
-        ResultSet rs = conn.createStatement().executeQuery(query);
-        StatementContext context = ((PhoenixResultSet)rs).getContext();
-        String queryId = context.getQueryLogger().getQueryId();
-        while (rs.next()) {
-            rs.getString(1);
-            rs.getString(2);
+        StatementContext context;
+        try (ResultSet rs = conn.createStatement().executeQuery(query)) {
+            context = ((PhoenixResultSet) rs).getContext();
+            while (rs.next()) {
+                rs.getString(1);
+                rs.getString(2);
+            }
         }
+        String queryId = context.getQueryLogger().getQueryId();
 
         String logQuery = "SELECT * FROM " + SYSTEM_CATALOG_SCHEMA + ".\"" + SYSTEM_LOG_TABLE + "\"";
         int delay = 5000;
 
         // sleep for sometime to let query log committed
         Thread.sleep(delay);
-        rs = conn.createStatement().executeQuery(logQuery);
-        boolean foundQueryLog = false;
-        while (rs.next()) {
-            if (rs.getString(QUERY_ID).equals(queryId)) {
-                foundQueryLog = true;
-                assertEquals(rs.getString(USER), System.getProperty("user.name"));
-                assertEquals(rs.getString(CLIENT_IP), InetAddress.getLocalHost().getHostAddress());
-                assertEquals(rs.getString(EXPLAIN_PLAN), null);
-                assertEquals(rs.getString(GLOBAL_SCAN_DETAILS),null);
-                assertEquals(rs.getLong(NO_OF_RESULTS_ITERATED), 10);
-                assertEquals(rs.getString(QUERY), query);
-                assertEquals(rs.getString(QUERY_STATUS),QueryStatus.COMPLETED.toString());
-                assertEquals(rs.getString(TENANT_ID), null);
+        try (ResultSet rs = conn.createStatement().executeQuery(logQuery)) {
+            boolean foundQueryLog = false;
+            while (rs.next()) {
+                if (rs.getString(QUERY_ID).equals(queryId)) {
+                    foundQueryLog = true;
+                    assertEquals(rs.getString(USER), System.getProperty("user.name"));
+                    assertEquals(rs.getString(CLIENT_IP), InetAddress.getLocalHost().getHostAddress());
+                    assertEquals(rs.getString(EXPLAIN_PLAN), null);
+                    assertEquals(rs.getString(GLOBAL_SCAN_DETAILS), null);
+                    assertEquals(rs.getLong(NO_OF_RESULTS_ITERATED), 10);
+                    assertEquals(rs.getString(QUERY), query);
+                    assertEquals(rs.getString(QUERY_STATUS), QueryStatus.COMPLETED.toString());
+                    assertEquals(rs.getString(TENANT_ID), null);
+                }
             }
+            assertTrue(foundQueryLog);
+            conn.close();
         }
-        assertTrue(foundQueryLog);
-        conn.close();
     }
     
     @Test
@@ -275,46 +280,50 @@ public class QueryLoggerIT extends BaseUniqueNamesOwnClusterIT {
         final MyClock clock = new MyClock(100);
         EnvironmentEdgeManager.injectEdge(clock);
         try{
-        String query = "SELECT * FROM " + tableName +" where V = ?";
-        
-        PreparedStatement pstmt = conn.prepareStatement(query);
-        pstmt.setString(1, "value5");
-        ResultSet rs = pstmt.executeQuery();
-        StatementContext context = ((PhoenixResultSet)rs).getContext();
-        String queryId = context.getQueryLogger().getQueryId();
-        while (rs.next()) {
-            rs.getString(1);
-            rs.getString(2);
-        }
-        ResultSet explainRS = conn.createStatement()
-                .executeQuery("Explain " + "SELECT * FROM " + tableName + " where V = 'value5'");
-        String logQuery = "SELECT * FROM " + SYSTEM_CATALOG_SCHEMA + ".\"" + SYSTEM_LOG_TABLE + "\"";
-        int delay = 5000;
+            String query = "SELECT * FROM " + tableName +" where V = ?";
+            StatementContext context;
+            PreparedStatement pstmt = conn.prepareStatement(query);
+            pstmt.setString(1, "value5");
+            try (ResultSet rs = pstmt.executeQuery()) {
+                 context = ((PhoenixResultSet) rs).getContext();
+                while (rs.next()) {
+                    rs.getString(1);
+                    rs.getString(2);
+                }
+            }
+            String queryId = context.getQueryLogger().getQueryId();
 
-        // sleep for sometime to let query log committed
-        Thread.sleep(delay);
-        rs = conn.createStatement().executeQuery(logQuery);
-        boolean foundQueryLog = false;
-        while (rs.next()) {
-            if (rs.getString(QUERY_ID).equals(queryId)) {
-                foundQueryLog = true;
-                assertEquals(rs.getString(BIND_PARAMETERS), loglevel == LogLevel.TRACE ? "value5" : null);
-                assertEquals(rs.getString(USER), System.getProperty("user.name"));
-                assertEquals(rs.getString(CLIENT_IP), InetAddress.getLocalHost().getHostAddress());
-                assertEquals(rs.getString(EXPLAIN_PLAN), QueryUtil.getExplainPlan(explainRS));
-                assertEquals(rs.getString(GLOBAL_SCAN_DETAILS), context.getScan().toJSON());
-                assertEquals(rs.getLong(NO_OF_RESULTS_ITERATED), 1);
-                assertEquals(rs.getString(QUERY), query);
-                assertEquals(rs.getString(QUERY_STATUS), QueryStatus.COMPLETED.toString());
-                assertTrue(LogLevel.TRACE == loglevel ? rs.getString(SCAN_METRICS_JSON).contains("scanMetrics")
-                        : rs.getString(SCAN_METRICS_JSON) == null);
-                assertEquals(rs.getTimestamp(START_TIME).getTime(),100);
-                assertEquals(rs.getString(TENANT_ID), null);
+            String logQuery = "SELECT * FROM " + SYSTEM_CATALOG_SCHEMA + ".\"" + SYSTEM_LOG_TABLE + "\"";
+            int delay = 5000;
+
+            // sleep for sometime to let query log committed
+            Thread.sleep(delay);
+            String explainQuery = "Explain " + "SELECT * FROM " + tableName + " where V = 'value5'";
+            try (ResultSet explainRS = conn.createStatement()
+                    .executeQuery(explainQuery);
+                 ResultSet rs = conn.createStatement().executeQuery(logQuery)) {
+                boolean foundQueryLog = false;
+                while (rs.next()) {
+                    if (rs.getString(QUERY_ID).equals(queryId)) {
+                        foundQueryLog = true;
+                        assertEquals(rs.getString(BIND_PARAMETERS), loglevel == LogLevel.TRACE ? "value5" : null);
+                        assertEquals(rs.getString(USER), System.getProperty("user.name"));
+                        assertEquals(rs.getString(CLIENT_IP), InetAddress.getLocalHost().getHostAddress());
+                        assertEquals(rs.getString(EXPLAIN_PLAN), QueryUtil.getExplainPlan(explainRS));
+                        assertEquals(rs.getString(GLOBAL_SCAN_DETAILS), context.getScan().toJSON());
+                        assertEquals(rs.getLong(NO_OF_RESULTS_ITERATED), 1);
+                        assertEquals(rs.getString(QUERY), query);
+                        assertEquals(rs.getString(QUERY_STATUS), QueryStatus.COMPLETED.toString());
+                        assertTrue(LogLevel.TRACE == loglevel ? rs.getString(SCAN_METRICS_JSON).contains("scanMetrics")
+                                : rs.getString(SCAN_METRICS_JSON) == null);
+                        assertEquals(rs.getTimestamp(START_TIME).getTime(), 100);
+                        assertEquals(rs.getString(TENANT_ID), null);
+                    }
+                }
+                assertTrue(foundQueryLog);
+                conn.close();
             }
-        }
-        assertTrue(foundQueryLog);
-        conn.close();
-        }finally{
+        }finally {
             EnvironmentEdgeManager.injectEdge(null);
         }
     }
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java
index b99ece6..016aa8f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java
@@ -839,9 +839,7 @@ public class PhoenixResultSet implements ResultSet, SQLCloseable {
                 overAllQueryMetrics.startResultSetWatch();
             }
             currentRow = scanner.next();
-            if (currentRow == null) {
-                close();
-            }else{
+            if (currentRow != null) {
                 count++;
                 // Reset this projector with each row
                 if (this.rowProjectorWithDynamicCols != null) {