-
Bug
-
Resolution: Future Project
-
P5
-
None
-
6
-
x86
-
windows_xp
FULL PRODUCT VERSION :
C:\Programme\Java\jdk1.6.0\bin>java -version
java version "1.6.0-beta2"
Java(TM) SE Runtime Environment (build 1.6.0-beta2-b86)
Java HotSpot(TM) Client VM (build 1.6.0-beta2-b86, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Windows XP SP-2
EXTRA RELEVANT SYSTEM CONFIGURATION :
Using Microsoft Access database
A DESCRIPTION OF THE PROBLEM :
On newly created ResultSet method first() shold have the same effect as method next() even for a ResultSet with 0 rows.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
See source code
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Internal rowPosition should be set to 1
ACTUAL -
Internal rowPosition is set to 0, 1, 2, ...
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
/*
* JdbcOdbcResultSetTest.java
* JUnit based test
*
* Created on 11. Juni 2006, 02:33
*
* $Id: JdbcOdbcResultSetTest.java 83 2006-08-24 20:56:16Z jdk6_JdbcOdbcBugs_ulf $
*/
package sun.jdbc.odbc;
import junit.framework.*;
import java.sql.*;
/**
*
* @author Ulf Zibis, ###@###.###
*/
public class JdbcOdbcResultSetTest extends TestCase {
private static final String URL = "jdbc:odbc:TestData";
private static final String TABLE = "Test1";
private static final String ID = "id";
private static final String STRING1 = "string1";
private static final String INT1 = "int1";
private static final int STRING1_LEN = 100;
private static final String EMPTY_QUERY = "SELECT * FROM "+TABLE+" WHERE "+ID+"=0";
private static final String ORDERED_QUERY = "SELECT * FROM "+TABLE+" ORDER BY "+ID;
private static final String STRING32CHARS = "Here are only 16 + 16 more chars";
private static final String UPDATED19CHARS = "updated to 19 chars";
private static final String INSERTED8CHARS = "inserted";
private Connection myCon = null;
private Statement myStmt;
private JdbcOdbcResultSet myRs;
static {
System.out.println("JDK Version: "+System.getProperty("java.version"));
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Obsolete in JDK 6.0
}
catch (Exception e) { e.printStackTrace(); }
}
public JdbcOdbcResultSetTest(String testName) {
super(testName);
System.out.println("Construct JdbcOdbcResultSetTest("+testName+") !!");
}
protected void finalize() throws Throwable {
super.finalize();
try { if (myCon != null) myCon.close(); }
catch (Throwable t) { t.printStackTrace(); }
}
protected void setUp() throws Exception {
myCon = DriverManager.getConnection( URL);
Statement stmt = myCon.createStatement();
try {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM "+TABLE);
rs.next();
//System.out.println( TABLE+" had "+rs.getInt( 1)+" record(s).");
stmt.executeUpdate("DROP TABLE "+TABLE);
}
catch (SQLException se) {
if (se.getErrorCode() == -1305)
System.out.println( TABLE+" was not existent.");
else throw se;
}
stmt.executeUpdate("CREATE TABLE "+TABLE+"( "+ID+" COUNTER PRIMARY KEY, "
+STRING1+" VARCHAR("+STRING1_LEN+"), "
+INT1+" INT)");
//System.out.println("New empty table "+TABLE+" created !");
stmt.close();
myStmt = myCon.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
}
protected void tearDown() throws Exception {
try { if (myCon != null) myCon.close(); myCon = null;}
catch (Throwable t) { t.printStackTrace(); }
}
public void testNextAgainstFirst() throws Exception {
System.out.println("testNextAgainstFirst() <Bug ???>");
try {
myRs = (JdbcOdbcResultSet)myStmt.executeQuery( ORDERED_QUERY);
boolean result;
myRs.beforeFirst(); // define same start position
result = myRs.next(); // OK: internal rowPosition is set to 1
assertFalse("myRs.next(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
result = myRs.next(); // Bug: internal rowPosition is set to 2
assertFalse("myRs.next(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
result = myRs.first(); // Bug: internal rowPosition remains on 2
assertFalse("myRs.first(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
myRs.beforeFirst(); // define same start position
result = myRs.first(); // Bug: internal rowPosition remains on 0
assertFalse("myRs.first(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
} catch (SQLException se) {
Exception e = new Exception( se+", Error: "+se.getErrorCode()+", SQLState: "+se.getSQLState());
e.setStackTrace( se.getStackTrace());
//e.initCause( se);
throw e;
}
}
/*
public static Test suite() {
TestSuite suite = new TestSuite(JdbcOdbcResultSetTest.class);
return suite;
}
public static void main (String[] args) {
junit.textui.TestRunner.run(suite());
}
*/
}
---------- END SOURCE ----------
C:\Programme\Java\jdk1.6.0\bin>java -version
java version "1.6.0-beta2"
Java(TM) SE Runtime Environment (build 1.6.0-beta2-b86)
Java HotSpot(TM) Client VM (build 1.6.0-beta2-b86, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Windows XP SP-2
EXTRA RELEVANT SYSTEM CONFIGURATION :
Using Microsoft Access database
A DESCRIPTION OF THE PROBLEM :
On newly created ResultSet method first() shold have the same effect as method next() even for a ResultSet with 0 rows.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
See source code
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Internal rowPosition should be set to 1
ACTUAL -
Internal rowPosition is set to 0, 1, 2, ...
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
/*
* JdbcOdbcResultSetTest.java
* JUnit based test
*
* Created on 11. Juni 2006, 02:33
*
* $Id: JdbcOdbcResultSetTest.java 83 2006-08-24 20:56:16Z jdk6_JdbcOdbcBugs_ulf $
*/
package sun.jdbc.odbc;
import junit.framework.*;
import java.sql.*;
/**
*
* @author Ulf Zibis, ###@###.###
*/
public class JdbcOdbcResultSetTest extends TestCase {
private static final String URL = "jdbc:odbc:TestData";
private static final String TABLE = "Test1";
private static final String ID = "id";
private static final String STRING1 = "string1";
private static final String INT1 = "int1";
private static final int STRING1_LEN = 100;
private static final String EMPTY_QUERY = "SELECT * FROM "+TABLE+" WHERE "+ID+"=0";
private static final String ORDERED_QUERY = "SELECT * FROM "+TABLE+" ORDER BY "+ID;
private static final String STRING32CHARS = "Here are only 16 + 16 more chars";
private static final String UPDATED19CHARS = "updated to 19 chars";
private static final String INSERTED8CHARS = "inserted";
private Connection myCon = null;
private Statement myStmt;
private JdbcOdbcResultSet myRs;
static {
System.out.println("JDK Version: "+System.getProperty("java.version"));
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Obsolete in JDK 6.0
}
catch (Exception e) { e.printStackTrace(); }
}
public JdbcOdbcResultSetTest(String testName) {
super(testName);
System.out.println("Construct JdbcOdbcResultSetTest("+testName+") !!");
}
protected void finalize() throws Throwable {
super.finalize();
try { if (myCon != null) myCon.close(); }
catch (Throwable t) { t.printStackTrace(); }
}
protected void setUp() throws Exception {
myCon = DriverManager.getConnection( URL);
Statement stmt = myCon.createStatement();
try {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM "+TABLE);
rs.next();
//System.out.println( TABLE+" had "+rs.getInt( 1)+" record(s).");
stmt.executeUpdate("DROP TABLE "+TABLE);
}
catch (SQLException se) {
if (se.getErrorCode() == -1305)
System.out.println( TABLE+" was not existent.");
else throw se;
}
stmt.executeUpdate("CREATE TABLE "+TABLE+"( "+ID+" COUNTER PRIMARY KEY, "
+STRING1+" VARCHAR("+STRING1_LEN+"), "
+INT1+" INT)");
//System.out.println("New empty table "+TABLE+" created !");
stmt.close();
myStmt = myCon.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
}
protected void tearDown() throws Exception {
try { if (myCon != null) myCon.close(); myCon = null;}
catch (Throwable t) { t.printStackTrace(); }
}
public void testNextAgainstFirst() throws Exception {
System.out.println("testNextAgainstFirst() <Bug ???>");
try {
myRs = (JdbcOdbcResultSet)myStmt.executeQuery( ORDERED_QUERY);
boolean result;
myRs.beforeFirst(); // define same start position
result = myRs.next(); // OK: internal rowPosition is set to 1
assertFalse("myRs.next(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
result = myRs.next(); // Bug: internal rowPosition is set to 2
assertFalse("myRs.next(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
result = myRs.first(); // Bug: internal rowPosition remains on 2
assertFalse("myRs.first(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
myRs.beforeFirst(); // define same start position
result = myRs.first(); // Bug: internal rowPosition remains on 0
assertFalse("myRs.first(): ", result);
// assertTrue("myRs.isAfterLast(): ", myRs.isAfterLast());
} catch (SQLException se) {
Exception e = new Exception( se+", Error: "+se.getErrorCode()+", SQLState: "+se.getSQLState());
e.setStackTrace( se.getStackTrace());
//e.initCause( se);
throw e;
}
}
/*
public static Test suite() {
TestSuite suite = new TestSuite(JdbcOdbcResultSetTest.class);
return suite;
}
public static void main (String[] args) {
junit.textui.TestRunner.run(suite());
}
*/
}
---------- END SOURCE ----------