[ http://issues.apache.org/jira/browse/DERBY-186?page=comments#action_61704 ] Shreyas Kaushik commented on DERBY-186: ---------------------------------------
I guess the problem is not whether you make a call to isFirst() first or next. The way a call to relative() is behaving when the param passed to it is more than the number of rows, is what is causing the problem. I have small fix going for this which I am still testing. Will update when I get some results. ~ Shreyas > 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