From 50b70f37d9d9e2efb4dd4d53bd9077d0049f59c8 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 10 Aug 2012 21:26:00 +0800 Subject: [PATCH 1/3] bug fixed for postgresql parser --- .../druid/filter/logging/LogFilter.java | 18 ++++++++ .../com/alibaba/druid/mock/MockDriver.java | 2 +- .../pool/DruidPooledCallableStatement.java | 26 +++++++++-- .../ast/stmt/OracleSelectForUpdate.java | 13 ------ .../postgresql/parser/PGSelectParser.java | 44 ++++++++++--------- .../druid/bvt/bug/Bug_for_xuershan.java | 2 +- .../sql/postgresql/PGSelectForUpdateTest.java | 41 +++++++++++++++++ 7 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java diff --git a/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java b/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java index c5499fda17..f48355b458 100644 --- a/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java +++ b/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java @@ -392,6 +392,24 @@ public abstract class LogFilter extends FilterEventAdapter implements LogFilterM + "} update executed. effort " + updateCount + ". " + sql); } } + + @Override + public void resultSet_close(FilterChain chain, ResultSetProxy resultSet) throws SQLException { + chain.resultSet_close(resultSet); + + StringBuffer buf = new StringBuffer(); + buf.append("{conn-"); + buf.append(resultSet.getStatementProxy().getConnectionProxy().getId()); + buf.append(", "); + buf.append(stmtId(resultSet)); + buf.append(", rs-"); + buf.append(resultSet.getId()); + buf.append("} closed"); + + if (isResultSetCloseAfterLogEnabled()) { + resultSetLog(buf.toString()); + } + } @Override public boolean resultSet_next(FilterChain chain, ResultSetProxy resultSet) throws SQLException { diff --git a/src/main/java/com/alibaba/druid/mock/MockDriver.java b/src/main/java/com/alibaba/druid/mock/MockDriver.java index c4e99d5061..4dcc6710cd 100644 --- a/src/main/java/com/alibaba/druid/mock/MockDriver.java +++ b/src/main/java/com/alibaba/druid/mock/MockDriver.java @@ -270,7 +270,7 @@ public class MockDriver implements Driver, MockDriverMBean { } } - protected ResultSet createResultSet(MockPreparedStatement stmt) { + public ResultSet createResultSet(MockPreparedStatement stmt) { MockResultSet rs = new MockResultSet(stmt); String sql = stmt.getSql(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java index 5bb1c698a3..be3068fcd9 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java @@ -24,6 +24,7 @@ import java.sql.CallableStatement; import java.sql.Clob; import java.sql.NClob; import java.sql.Ref; +import java.sql.ResultSet; import java.sql.RowId; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; @@ -196,12 +197,26 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(int parameterIndex) throws SQLException { try { - return stmt.getObject(parameterIndex); + Object obj = stmt.getObject(parameterIndex); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } } + private Object wrapObject(Object obj) { + if (obj instanceof ResultSet) { + ResultSet rs = (ResultSet) obj; + + DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); + resultSetTrace.add(poolableResultSet); + + obj = poolableResultSet; + } + + return obj; + } + @Override public BigDecimal getBigDecimal(int parameterIndex) throws SQLException { try { @@ -214,7 +229,8 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(int parameterIndex, java.util.Map> map) throws SQLException { try { - return stmt.getObject(parameterIndex, map); + Object obj = stmt.getObject(parameterIndex, map); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } @@ -664,7 +680,8 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(String parameterName) throws SQLException { try { - return stmt.getObject(parameterName); + Object obj = stmt.getObject(parameterName); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } @@ -682,7 +699,8 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(String parameterName, java.util.Map> map) throws SQLException { try { - return stmt.getObject(parameterName, map); + Object obj = stmt.getObject(parameterName, map); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java index 3aa749eeed..0a8477e2c3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -73,16 +72,4 @@ public class OracleSelectForUpdate extends OracleSQLObjectImpl { public List getOf() { return this.of; } - - public static class SkipLock { - } - - public static abstract class Type extends SQLObjectImpl { - - private static final long serialVersionUID = 1L; - - public Type(){ - - } - } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java index ab50576731..e93db13aba 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java @@ -26,7 +26,7 @@ public class PGSelectParser extends SQLSelectParser { public PGSelectParser(String sql) throws ParserException{ this(new PGExprParser(sql)); } - + protected SQLExprParser createExprParser() { return new PGExprParser(lexer); } @@ -133,8 +133,8 @@ public class PGSelectParser extends SQLSelectParser { if (lexer.token() == Token.ROW || lexer.token() == Token.ROWS) { lexer.nextToken(); } else { - //TODO - //throw new ParserException("expect 'ROW' or 'ROWS'"); + // TODO + // throw new ParserException("expect 'ROW' or 'ROWS'"); } } @@ -175,22 +175,24 @@ public class PGSelectParser extends SQLSelectParser { if (lexer.token() == Token.UPDATE) { forClause.setOption(PGSelectQueryBlock.ForClause.Option.UPDATE); + lexer.nextToken(); } else if (lexer.token() == Token.SHARE) { forClause.setOption(PGSelectQueryBlock.ForClause.Option.SHARE); + lexer.nextToken(); } else { throw new ParserException("expect 'FIRST' or 'NEXT'"); } - accept(Token.OF); - - for (;;) { - SQLExpr expr = this.createExprParser().expr(); - forClause.getOf().add(expr); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } else { - break; + if (lexer.token() == Token.OF) { + for (;;) { + SQLExpr expr = this.createExprParser().expr(); + forClause.getOf().add(expr); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } else { + break; + } } } @@ -208,31 +210,31 @@ public class PGSelectParser extends SQLSelectParser { protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) throws ParserException { if (lexer.token() == Token.AS && tableSource instanceof SQLExprTableSource) { String alias = this.as(); - + if (lexer.token() == Token.LPAREN) { SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; - + PGFunctionTableSource functionTableSource = new PGFunctionTableSource(exprTableSource.getExpr()); functionTableSource.setAlias(alias); - + lexer.nextToken(); parserParameters(functionTableSource.getParameters()); accept(Token.RPAREN); - + return super.parseTableSourceRest(functionTableSource); } } - + return super.parseTableSourceRest(tableSource); } - + private void parserParameters(List parameters) { for (;;) { PGParameter parameter = new PGParameter(); parameter.setName(this.exprParser.name()); parameter.setDataType(this.exprParser.parseDataType()); - + parameters.add(parameter); if (lexer.token() == Token.COMMA || lexer.token() == Token.SEMI) { lexer.nextToken(); @@ -245,4 +247,4 @@ public class PGSelectParser extends SQLSelectParser { break; } } -} \ No newline at end of file +} diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java index 5e1c3adf50..d50094d89c 100644 --- a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java @@ -19,7 +19,7 @@ public class Bug_for_xuershan extends TestCase { protected void setUp() throws Exception { driver = new MockDriver() { - protected ResultSet createResultSet(MockPreparedStatement stmt) { + public ResultSet createResultSet(MockPreparedStatement stmt) { return null; } }; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java new file mode 100644 index 0000000000..94204f108e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.postgresql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; + +public class PGSelectForUpdateTest extends PGTest { + + public void test_0() throws Exception { + String sql = "select pkvalue from dbtpktable where tablename = 'taturvisit' for update"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getTables().size()); + } + +} + +// select categoryId , offerIds from cnres.function_select_get_spt_p4p_offer_list (' 1031918 , 1031919 , 1037004 ') as +// a(categoryId numeric,offerIds character varying(4000)) +// select memberId , offerIds from cnres.function_select_get_seller_hot_offer_list('\'gzyyd168\'') as a(memberId +// character varying(20),offerIds character varying(4000)) + From f59e2c6391f5177829ddb2f52950a359fb1893e6 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 10 Aug 2012 21:27:54 +0800 Subject: [PATCH 2/3] add testcase --- .../druid/bvt/pool/CallableStatmentTest.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/CallableStatmentTest.java diff --git a/src/test/java/com/alibaba/druid/bvt/pool/CallableStatmentTest.java b/src/test/java/com/alibaba/druid/bvt/pool/CallableStatmentTest.java new file mode 100644 index 0000000000..1d30be87ef --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/CallableStatmentTest.java @@ -0,0 +1,100 @@ +package com.alibaba.druid.bvt.pool; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; + +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.MockResultSet; +import com.alibaba.druid.pool.DruidDataSource; + +public class CallableStatmentTest extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setTestOnBorrow(false); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + dataSource.setFilters("log4j"); + + dataSource.setDriver(new MockDriver() { + + public MockCallableStatement createMockCallableStatement(MockConnection conn, String sql) { + return new MyMockCallableStatement(conn, sql); + } + }); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_connect() throws Exception { + MockCallableStatement rawStmt = null; + MockResultSet rawRs = null; + { + Connection conn = dataSource.getConnection(); + + CallableStatement stmt = conn.prepareCall("select 1"); + stmt.execute(); + rawStmt = stmt.unwrap(MockCallableStatement.class); + + ResultSet rs = (ResultSet) stmt.getObject(0); + + rawRs = rs.unwrap(MockResultSet.class); + + rs.next(); + + rs.close(); + stmt.close(); + + Assert.assertFalse(rawStmt.isClosed()); + Assert.assertTrue(rawRs.isClosed()); + + rawRs = rs.unwrap(MockResultSet.class); + Assert.assertNotNull(rawRs); + + conn.close(); + } + + { + Connection conn = dataSource.getConnection(); + + CallableStatement stmt = conn.prepareCall("select 1"); + stmt.execute(); + + Assert.assertSame(rawStmt, stmt.unwrap(MockCallableStatement.class)); + Assert.assertFalse(rawStmt.isClosed()); + + stmt.getObject(0); + + ResultSet rs = (ResultSet) stmt.getObject(0); + rs.next(); + rs.close(); + + stmt.close(); + + conn.close(); + } + } + + public static class MyMockCallableStatement extends MockCallableStatement { + + public MyMockCallableStatement(MockConnection conn, String sql){ + super(conn, sql); + } + + public Object getObject(int index) throws SQLException { + return this.getConnection().getDriver().createResultSet(this); + } + } +} From b6895d84d613ab241a8c860a26e50d2373830a4c Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 10 Aug 2012 22:13:58 +0800 Subject: [PATCH 3/3] FileterChain support CallableStatement.getObject return ResultSet --- .../alibaba/druid/filter/FilterChainImpl.java | 87 +++++++++++++------ .../encoding/EncodingConvertFilter.java | 7 -- .../druid/filter/logging/LogFilter.java | 55 +++++++++++- 3 files changed, 111 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java b/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java index 0d293e5219..8100faa3da 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java +++ b/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java @@ -3336,7 +3336,65 @@ public class FilterChainImpl implements FilterChain { if (this.pos < filterSize) { return nextFilter().callableStatement_getObject(this, statement, parameterIndex); } - return statement.getRawObject().getObject(parameterIndex); + + Object obj = statement.getRawObject().getObject(parameterIndex); + + if (obj instanceof ResultSet) { + return wrap(statement, (ResultSet) obj); + } + + return obj; + } + + @Override + public Object callableStatement_getObject(CallableStatementProxy statement, int parameterIndex, + java.util.Map> map) throws SQLException { + if (this.pos < filterSize) { + return nextFilter().callableStatement_getObject(this, statement, parameterIndex, map); + } + + + Object obj = statement.getRawObject().getObject(parameterIndex, map); + + if (obj instanceof ResultSet) { + return wrap(statement, (ResultSet) obj); + } + + return obj; + } + + + @Override + public Object callableStatement_getObject(CallableStatementProxy statement, String parameterName) + throws SQLException { + if (this.pos < filterSize) { + return nextFilter().callableStatement_getObject(this, statement, parameterName); + } + + Object obj = statement.getRawObject().getObject(parameterName); + + if (obj instanceof ResultSet) { + return wrap(statement, (ResultSet) obj); + } + + return obj; + } + + + @Override + public Object callableStatement_getObject(CallableStatementProxy statement, String parameterName, + java.util.Map> map) throws SQLException { + if (this.pos < filterSize) { + return nextFilter().callableStatement_getObject(this, statement, parameterName, map); + } + + Object obj = statement.getRawObject().getObject(parameterName, map); + + if (obj instanceof ResultSet) { + return wrap(statement, (ResultSet) obj); + } + + return obj; } @Override @@ -3348,15 +3406,6 @@ public class FilterChainImpl implements FilterChain { return statement.getRawObject().getBigDecimal(parameterIndex); } - @Override - public Object callableStatement_getObject(CallableStatementProxy statement, int parameterIndex, - java.util.Map> map) throws SQLException { - if (this.pos < filterSize) { - return nextFilter().callableStatement_getObject(this, statement, parameterIndex, map); - } - return statement.getRawObject().getObject(parameterIndex, map); - } - @Override public Ref callableStatement_getRef(CallableStatementProxy statement, int parameterIndex) throws SQLException { if (this.pos < filterSize) { @@ -3820,15 +3869,6 @@ public class FilterChainImpl implements FilterChain { return statement.getRawObject().getTimestamp(parameterName); } - @Override - public Object callableStatement_getObject(CallableStatementProxy statement, String parameterName) - throws SQLException { - if (this.pos < filterSize) { - return nextFilter().callableStatement_getObject(this, statement, parameterName); - } - return statement.getRawObject().getObject(parameterName); - } - @Override public BigDecimal callableStatement_getBigDecimal(CallableStatementProxy statement, String parameterName) throws SQLException { @@ -3838,15 +3878,6 @@ public class FilterChainImpl implements FilterChain { return statement.getRawObject().getBigDecimal(parameterName); } - @Override - public Object callableStatement_getObject(CallableStatementProxy statement, String parameterName, - java.util.Map> map) throws SQLException { - if (this.pos < filterSize) { - return nextFilter().callableStatement_getObject(this, statement, parameterName, map); - } - return statement.getRawObject().getObject(parameterName, map); - } - @Override public Ref callableStatement_getRef(CallableStatementProxy statement, String parameterName) throws SQLException { if (this.pos < filterSize) { diff --git a/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java b/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java index 1b3ff04c64..75af4b7979 100644 --- a/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java +++ b/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java @@ -33,7 +33,6 @@ import com.alibaba.druid.proxy.jdbc.ClobProxy; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; import com.alibaba.druid.proxy.jdbc.ResultSetProxy; -import com.alibaba.druid.proxy.jdbc.ResultSetProxyImpl; import com.alibaba.druid.proxy.jdbc.StatementProxy; import com.alibaba.druid.util.IOUtils; @@ -225,12 +224,6 @@ public class EncodingConvertFilter extends FilterAdapter { return new StringReader(decode(stmt.getConnectionProxy(), text)); } - if (object instanceof ResultSet) { - long resultSetId = stmt.getConnectionProxy().getDirectDataSource().createResultSetId(); - ResultSet resultSet = (ResultSet) object; - return new ResultSetProxyImpl(stmt, resultSet, resultSetId, stmt.getLastExecuteSql()); - } - return object; } diff --git a/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java b/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java index f48355b458..71d4b6fd28 100644 --- a/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java +++ b/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java @@ -291,7 +291,7 @@ public abstract class LogFilter extends FilterEventAdapter implements LogFilterM super.connection_rollback(chain, connection); if (connectionRollbackAfterLogEnable && isConnectionLogEnabled()) { - connectionLog("connect rollback. id " + connection.getId()); + connectionLog("{conn " + connection.getId() + "} rollback"); } } @@ -300,7 +300,7 @@ public abstract class LogFilter extends FilterEventAdapter implements LogFilterM super.connection_commit(chain, connection); if (connectionCommitAfterLogEnable && isConnectionLogEnabled()) { - connectionLog("connect committed. id " + connection.getId()); + connectionLog("{conn-" + connection.getId() + "} commited"); } } @@ -308,7 +308,7 @@ public abstract class LogFilter extends FilterEventAdapter implements LogFilterM public void connection_setAutoCommit(FilterChain chain, ConnectionProxy connection, boolean autoCommit) throws SQLException { - connectionLog("connect setAutoCommit " + autoCommit + ". id " + connection.getId()); + connectionLog("{conn-" + connection.getId() + "} setAutoCommit " + autoCommit); chain.connection_setAutoCommit(connection, autoCommit); } @@ -464,6 +464,55 @@ public abstract class LogFilter extends FilterEventAdapter implements LogFilterM return moreRows; } + + @Override + public Object callableStatement_getObject(FilterChain chain, CallableStatementProxy statement, int parameterIndex) + throws SQLException { + Object obj = chain.callableStatement_getObject(statement, parameterIndex); + + if (obj instanceof ResultSetProxy) { + resultSetOpenAfter((ResultSetProxy) obj); + } + + return obj; + } + + @Override + public Object callableStatement_getObject(FilterChain chain, CallableStatementProxy statement, int parameterIndex, + java.util.Map> map) throws SQLException { + Object obj = chain.callableStatement_getObject(statement, parameterIndex, map); + + if (obj instanceof ResultSetProxy) { + resultSetOpenAfter((ResultSetProxy) obj); + } + + return obj; + } + + @Override + public Object callableStatement_getObject(FilterChain chain, CallableStatementProxy statement, String parameterName) + throws SQLException { + Object obj = chain.callableStatement_getObject(statement, parameterName); + + if (obj instanceof ResultSetProxy) { + resultSetOpenAfter((ResultSetProxy) obj); + } + + return obj; + } + + @Override + public Object callableStatement_getObject(FilterChain chain, CallableStatementProxy statement, + String parameterName, java.util.Map> map) + throws SQLException { + Object obj = chain.callableStatement_getObject(statement, parameterName, map); + + if (obj instanceof ResultSetProxy) { + resultSetOpenAfter((ResultSetProxy) obj); + } + + return obj; + } @Override protected void resultSetOpenAfter(ResultSetProxy resultSet) {