Bug #108414 Malformed packet generation for `COM_STMT_EXECUTE`
Submitted: 7 Sep 2022 13:24 Modified: 20 Dec 2022 21:11
Reporter: Seongman Yang (OCA) Email Updates:
Status: Closed Impact on me:
Category:Connector / J Severity:S3 (Non-critical)
Version:8.0.29, 8.0.30 OS:Any
Assigned to: CPU Architecture:Any
Tags: Contribution

[7 Sep 2022 13:24] Seongman Yang
Use the parameter `useServerPrepStmts=true`.

PreparedStatement parameter for a boolean value with `targetSqlType` of `BIT`, it is mapped to type `FIELD_TYPE_VAR_STRING` to generate a malformed packet.

MySQL Server versions 5.6.51, 5.7.39, and 8.0.30 have been tested with Testcontainers.

How to repeat:
Connection conn = ...; // with useServerPrepStmts=true
PreparedStatement pstmt = conn.prepareStatement("SELECT ?"); // send COM_STMT_PREPARE

pstmt.setObject(1, true, MysqlType.BIT); // maps to FIELD_TYPE_VAR_STRING; cause of the problem

ResultSet rs = pstmt.executeQuery(); // send COM_STMT_EXECUTE with malformed packet

// results from MySQL Server 8.0.30
rs.getBytes(1);                 // {byte[0]} []
rs.getBoolean(1);               // false
rs.getObject(1, Boolean.class); // {Boolean} false

Suggested fix:
To be submitted on GitHub.
[7 Sep 2022 19:53] OCA Admin
Contribution submitted via Github - fix. bug#108414 Malformed Packet 
(*) Contribution by Seongman Yang (Github scndry, mysql-connector-j/pull/85#issuecomment-1239796193): I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.

Contribution: git_patch_1048906516.txt (text/plain), 3.29 KiB.

[8 Sep 2022 9:50] MySQL Verification Team
Hello Seongman Yang,

Thank you for the report and contribution.

[20 Dec 2022 21:11] Daniel So
Posted by developer:
Added the following entry to the C/J 8.0.32 changelog: 

"When using server-side prepared statements, the BIT data type was not properly handled by NativeQueryBindValue.getFieldType() and, as a result, BIT values were being mapped to FIELD_TYPE_VAR_STRING and causing malformed packets. This patch fixes this by mapping BIT values to FIELD_TYPE_TINY, so that the values will be handled correctly when the prepared statement is executed on the server. Thanks to Seongman Yang for contributing to the patch."