Re: streaming result sets: progress - Mailing list pgsql-jdbc

From snpe
Subject Re: streaming result sets: progress
Date
Msg-id 200211162045.47865.snpe@snpe.co.yu
Whole thread Raw
In response to Re: streaming result sets: progress  (Nic Ferrier <nferrier@tapsellferrier.co.uk>)
Responses Re: streaming result sets: progress  (Nic Ferrier <nferrier@tapsellferrier.co.uk>)
List pgsql-jdbc
Hello Nic,
  Please call patch with ;
diff -Naur olddir newdir
and add in message like attach
This is add PGResultSet
I can't open this patch

Thanks
Haris Peco
On Friday 15 November 2002 11:50 pm, Nic Ferrier wrote:
> 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/PGConnect
>ion.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/Quer
>yExecutor.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/Abs
>tractJdbc1Connection.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/Abs
>tractJdbc1DatabaseMetaData.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/Abs
>tractJdbc1ResultSet.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/Abs
>tractJdbc1Statement.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/Jdb
>c1Connection.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/Abs
>tractJdbc2Connection.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/Abs
>tractJdbc2ResultSet.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/Abs
>tractJdbc2Statement.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/Arr
>ay.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/Jdb
>c2Connection.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/Jdb
>c2ResultSet.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/Abs
>tractJdbc3ResultSet.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/Jdb
>c3Connection.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/Jdb
>c3ResultSet.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/Seri
>alize.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(
> >));
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster


pgsql-jdbc by date:

Previous
From: snpe
Date:
Subject: Query for DatabaseMetaData.getImportedKey
Next
From: "Felipe Schnack"
Date:
Subject: default values