aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java10
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java8
-rw-r--r--src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java46
3 files changed, 58 insertions, 6 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java
index b75f0106a00..5dbb80a6921 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java
@@ -9,7 +9,7 @@
* Copyright (c) 2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1ResultSet.java,v 1.22.2.1 2003/12/12 17:59:08 davec Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1ResultSet.java,v 1.22.2.2 2004/02/03 05:25:36 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -137,11 +137,13 @@ public abstract class AbstractJdbc1ResultSet implements BaseResultSet
if (rows == null)
throw new PSQLException("postgresql.con.closed", PSQLState.CONNECTION_DOES_NOT_EXIST);
- if (++current_row >= rows.size())
+ if (current_row+1 >= rows.size())
{
String cursorName = statement.getFetchingCursorName();
- if (cursorName == null || lastFetchSize == 0 || rows.size() < lastFetchSize)
+ if (cursorName == null || lastFetchSize == 0 || rows.size() < lastFetchSize) {
+ current_row = rows.size();
return false; // Not doing a cursor-based fetch or the last fetch was the end of the query
+ }
// Use the ref to the statement to get
// the details we need to do another cursor
@@ -167,6 +169,8 @@ public abstract class AbstractJdbc1ResultSet implements BaseResultSet
// Otherwise reset the counter and let it go on...
current_row = 0;
+ } else {
+ current_row++;
}
this_row = (byte [][])rows.elementAt(current_row);
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
index 10c6ad136ab..a10578cfe92 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
@@ -9,7 +9,7 @@
* Copyright (c) 2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.25.2.2 2003/12/18 03:35:55 davec Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.25.2.3 2004/02/03 05:25:37 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -490,8 +490,12 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
public boolean previous() throws SQLException
{
- if (--current_row < 0)
+ if (current_row-1 < 0) {
+ current_row = -1;
return false;
+ } else {
+ current_row--;
+ }
this_row = (byte[][]) rows.elementAt(current_row);
rowBuffer = new byte[this_row.length][];
System.arraycopy(this_row, 0, rowBuffer, 0, this_row.length);
diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java
index c09ac49a982..aec11850467 100644
--- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java
+++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetTest.java
@@ -4,6 +4,7 @@ import org.postgresql.test.TestUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
+import java.sql.SQLException;
import junit.framework.TestCase;
@@ -285,5 +286,48 @@ public class ResultSetTest extends TestCase
fail("Exception expected.");
}
}
-
+
+ public void testZeroRowResultPositioning() throws SQLException
+ {
+ Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
+ ResultSet rs = stmt.executeQuery("SELECT * FROM pg_database WHERE datname='nonexistantdatabase'");
+ assertEquals(rs.previous(),false);
+ assertEquals(rs.previous(),false);
+ assertEquals(rs.next(),false);
+ assertEquals(rs.next(),false);
+ assertEquals(rs.next(),false);
+ assertEquals(rs.next(),false);
+ assertEquals(rs.next(),false);
+ assertEquals(rs.previous(),false);
+ assertEquals(rs.first(),false);
+ assertEquals(rs.last(),false);
+ assertEquals(rs.getRow(),0);
+ assertEquals(rs.absolute(1),false);
+ assertEquals(rs.relative(1),false);
+ assertEquals(rs.isBeforeFirst(),false);
+ assertEquals(rs.isAfterLast(),false);
+ assertEquals(rs.isFirst(),false);
+ assertEquals(rs.isLast(),false);
+ rs.close();
+ stmt.close();
+ }
+
+ public void testRowResultPositioning() throws SQLException
+ {
+ Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
+ // Create a one row result set.
+ ResultSet rs = stmt.executeQuery("SELECT * FROM pg_database WHERE datname='template1'");
+ assertTrue(rs.isBeforeFirst());
+ assertTrue(rs.next());
+ assertTrue(rs.isFirst());
+ assertTrue(rs.isLast());
+ assertTrue(!rs.next());
+ assertTrue(rs.isAfterLast());
+ assertTrue(rs.previous());
+ assertTrue(rs.absolute(1));
+ rs.close();
+ stmt.close();
+ }
+
}
+