Bug #90420 Contribution by Facebook: Query attributes
Submitted: 13 Apr 2018 0:21 Modified: 18 Jan 12:26
Reporter: FBContrib Admin Email Updates:
Status: Closed Impact on me:
Category:MySQL Server: Connection Handling Severity:S4 (Feature request)
Version:8.0.11 OS:Any
Assigned to: CPU Architecture:Any

[13 Apr 2018 0:21] FBContrib Admin
Background innformation provided by Facebook:


This adds a way to tag COM_QUERY requests.
Currently, queries sent over the network are encoded as follows:
      total packet length
      query string

The length of the query string is implicit from and calculated from the packet length. This change adds a new command called COM_QUERY_ATTRS with the following structure
       total packet length
       total attributes length
       attributes string
       query string

Note that query string length is still implicit. In order to avoid conflicting RPC values with Oracle, COM_QUERY_ATTRS was put at the end of the valid RPC range. Its value is set at 255.

For upstream purposes, COM_QUERY_ATTRS and COM_QUERY can probably be merged, using capability flags to help with the format change.

Repo: https://github.com/mysql/mysql-server
Patch on top of 8.0.4: https://github.com/mysql/mysql-server/commit/577fbcf856cd693434d554545d499559bcdd3695
Facebook commits: https://github.com/facebook/mysql-5.6/commit/a619992

How to repeat:
See description

Suggested fix:
See contribution code attached
[13 Apr 2018 0:21] FBContrib Admin
Query attributes 
(*) This code is contributed under the Facebook agreement

Contribution: fb_patch_43.txt (text/plain), 20.84 KiB.

[1 Oct 2018 22:27] FBContrib Admin
Query attributes for 8.0.11 
(*) This code is contributed under the Facebook agreement

Contribution: fb_patch_83.txt (text/plain), 22.16 KiB.

[18 Jan 8:17] Georgi Kodinov
Implemented as WL#12542 in 8.0.23
[18 Jan 12:26] Paul DuBois
Posted by developer:
Fixed in 8.0.23.

For some applications, it may be useful to define metadata on a
per-query basis. Examples include the URL of the page that produced a
query, or extra processing information to be passed with a query for
use by a plugin such as an audit plugin or query rewrite plugin.
MySQL now supports this capability without the use of workarounds
such as specially formatted comments included in query strings:

* On the client side, the mysql_bind_param() C API function enables
  defining query attributes. These attributes apply to the next SQL
  statement sent to the server for execution. Additionally, the mysql and
  mysqltest clients have a query_attributes command that enables defining
  query attributes.

* On the server side, a component service provides access to query
  attributes. A component named query_attributes uses this service to
  implement a mysql_query_attribute_string() user-defined function (UDF)
  that enables obtaining attribute values within SQL statements. The
  query_attributes component is optional but must be installed for the UDF
  to be available.

Thanks to Facebook for suggesting the idea (and for contributing
code, although it was not used).