Attached is a patch against the CVS repository that fixes the ResultSet absolute...
authorBarry Lind
Wed, 14 Nov 2001 04:11:37 +0000 (04:11 +0000)
committerBarry Lind
Wed, 14 Nov 2001 04:11:37 +0000 (04:11 +0000)
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 Stewart

src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java
src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java [new file with mode: 0644]

index c5a6429624516f7da7d140fdf1832d2da127208f..e98cef86600b433ded86d2f270c96143aabaebd6 100644 (file)
@@ -836,6 +836,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
        //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,16 +844,19 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
                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;
+           //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,6 +1078,11 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
 
    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 1f299ceb16cf85ef86ec6fe3c9e4a75b3c3b91f0..2512192c9816445e86b1248d1fef1622ba8a0b2b 100644 (file)
@@ -205,6 +205,7 @@ public class JDBC2Tests extends TestSuite
        // Connectivity/Protocols
 
        // ResultSet
+       suite.addTestSuite(ResultSetTest.class);
 
        // Time, Date, Timestamp
        suite.addTestSuite(DateTest.class);
diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java
new file mode 100644 (file)
index 0000000..e4ec792
--- /dev/null
@@ -0,0 +1,66 @@
+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();
+   }
+}