| Bug #71924 | StatementInterceptorV2.postProcess() exceptions swallows other exceptions | ||
|---|---|---|---|
| Submitted: | 4 Mar 2014 13:22 | Modified: | 4 Mar 2014 13:23 |
| Reporter: | Filipe Silva | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | Connector / J | Severity: | S3 (Non-critical) |
| Version: | 5.1.29 | OS: | Any |
| Assigned to: | Filipe Silva | CPU Architecture: | Any |
[4 Mar 2014 16:23]
Filipe Silva
Posted by developer:
Instead of the postProcess() method above, the correct code example should contain:
public ResultSetInternalMethods postProcess(String sql, com.mysql.jdbc.Statement interceptedStatement,
ResultSetInternalMethods originalResultSet, com.mysql.jdbc.Connection connection, int warningCount,
boolean noIndexUsed, boolean noGoodIndexUsed, SQLException statementException) throws SQLException {
if (sql.contains("t_original")) {
return (ResultSetInternalMethods) interceptedStatement.executeQuery(sql.replace("t_original", "t_intercepted"));
}
return originalResultSet;
}

Description: If the method StatementInterceptorV2.postProcess() throws an exception, it swallows any other that may have occurred while executing the main query. How to repeat: package mysql.interceptors; 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 com.mysql.jdbc.ResultSetInternalMethods; import com.mysql.jdbc.StatementInterceptorV2; public class StatementInterceptorTest { private static final String CONNECTION_URL = "jdbc:mysql:///test?statementInterceptors=" + MyStatementInterceptor.class.getName(); private static final String USERNAME = "myuser"; private static final String PASSWORD = "mypass"; public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT c FROM t_original"); rs.close(); stmt.close(); conn.close(); } public static class MyStatementInterceptor implements StatementInterceptorV2 { public void init(com.mysql.jdbc.Connection conn, Properties props) throws SQLException { } public ResultSetInternalMethods preProcess(String sql, com.mysql.jdbc.Statement interceptedStatement, com.mysql.jdbc.Connection connection) throws SQLException { return null; } public boolean executeTopLevelOnly() { return true; } public void destroy() { } public ResultSetInternalMethods postProcess(String sql, com.mysql.jdbc.Statement interceptedStatement, ResultSetInternalMethods originalResultSet, com.mysql.jdbc.Connection connection, int warningCount, boolean noIndexUsed, boolean noGoodIndexUsed, SQLException statementException) throws SQLException { return (ResultSetInternalMethods) interceptedStatement.executeQuery("SELECT c FROM t_intercepted"); } } } Suggested fix: Chain exceptions thrown.