diff --git a/src/main/java/com/alibaba/druid/filter/FilterEventAdapter.java b/src/main/java/com/alibaba/druid/filter/FilterEventAdapter.java index 2e7585cd25..b96ff057d9 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterEventAdapter.java +++ b/src/main/java/com/alibaba/druid/filter/FilterEventAdapter.java @@ -301,8 +301,10 @@ public abstract class FilterEventAdapter extends FilterAdapter { try { ResultSetProxy resultSet = super.statement_executeQuery(chain, statement, sql); - statementExecuteQueryAfter(statement, sql, resultSet); - resultSetOpenAfter(resultSet); + if (resultSet != null) { + statementExecuteQueryAfter(statement, sql, resultSet); + resultSetOpenAfter(resultSet); + } return resultSet; } catch (SQLException error) { @@ -462,9 +464,11 @@ public abstract class FilterEventAdapter extends FilterAdapter { ResultSetProxy resultSet = chain.preparedStatement_executeQuery(statement); - statementExecuteQueryAfter(statement, statement.getSql(), resultSet); + if (resultSet != null) { + statementExecuteQueryAfter(statement, statement.getSql(), resultSet); - resultSetOpenAfter(resultSet); + resultSetOpenAfter(resultSet); + } return resultSet; } catch (SQLException error) { diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index f9139cad2e..4f462272f1 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -180,6 +180,10 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement conn.beforeExecute(); try { ResultSet rs = stmt.executeQuery(); + + if (rs == null) { + return null; + } DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); resultSetTrace.add(poolableResultSet); diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java index e402d1472f..b5fa0f6e7f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java @@ -107,6 +107,10 @@ public class DruidPooledStatement extends PoolableWrapper implements Statement { conn.beforeExecute(); try { ResultSet rs = stmt.executeQuery(sql); + + if (rs == null) { + return rs; + } DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); resultSetTrace.add(poolableResultSet); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java index b6c95ed016..010d02154d 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java @@ -200,7 +200,7 @@ public class FilterChainImplTest extends TestCase { ResultSet rs = stmt.executeQuery(); rs.next(); - Assert.assertNull(rs.getURL(1)); + Assert.assertNull(rs.getRowId(1)); rs.close(); stmt.close(); @@ -215,7 +215,7 @@ public class FilterChainImplTest extends TestCase { ResultSet rs = stmt.executeQuery(); rs.next(); - Assert.assertNull(rs.getURL("1")); + Assert.assertNull(rs.getRowId("1")); rs.close(); stmt.close(); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java index e246f5f19e..f6727d889a 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java @@ -3,6 +3,7 @@ package com.alibaba.druid.bvt.filter; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Types; +import java.util.Collections; import junit.framework.Assert; import junit.framework.TestCase; @@ -601,4 +602,48 @@ public class FilterChainImplTest2 extends TestCase { stmt.close(); conn.close(); } + + public void test_getObject() throws Exception { + Connection conn = dataSource.getConnection(); + CallableStatement stmt = conn.prepareCall("select ?"); + stmt.registerOutParameter(1, Types.VARCHAR); + + Assert.assertNull(stmt.getObject(1)); + + stmt.close(); + conn.close(); + } + + public void test_getObject_1() throws Exception { + Connection conn = dataSource.getConnection(); + CallableStatement stmt = conn.prepareCall("select ?"); + stmt.registerOutParameter(1, Types.VARCHAR); + + Assert.assertNull(stmt.getObject("1")); + + stmt.close(); + conn.close(); + } + + public void test_getObject_2() throws Exception { + Connection conn = dataSource.getConnection(); + CallableStatement stmt = conn.prepareCall("select ?"); + stmt.registerOutParameter(1, Types.VARCHAR); + + Assert.assertNull(stmt.getObject(1, Collections.>emptyMap())); + + stmt.close(); + conn.close(); + } + + public void test_getObject_3() throws Exception { + Connection conn = dataSource.getConnection(); + CallableStatement stmt = conn.prepareCall("select ?"); + stmt.registerOutParameter(1, Types.VARCHAR); + + Assert.assertNull(stmt.getObject("1", Collections.>emptyMap())); + + stmt.close(); + conn.close(); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java new file mode 100644 index 0000000000..a0de090f6e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java @@ -0,0 +1,86 @@ +package com.alibaba.druid.bvt.filter; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Types; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.mock.MockCallableStatement; +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.mock.MockStatement; +import com.alibaba.druid.mock.MockStatementBase; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcUtils; + +public class FilterChainImplTest3 extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setFilters("stat"); + + dataSource.setDriver(new MockDriver() { + public ResultSet executeQuery(MockStatementBase stmt, String sql) throws SQLException { + return null; + } + + public MockStatement createMockStatement(MockConnection conn) { + return new MockStatement(conn) { + public ResultSet getResultSet() throws SQLException { + return null; + } + }; + } + }); + + dataSource.init(); + } + + protected void tearDown() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_executeQuery() throws Exception { + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement("select ?"); + stmt.setNull(1, Types.VARCHAR); + Assert.assertNull(stmt.executeQuery()); + stmt.close(); + conn.close(); + } + + public void test_executeQuery_2() throws Exception { + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareCall("select ?"); + stmt.setNull(1, Types.VARCHAR); + Assert.assertNull(stmt.executeQuery()); + stmt.close(); + conn.close(); + } + + public void test_executeQuery_3() throws Exception { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + Assert.assertNull(stmt.executeQuery("select 1")); + stmt.close(); + conn.close(); + } + + public void test_execute() throws Exception { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("select 1"); + Assert.assertNull(stmt.getResultSet()); + stmt.close(); + conn.close(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TransactionTest.java b/src/test/java/com/alibaba/druid/bvt/pool/TransactionTest.java new file mode 100644 index 0000000000..55e61934e5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/TransactionTest.java @@ -0,0 +1,35 @@ +package com.alibaba.druid.bvt.pool; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidDataSource; + +public class TransactionTest extends TestCase { + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setTestOnBorrow(false); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_txn() throws Exception { + Connection conn = dataSource.getConnection(); + + conn.setAutoCommit(false); + for (int i = 0; i < 100; ++i) { + PreparedStatement stmt = conn.prepareStatement("select + " + (i % 10)); + stmt.executeUpdate(); + stmt.close(); + } + conn.commit(); + conn.close(); + } +}