Repository: phoenix Updated Branches: refs/heads/4.x-HBase-1.3 79e833750 -> 46f50d294
PHOENIX-4864 Fix NullPointerException while Logging some DDL Statements Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/46f50d29 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/46f50d29 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/46f50d29 Branch: refs/heads/4.x-HBase-1.3 Commit: 46f50d29435e29d35dc5cca0f9c68711b22c8308 Parents: 79e8337 Author: Ashutosh Parekh <parekh.ashut...@gmail.com> Authored: Thu Aug 23 12:11:23 2018 -0700 Committer: Karan Mehta <karanmeht...@gmail.com> Committed: Fri Aug 24 17:35:46 2018 -0700 ---------------------------------------------------------------------- .../monitoring/PhoenixLoggingMetricsIT.java | 42 +++++++++++++++++++- .../jdbc/LoggingPhoenixPreparedStatement.java | 5 ++- .../phoenix/jdbc/LoggingPhoenixStatement.java | 5 ++- 3 files changed, 49 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/46f50d29/phoenix-core/src/it/java/org/apache/phoenix/monitoring/PhoenixLoggingMetricsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/PhoenixLoggingMetricsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/PhoenixLoggingMetricsIT.java index 7e56902..5d5524c 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/PhoenixLoggingMetricsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/PhoenixLoggingMetricsIT.java @@ -20,6 +20,7 @@ package org.apache.phoenix.monitoring; import com.google.common.collect.Maps; import org.apache.phoenix.jdbc.LoggingPhoenixConnection; import org.apache.phoenix.jdbc.PhoenixMetricsLog; +import org.apache.phoenix.jdbc.LoggingPhoenixResultSet; import org.junit.Before; import org.junit.Test; @@ -69,6 +70,35 @@ public class PhoenixLoggingMetricsIT extends BasePhoenixMetricsIT { } @Test + public void testResultSetTypeForQueries() throws Exception { + String tableName3 = generateUniqueName(); + + String create = "CREATE TABLE " + tableName3 + " (K INTEGER PRIMARY KEY)"; + assertTrue(executeAndGetResultSet(create) == null); + + String upsert = "UPSERT INTO " + tableName3 + " VALUES (42)"; + assertTrue(executeAndGetResultSet(upsert) == null); + + String select = "SELECT * FROM " + tableName3; + assertTrue(executeAndGetResultSet(select) instanceof LoggingPhoenixResultSet); + + String createView = "CREATE VIEW TEST_VIEW (K INTEGER) AS SELECT * FROM " + tableName3; + assertTrue(executeAndGetResultSet(createView) == null); + + String createIndex = "CREATE INDEX TEST_INDEX ON " + tableName3 + " (K)"; + assertTrue(executeAndGetResultSet(createIndex) == null); + + String dropIndex = "DROP INDEX TEST_INDEX ON " + tableName3; + assertTrue(executeAndGetResultSet(dropIndex) == null); + + String dropView = "DROP VIEW TEST_VIEW"; + assertTrue(executeAndGetResultSet(dropView) == null); + + String dropTable = "DROP TABLE " + tableName3; + assertTrue(executeAndGetResultSet(dropTable) == null); + } + + @Test public void testPhoenixMetricsLoggedOnCommit() throws Exception { // run SELECT to verify read metrics are logged String query = "SELECT * FROM " + tableName1; @@ -134,12 +164,22 @@ public class PhoenixLoggingMetricsIT extends BasePhoenixMetricsIT { mutationReadMetricsMap.size() == 0); } + private ResultSet executeAndGetResultSet(String query) throws Exception { + Statement stmt = loggedConn.createStatement(); + stmt.execute(query); + return stmt.getResultSet(); + } + private void verifyQueryLevelMetricsLogging(String query) throws SQLException { Statement stmt = loggedConn.createStatement(); ResultSet rs = stmt.executeQuery(query); + assertTrue(rs instanceof LoggingPhoenixResultSet); + int rowsRetrievedCounter = 0; while (rs.next()) { + rowsRetrievedCounter++; } rs.close(); + assertTrue(rowsRetrievedCounter == NUM_ROWS); assertTrue("Read metrics for not found for " + tableName1, requestReadMetricsMap.get(tableName1).size() > 0); assertTrue("Logged query doesn't match actual query", loggedSql.equals(query)); @@ -192,4 +232,4 @@ public class PhoenixLoggingMetricsIT extends BasePhoenixMetricsIT { } }); } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/46f50d29/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixPreparedStatement.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixPreparedStatement.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixPreparedStatement.java index 952e3fd..dbeea0d 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixPreparedStatement.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixPreparedStatement.java @@ -45,7 +45,10 @@ public class LoggingPhoenixPreparedStatement extends DelegatePreparedStatement { @Override public ResultSet getResultSet() throws SQLException { - return new LoggingPhoenixResultSet(super.getResultSet(), phoenixMetricsLog, sql); + // Re-use the cached ResultSet value since call to getResultSet() is not idempotent + ResultSet resultSet = super.getResultSet(); + return (resultSet == null) ? null : new LoggingPhoenixResultSet(resultSet, + phoenixMetricsLog, sql); } @Override http://git-wip-us.apache.org/repos/asf/phoenix/blob/46f50d29/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixStatement.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixStatement.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixStatement.java index f9abe6a..de33893 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixStatement.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/LoggingPhoenixStatement.java @@ -51,7 +51,10 @@ public class LoggingPhoenixStatement extends DelegateStatement { @Override public ResultSet getResultSet() throws SQLException { - return new LoggingPhoenixResultSet(super.getResultSet(), phoenixMetricsLog, this.sql); + // Re-use the cached ResultSet value since call to getResultSet() is not idempotent + ResultSet resultSet = super.getResultSet(); + return (resultSet == null) ? null : new LoggingPhoenixResultSet(resultSet, + phoenixMetricsLog, sql); } @Override