From: Barry Lind Date: Wed, 14 Nov 2001 04:11:37 +0000 (+0000) Subject: Attached is a patch against the CVS repository that fixes the ResultSet absolute... X-Git-Tag: REL7_2_BETA3~76 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ebb93323bbf7c62aeff283cd5991071ee8c575fa;p=postgresql Attached is a patch against the CVS repository that fixes the ResultSet absolute() 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 Stewart --- diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java index c5a6429624..e98cef8660 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java @@ -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; } diff --git a/src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java b/src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java index 1f299ceb16..2512192c98 100644 --- a/src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java +++ b/src/interfaces/jdbc/org/postgresql/test/JDBC2Tests.java @@ -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 index 0000000000..e4ec7928c9 --- /dev/null +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java @@ -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(); + } +}