Preserve type for binary protocol parameters in prepared statements #1081
+63
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When
bindStmtArgsparses binary protocol parameters, the MySQL type is available inparamTypes. However, the library loses this type information when passing the parsed values to theHandler.HandleStmtExecutecallback: it converts length-encoded parameters (datetime, varchar, blob, etc.) to plain[]byteand drops the type.This creates problems for proxies: when forwarding these parameters to a backend, the client sees
[]byteand sends them asMYSQL_TYPE_STRING, even if the original type wasMYSQL_TYPE_DATETIMEor another type. Some server implementations strictly validate parameter types and reject this mismatch.This PR introduces a simple
TypedBytesstruct that preserves the original MySQL type alongside the raw bytes.Handler.HandleStmtExecutecallback now receives this struct instead of[]bytefor length-encoded parameters, andclient.Stmtalso handlesTypedBytesby using the preserved type when sending to servers.