diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java index 1b957bd9cbf52caa964aeaf792ae041d55209654..85cb3c1f434e9d18d05d557d5545671d611c19f8 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java @@ -801,16 +801,34 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu public boolean absolute(int index) throws SQLException { - // Peter: Added because negative indices read from the end of the - // ResultSet - if(index<0) - index=rows.size()+index; - - if (index > rows.size()) + // index is 1-based, but internally we use 0-based indices + int internalIndex; + + if (index==0) + throw new SQLException("Cannot move to index of 0"); + + //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 { + 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=index; - this_row = (byte [][])rows.elementAt(index); + } + + current_row=internalIndex; + this_row = (byte [][])rows.elementAt(internalIndex); return true; } @@ -1041,7 +1059,8 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu // Peter: Implemented in 7.0 public boolean relative(int rows) throws SQLException { - return absolute(current_row+rows); + //have to add 1 since absolute expects a 1-based index + return absolute(current_row+1+rows); } public boolean rowDeleted() throws SQLException