Bug #114533 JDBC exception java.lang.NumberFormatException

Submitted: 3 Apr 2024 4:09 Modified: 8 Jul 2024 13:01
Reporter: Ming Wei Tan Email Updates:
Status: Won't fix Impact on me:
None 
Category:Connector / J Severity:S3 (Non-critical)
Version:8.3.0, 9.2.0 OS:Linux
Assigned to: CPU Architecture:x86
Tags: jdbc

[3 Apr 2024 4:09] Ming Wei Tan
Description:
MySQL Server: 8.0.36
Driver Name & Ver: MySQL Connector/Jmysql-connector-j-8.0.33 (Revision: 7d6b0800528b6b25c68b52dc10d6c1c8429c100c)

Exception is thrown in Java with the following testcase generated from SQLancer.  

DROP DATABASE IF EXISTS database3;
CREATE DATABASE database3;
USE database3;
CREATE TABLE IF NOT EXISTS t0(c0 FLOAT ZEROFILL);
INSERT INTO t0(c0) VALUES("-0");
SELECT t0.c0 FROM t0;  --0000000000-0

Seems to be a parsing error of "0000000000-0" returned due to a column with ZEROFILL and a negative 0

Stack trace:

Exception in thread "main" java.lang.NumberFormatException: For input string: "0000000000-0"
	at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
	at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.base/java.lang.Double.parseDouble(Double.java:651)
	at com.mysql.cj.protocol.a.MysqlTextValueDecoder.getDouble(MysqlTextValueDecoder.java:249)
	at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeDouble(MysqlTextValueDecoder.java:134)
	at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeFloat(MysqlTextValueDecoder.java:130)
	at com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:116)
	at com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:243)
	at com.mysql.cj.protocol.a.result.ByteArrayRow.getValue(ByteArrayRow.java:91)
	at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:883)
	at Main.main(Main.java:19)

How to repeat:
Reproducible with this java code

import java.sql.*;

public class Main {

    public static void main(String[] args) throws Exception {

        try (Connection con = getMySqlConnection()) {

            Statement statement = con.createStatement();

            statement.execute("DROP DATABASE IF EXISTS database3;");
            statement.execute("CREATE DATABASE database3;");
            statement.execute("USE database3;");
            statement.execute("CREATE TABLE IF NOT EXISTS t0(c0 FLOAT ZEROFILL);");
            statement.execute("INSERT INTO t0(c0) VALUES(\"-0\");");
            ResultSet result = statement.executeQuery("SELECT t0.c0 FROM t0;");

            result.next();
            System.out.println(result.getString(1));
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static Connection getMySqlConnection() throws Exception {
        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost/databaseconnectiontest?user=root&password=root&rewriteBatchStatements=true";

        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url);
        DatabaseMetaData meta = conn.getMetaData();
        System.out.println("MySQL Server: " + meta.getDatabaseProductVersion());
        System.out.println("Driver Name & Ver: " + meta.getDriverName() + meta.getDriverVersion());
        return conn;
    }
}
[3 Apr 2024 8:04] MySQL Verification Team
Hello Ming Wei Tan,

Thank you for the report and test case.

regards,
Umesh
[8 Jul 2024 13:01] Filipe Silva
Not a bug in MySQL Connector/J. Related to MySQL Server Bug#115493.
[5 Mar 2025 7:51] MySQL Verification Team
Bug #117620 marked as duplicate of this one

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

Page generated in 0.056 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.