WL#681: Per query variable settings
Status: Code-Review — Priority: Medium
Some of the variable settings has much more meaning being set for query rather than for connection. That is you might with to increase sort_buffer_size before doing large sort query but it is very likely other queries in a session are simple and quite OK with default settings. Now to one can set variable value on query basics the following way: 1) store current value got by SHOW SESSION VARIABLES LIKE "name"; 2) set new variable value 3) run the query. 4) restore old settings Which require 4 steps instead of one, which can override all benefit of tuning, also it requires changing the application rather than the query itself. The good solution is for queries which make sense in query contexts such as record_buffer, record_rnd_buffer, join_buffer, sort_buffer, tmp_table_size allow setting them inside of the query: 1. SELECT MYSQL_SET_VARIABLE sort_buffer=16M name FROM people ORDER BY name; or (sh style) 2. @@sort_buffer=16M SELECT name FROM people ORDER BY name; or 3. SET STATEMENT @@sort_buffer=16M SELECT name FROM people ORDER BY name; and SET @@statement.sort_buffer=16M SELECT name FROM people ORDER BY name; or even 4. SET STATEMENT @@sort_buffer=16M; SELECT name FROM people ORDER BY name; and SET @@statement.sort_buffer=16M; SELECT name FROM people ORDER BY name; We'll do #3.
The syntax will be SET STATEMENT ... FOR <statement> "FOR" was added to help the parser (read - resolve reduce/reduce conflicts) to separate the expression in the assignment from a statement, as (SELECT 1) is both a valid <statement> and a valid <expression>. SET STATEMENT ... FOR <statement> can be used anywhere a <statement> can be. the feature is implemented by remembering a list of modified variables and their old values at the beginning of the mysql_execute_command, and restoring the value at the end. An error in assignment aborts the statement, an error in restoring the value is converted to a warning (too late to abort).
this was a GSoC 2009 project original tree is here - lp:~jlukas79/+junk/mysql-server/ our tree with post-review fixes is here - my:6.0-wl681
Copyright (c) 2000, 2017, Oracle Corporation and/or its affiliates. All rights reserved.