isFirst() returns true when relative(x) goes beyond result set --------------------------------------------------------------
Key: DERBY-186 URL: http://issues.apache.org/jira/browse/DERBY-186 Project: Derby Type: Bug Components: JDBC Versions: 10.0.2.0 Environment: Windows XP SP1 Professional Reporter: George Baklarz Bizarre error. Not sure if this is a JDBC, Derby, or Java issue. An opened result set has 4 records. A call to relative(3) while on row 3 should result in isAfterLast=true, and isFirst, isBeforeFirst, and IsLast set to false. However, the result is isAfterLast=True and isFirst=True. ij connect 'IsAfter;create=true'; create table x (a char(1)); insert into x values '1','2','3','4'; quit; import java.sql.*; public class ErrIsFirst { public static void main(String argv[]) throws SQLException { Connection conn = null; Statement s = null; ResultSet rs = null; String DerbyDriver = "org.apache.derby.jdbc.EmbeddedDriver"; String returnValue; try { Class.forName(DerbyDriver).newInstance(); } catch (Exception NoDriver) { System.out.println("Derby driver not found: " + DerbyDriver); NoDriver.printStackTrace(); System.exit(1); } try { conn = DriverManager.getConnection("jdbc:derby:IsAfter"); s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); rs = s.executeQuery( "SELECT A FROM X"); rs.next(); // First Record returnValue = rs.getString("A"); System.out.println("Value="+returnValue); rs.relative(2); System.out.println("isFirst=" + rs.isFirst() + " isLast=" + rs.isLast() + " isAfterLast=" + rs.isAfterLast()); returnValue = rs.getString("A"); System.out.println("Value="+returnValue); rs.relative(-2); returnValue = rs.getString("A"); System.out.println("Value="+returnValue); rs.relative(10); System.out.println("isFirst=" + rs.isFirst() + " isLast=" + rs.isLast() + " isAfterLast=" + rs.isAfterLast()); returnValue = rs.getString("A"); System.out.println("Value="+returnValue); rs.close(); s.close(); } catch (SQLException se) { String SQLState = se.getSQLState(); String SQLMessage = se.getMessage(); System.out.println("Error = "+SQLState); System.out.println(SQLMessage); } } } The results on my system are: Value=1 isFirst=false isLast=false isAfterLast=false Value=3 Value=1 isFirst=true isLast=false isAfterLast=true Error = 24000 Invalid cursor state - no current row. If you eliminate the first println call to isFirst() you get the following (correct) results. Value=1 Value=3 Value=1 isFirst=false isLast=false isAfterLast=true Error = 24000 Invalid cursor state - no current row. Okay, so where did we go wrong? -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira