Re: streaming result sets: progress - Mailing list pgsql-jdbc
From | Nic Ferrier |
---|---|
Subject | Re: streaming result sets: progress |
Date | |
Msg-id | 87r8dml7eg.fsf@pooh-sticks-bridge.tapsellferrier.co.uk Whole thread Raw |
In response to | Re: streaming result sets: progress (snpe <snpe@snpe.co.yu>) |
Responses |
Re: streaming result sets: progress
|
List | pgsql-jdbc |
This is the patch which should fix the meta data problem. It makes the use of nic_execute (ie: the cursor based fetch) dependant on the setting of fetch size. I have come to the view that this has been a bit of a waste of time. I don't think it's reasonable to put this into a release because the block based querys will always be interfering with other statements. Basically, unless everything goes cursor based (not very promising idea) or it's possible to declare a cursor in postgresql's default, non-transactional mode (more promising idea, maybe it would be possible to alter the backend to allow that?) I think this is a non-starter. It has been valuable in as much as I've had a good look at how it might be possible to rip out some of the duplicate query execution stuff. I believe the query execution stuff expressed by my patch is now pretty good. The other interesting thing is that a PGRefCursorResultSet (as dreamed up by Barry) would be able to deal row selection, so one could always call a proc if one wanted a batch return. Anyway, here's the patch. Nic Index: org/postgresql/PGConnection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/PGConnection.java,v retrieving revision 1.3 diff -r1.3 PGConnection.java 79a80,89 > > > // Added by Nic. > > /** Create a result set for the specified statement. > * This is the factory method provided by the various > * version specific implementations of the JDBC connection > * classes. > */ > public java.sql.ResultSet createResultSet (java.sql.Statement statement); cvs server: Diffing org/postgresql/core Index: org/postgresql/core/QueryExecutor.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java,v retrieving revision 1.16.2.1 diff -r1.16.2.1 QueryExecutor.java 20a21,69 > /** nic version - statically sets up the QE correctly. > */ > public static void execute (String[] p_sqlFrags, > Object[] p_binds, > java.sql.Statement statement, > java.sql.ResultSet rs, > PG_Stream pg_stream, > java.sql.Connection con) > throws SQLException > { > QueryExecutor qe = new QueryExecutor(); > // I think this should be a PGConnection and we should move > // everything we need for that from AbstractJdbc1... into PGConnection. > qe.connection = (org.postgresql.jdbc1.AbstractJdbc1Connection)con; > qe.m_sqlFrags = p_sqlFrags; > qe.m_binds = p_binds; > qe.statement = statement; > // Nic says: connection should wrap pg_stream. > qe.pg_stream = pg_stream; > if (statement != null) > qe.maxRows = statement.getMaxRows(); > else > qe.maxRows = 0; > // The result set. > qe.rs = rs; > qe.execute(); > } > > // This is the result set used to wrap the results. > // The type of this is whatever is passed into the static above. > private java.sql.ResultSet rs; > > // cons for the static above. > private QueryExecutor () > { > } > > > > > /*** pre-nic implementation ***/ > > > /// Nic has removed the final from ALL of these (to facilitate static method). > private String[] m_sqlFrags; > private Object[] m_binds; > private java.sql.Statement statement; > private PG_Stream pg_stream; > private org.postgresql.jdbc1.AbstractJdbc1Connection connection; 22,26d70 < private final String[] m_sqlFrags; < private final Object[] m_binds; < private final java.sql.Statement statement; < private final PG_Stream pg_stream; < private final org.postgresql.jdbc1.AbstractJdbc1Connection connection; 36c80 < this.statement = statement; --- > this.statement = statement; 45a90 > 53a99 > 55a102 > * 133c180,185 < return connection.getResultSet(statement, fields, tuples, status, update_count, insert_oid, binaryCursor); --- > > // Nic changes. > PGResultSet resSet = ((PGResultSet)rs); > // System.out.println(getClass().getName() + " resSet=" + resSet); > resSet.init(fields, tuples, status, update_count, insert_oid, binaryCursor); > return rs; Index: org/postgresql/jdbc1/AbstractJdbc1Connection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java,v retrieving revision 1.12.2.1 diff -r1.12.2.1 AbstractJdbc1Connection.java 353,354d352 < java.sql.ResultSet resultSet = < ExecSQL("set datestyle to 'ISO'; select version(), " + encodingQuery + ";"); 355a354,356 > java.sql.ResultSet resultSet > = doQuery("set datestyle to 'ISO'; select version(), " + encodingQuery + ";"); > 376c377 < ExecSQL("set client_encoding = 'UNICODE'; show autocommit"); --- > doQuery("set client_encoding = 'UNICODE'; show autocommit"); 391c392 < ExecSQL("set autocommit = on; commit;"); --- > doQuery("set autocommit = on; commit;"); 412,418d412 < // These methods used to be in the main Connection implementation. As they < // are common to all implementations (JDBC1 or 2), they are placed here. < // This should make it easy to maintain the two specifications. < < public abstract java.sql.ResultSet getResultSet(Statement statement, org.postgresql.Field[] fields, Vector tuples,String status, int updateCount, long insertOID, boolean binaryCursor) throws SQLException; < < public abstract java.sql.ResultSet getResultSet(Statement statement, org.postgresql.Field[] fields, Vector tuples,String status, int updateCount) throws SQLException; 448,457c442 < /* < * Send a query to the backend. Returns one of the ResultSet < * objects. < * < * <B>Note:</B> there does not seem to be any method currently < * in existance to return the update count. < * < * @param sql the SQL statement to be executed < * @return a ResultSet holding the results < * @exception SQLException if a database error occurs --- > /** Simple query execution. 459c444 < public java.sql.ResultSet ExecSQL(String sql) throws SQLException --- > public java.sql.ResultSet doQuery (String s) throws SQLException 461c446,450 < return ExecSQL(sql, null); --- > final Object[] nullarr = new Object[0]; > java.sql.Statement stat = createStatement(); > java.sql.ResultSet rs = createResultSet(stat); > execSQL(new String[] { s }, nullarr, stat, rs); > return rs; 464,491c453 < /* < * Send a query to the backend. Returns one of the ResultSet < * objects. < * < * <B>Note:</B> there does not seem to be any method currently < * in existance to return the update count. < * < * @param sql the SQL statement to be executed < * @param stat The Statement associated with this query (may be null) < * @return a ResultSet holding the results < * @exception SQLException if a database error occurs < */ < public java.sql.ResultSet ExecSQL(String sql, java.sql.Statement stat) throws SQLException < { < if (isClosed()) < { < throw new PSQLException("postgresql.con.closed"); < } < return new QueryExecutor(new String[] {sql}, EMPTY_OBJECT_ARRAY, stat, pg_stream, (java.sql.Connection)this).execute(); < } < private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; < < /* < * Send a query to the backend. Returns one of the ResultSet < * objects. < * < * <B>Note:</B> there does not seem to be any method currently < * in existance to return the update count. --- > /** Advanced query execution. 495,496c457,458 < * @param stat The Statement associated with this query (may be null) < * @return a ResultSet holding the results --- > * @param stat the statement associated with this query. > * @param rs the ResultSet which will be initied for the results. 499,505c461,472 < public java.sql.ResultSet ExecSQL(String[] p_sqlFragments, Object[] p_binds, java.sql.Statement stat) throws SQLException < { < if (isClosed()) < { < throw new PSQLException("postgresql.con.closed"); < } < return new QueryExecutor(p_sqlFragments, p_binds, stat, pg_stream, (java.sql.Connection)this).execute(); --- > public void execSQL(String[] p_sqlFragments, > Object[] p_binds, > java.sql.Statement stat, > java.sql.ResultSet rs) > throws SQLException > { > QueryExecutor.execute(p_sqlFragments, > p_binds, > stat, > rs, > pg_stream, > (java.sql.Connection)this); 507a475 > 942c910 < ExecSQL("select 1; commit; set autocommit = on;"); --- > doQuery("select 1; commit; set autocommit = on;"); 946c914 < ExecSQL("end"); --- > doQuery("end"); 953c921 < ExecSQL("set autocommit = off; " + getIsolationLevelSQL()); --- > doQuery("set autocommit = off; " + getIsolationLevelSQL()); 957c925 < ExecSQL("begin;" + getIsolationLevelSQL()); --- > doQuery("begin;" + getIsolationLevelSQL()); 961,962c929,930 < ExecSQL("begin"); < ExecSQL(getIsolationLevelSQL()); --- > doQuery("begin"); > doQuery(getIsolationLevelSQL()); 996c964 < ExecSQL("commit; " + getIsolationLevelSQL()); --- > doQuery("commit; " + getIsolationLevelSQL()); 1000c968 < ExecSQL("commit;begin;" + getIsolationLevelSQL()); --- > doQuery("commit;begin;" + getIsolationLevelSQL()); 1004,1006c972,974 < ExecSQL("commit"); < ExecSQL("begin"); < ExecSQL(getIsolationLevelSQL()); --- > doQuery("commit"); > doQuery("begin"); > doQuery(getIsolationLevelSQL()); 1027c995 < ExecSQL("rollback; " + getIsolationLevelSQL()); --- > doQuery("rollback; " + getIsolationLevelSQL()); 1031c999 < ExecSQL("rollback; begin;" + getIsolationLevelSQL()); --- > doQuery("rollback; begin;" + getIsolationLevelSQL()); 1035,1037c1003,1005 < ExecSQL("rollback"); < ExecSQL("begin"); < ExecSQL(getIsolationLevelSQL()); --- > doQuery("rollback"); > doQuery("begin"); > doQuery(getIsolationLevelSQL()); 1052c1020 < ResultSet rs = ExecSQL(sql); --- > ResultSet rs = doQuery(sql); 1059c1027 < ExecSQL(sql); --- > doQuery(sql); 1124c1092 < ExecSQL(isolationLevelSQL); --- > doQuery(isolationLevelSQL); 1267c1235 < ResultSet result = ExecSQL(sql); --- > ResultSet result = doQuery(sql); 1308c1276 < ResultSet result = ExecSQL(sql); --- > ResultSet result = doQuery(sql); Index: org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java,v retrieving revision 1.10.2.1 diff -r1.10.2.1 AbstractJdbc1DatabaseMetaData.java 1916c1916,1918 < return connection.getResultSet(null, f, v, "OK", 1); --- > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; 2202c2204,2207 < return connection.getResultSet(null, f, v, "OK", 1); --- > > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; 2369c2374,2376 < return connection.getResultSet(null, f, v, "OK", 1); --- > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; 2481c2488,2491 < return connection.getResultSet(null, f, v, "OK", 1); --- > > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; 2583c2593,2595 < return connection.getResultSet(null, f, v, "OK", 1); --- > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; 2776c2788,2791 < return connection.getResultSet(null, f, v, "OK", 1); --- > > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; 2846c2861,2863 < return connection.getResultSet(null, f, v, "OK", 1); --- > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; 3196c3213,3215 < return connection.getResultSet(null, f, tuples, "OK", 1); --- > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, tuples, "OK", 1, 0, false); > return retRs; 3481c3500,3503 < return connection.getResultSet(null, f, v, "OK", 1); --- > > java.sql.ResultSet retRs = connection.createResultSet(connection.createStatement()); > ((AbstractJdbc1ResultSet)retRs).init(f, v, "OK", 1, 0, false); > return retRs; Index: org/postgresql/jdbc1/AbstractJdbc1ResultSet.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java,v retrieving revision 1.7 diff -r1.7 AbstractJdbc1ResultSet.java 21c21 < public abstract class AbstractJdbc1ResultSet --- > public abstract class AbstractJdbc1ResultSet implements org.postgresql.PGResultSet 45c45,51 < public AbstractJdbc1ResultSet(org.postgresql.PGConnection conn, Statement statement, Field[] fields, Vector tuples,String status, int updateCount, long insertOID, boolean binaryCursor) --- > public AbstractJdbc1ResultSet(org.postgresql.PGConnection conn, > Statement statement, > Field[] fields, > Vector tuples, > String status, > int updateCount, > long insertOID, boolean binaryCursor) 52a59,61 > > System.out.println(getClass().getName() + " updateCount = " + updateCount); > 59a69,97 > /*** nic constructor: called by superclass which is called from Jdbc1Connection.createResultSet ***/ > public AbstractJdbc1ResultSet(org.postgresql.PGConnection conn, > Statement statement) > { > this.connection = conn; > this.statement = statement; > } > > /*** nic initializer. ***/ > public void init (Field[] fields, Vector tuples, String status, > int updateCount, long insertOID, boolean binaryCursor) > { > this.fields = fields; > > // on a reinit the size of this indicates how many we pulled > // back. If it's 0 then the res set has ended. > this.rows = tuples; > this.status = status; > this.updateCount = updateCount; > this.insertOID = insertOID; > this.this_row = null; > this.current_row = -1; > this.binaryCursor = binaryCursor; > } > > > > > // This slightly altered by nic. 66c104,125 < return false; --- > { > int fetchSize = ((AbstractJdbc1Statement)statement).fetchSize; > // Must be false if we weren't batching. > if (fetchSize == 0) > return false; > // Use the ref to the statement to get > // the details we need to do another cursor > // query - it will use reinit() to repopulate this > // with the right data. > String[] sql = new String[1]; > String[] binds = new String[0]; > // Is this the correct query??? > String cursorName = ((AbstractJdbc1Statement)statement).m_statementName; > sql[0] = "FETCH FORWARD " + fetchSize + " FROM " + cursorName + " ;"; > ((AbstractJdbc1Connection)connection).execSQL(sql, binds, statement, (java.sql.ResultSet)this); > > // Test the new rows array. > if (rows.size() == 0) > return false; > // Otherwise reset the counter and let it go on... > current_row = 0; > } Index: org/postgresql/jdbc1/AbstractJdbc1Statement.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java,v retrieving revision 1.12.2.1 diff -r1.12.2.1 AbstractJdbc1Statement.java 27a28,30 > /** Number of rows to get in a batch. */ > protected int fetchSize = 0; > 51c54 < private String m_statementName = null; --- > protected String m_statementName = null; 120c123 < --- > 136c139 < ((AbstractJdbc1Connection)connection).ExecSQL("DEALLOCATE " + m_statementName); --- > ((AbstractJdbc1Connection)connection).doQuery("DEALLOCATE " + m_statementName); 153c156,159 < this.execute(); --- > if (fetchSize > 0) > this.nic_execute(); > else > this.execute(); 178c184 < ((AbstractJdbc1Connection)connection).ExecSQL("DEALLOCATE " + m_statementName); --- > ((AbstractJdbc1Connection)connection).doQuery("DEALLOCATE " + m_statementName); 222c228 < ((AbstractJdbc1Connection)connection).ExecSQL("DEALLOCATE " + m_statementName); --- > ((AbstractJdbc1Connection)connection).doQuery("DEALLOCATE " + m_statementName); 320c326,328 < result = ((AbstractJdbc1Connection)connection).ExecSQL(m_sqlFragments, m_binds, (java.sql.Statement)this); --- > result = ((AbstractJdbc1Connection)connection).createResultSet((java.sql.Statement)this); > ((AbstractJdbc1Connection)connection).execSQL(m_sqlFragments, m_binds, > (java.sql.Statement)this, result); 343a352,455 > /** version of execute which converts the query to a cursor. > */ > public boolean nic_execute() throws SQLException > { > if (isFunction && !returnTypeSet) > throw new PSQLException("postgresql.call.noreturntype"); > if (isFunction) > { // set entry 1 to dummy entry.. > m_binds[0] = ""; // dummy entry which ensured that no one overrode > m_bindTypes[0] = PG_TEXT; > // and calls to setXXX (2,..) really went to first arg in a function call.. > } > > // New in 7.1, if we have a previous resultset then force it to close > // This brings us nearer to compliance, and helps memory management. > // Internal stuff will call ExecSQL directly, bypassing this. > if (result != null) > { > java.sql.ResultSet rs = getResultSet(); > if (rs != null) > rs.close(); > } > > // I've pretty much ignored server prepared statements... can declare and prepare be > // used together? > // It's trivial to change this: you just have to resolve this issue > // of how to work out whether there's a function call. If there isn't then the first > // element of the array must be the bit that you extend to become the cursor > // decleration. > // The last thing that can go wrong is when the user supplies a cursor statement > // directly: the translation takes no account of that. I think we should just look > // for declare and stop the translation if we find it. > > // The first thing to do is transform the statement text into the cursor form. > String[] origSqlFragments = m_sqlFragments; > if (origSqlFragments.length > 1) > m_sqlFragments = new String[origSqlFragments.length + 1]; > else > m_sqlFragments = new String[origSqlFragments.length]; > System.arraycopy(origSqlFragments, 0, m_sqlFragments, 0, origSqlFragments.length); > // Pinch the prepared count for our own nefarious purposes. > m_statementName = "JDBC_CURS_" + m_preparedCount++; > // The static bit to prepend to all querys. > String cursDecl = "BEGIN; DECLARE " + m_statementName + " CURSOR FOR "; > String endCurs = " FETCH FORWARD " + fetchSize + " FROM " + m_statementName + ";"; > > // Add the real query to the curs decleration. > // This is the bit that really makes the presumption about > // m_sqlFragments not being a function call. > if (m_sqlFragments.length < 1) > m_sqlFragments[0] = cursDecl + "SELECT NULL;"; > > else if (m_sqlFragments.length < 2) > { > if (m_sqlFragments[0].endsWith(";")) > m_sqlFragments[0] = cursDecl + m_sqlFragments[0] + endCurs; > else > m_sqlFragments[0] = cursDecl + m_sqlFragments[0] + ";" + endCurs; > } > else > { > m_sqlFragments[0] = cursDecl + m_sqlFragments[0]; > if (m_sqlFragments[m_sqlFragments.length - 2].endsWith(";")) > m_sqlFragments[m_sqlFragments.length - 1] = endCurs; > else > m_sqlFragments[m_sqlFragments.length - 1] = ";" + endCurs; > } > > // Make the call to the query executor. > AbstractJdbc1Connection execr = (AbstractJdbc1Connection)connection; > java.sql.Statement st = (java.sql.Statement)this; > result = (java.sql.ResultSet) execr.createResultSet(st); > // Nic says: > // we don't need to collect the result here, rs is altered to > // be the result set so "result = rs" would do ok after this call. > execr.execSQL(m_sqlFragments, m_binds, st, result); > > //If we are executing a callable statement function set the return data > if (isFunction) > { > if (!((AbstractJdbc1ResultSet)result).reallyResultSet()) > throw new PSQLException("postgresql.call.noreturnval"); > if (!result.next ()) > throw new PSQLException ("postgresql.call.noreturnval"); > callResult = result.getObject(1); > int columnType = result.getMetaData().getColumnType(1); > if (columnType != functionReturnType) > { > Object[] arr = > { "java.sql.Types=" + columnType, > "java.sql.Types=" + functionReturnType > }; > throw new PSQLException ("postgresql.call.wrongrtntype",arr); > } > result.close (); > return true; > } > else > { > return (result != null && ((AbstractJdbc1ResultSet)result).reallyResultSet()); > } > } > > 596c708 < ((AbstractJdbc1Connection)connection).ExecSQL("DEALLOCATE " + m_statementName); --- > ((AbstractJdbc1Connection)connection).doQuery("DEALLOCATE " + m_statementName); 1915c2027 < ((AbstractJdbc1Connection)connection).ExecSQL("DEALLOCATE " + m_statementName); --- > ((AbstractJdbc1Connection)connection).doQuery("DEALLOCATE " + m_statementName); Index: org/postgresql/jdbc1/Jdbc1Connection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/Jdbc1Connection.java,v retrieving revision 1.5 diff -r1.5 Jdbc1Connection.java 48a49,54 > > public java.sql.ResultSet createResultSet (java.sql.Statement stat) throws SQLException > { > // This needs doing. > return null; > } cvs server: Diffing org/postgresql/jdbc2 Index: org/postgresql/jdbc2/AbstractJdbc2Connection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java,v retrieving revision 1.2 diff -r1.2 AbstractJdbc2Connection.java 8a9 > 20c21 < --- > Index: org/postgresql/jdbc2/AbstractJdbc2ResultSet.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v retrieving revision 1.10 diff -r1.10 AbstractJdbc2ResultSet.java 40a41,45 > > AbstractJdbc2ResultSet (org.postgresql.PGConnection conn, Statement statement) > { > super(conn, statement); > } 144a150,157 > else if (type.equals("refcursor")) > { > // We must return a ResultSet with the results packaged. > // We should probably check that auto commit is turned off. > String cursorName = getString(columnIndex); > // return new RefCursorResultSet(cursorName); > return null; > } 369,371c382 < // In this implementation we return the entire result set, so < // here return the number of rows we have. Sub-classes can return a proper < // value --- > // Returning the current batch size seems the right thing to do. 757d767 < 790d799 < Index: org/postgresql/jdbc2/AbstractJdbc2Statement.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java,v retrieving revision 1.8 diff -r1.8 AbstractJdbc2Statement.java 118c118 < return 0; --- > return super.fetchSize; 133c133,135 < throw org.postgresql.Driver.notImplemented(); --- > // I don't think this should happen, since it's a hint it should just > // fail quietly. > // throw org.postgresql.Driver.notImplemented(); 138c140 < throw org.postgresql.Driver.notImplemented(); --- > super.fetchSize = rows; Index: org/postgresql/jdbc2/Array.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java,v retrieving revision 1.18 diff -r1.18 Array.java 346c346,349 < return ((AbstractJdbc2Connection)conn).getResultSet(null, fields, rows, "OK", 1 ); --- > java.sql.Statement stat = ((AbstractJdbc2Connection)conn).createStatement(); > java.sql.ResultSet retRs = ((AbstractJdbc2Connection)conn).createResultSet(stat); > ((AbstractJdbc2ResultSet)retRs).init(fields, rows, "OK", 1, 0, false); > return retRs; Index: org/postgresql/jdbc2/Jdbc2Connection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2Connection.java,v retrieving revision 1.5 diff -r1.5 Jdbc2Connection.java 48a49,80 > > > // the new method override which re-inits existing resultsets > public java.sql.ResultSet getResultSet(java.sql.Statement stat, > org.postgresql.jdbc1.AbstractJdbc1ResultSet rs, > Field[] fields, > Vector tuples, > String status, > int updateCount, long insertOID, boolean binaryCursor) > throws SQLException > { > if (rs == null) > return new Jdbc2ResultSet(this, stat, fields, > tuples, status, > updateCount, insertOID, binaryCursor); > else > { > rs.init(fields, tuples, status, updateCount, insertOID, binaryCursor); > return (java.sql.ResultSet) rs; > } > } > > > > > /** new nic method **/ > public java.sql.ResultSet createResultSet (Statement statement) > { > return new Jdbc2ResultSet(this, statement); > } > > Index: org/postgresql/jdbc2/Jdbc2ResultSet.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2ResultSet.java,v retrieving revision 1.6 diff -r1.6 Jdbc2ResultSet.java 15a16,21 > Jdbc2ResultSet (org.postgresql.PGConnection conn, Statement statement) > { > super (conn, statement); > } > > Index: org/postgresql/jdbc3/AbstractJdbc3ResultSet.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3ResultSet.java,v retrieving revision 1.2 diff -r1.2 AbstractJdbc3ResultSet.java 14a15,20 > AbstractJdbc3ResultSet (org.postgresql.PGConnection conn, Statement statement) > { > super(conn, statement); > } > > Index: org/postgresql/jdbc3/Jdbc3Connection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc3/Jdbc3Connection.java,v retrieving revision 1.2 diff -r1.2 Jdbc3Connection.java 49,52d48 < public java.sql.ResultSet getResultSet(Statement statement, Field[] fields, Vector tuples, String status, int updateCount,long insertOID, boolean binaryCursor) throws SQLException < { < return new Jdbc3ResultSet(this, statement, fields, tuples, status, updateCount, insertOID, binaryCursor); < } 54c50,56 < public java.sql.ResultSet getResultSet(Statement statement, Field[] fields, Vector tuples, String status, int updateCount)throws SQLException --- > > > > > > /** new nic method **/ > public java.sql.ResultSet createResultSet (Statement statement) 56c58 < return new Jdbc3ResultSet(this, statement, fields, tuples, status, updateCount, 0, false); --- > return new Jdbc3ResultSet(this, statement); Index: org/postgresql/jdbc3/Jdbc3ResultSet.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc3/Jdbc3ResultSet.java,v retrieving revision 1.3 diff -r1.3 Jdbc3ResultSet.java 15a16,22 > Jdbc3ResultSet (org.postgresql.PGConnection conn, Statement statement) > { > super (conn, statement); > } > > > Index: org/postgresql/util/Serialize.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/util/Serialize.java,v retrieving revision 1.14 diff -r1.14 Serialize.java 408c408 < ResultSet rs = ((org.postgresql.jdbc1.AbstractJdbc1Connection)conn).ExecSQL(sb.toString()); --- > ResultSet rs = ((org.postgresql.jdbc1.AbstractJdbc1Connection)conn).doQuery(sb.toString());
pgsql-jdbc by date: