Bug #69788 Some ResultSet methods don't throw the proper exception when on an invalid row

Submitted: 19 Jul 2013 0:57 Modified: 28 Feb 2022 8:15
Reporter: Jess Balint Email Updates:
Status: Can't repeat Impact on me:
None 
Category:Connector / J Severity:S3 (Non-critical)
Version:5.1.25 OS:Any
Assigned to: Alexander Soklakov CPU Architecture:Any

[19 Jul 2013 0:57] Jess Balint
Description:
ResultSet.getString(), etc should throw an exception when on an "invalid row", e.g. beforeFirst:

java.sql.SQLException: Before start of result set
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:855)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5773)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5693)

Some methods don't throw the proper exception:
java.lang.NullPointerException
    at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2211)
    at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2173)

How to repeat:
call getDate() when on an invalid row

Suggested fix:
All public get*() methods on ResultSet should call checkRowPos()
[19 Jul 2013 2:20] Jess Balint
NPE is thrown on this line:

Date tmpDate = this.thisRow.getDateFast(columnIndexMinusOne, this.connection, this, cal);
[2 Jan 2016 20:07] Ramin Orujov
Fixed this bug in this commit.
https://github.com/raminorujov/mysql-connector-j/commit/dc4667f84f6a6a3223fde4793bd050f4de...
[2 Jan 2016 20:15] Ramin Orujov
Test case

Attachment: Bug69788.java (text/x-java), 1.13 KiB.

[2 Jan 2016 20:19] Ramin Orujov
Here is test case with attached Bug69788.java file. 

create table test.bug69788(
    col_int int,
    col_str varchar(50),
    col_datetime datetime,
    col_date date
);

insert into test.bug69788 values(1, 'test', now(), curdate());

select col_int, col_str, col_datetime, col_date from test.bug69788;

raminorujov@ro--ubuntu:~/repo/ro-mysql-connector-j/mysql-connector-j$ cd ~/Downloads/
raminorujov@ro--ubuntu:~/Downloads$ javac -cp .:mysql-connector-java-5.1.38-SNAPSHOT-bin.jar Bug69788.java 
raminorujov@ro--ubuntu:~/Downloads$ java -cp .:mysql-connector-java-5.1.38-SNAPSHOT-bin.jar Bug69788
Exception in thread "main" java.sql.SQLException: Before start of result set
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
	at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:790)
	at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2012)
	at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:1978)
	at Bug69788.main(Bug69788.java:30)
raminorujov@ro--ubuntu:~/Downloads$
[28 Feb 2022 8:15] Alexander Soklakov
Posted by developer:
 
This bug is not reproducible with the latest Connector/J 8.0.

Connector/J 5.1 series came to EOL on Feb 9th, 2021, see https://www.mysql.com/support/eol-notice.html, so this bug will not be fixed there.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.043 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.