]> granicus.if.org Git - postgresql/commitdiff
Attached is a patch against the CVS repository that fixes the ResultSet absolute...
authorBarry Lind <barry@xythos.com>
Wed, 14 Nov 2001 04:11:37 +0000 (04:11 +0000)
committerBarry Lind <barry@xythos.com>
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();
+       }
+}