Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-186

isFirst() returns true when relative(x) goes beyond result set

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 10.0.2.0
    • 10.1.1.0
    • JDBC
    • None
    • Windows XP SP1 Professional

    Description

      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?

      Attachments

        Activity

          People

            Unassigned Unassigned
            baklarz George Baklarz
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: