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

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

Agile BoardAttach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    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

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

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

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment