WL#9637: SQL Function to return DIGEST of given SQL
This feature has been requested by many users. They want to ask the server for a digest for a query so they can correlate it with their application-side query capturing.
The feature consists of two new functions for which we see examples below:
mysql> SELECT statement_digest('SELECT * FROM foo') ->fc86ab9f4e4275ef861733844e3b2710313376a3a632204f99eecf8ce0855f4d
mysql> SELECT statement_digest_text('SELECT * FROM foo') -> 'SELECT * FROM `foo`'
- F-1
statement_digestwill calculate a statement digest from the tokens in its argument string. - F-2
statement_digest_textwill calculate a normalized statement, a.k.a. digest text from the tokens in its argument string. F-3
statement_digestandstatement_digest_textwill returnNULLforNULLarguments.NF-1
statement_digestshall calculate the same digest for a given syntactically correct SQL string as performance_schema does.- NF-2
statement_digest_textshall calculate the same normalized statement for a given syntactically correct SQL string as performance_schema does. - NF-3
statement_digestandstatement_digest_textraise an error for incorrect SQL strings during execution. - NF-4
statement_digestandstatement_digest_textonly returnNULLforNULLarguments. - NF-5 If the argument to either function is a string literal, the parse error from the parser will be quoted in the error message.
- NF-6 If the argument to either function not a string literal, the parse error from the parser will not be quoted in the error message.
Overview
This work adds the new native functions STATEMENT_DIGEST() and STATEMENT_DIGEST_TEXT(). Both functions will parse the string using the normal SQL parser and hence may throw parse errors, but return NULL only when the argument is NULL. For strings containing valid SQL statements, STATEMENT_DIGEST() will return the digest that performance_schema would assign to the statement, and STATEMENT_DIGEST_TEXT() will return the normalized statement that performance_schema would assign.
Security
The argument will not be expanded in the case of syntax errors unless it was passed as a string literal.
Because the functions are so similar, they will have a common implementation called parse() in an anonymous namespace. The only difference between the functions is that Item_func_statement_digest::val_str_ascii() will call compute_digest_hash() whereas Item_func_statement_digest_text::val_str() will call compute_digest_text() after parsing.
The function parse() calls Bison's parser symbol MYSQLparse() directly, as all of the work done in parse_sql() deals either with cleanup up a previous state or preparing for execution.