Commit a21ef88d authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

MDEV-6954: SET STATEMENT rand_seedX = ...FOR ... makes the next rand() to return 0

The variables now return real values. They can't be made usual variables because they do not have DEFAULT value.
parent 41106b22
......@@ -1122,10 +1122,6 @@ set statement autocommit=default for select 1;
ERROR 42000: The system variable autocommit cannot be set in SET STATEMENT.
set statement tx_isolation=default for select 1;
ERROR 42000: The system variable tx_isolation cannot be set in SET STATEMENT.
set statement rand_seed1=default for select 1;
ERROR 42000: The system variable rand_seed1 cannot be set in SET STATEMENT.
set statement rand_seed2=default for select 1;
ERROR 42000: The system variable rand_seed2 cannot be set in SET STATEMENT.
set statement skip_replication=default for select 1;
ERROR 42000: The system variable skip_replication cannot be set in SET STATEMENT.
set statement sql_log_off=default for select 1;
......@@ -1214,3 +1210,13 @@ ERROR HY000: Unknown system variable 'non_existing'
show errors;
Level Code Message
Error 1193 Unknown system variable 'non_existing'
#
# MDEV-6954: SET STATEMENT rand_seedX = ...FOR ... makes
# the next rand() to return 0
#
set @rnd=1;
# test that rand() is not always 0 after restoring rand_seed, rand_seed2...
# @rnd should be 0
select @rnd;
@rnd
0
......@@ -25,6 +25,8 @@ select * from information_schema.system_variables
'lower_case_file_system',
'lower_case_table_names',
'open_files_limit',
'rand_seed1',
'rand_seed2',
'system_time_zone',
'version_comment',
'version_compile_machine', 'version_compile_os',
......@@ -46,6 +48,8 @@ select VARIABLE_NAME, VARIABLE_SCOPE, VARIABLE_TYPE, VARIABLE_COMMENT,
'lower_case_file_system',
'lower_case_table_names',
'open_files_limit',
'rand_seed1',
'rand_seed2',
'system_time_zone',
'version_comment',
'version_compile_machine', 'version_compile_os',
......
select @@global.rand_seed1;
ERROR HY000: Variable 'rand_seed1' is a SESSION variable
set session rand_seed1=default;
ERROR 42000: Variable 'rand_seed1' doesn't have a default value
set session rand_seed1=10969771;
select @@session.rand_seed1;
@@session.rand_seed1
0
10969771
show global variables like 'rand_seed1';
Variable_name Value
show session variables like 'rand_seed1';
Variable_name Value
rand_seed1 0
rand_seed1 10969771
select * from information_schema.global_variables where variable_name='rand_seed1';
VARIABLE_NAME VARIABLE_VALUE
select * from information_schema.session_variables where variable_name='rand_seed1';
VARIABLE_NAME VARIABLE_VALUE
RAND_SEED1 0
RAND_SEED1 10969771
set session rand_seed1=1;
select @@session.rand_seed1;
@@session.rand_seed1
0
1
select * from information_schema.global_variables where variable_name='rand_seed1';
VARIABLE_NAME VARIABLE_VALUE
select * from information_schema.session_variables where variable_name='rand_seed1';
VARIABLE_NAME VARIABLE_VALUE
RAND_SEED1 0
RAND_SEED1 1
set global rand_seed1=1;
ERROR HY000: Variable 'rand_seed1' is a SESSION variable and can't be used with SET GLOBAL
set session rand_seed1=1.1;
......
select @@global.rand_seed2;
ERROR HY000: Variable 'rand_seed2' is a SESSION variable
set session rand_seed2=default;
ERROR 42000: Variable 'rand_seed2' doesn't have a default value
set session rand_seed2=10969771;
select @@session.rand_seed2;
@@session.rand_seed2
0
10969771
show global variables like 'rand_seed2';
Variable_name Value
show session variables like 'rand_seed2';
Variable_name Value
rand_seed2 0
rand_seed2 10969771
select * from information_schema.global_variables where variable_name='rand_seed2';
VARIABLE_NAME VARIABLE_VALUE
select * from information_schema.session_variables where variable_name='rand_seed2';
VARIABLE_NAME VARIABLE_VALUE
RAND_SEED2 0
RAND_SEED2 10969771
set session rand_seed2=1;
select @@session.rand_seed2;
@@session.rand_seed2
0
1
select * from information_schema.global_variables where variable_name='rand_seed2';
VARIABLE_NAME VARIABLE_VALUE
select * from information_schema.session_variables where variable_name='rand_seed2';
VARIABLE_NAME VARIABLE_VALUE
RAND_SEED2 0
RAND_SEED2 1
set global rand_seed2=1;
ERROR HY000: Variable 'rand_seed2' is a SESSION variable and can't be used with SET GLOBAL
set session rand_seed2=1.1;
......
......@@ -15,6 +15,8 @@ variable_name not in (
'lower_case_file_system',
'lower_case_table_names',
'open_files_limit',
'rand_seed1',
'rand_seed2',
'system_time_zone',
'version_comment',
'version_compile_machine', 'version_compile_os',
......@@ -3087,34 +3089,6 @@ NUMERIC_BLOCK_SIZE 1024
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME RAND_SEED1
SESSION_VALUE 0
GLOBAL_VALUE NULL
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME RAND_SEED2
SESSION_VALUE 0
GLOBAL_VALUE NULL
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME RANGE_ALLOC_BLOCK_SIZE
SESSION_VALUE 4096
GLOBAL_VALUE 4096
......@@ -4051,6 +4025,8 @@ where variable_name in (
'lower_case_file_system',
'lower_case_table_names',
'open_files_limit',
'rand_seed1',
'rand_seed2',
'system_time_zone',
'version_comment',
'version_compile_machine', 'version_compile_os',
......@@ -4127,6 +4103,26 @@ NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME RAND_SEED1
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME RAND_SEED2
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME SYSTEM_TIME_ZONE
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE VARCHAR
......
......@@ -15,6 +15,8 @@ variable_name not in (
'lower_case_file_system',
'lower_case_table_names',
'open_files_limit',
'rand_seed1',
'rand_seed2',
'system_time_zone',
'version_comment',
'version_compile_machine', 'version_compile_os',
......@@ -3269,34 +3271,6 @@ NUMERIC_BLOCK_SIZE 1024
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME RAND_SEED1
SESSION_VALUE 0
GLOBAL_VALUE NULL
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME RAND_SEED2
SESSION_VALUE 0
GLOBAL_VALUE NULL
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME RANGE_ALLOC_BLOCK_SIZE
SESSION_VALUE 4096
GLOBAL_VALUE 4096
......@@ -4793,6 +4767,8 @@ where variable_name in (
'lower_case_file_system',
'lower_case_table_names',
'open_files_limit',
'rand_seed1',
'rand_seed2',
'system_time_zone',
'version_comment',
'version_compile_machine', 'version_compile_os',
......@@ -4869,6 +4845,26 @@ NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME RAND_SEED1
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME RAND_SEED2
VARIABLE_SCOPE SESSION ONLY
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME SYSTEM_TIME_ZONE
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE VARCHAR
......
......@@ -6,6 +6,9 @@
#
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
select @@global.rand_seed1;
--error ER_NO_DEFAULT
set session rand_seed1=default;
set session rand_seed1=10969771;
select @@session.rand_seed1;
show global variables like 'rand_seed1';
show session variables like 'rand_seed1';
......
......@@ -7,6 +7,9 @@
#
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
select @@global.rand_seed2;
--error ER_NO_DEFAULT
set session rand_seed2=default;
set session rand_seed2=10969771;
select @@session.rand_seed2;
show global variables like 'rand_seed2';
show session variables like 'rand_seed2';
......
......@@ -1050,10 +1050,6 @@ 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 rand_seed1=default for select 1;
--error ER_SET_STATEMENT_NOT_SUPPORTED
set statement rand_seed2=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;
......@@ -1115,3 +1111,23 @@ set @@old_passwords=@save_old_passwords;
--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;
......@@ -3830,17 +3830,17 @@ static bool update_rand_seed1(THD *thd, set_var *var)
thd->rand.seed1= (ulong) var->save_result.ulonglong_value;
return false;
}
static ulonglong read_rand_seed(THD *thd)
static ulonglong read_rand_seed1(THD *thd)
{
return 0;
return thd->rand.seed1;
}
static Sys_var_session_special Sys_rand_seed1(
"rand_seed1", "Sets the internal state of the RAND() "
"generator for replication purposes",
NO_SET_STMT sys_var::ONLY_SESSION, NO_CMD_LINE,
sys_var::ONLY_SESSION, NO_CMD_LINE,
VALID_RANGE(0, ULONG_MAX), BLOCK_SIZE(1),
NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(0),
ON_UPDATE(update_rand_seed1), ON_READ(read_rand_seed));
ON_UPDATE(update_rand_seed1), ON_READ(read_rand_seed1));
static bool update_rand_seed2(THD *thd, set_var *var)
{
......@@ -3852,13 +3852,17 @@ static bool update_rand_seed2(THD *thd, set_var *var)
thd->rand.seed2= (ulong) var->save_result.ulonglong_value;
return false;
}
static ulonglong read_rand_seed2(THD *thd)
{
return thd->rand.seed2;
}
static Sys_var_session_special Sys_rand_seed2(
"rand_seed2", "Sets the internal state of the RAND() "
"generator for replication purposes",
NO_SET_STMT sys_var::ONLY_SESSION, NO_CMD_LINE,
sys_var::ONLY_SESSION, NO_CMD_LINE,
VALID_RANGE(0, ULONG_MAX), BLOCK_SIZE(1),
NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(0),
ON_UPDATE(update_rand_seed2), ON_READ(read_rand_seed));
ON_UPDATE(update_rand_seed2), ON_READ(read_rand_seed2));
static ulonglong read_error_count(THD *thd)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment