This task goal is to permit not sending metadata every time
MySQL has changed the protocol to permit skipping metadata for version 8.
In description MySQL task indicate some big improvement:
- METADATA_FULL : 3.48w TPS, Net send 113M
- METADATA_IGNORE: 13.8w TPS, Net send 30M
MySQL implementation send metadata (or not) according to resultset_metadata variable.
Associate capability is CLIENT_OPTIONAL_RESULTSET_METADATA (1UL << 25)
When resultset_metadata = 0 (NONE) no metadata is send for COM_STMT_PREPARE/COM_STMT_EXECUTE/COM_QUERY
There is a "new metadata_follows flag"
When metadata_follows = 0x00, protocol skip column informations packet (continuing by an EOF_packet if CLIENT_DEPRECATE_EOF capability is not set or rows if CLIENT_DEPRECATE_EOF is set).
be careful not to rely on mysql documentation that indicate them in a wrong order
if metadata is set to 0x00, column definition packet that decribe each parameter and each column are skipped.
Connectors need metadata to parse resultset.
Proposal is to offer this functionality, but in a more modular way.
What do connectors need:
For first execute of a prepared statement:
For next execute:
- COM_STMT_EXECUTE WITHOUT metadata. use cached metadata
There are two issues with not sending metadata each time:
- Metadata can change over time. Server already automatically reprepares internally, so it knows to resend the metadata even if the client asked not to send the metadata every time.
- commands like "SELECT ?" will have metadata type changing according to parameter. Metadata must then be send each time.
For production environment where DDL never change an option can be set on client level to use that same functionality for COM_QUERY.
Client can then cache metadata and ask for COM_QUERY without metadata.
MySQL doesn't permits modularity, so client request have to add this information.
That can be either by:
- create new commands COM_STMT_PREPARE_WITHOUT_META, COM_STMT_EXECUTE_WITHOUT_META and COM_QUERY_WITHOUT_META
- changing existing COM_STMT_PREPARE, COM_STMT_EXECUTE and COM_QUERY format.