mirror of
https://github.com/apache/doris.git
synced 2026-11-04 07:31:17 +00:00
### What problem does this PR solve? Related PR: #69314 JDBC `setBytes()` and Connector/ODBC binary bindings can send `MYSQL_TYPE_VAR_STRING` / `MYSQL_TYPE_STRING` rather than BLOB. FE decoded those bytes with Java's replacement UTF-8 decoder, silently changing arbitrary binary data. For example, `0080FF4100C328` became `00EFBFBDEFBFBD4100EFBFBD28` in `SELECT HEX(?)`. The BLOB handling added by #69314 did not cover these wire types. Decode string parameters strictly and retain non-UTF-8 payloads as binary literals. Bind those payloads through a BE-side cast to the original string category, preserving string function and comparison typing without replacing bytes. Valid UTF-8 retains the existing text literal types, and BLOB types retain their existing binary behavior. Use value-based binary literal child hashes so equivalent casts remain equal after rebinding and forwarding. ### Release note Preserve non-UTF-8 bytes in MySQL server-prepared string parameters, including JDBC `setBytes()` and Connector/ODBC binary bindings. ### Check List (For Author) - Test: - [x] Regression test: generated and replayed `prepared_stmt_p0/binary_parameters`; replayed `prepared_stmt_p0/send_long_data`. Covers all byte values, malformed UTF-8, parameter reuse, stored HEX/MD5, string expression predicates, NULL/empty values and ordinary Unicode text. - [x] Unit Test: 17 tests passed across `MysqlParameterLiteralTest` and `MysqlConnectProcessorLongDataTest`, including string wire aliases, cached types, uploads and forwarding. - [x] Manual test: Connector/J 8.2.0 server-prepared `setBytes`, `setBinaryStream` and `setBlob` preserve `0080FF4100C328`. - [x] Manual test: Linux Connector/ODBC 5.3.14 Unicode, 17 cases passed, including 1-MiB binary/Unicode inputs. An additional 17-case proxy-rewritten VARCHAR wire-type probe also passed. - [x] FE build and Checkstyle passed. - Behavior changed: - [x] Yes. Non-UTF-8 string-coded parameters preserve the input bytes instead of substituting U+FFFD. Valid UTF-8 text behavior is unchanged. - Does this need documentation? - [x] No. Runtime regression checks used the newly built master FE with an existing 4.1.4 BE and condition cache disabled. The predicate regression uses `CONCAT(value, '') = ?`; direct constant predicate pushdown on a current master BE was not validated. No BE, storage-format or protocol-field changes are included.