Bug #35170 isAfterLast() not working in streaming ResultSet
Submitted: 9 Mar 2008 10:29 Modified: 4 Jul 2008 18:08
Reporter: Janbo Petkov
Status: Closed
Category:Connector/J Severity:S1 (Critical)
Version:5.1.6 OS:Microsoft Windows (XP)
Assigned to: Target Version:
Tags: isAfterLast, setFetchSize
Triage: D3 (Medium)

[9 Mar 2008 10:29] Janbo Petkov
Description:
Connector/J

wrong result from isAfterLast() in streaming ResultSet when using
setFetchSize(Integer.MIN_VALUE)

possibly connected to bugs #18148, #8778, #7435

tested with server.5.0.27
connector/j:
   3.0.11 - ok
   3.1.14 - ok
   5.0.8 - ok
   5.1.5 - fail
   5.1.6 - fail

How to repeat:
Connection con;
//... initiate con
Statement stt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
   ResultSet.CONCUR_READ_ONLY);
stt.setFetchSize(Integer.MIN_VALUE);
ResultSet set = stt.executeQuery("select * from TEST");
while(set.next());
boolean eof = set.isAfterLast();

wrong - eof == false
[10 Mar 2008 11:20] Tonci Grgin
Test case on latest c/J 5.1 sources

Attachment: TestBug35170.java (text/java), 1.54 KiB.

[10 Mar 2008 11:29] Tonci Grgin
Hi Janbo and thanks for your report. I must say I do not understand it. Can you please
elaborate why "false" is wrong?
I would expect "false" there but for this.rs.isLast() I would expect error (see comments
in my test case) using streaming RS. I'm using driver built from latest sources (5.1.7)
on Win32.

Test case output (uncomment isLast() line to see the error):
.Loading JDBC driver 'com.mysql.jdbc.Driver'
Done.

Done.

Connected to 5.0.58-pb1083-log
java.vm.version         : 1.5.0_12-b04
java.vm.vendor          : Sun Microsystems Inc.
java.runtime.version    : 1.5.0_12-b04
os.name                 : Windows XP
os.version              : null
sun.management.compiler : HotSpot Client Compiler
falseE << Output from "this.rs.isAfterLast()", removed from test case attached
Time: 0,234
There was 1 error: << Error from "this.rs.isLast()", remarked in test case attached
1)
testBug35170(testsuite.simple.TestBug35170)com.mysql.jdbc.RowDataDynamic$OperationNotSupportedException:
Operation not supported for streaming result sets
	at com.mysql.jdbc.RowDataDynamic.notSupported(RowDataDynamic.java:454)
	at com.mysql.jdbc.RowDataDynamic.isLast(RowDataDynamic.java:365)
	at com.mysql.jdbc.ResultSetImpl.isLast(ResultSetImpl.java:6850)
	at testsuite.simple.TestBug35170.testBug35170(TestBug35170.java:39)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at testsuite.simple.TestBug35170.main(TestBug35170.java:51)

FAILURES!!!
Tests run: 1,  Failures: 0,  Errors: 1
[13 Mar 2008 14:17] Janbo Petkov
sorry. wrong example. right one:

			Statement stt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
			stt.setFetchSize(Integer.MIN_VALUE);
			ResultSet rs = stt.executeQuery("select * from mysql.user");
			rs.next();
			while(!rs.isAfterLast()){
				System.out.println(rs.getString(1));
				rs.next();
			}

fails with:
java.lang.NullPointerException
	at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5528)
	at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5434)
[13 Mar 2008 19:46] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/43953
[4 Jul 2008 18:08] Tony Bedford
An entry has been added to the 5.1.7 changelog:

Incorrect result is returned from isAfterLast() in streaming ResultSet when using
setFetchSize(Integer.MIN_VALUE).
[30 Jul 2008 16:53] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/50724