mariadb/mysql-test/main/set_statement.test

1162 lines
39 KiB
Text
Raw Normal View History

--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;
# repreparation with other mode does not cause an error
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;
# repreparation with other mode does not cause an error
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
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;
let $wait_condition=select @@timestamp != @save_tm;
source include/wait_condition.inc;
eval $wait_condition;
#
# 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;
--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;
let $long_query_time=`select @@long_query_time`;
--replace_result $long_query_time DEFAULT
set statement long_query_time=default for select @@long_query_time;
# Disable result log as the results depends on the values of the variables
--disable_result_log
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;
--enable_result_log
truncate table mysql.slow_log;
set slow_query_log= 1;
set global log_output='TABLE';
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
set @@long_query_time=0.01;
--echo #should be written
select sleep(0.1);
set @@long_query_time=@save_long_query_time;
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
--echo #---
--echo #should be written
set statement long_query_time=0.01 for select sleep(0.1);
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
--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;
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
--echo #---
--echo #should NOT be written
set statement long_query_time=0.01,log_slow_filter='full_scan' for select sleep(0.1);
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
--echo #---
--echo #should NOT be written
set statement long_query_time=0.01,log_slow_rate_limit=9999 for select sleep(0.1);
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
--echo #---
--echo #should NOT be written
set statement long_query_time=0.01,min_examined_row_limit=50 for select sleep(0.1);
select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%';
--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;
#
# 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;
# 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;
# 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;
--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;
--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;