Re: [PATCHES] absolute() error with jdbc7.1-1.2 - Mailing list pgsql-jdbc

From Barry Lind
Subject Re: [PATCHES] absolute() error with jdbc7.1-1.2
Date
Msg-id 3BF1EF03.8040905@xythos.com
Whole thread Raw
In response to absolute() error with jdbc7.1-1.2  (Robert Down <down@mind.net>)
Responses Patch to fix getIndex for forte's transparent persistence
List pgsql-jdbc
Liam,

I reviewed and applied your patch.  It will be in beta3.

thanks,
--Barry

Liam Stewart wrote:

> Attached is a patch against the CVS repository that fixes the problem.
> There's also a little fix for the getRow() method. While fixing
> absolute(), I noticed that getRow() wasn't quite following the spec: it
> wasn't returning 0 when the ResultSet wasn't positioned on a row.  I've
> started a ResultSet test case and included it as well.
>
> Liam
>
> On Mon, Nov 12, 2001 at 10:53:45AM -0800, Robert Down wrote:
>
>>with the lasttest driver, I can't use absolute() according to the spec.
>>
>>index = -1;
>>rs.absolute(index);
>>
>>What it currently does:
>>java.lang.ArrayIndexOutOfBoundsException: -2 < 0
>>
>>
>>What it should do according to the spec:
>>========================================
>>public boolean absolute(int row)
>>                 throws SQLExceptionMoves the cursor to the given row number
>>in this ResultSet object.
>>
>>If the row number is positive, the cursor moves to the given row number with
>>respect to the beginning of the result set. The first row is row 1, the
>>second is row 2, and so on.
>>
>>If the given row number is negative, the cursor moves to an absolute row
>>position with respect to the end of the result set. For example, calling the
>>method absolute(-1) positions the cursor on the last row; calling the method
>>absolute(-2) moves the cursor to the next-to-last row, and so on.
>>
>>An attempt to position the cursor beyond the first/last row in the result set
>>leaves the cursor before the first row or after the last row.
>>===========================================
>>
>>Please note the important fact that you can use (-1) as a position.  This is
>>very important.
>>
>>Thanks!
>>
>>---------------------------(end of broadcast)---------------------------
>>TIP 3: if posting/reading through Usenet, please send an appropriate
>>subscribe-nomail command to majordomo@postgresql.org so that your
>>message can get through to the mailing list cleanly
>>
>
>
> ------------------------------------------------------------------------
>
> package org.postgresql.test.jdbc2;
>
> import org.postgresql.test.JDBC2Tests;
> import junit.framework.TestCase;
> import java.io.*;
> import java.sql.*;
>
> /**
>  * ResultSet tests.
>  */
> public class ResultSetTest extends TestCase
> {
>     private Connection con;
>
>     public ResultSetTest(String name)
>     {
>         super(name);
>     }
>
>     protected void setUp() throws Exception
>     {
>         con = JDBC2Tests.openDB();
>         Statement stmt = con.createStatement();
>
>         JDBC2Tests.createTable(con, "testrs", "id integer");
>
>         stmt.executeUpdate("INSERT INTO testrs VALUES (1)");
>         stmt.executeUpdate("INSERT INTO testrs VALUES (2)");
>         stmt.executeUpdate("INSERT INTO testrs VALUES (3)");
>         stmt.executeUpdate("INSERT INTO testrs VALUES (4)");
>         stmt.executeUpdate("INSERT INTO testrs VALUES (6)");
>         stmt.executeUpdate("INSERT INTO testrs VALUES (9)");
>
>         stmt.close();
>     }
>
>     protected void tearDown() throws Exception
>     {
>         JDBC2Tests.dropTable(con, "testrs");
>         JDBC2Tests.closeDB(con);
>     }
>
>     public void testAbsolute() throws Exception
>     {
>         Statement stmt = con.createStatement();
>         ResultSet rs = stmt.executeQuery("SELECT * FROM testrs");
>
>         assertTrue(rs.absolute(-1));
>         assertEquals(6, rs.getRow());
>
>         assertTrue(rs.absolute(1));
>         assertEquals(1, rs.getRow());
>
>         assertTrue(!rs.absolute(-10));
>         assertEquals(0, rs.getRow());
>          assertTrue(rs.next());
>          assertEquals(1, rs.getRow());
>
>         assertTrue(!rs.absolute(10));
>         assertEquals(0, rs.getRow());
>         assertTrue(rs.previous());
>         assertEquals(6, rs.getRow());
>
>         stmt.close();
>     }
> }
>
>
> ------------------------------------------------------------------------
>
> Index: src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java,v
> retrieving revision 1.41
> diff -c -r1.41 ResultSet.java
> *** src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java    2001/11/12 19:59:46    1.41
> --- src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java    2001/11/13 21:22:01
> ***************
> *** 836,841 ****
> --- 836,842 ----
>           //if index<0, count from the end of the result set, but check
>           //to be sure that it is not beyond the first index
>           if (index < 0)
> +         {
>               if (index >= -rows_size)
>                   internalIndex = rows_size + index;
>               else
> ***************
> *** 843,858 ****
>                   beforeFirst();
>                   return false;
>               }
> !
> !         //must be the case that index>0,
> !         //find the correct place, assuming that
> !         //the index is not too large
> !         if (index <= rows_size)
> !             internalIndex = index - 1;
>           else
>           {
> !             afterLast();
> !             return false;
>           }
>
>           current_row = internalIndex;
> --- 844,862 ----
>                   beforeFirst();
>                   return false;
>               }
> !         }
>           else
>           {
> !             //must be the case that index>0,
> !             //find the correct place, assuming that
> !             //the index is not too large
> !             if (index <= rows_size)
> !                 internalIndex = index - 1;
> !             else
> !             {
> !                 afterLast();
> !                 return false;
> !             }
>           }
>
>           current_row = internalIndex;
> ***************
> *** 1074,1079 ****
> --- 1078,1088 ----
>
>       public int getRow() throws SQLException
>       {
> +         final int rows_size = rows.size();
> +
> +         if (current_row < 0 || current_row >= rows_size)
> +             return 0;
> +
>           return current_row + 1;
>       }
>
> Index: src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java,v
> retrieving revision 1.8
> diff -c -r1.8 JDBC2Tests.java
> *** src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java    2001/10/25 05:59:59    1.8
> --- src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java    2001/11/13 21:22:01
> ***************
> *** 205,210 ****
> --- 205,211 ----
>           // Connectivity/Protocols
>
>           // ResultSet
> +         suite.addTestSuite(ResultSetTest.class);
>
>           // Time, Date, Timestamp
>           suite.addTestSuite(DateTest.class);
>
>
> ------------------------------------------------------------------------
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>



pgsql-jdbc by date:

Previous
From: Barry Lind
Date:
Subject: Re: jdbc 7.2b1 question...
Next
From: Antonio Fiol Bonnín
Date:
Subject: Re: [GENERAL] Storing a tree