Made this a comment on the JIRA issue, but emailing directly too:

===

Hi, Andreas, this fix *looks* good, but it would be nice to see a test come with it, both so that the committer can verify that everything works better with the patch, and also to increase our test code coverage.

Since you included test code that demonstrates this bug, it shouldn't be too hard to integrate to an existing JDBC test...

Thanks,

David

Andreas Korneliussen (JIRA) wrote:
     [ http://issues.apache.org/jira/browse/DERBY-795?page=all ]

Andreas Korneliussen updated DERBY-795:
---------------------------------------

    Attachment: DERBY-795.diff
                DERBY-795.diff

Attached is a fix for this issue.
The problem is detected by the jdbcapi/SURQueryMix.junit test provided in 
DERBY-934, when running in embedded mode.


After calling ResultSet.relative(0) the cursor loses its position
-----------------------------------------------------------------

        Key: DERBY-795
        URL: http://issues.apache.org/jira/browse/DERBY-795
    Project: Derby
       Type: Bug
 Components: JDBC
   Versions: 10.1.2.1
Environment: Any
   Reporter: Andreas Korneliussen
   Assignee: Andreas Korneliussen
   Priority: Minor
Attachments: DERBY-795.diff, DERBY-795.diff

After calling rs.relative(0), on a scrollable ResultSet, the cursor looses its 
position, and a rs.getXXX(..) fails with:
SQL Exception: Invalid cursor state - no current row.
Probably caused by the following logic in 
ScrollInsensitiveResultSet.getRelativeRow(int row):
        // Return the current row for 0
                if (row == 0)
                {
                   if ((beforeFirst || afterLast) ||
                       (!beforeFirst && !afterLast)) {
                       return null;
                   } else {
                        return getRowFromHashTable(currentPosition);
                   }
                }
The if () will always evaluate to true, regardless of the values of beforeFirst 
and afterLast
Test code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class RelativeZeroIssue {
public static void main(String[] args) throws Exception { Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
       Connection con = 
DriverManager.getConnection("jdbc:derby:testdb2;create=true");
       con.setAutoCommit(false);
try { Statement statement = con.createStatement(); /** Create the table */
           statement.execute("create table t1(id int)");
           statement.execute("insert into t1 values 1,2,3,4,5,6,7,8");
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                   ResultSet.CONCUR_READ_ONLY);
           ResultSet rs = s.executeQuery("select * from t1");
           rs.next();
           System.out.println(rs.getInt(1));
           System.out.println(rs.relative(0));
           System.out.println(rs.getInt(1));
       }  finally {
con.rollback();
           con.close();
       }
   }
}
Output from test:
1
false
Exception in thread "main" SQL Exception: Invalid cursor state - no current row.
       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
       at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
       at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown 
Source)
       at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown 
Source)
       at org.apache.derby.impl.jdbc.EmbedResultSet.checkOnRow(Unknown Source)
       at org.apache.derby.impl.jdbc.EmbedResultSet.getColumn(Unknown Source)
       at org.apache.derby.impl.jdbc.EmbedResultSet.getInt(Unknown Source)
       at derbytest.RelativeZeroIssue.main(RelativeZeroIssue.java:51)
Java Result: 1


begin:vcard
fn:David W Van Couvering
n:Van Couvering;David W
org:Sun Microsystems, Inc.;Database Technology Group
email;internet:[EMAIL PROTECTED]
title:Senior Staff Software Engineer
tel;work:510-550-6819
tel;cell:510-684-7281
x-mozilla-html:TRUE
version:2.1
end:vcard

Reply via email to