2014-10-24 10:13:08 +02:00
|
|
|
--echo '# SET STATEMENT ..... FOR .... TEST'
|
|
|
|
############################ STATEMENT_SET #############################
|
|
|
|
# #
|
|
|
|
# Testing working functionality of SET STATEMENT #
|
|
|
|
# #
|
|
|
|
# #
|
|
|
|
# There is important documentation within #
|
|
|
|
# #
|
|
|
|
# #
|
|
|
|
# Author: Joe Lukas #
|
|
|
|
# Creation: #
|
|
|
|
# 2009-08-02 Implement this test as part of #
|
|
|
|
# WL#681 Per query variable settings #
|
|
|
|
# #
|
|
|
|
########################################################################
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
DROP FUNCTION IF EXISTS myProc;
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
DROP PROCEDURE IF EXISTS p2;
|
|
|
|
DROP PROCEDURE IF EXISTS p3;
|
|
|
|
DROP PROCEDURE IF EXISTS p4;
|
|
|
|
DROP PROCEDURE IF EXISTS p5;
|
|
|
|
DROP PROCEDURE IF EXISTS p6;
|
|
|
|
DROP VIEW IF EXISTS v1;
|
|
|
|
DROP TABLE IF EXISTS STATEMENT;
|
|
|
|
--enable_warnings
|
|
|
|
SET @save_binlog_format = @@binlog_format;
|
|
|
|
SET @save_keep_files_on_create = @@keep_files_on_create;
|
|
|
|
SET @save_max_join_size = @@max_join_size;
|
|
|
|
SET @save_myisam_repair_threads = @@myisam_repair_threads;
|
|
|
|
SET @save_myisam_sort_buffer_size = @@myisam_sort_buffer_size;
|
|
|
|
SET @save_sort_buffer_size = @@sort_buffer_size;
|
|
|
|
####################################################################
|
|
|
|
#Set up current database
|
|
|
|
####################################################################
|
|
|
|
--echo '# Setup database'
|
|
|
|
CREATE TABLE t1 (v1 INT, v2 INT);
|
|
|
|
INSERT INTO t1 VALUES (1,2);
|
|
|
|
INSERT INTO t1 VALUES (3,4);
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------ STATEMENT Test 1 -----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Checks with variable value type ulong #
|
|
|
|
####################################################################
|
|
|
|
--echo '# Initialize variables to known setting'
|
|
|
|
SET SESSION sort_buffer_size=100000;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
SET STATEMENT sort_buffer_size=150000 FOR SELECT *,@@sort_buffer_size FROM t1;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------ STATEMENT Test 2 -----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Checks for multiple set values inside STATEMENT ... FOR #
|
|
|
|
####################################################################
|
|
|
|
--echo '# Initialize variables to known setting'
|
|
|
|
SET SESSION binlog_format=mixed;
|
|
|
|
SET SESSION sort_buffer_size=100000;
|
|
|
|
--echo '# Pre-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'binlog_format';
|
|
|
|
SET STATEMENT sort_buffer_size=150000, binlog_format=row
|
|
|
|
FOR SELECT *,@@sort_buffer_size,@@binlog_format FROM t1;
|
|
|
|
--echo '# Post-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'binlog_format';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------ STATEMENT Test 3 -----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Check current variable value is stored in using stored #
|
|
|
|
# statements. #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable value, make prepared statement
|
|
|
|
SET SESSION binlog_format=row;
|
|
|
|
PREPARE stmt1 FROM 'SET STATEMENT binlog_format=row FOR SELECT *,@@binlog_format FROM t1';
|
|
|
|
--echo ''
|
|
|
|
--echo '# Change variable setting'
|
|
|
|
SET SESSION binlog_format=mixed;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value'
|
|
|
|
--echo ''
|
|
|
|
SHOW SESSION VARIABLES LIKE 'binlog_format';
|
|
|
|
--echo ''
|
|
|
|
EXECUTE stmt1;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'binlog_format';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
DEALLOCATE PREPARE stmt1;
|
|
|
|
--echo '#------------------ STATEMENT Test 4 -----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Check works with OPTIMIZE TABLE command #
|
|
|
|
# Checks works with a variable value of type INT #
|
|
|
|
# Checks works with variable type ULONGLONG #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable value, make prepared statement
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000, myisam_repair_threads=1;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'myisam_sort_buffer_size';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'myisam_repair_threads';
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=800000,
|
|
|
|
myisam_repair_threads=2 FOR OPTIMIZE TABLE t1;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'myisam_sort_buffer_size';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'myisam_repair_threads';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------ STATEMENT Test 5 -----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Checks if variable reset after error in statement after FOR #
|
|
|
|
####################################################################
|
|
|
|
--echo '# Initialize variables to known setting'
|
|
|
|
SET SESSION sort_buffer_size=100000;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
--echo ''
|
|
|
|
--error ER_NO_SUCH_TABLE
|
|
|
|
SET STATEMENT sort_buffer_size=150000 FOR SELECT * FROM t2;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------ STATEMENT Test 6 -----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Checks works with variable type MY_BOOL #
|
|
|
|
####################################################################
|
|
|
|
--echo '# Initialize variables to known setting'
|
|
|
|
SET SESSION keep_files_on_create=ON;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT keep_files_on_create=OFF FOR SELECT *,@@keep_files_on_create FROM t1;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------ STATEMENT Test 7 -----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Checks works with variable type HA_ROWS #
|
|
|
|
####################################################################
|
|
|
|
--echo '# Initialize variables to known setting'
|
|
|
|
SET SESSION max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'max_join_size';
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT max_join_size=1000000000000 FOR SELECT *,@@max_join_size FROM t1;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT variable value'
|
|
|
|
SHOW SESSION VARIABLES LIKE 'max_join_size';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 8-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Ensure variable of each type is set to proper value during #
|
|
|
|
# statement after FOR execution #
|
|
|
|
####################################################################
|
|
|
|
--echo '# Initialize test variables'
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size = 200000,
|
|
|
|
max_join_size=2222220000000,
|
|
|
|
keep_files_on_create=ON;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '# LONG '
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
SET STATEMENT sort_buffer_size = 100000
|
|
|
|
FOR SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
|
|
|
|
--echo ''
|
|
|
|
--echo '# MY_BOOL '
|
|
|
|
SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
|
|
|
|
SET STATEMENT keep_files_on_create=OFF
|
|
|
|
FOR SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '# INT/LONG '
|
|
|
|
SHOW SESSION VARIABLES LIKE 'myisam_repair_threads';
|
|
|
|
SET STATEMENT myisam_repair_threads=2
|
|
|
|
FOR SHOW SESSION VARIABLES LIKE 'myisam_repair_threads';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'myisam_repair_threads';
|
|
|
|
--echo ''
|
|
|
|
--echo '# ULONGLONG '
|
|
|
|
SHOW SESSION VARIABLES LIKE 'max_join_size';
|
|
|
|
SET STATEMENT max_join_size=2000000000000
|
|
|
|
FOR SHOW SESSION VARIABLES LIKE 'max_join_size';
|
|
|
|
SHOW SESSION VARIABLES LIKE 'max_join_size';
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 9-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# No 1 - Check works with CREATE ... BEGIN ... END command #
|
|
|
|
# Display variables during execution #
|
|
|
|
# No 2 - Test with DROP command #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
DELIMITER |;
|
|
|
|
CREATE FUNCTION myProc (cost DECIMAL(10,2))
|
|
|
|
RETURNS DECIMAL(10,2)
|
|
|
|
|
|
|
|
SQL SECURITY DEFINER
|
|
|
|
|
|
|
|
tax: BEGIN
|
|
|
|
DECLARE order_tax DECIMAL(10,2);
|
|
|
|
SET order_tax = cost * .05 + @@sort_buffer_size;
|
|
|
|
RETURN order_tax;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--echo ''
|
|
|
|
--echo '# During Execution values
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
SELECT myProc(123.45);
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=300000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
SELECT myProc(123.45);
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT No 1 variable value Pre-STATEMENT for No 2'
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
DROP FUNCTION myProc;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT No 2 variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 11-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# No 1 - Check with PREPARE statement #
|
|
|
|
# check with different variable on inside PREPARE #
|
|
|
|
# No 2 - Check with EXECUTE statement #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
PREPARE stmt1 FROM
|
|
|
|
'SET STATEMENT binlog_format=row FOR SELECT *,@@binlog_format,@@sort_buffer_size FROM t1';
|
|
|
|
--echo ''
|
|
|
|
--echo 'Test No 1 Post Value & Test 2 Pre values'
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
EXECUTE stmt1;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT No 2
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 12-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# No 1 - Check with PROCEDURE (show variables in procedure) #
|
|
|
|
# No 2 - Check with CALL statement show variables in PROCEDURE #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
DELIMITER |;
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
CREATE PROCEDURE p1() BEGIN
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--echo ''
|
|
|
|
--echo 'Test No 1 Post Value & Test 2 Pre values'
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400001,
|
|
|
|
myisam_repair_threads=3,
|
|
|
|
sort_buffer_size=200001,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000001 FOR
|
|
|
|
CALL p1();
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT No 2
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
|
|
|
|
--echo '#------------------Test 13-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Check PROCEDURE containing SET STATEMENT FOR #
|
|
|
|
# p1() from test 12 will be used to display variables #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
DELIMITER |;
|
|
|
|
CREATE PROCEDURE p2() BEGIN
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=3,
|
|
|
|
sort_buffer_size=300000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=3333330000000 FOR
|
|
|
|
CALL p1();
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
CALL p2();
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 14-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Check PROCEDURE containing compound SET STATEMENT FOR #
|
|
|
|
# p2() will be used as compounding statement from test 13 #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
DELIMITER |;
|
|
|
|
CREATE PROCEDURE p3() BEGIN
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=320000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=220022,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000 FOR
|
|
|
|
CALL p2();
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
CALL p3();
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 15-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Check PROCEDURE containing compound SET STATEMENT FOR #
|
|
|
|
# call multiple SET STATEMENT .. FOR showing SELECT #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
DELIMITER |;
|
|
|
|
CREATE PROCEDURE p4() BEGIN
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=320000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=220022,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000 FOR
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=320000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=220022,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000 FOR
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=320000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=220022,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000 FOR
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
CALL p4();
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 16-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Test Effect on parsing #
|
|
|
|
####################################################################
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT sql_mode='ansi' FOR PREPARE stmt FROM 'SELECT "t1".* FROM t1';
|
|
|
|
execute stmt;
|
|
|
|
ALTER TABLE t1 ADD COLUMN v3 int;
|
2017-01-24 14:29:51 +01:00
|
|
|
# repreparation with other mode does not cause an error
|
2014-10-24 10:13:08 +02:00
|
|
|
execute stmt;
|
|
|
|
ALTER TABLE t1 drop COLUMN v3;
|
|
|
|
deallocate prepare stmt;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
--echo check the same behaviour in normal set
|
|
|
|
SET sql_mode='ansi';
|
|
|
|
PREPARE stmt FROM 'SELECT "t1".* FROM t1';
|
|
|
|
SET sql_mode=default;
|
|
|
|
execute stmt;
|
|
|
|
ALTER TABLE t1 ADD COLUMN v3 int;
|
2017-01-24 14:29:51 +01:00
|
|
|
# repreparation with other mode does not cause an error
|
2014-10-24 10:13:08 +02:00
|
|
|
execute stmt;
|
|
|
|
ALTER TABLE t1 drop COLUMN v3;
|
|
|
|
deallocate prepare stmt;
|
|
|
|
# the above test about SP
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
SET sql_mode='ansi';
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
DELIMITER |;
|
|
|
|
CREATE PROCEDURE p6() BEGIN
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
SELECT "t1".* FROM t1;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
SET sql_mode=default;
|
|
|
|
call p6;
|
|
|
|
ALTER TABLE t1 ADD COLUMN v3 int;
|
|
|
|
#force SP stack invalidation
|
|
|
|
create view v1 as select * from t1;
|
|
|
|
drop view v1;
|
|
|
|
call p6;
|
|
|
|
ALTER TABLE t1 drop COLUMN v3;
|
|
|
|
drop procedure p6;
|
|
|
|
|
|
|
|
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
DELIMITER |;
|
|
|
|
--echo # SET and the statement parsed as one unit before the SET takes effect
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SET STATEMENT sql_mode='ansi' FOR
|
|
|
|
CREATE PROCEDURE p6() BEGIN
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
SELECT "t1".* FROM t1;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
#call p1;
|
|
|
|
#ALTER TABLE t1 ADD COLUMN v3 int;
|
|
|
|
#--echo # no reparsing for now
|
|
|
|
#call p1;
|
|
|
|
#ALTER TABLE t1 drop COLUMN v3;
|
|
|
|
#drop procedure p1;
|
|
|
|
|
|
|
|
|
|
|
|
# the above test about compound statement
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
SET sql_mode='ansi';
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
DELIMITER |;
|
|
|
|
BEGIN NOT ATOMIC
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
SELECT "t1".* FROM t1;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
SET sql_mode=default;
|
|
|
|
|
|
|
|
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
DELIMITER |;
|
|
|
|
--echo # SET and the statement parsed as one unit before the SET takes effect
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SET STATEMENT sql_mode='ansi' FOR
|
|
|
|
BEGIN NOT ATOMIC
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
SELECT "t1".* FROM t1;
|
|
|
|
END|
|
|
|
|
SET STATEMENT sql_mode='ansi' FOR
|
|
|
|
BEGIN NOT ATOMIC
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
SELECT * FROM t1;
|
|
|
|
SELECT @@sql_mode;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 17-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Test effect of SET STATEMENT FOR with SET SESSION modifying #
|
|
|
|
# the same variables as the SET STATEMENT #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=320000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=220022,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000
|
|
|
|
FOR SET SESSION
|
|
|
|
myisam_sort_buffer_size=260000,
|
|
|
|
myisam_repair_threads=3,
|
|
|
|
sort_buffer_size=230013,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2323230000000;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 18-----------------------#'
|
|
|
|
####################################################################
|
|
|
|
# Test effect of SET SESSION inside a stored procedure with #
|
|
|
|
# with a SET STATEMENT on outside variables #
|
|
|
|
####################################################################
|
|
|
|
--echo '# set initial variable values
|
|
|
|
SET SESSION myisam_sort_buffer_size=500000,
|
|
|
|
myisam_repair_threads=1,
|
|
|
|
sort_buffer_size=100000,
|
|
|
|
binlog_format=mixed,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2222220000000;
|
|
|
|
--echo ''
|
|
|
|
--echo '# Pre-STATEMENT variable value
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
DELIMITER |;
|
|
|
|
CREATE PROCEDURE p5() BEGIN
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
SET SESSION
|
|
|
|
myisam_sort_buffer_size=260000,
|
|
|
|
myisam_repair_threads=3,
|
|
|
|
sort_buffer_size=230013,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=ON,
|
|
|
|
max_join_size=2323230000000;
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
SET STATEMENT myisam_sort_buffer_size=400000,
|
|
|
|
myisam_repair_threads=2,
|
|
|
|
sort_buffer_size=200000,
|
|
|
|
binlog_format=row,
|
|
|
|
keep_files_on_create=OFF,
|
|
|
|
max_join_size=4444440000000 FOR
|
|
|
|
CALL p5();
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '# Post-STATEMENT
|
|
|
|
SELECT @@myisam_sort_buffer_size,
|
|
|
|
@@myisam_repair_threads,
|
|
|
|
@@sort_buffer_size,
|
|
|
|
@@binlog_format,
|
|
|
|
@@keep_files_on_create,
|
|
|
|
@@max_join_size;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 19-----------------------#'
|
|
|
|
#Test for bad syntax
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SET STATEMENT max_error_count=100 FOR;
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SET STATEMENT max_error_count=100 INSERT t1 VALUES (1,2);
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SET STATEMENT FOR INSERT INTO t1 VALUES (1,2);
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SET max_error_count=100 FOR INSERT INTO t1 VALUES (1,2);
|
MDEV-15620 Crash when using "SET @@NEW.a=expr" inside a trigger
The problem resided in this branch of the "option_value_no_option_type" rule:
| '@' '@' opt_var_ident_type internal_variable_name equal set_expr_or_default
Summary:
1. internal_variable_name initialized tmp.var to trg_new_row_fake_var (0x01).
2. The condition "if (tmp.var == NULL)" did not check
the special case with trg_new_row_fake_var,
so Lex->set_system_variable(&tmp, $3, $6) was
called with tmp.var pointing to trg_new_row_fake_var,
which created a sys_var instance pointing to 0x01 instead of
a real system variable.
3. Later, at the trigger invocation time, this method was called:
sys_var::do_deprecated_warning (this=0x1, thd=0x7ffe6c000a98)
Notice, "this" is equal to trg_new_row_fake_var (0x01)
Solution:
The old implementation with separate rules
internal_variable_name (in sql_yacc.yy and sql_yacc_ora.yy) and
internal_variable_name_directly_assignable (in sql_yacc_ora.yy only)
was too complex and hard to follow.
Rewriting the code in a more straightforward way.
1. Changing LEX::set_system_variable()
from:
bool set_system_variable(struct sys_var_with_base *, enum_var_type, Item *);
to:
bool set_system_variable(enum_var_type, sys_var *, const LEX_CSTRING *, Item *);
2. Adding new methods in LEX, which operate with variable names:
bool set_trigger_field(const LEX_CSTRING *, const LEX_CSTRING *, Item *);
bool set_system_variable(enum_var_type var_type, const LEX_CSTRING *name,
Item *val);
bool set_system_variable(THD *thd, enum_var_type var_type,
const LEX_CSTRING *name1,
const LEX_CSTRING *name2,
Item *val);
bool set_default_system_variable(enum_var_type var_type,
const LEX_CSTRING *name,
Item *val);
bool set_variable(const LEX_CSTRING *name, Item *item);
3. Changing the grammar to call the new methods directly
in option_value_no_option_type,
Removing rules internal_variable_name and
internal_variable_name_directly_assignable.
4. Removing "struct sys_var_with_base" and trg_new_row_fake_var.
Good side effect:
- The code in /sql reduced from 314 to 183 lines.
- MDEV-15615 Unexpected syntax error instead of "Unknown system variable" ...
was also fixed automatically
2018-03-23 11:23:48 +01:00
|
|
|
--error ER_PARSE_ERROR
|
2014-10-24 10:13:08 +02:00
|
|
|
SET STATEMENT GLOBAL max_error_count=100 FOR INSERT INTO t1 VALUES (1,2);
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SET STATEMENT @@global.max_error_count=100 FOR INSERT INTO t1 VALUES (1,2);
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 20-----------------------#'
|
|
|
|
#Test for global-only variables
|
|
|
|
--error ER_GLOBAL_VARIABLE
|
|
|
|
SET STATEMENT connect_timeout=100 FOR INSERT INTO t1 VALUES (1,2);
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 21-----------------------#'
|
|
|
|
#Test for recursion
|
|
|
|
SELECT @@myisam_sort_buffer_size, @@sort_buffer_size;
|
|
|
|
SET STATEMENT myisam_sort_buffer_size = 700000, sort_buffer_size = 3000000
|
|
|
|
FOR SET STATEMENT myisam_sort_buffer_size=200000
|
|
|
|
FOR SELECT @@myisam_sort_buffer_size, @@sort_buffer_size;
|
|
|
|
SELECT @@myisam_sort_buffer_size, @@sort_buffer_size;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo ''
|
|
|
|
--echo '#------------------Test 22-----------------------#'
|
|
|
|
#Test for STATEMENT keyword
|
|
|
|
CREATE TABLE STATEMENT(a INT);
|
|
|
|
DROP TABLE STATEMENT;
|
|
|
|
|
|
|
|
--echo ''
|
|
|
|
--echo '# Cleanup'
|
|
|
|
DROP TABLE t1;
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
DROP PROCEDURE p3;
|
|
|
|
DROP PROCEDURE p4;
|
|
|
|
DROP PROCEDURE p5;
|
|
|
|
|
|
|
|
#
|
|
|
|
# Limitation of opening tables for set operation
|
|
|
|
#
|
|
|
|
CREATE TABLE t1 (v1 INT, v2 INT);
|
|
|
|
insert into t1 values (1,1);
|
|
|
|
DELIMITER |;
|
|
|
|
CREATE FUNCTION myProc ()
|
|
|
|
RETURNS INT
|
|
|
|
|
|
|
|
SQL SECURITY DEFINER
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
DECLARE mx INT;
|
|
|
|
SET mx = (select max(v1) from t1);
|
|
|
|
RETURN mx;
|
|
|
|
END|
|
|
|
|
DELIMITER ;|
|
|
|
|
--error ER_SUBQUERIES_NOT_SUPPORTED
|
|
|
|
SET STATEMENT myisam_repair_threads=(select max(v1) from t1) FOR
|
|
|
|
select 1;
|
|
|
|
|
|
|
|
--error ER_SUBQUERIES_NOT_SUPPORTED
|
|
|
|
SET STATEMENT myisam_repair_threads=myProc() FOR
|
|
|
|
select 1;
|
|
|
|
drop function myProc;
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
#
|
|
|
|
# Prepared Statement
|
|
|
|
#
|
|
|
|
set session binlog_format=mixed;
|
|
|
|
PREPARE stmt1 FROM 'SELECT @@binlog_format';
|
|
|
|
execute stmt1;
|
|
|
|
set statement binlog_format=row for execute stmt1;
|
|
|
|
execute stmt1;
|
|
|
|
deallocate prepare stmt1;
|
|
|
|
set statement binlog_format=row for PREPARE stmt1 FROM 'SELECT @@binlog_format';
|
|
|
|
execute stmt1;
|
|
|
|
execute stmt1;
|
|
|
|
deallocate prepare stmt1;
|
|
|
|
PREPARE stmt1 FROM 'set statement binlog_format=row for SELECT @@binlog_format';
|
|
|
|
execute stmt1;
|
|
|
|
execute stmt1;
|
|
|
|
deallocate prepare stmt1;
|
|
|
|
set session binlog_format=default;
|
|
|
|
|
|
|
|
#
|
|
|
|
# Percona server bug#1341438
|
|
|
|
# SET SESSION statement combined with SET STATEMENT has no effect
|
|
|
|
#
|
|
|
|
set session binlog_format=mixed;
|
|
|
|
SET STATEMENT sort_buffer_size=150000 FOR set session binlog_format=row;
|
|
|
|
SELECT @@binlog_format;
|
|
|
|
|
|
|
|
#
|
|
|
|
# restore variables of original tests
|
|
|
|
#
|
|
|
|
SET @@binlog_format = @save_binlog_format;
|
|
|
|
SET @@keep_files_on_create = @save_keep_files_on_create;
|
|
|
|
SET @@max_join_size = @save_max_join_size;
|
|
|
|
SET @@myisam_repair_threads = @save_myisam_repair_threads;
|
|
|
|
SET @@myisam_sort_buffer_size = @save_myisam_sort_buffer_size;
|
|
|
|
SET @@sort_buffer_size = @save_sort_buffer_size;
|
|
|
|
|
|
|
|
#
|
|
|
|
# Percona sever bug#1341606
|
|
|
|
# SET STATEMENT incorrectly restore vaues of some variables
|
|
|
|
#
|
|
|
|
--echo #Correctly set timestamp
|
|
|
|
set session timestamp=4646464;
|
|
|
|
select @@timestamp != 4646464;
|
|
|
|
select @@timestamp != 4646464;
|
|
|
|
--echo #Correctly returned normal behaviour
|
|
|
|
set session timestamp=default;
|
|
|
|
select @@timestamp != 4646464;
|
|
|
|
select @@timestamp != 4646464;
|
|
|
|
--echo #here timestamp should be set only for the statement then restored default
|
|
|
|
set statement timestamp=4646464 for select @@timestamp;
|
|
|
|
set @save_tm=@@timestamp;
|
|
|
|
select @@timestamp != 4646464;
|
|
|
|
select @@timestamp != 4646464;
|
2014-12-04 15:58:25 +01:00
|
|
|
let $wait_condition=select @@timestamp != @save_tm;
|
|
|
|
source include/wait_condition.inc;
|
|
|
|
eval $wait_condition;
|
2014-10-24 10:13:08 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Test of temporary changing default storage engine
|
|
|
|
#
|
|
|
|
set @save_dfs=@@default_storage_engine;
|
|
|
|
SET @@default_storage_engine=MyISAM;
|
|
|
|
SET STATEMENT default_storage_engine=MEMORY for CREATE TABLE t1 (a int);
|
|
|
|
SHOW CREATE TABLE t1;
|
|
|
|
select @@default_storage_engine;
|
|
|
|
drop table t1;
|
|
|
|
SET STATEMENT default_storage_engine=MyISAM for CREATE TABLE t1 (a int);
|
|
|
|
SHOW CREATE TABLE t1;
|
|
|
|
drop table t1;
|
|
|
|
SET @@default_storage_engine=@save_dfs;
|
|
|
|
|
|
|
|
#
|
|
|
|
# MDEV-6946:Assertion `0' failed in mysql_execute_command on SET STATEMENT
|
|
|
|
# keycache1.key_buffer_size=.. FOR
|
|
|
|
#
|
|
|
|
--error ER_GLOBAL_VARIABLE
|
|
|
|
SET STATEMENT keycache1.key_buffer_size=1024 FOR SELECT 1;
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# MDEV-6940: SET STATEMENT executed after SET GLOBAL does not work
|
|
|
|
#
|
|
|
|
set @save_general_log=@@global.general_log;
|
|
|
|
--echo # SET STATEMENT works (OK)
|
|
|
|
set statement lock_wait_timeout=1 for select @@lock_wait_timeout;
|
|
|
|
--echo # Setting a totally unrelated global variable
|
|
|
|
set global general_log=0;
|
|
|
|
--echo # SET STATEMENT should work
|
|
|
|
set statement lock_wait_timeout=1 for select @@lock_wait_timeout;
|
|
|
|
set global general_log=@save_general_log;
|
|
|
|
|
2015-02-17 12:54:51 +01:00
|
|
|
--echo # MDEV-7006 MDEV-7007: SET statement and slow log
|
|
|
|
|
|
|
|
set @save_long_query_time= @@long_query_time;
|
|
|
|
set @save_slow_query_log= @@slow_query_log;
|
|
|
|
set @save_log_output= @@log_output;
|
|
|
|
|
2019-08-30 15:06:54 +02:00
|
|
|
let $long_query_time=`select @@long_query_time`;
|
|
|
|
--replace_result $long_query_time DEFAULT
|
2015-02-17 12:54:51 +01:00
|
|
|
set statement long_query_time=default for select @@long_query_time;
|
2019-08-30 15:06:54 +02:00
|
|
|
|
|
|
|
# Disable result log as the results depends on the values of the variables
|
|
|
|
--disable_result_log
|
2015-02-17 12:54:51 +01:00
|
|
|
set statement log_slow_filter=default for select @@log_slow_filter;
|
|
|
|
set statement log_slow_verbosity=default for select @@log_slow_verbosity;
|
|
|
|
set statement log_slow_rate_limit=default for select @@log_slow_rate_limit;
|
|
|
|
set statement slow_query_log=default for select @@slow_query_log;
|
2019-08-30 15:06:54 +02:00
|
|
|
--enable_result_log
|
2015-02-17 12:54:51 +01:00
|
|
|
|
|
|
|
truncate table mysql.slow_log;
|
|
|
|
set slow_query_log= 1;
|
|
|
|
set global log_output='TABLE';
|
|
|
|
|
2016-06-03 21:22:47 +02:00
|
|
|
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
|
2015-02-17 12:54:51 +01:00
|
|
|
set @@long_query_time=0.01;
|
|
|
|
--echo #should be written
|
|
|
|
select sleep(0.1);
|
|
|
|
set @@long_query_time=@save_long_query_time;
|
2016-06-03 21:22:47 +02:00
|
|
|
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
|
2015-02-17 12:54:51 +01:00
|
|
|
--echo #---
|
|
|
|
--echo #should be written
|
|
|
|
set statement long_query_time=0.01 for select sleep(0.1);
|
2016-06-03 21:22:47 +02:00
|
|
|
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
|
2015-02-17 12:54:51 +01:00
|
|
|
--echo #---
|
|
|
|
set @@long_query_time=0.01;
|
|
|
|
--echo #should NOT be written
|
|
|
|
set statement slow_query_log=0 for select sleep(0.1);
|
|
|
|
set @@long_query_time=@save_long_query_time;
|
2016-06-03 21:22:47 +02:00
|
|
|
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
|
2015-02-17 12:54:51 +01:00
|
|
|
--echo #---
|
|
|
|
--echo #should NOT be written
|
|
|
|
set statement long_query_time=0.01,log_slow_filter='full_scan' for select sleep(0.1);
|
2016-06-03 21:22:47 +02:00
|
|
|
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
|
2015-02-17 12:54:51 +01:00
|
|
|
--echo #---
|
|
|
|
--echo #should NOT be written
|
|
|
|
set statement long_query_time=0.01,log_slow_rate_limit=9999 for select sleep(0.1);
|
2016-06-03 21:22:47 +02:00
|
|
|
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
|
2015-02-17 12:54:51 +01:00
|
|
|
--echo #---
|
|
|
|
--echo #should NOT be written
|
|
|
|
set statement long_query_time=0.01,min_examined_row_limit=50 for select sleep(0.1);
|
2016-06-03 21:22:47 +02:00
|
|
|
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
|
2015-02-17 12:54:51 +01:00
|
|
|
--echo #---
|
|
|
|
#
|
|
|
|
# log_slow_verbosity is impossible to check because results are not written
|
|
|
|
# in TABLE mode
|
|
|
|
#
|
|
|
|
|
|
|
|
set global log_output= @save_log_output;
|
|
|
|
set @@slow_query_log= @save_slow_query_log;
|
|
|
|
set @@long_query_time= @save_long_query_time;
|
2015-10-12 00:37:58 +02:00
|
|
|
truncate table mysql.slow_log;
|
2015-02-17 12:54:51 +01:00
|
|
|
|
|
|
|
|
2014-10-24 10:13:08 +02:00
|
|
|
#
|
|
|
|
# Prohibited Variables
|
|
|
|
#
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement autocommit=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement tx_isolation=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement skip_replication=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement sql_log_off=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement character_set_client=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement character_set_connection=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement character_set_filesystem=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement collation_connection=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement query_cache_type=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement wait_timeout=default for select 1;
|
|
|
|
--error ER_SET_STATEMENT_NOT_SUPPORTED
|
|
|
|
set statement interactive_timeout=default for select 1;
|
|
|
|
|
2014-12-02 09:04:09 +01:00
|
|
|
# MDEV-6996: SET STATEMENT default_week_format = .. has no effect
|
|
|
|
set @save_week_format=@@default_week_format;
|
|
|
|
set @@default_week_format=0;
|
|
|
|
SET STATEMENT default_week_format = 2 FOR SELECT WEEK('2000-01-01');
|
|
|
|
create table t1 (a date);
|
|
|
|
insert t1 values ('2000-01-01');
|
|
|
|
explain extended select week(a) from t1;
|
|
|
|
prepare stmt1 from "select week(a) from t1";
|
|
|
|
execute stmt1;
|
|
|
|
set default_week_format = 2;
|
|
|
|
execute stmt1;
|
|
|
|
alter table t1 engine=myisam;
|
|
|
|
execute stmt1;
|
|
|
|
deallocate prepare stmt1;
|
|
|
|
drop table t1;
|
|
|
|
set @@default_week_format=@save_week_format;
|
|
|
|
|
2014-12-02 10:59:44 +01:00
|
|
|
# MDEV-7015: SET STATEMENT old_passwords has no effect
|
|
|
|
set @save_old_passwords=@@old_passwords;
|
|
|
|
set @@old_passwords=0;
|
|
|
|
set statement OLD_PASSWORDS = 0 for select password('test');
|
|
|
|
set statement OLD_PASSWORDS = 1 for select password('test');
|
|
|
|
set statement OLD_PASSWORDS = 0 for explain extended select password('test');
|
|
|
|
set statement OLD_PASSWORDS = 1 for explain extended select password('test');
|
|
|
|
create table t1 (a char(10));
|
|
|
|
insert t1 values ('qwertyuiop');
|
|
|
|
prepare stmt1 from "select password(a) from t1";
|
|
|
|
execute stmt1;
|
|
|
|
set old_passwords=1;
|
|
|
|
execute stmt1;
|
|
|
|
alter table t1 engine=myisam;
|
|
|
|
execute stmt1;
|
|
|
|
deallocate prepare stmt1;
|
|
|
|
drop table t1;
|
|
|
|
set @@old_passwords=@save_old_passwords;
|
2015-03-11 14:57:30 +01:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo #MDEV-6951:Erroneous SET STATEMENT produces two identical errors
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
--error ER_UNKNOWN_SYSTEM_VARIABLE
|
|
|
|
set statement non_existing=1 for select 1;
|
|
|
|
show errors;
|
2015-03-11 11:02:13 +01:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-6954: SET STATEMENT rand_seedX = ...FOR ... makes
|
|
|
|
--echo # the next rand() to return 0
|
|
|
|
--echo #
|
|
|
|
set @rnd=1;
|
|
|
|
let $1=10;
|
|
|
|
--disable_query_log
|
|
|
|
--echo # test that rand() is not always 0 after restoring rand_seed, rand_seed2...
|
|
|
|
while ($1)
|
|
|
|
{
|
|
|
|
--disable_result_log
|
|
|
|
set statement rand_seed1=1, rand_seed2=1 for select 1;
|
|
|
|
--enable_result_log
|
|
|
|
set @rnd= rand()=0 and @rnd;
|
|
|
|
dec $1;
|
|
|
|
}
|
|
|
|
--enable_query_log
|
|
|
|
--echo # @rnd should be 0
|
|
|
|
select @rnd;
|
MDEV-24860: Incorrect behaviour of SET STATEMENT in case it is executed as a prepared statement
Running statements with SET STATEMENT FOR clause is handled incorrectly in
case the whole statement is executed in prepared statement mode.
For example, running of the following statement
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR CREATE TABLE t1 AS SELECT CONCAT('abc') AS c1;
results in different definition of the table t1 depending on whether
the statement is executed as a prepared or as a regular statement.
In first case the column c1 is defined as
`c1` varchar(3) DEFAULT NULL
in the last case the column c1 is defined as
`c1` varchar(3) NOT NULL
Different definition for the column c1 arise due to the fact that
a value of the data memeber Item_func_concat::maybe_null depends on
whether strict mode is on or off. Below is definition of the method
fix_fields() of the class Item_str_func that is base class for the
class Item_func_concat that is created on parsing the
SET STATEMENT FOR clause.
bool Item_str_func::fix_fields(THD *thd, Item **ref)
{
bool res= Item_func::fix_fields(thd, ref);
/*
In Item_str_func::check_well_formed_result() we may set null_value
flag on the same condition as in test() below.
*/
maybe_null= maybe_null || thd->is_strict_mode();
return res;
}
Although the clause SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
is parsed on PREPARE phase during processing of the prepared statement,
real setting of the sql_mode system variable is done on EXECUTION phase.
On the other hand, the method Item_str_func::fix_fields is called on PREPARE
phase. In result, thd->is_strict_mode() returns true during calling the method
Item_str_func::fix_fields(), the data member maybe_null is assigned the value
true and column c1 is defined as DEFAULT NULL.
To fix the issue the system variables listed in the SET STATEMENT FOR clause
are set at the beginning of handling the PREPARE phase just right before
calling the function check_prepared_statement() and their original values
restored immediate after return from this function.
Additionally, to avoid code duplication the source code used in the function
mysql_execute_command for setting variables, specified by SET STATEMENT
clause, were extracted to the standalone functions
run_set_statement_if_requested(). This new function is called from
the function mysql_execute_command() and the method
Prepared_statement::prepare().
2021-02-25 08:20:11 +01:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-24860: Incorrect behaviour of SET STATEMENT in case
|
|
|
|
--echo # it is executed as a prepared statement
|
|
|
|
--echo #
|
|
|
|
PREPARE stmt FROM "SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR CREATE TABLE t1 AS SELECT CONCAT('abc') AS c1";
|
|
|
|
EXECUTE stmt;
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
|
|
|
|
--echo # Show definition of the table t1 created using Prepared Statement
|
|
|
|
SHOW CREATE TABLE t1;
|
|
|
|
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
|
|
|
--echo # Create the table t1 with the same definition as it used before
|
|
|
|
--echo # using regular statement execution mode.
|
|
|
|
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR CREATE TABLE t1 AS SELECT CONCAT('abc') AS c1;
|
|
|
|
|
|
|
|
--echo # Show that the table has the same definition as it is in case the table
|
|
|
|
--echo # created in prepared statement mode.
|
|
|
|
SHOW CREATE TABLE t1;
|
|
|
|
|
|
|
|
DROP TABLE t1;
|