From d02b8a3bcc2f3f0d088a8f2dfb45a15c79d56833 Mon Sep 17 00:00:00 2001 From: Kristofer Pettersson Date: Tue, 14 Oct 2008 15:41:35 +0200 Subject: [PATCH 01/21] Bug#37416 When SQL_NO_CACHE is used, MySQL still lookup into the query cache The query cache module did not check for the SQL_NO_CACHE keyword before attempting to query the hash lookup table. This had a small performance impact. By introducing a check on the query string before obtaining the hash mutex we can gain some performance if the SQL_NO_CACHE directive is used often. --- sql/sql_cache.cc | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index b487f092f75..b4fe1e65bbc 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -363,6 +363,43 @@ TYPELIB query_cache_type_typelib= array_elements(query_cache_type_names)-1,"", query_cache_type_names, NULL }; + +/** + Helper function for determine if a SELECT statement has a SQL_NO_CACHE + directive. + + @param sql A pointer to the first white space character after SELECT + + @return + @retval TRUE The character string contains SQL_NO_CACHE + @retval FALSE No directive found. +*/ + +static bool has_no_cache_directive(char *sql) +{ + int i=0; + while (sql[i] == ' ') + ++i; + + if (my_toupper(system_charset_info, sql[i]) == 'S' && + my_toupper(system_charset_info, sql[i+1]) == 'Q' && + my_toupper(system_charset_info, sql[i+2]) == 'L' && + my_toupper(system_charset_info, sql[i+3]) == '_' && + my_toupper(system_charset_info, sql[i+4]) == 'N' && + my_toupper(system_charset_info, sql[i+5]) == 'O' && + my_toupper(system_charset_info, sql[i+6]) == '_' && + my_toupper(system_charset_info, sql[i+7]) == 'C' && + my_toupper(system_charset_info, sql[i+8]) == 'A' && + my_toupper(system_charset_info, sql[i+9]) == 'C' && + my_toupper(system_charset_info, sql[i+10]) == 'H' && + my_toupper(system_charset_info, sql[i+11]) == 'E' && + my_toupper(system_charset_info, sql[i+12]) == ' ') + return TRUE; + + return FALSE; +} + + /***************************************************************************** Query_cache_block_table method(s) *****************************************************************************/ @@ -1085,6 +1122,16 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length) DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached")); goto err; } + + if (query_length > 20 && has_no_cache_directive(&sql[i+6])) + { + /* + We do not increase 'refused' statistics here since it will be done + later when the query is parsed. + */ + DBUG_PRINT("qcache", ("The statement has a SQL_NO_CACHE directive")); + goto err; + } } #ifdef __WIN__ From d1fb6bbcc890955e634d644a002a707c3d8e7f67 Mon Sep 17 00:00:00 2001 From: "Tatiana A. Nurnberg" Date: Tue, 3 Feb 2009 02:43:32 +0100 Subject: [PATCH 02/21] Bug#40657: assertion with out of range variables and traditional sql_mode In STRICT mode, out-of-bounds values caused an error message to be queued (rather than just a warning), without any further error-like processing happening. (The error is queued during update, at which time it's too late. For it to be processed properly, it would need to be queued during check-stage.) The assertion rightfully complains that we're trying to send an OK while having an error queued. Changeset breaks a lot of tests out into check-stage. This also allows us to send more correct warnings/error messages. mysql-test/r/auto_increment_increment_basic.result: update test results reflecting more correct warnings mysql-test/r/auto_increment_increment_func.result: update test results reflecting more correct warnings mysql-test/r/auto_increment_offset_basic.result: update test results reflecting more correct warnings mysql-test/r/auto_increment_offset_func.result: update test results reflecting more correct warnings mysql-test/r/concurrent_insert_basic.result: update test results reflecting more correct warnings mysql-test/r/connect_timeout_basic.result: update test results reflecting more correct warnings mysql-test/r/default_week_format_basic.result: update test results reflecting more correct warnings mysql-test/r/delayed_insert_timeout_basic.result: update test results reflecting more correct warnings mysql-test/r/div_precision_increment_basic.result: update test results reflecting more correct warnings mysql-test/r/expire_logs_days_basic.result: update test results reflecting more correct warnings mysql-test/r/group_concat_max_len_basic.result: update test results reflecting more correct warnings mysql-test/r/interactive_timeout_basic.result: update test results reflecting more correct warnings mysql-test/r/max_allowed_packet_basic.result: update test results reflecting more correct warnings mysql-test/r/max_binlog_size_basic.result: update test results reflecting more correct warnings mysql-test/r/max_connections_basic.result: update test results reflecting more correct warnings mysql-test/r/max_delayed_threads_basic.result: update test results reflecting more correct warnings mysql-test/r/max_error_count_basic.result: update test results reflecting more correct warnings mysql-test/r/max_insert_delayed_threads_basic.result: update test results reflecting more correct warnings mysql-test/r/max_length_for_sort_data_basic.result: update test results reflecting more correct warnings mysql-test/r/max_prepared_stmt_count_basic.result: update test results reflecting more correct warnings mysql-test/r/max_relay_log_size_basic.result: update test results reflecting more correct warnings mysql-test/r/max_sort_length_basic.result: update test results reflecting more correct warnings mysql-test/r/max_sp_recursion_depth_basic.result: update test results reflecting more correct warnings mysql-test/r/myisam_data_pointer_size_basic.result: update test results reflecting more correct warnings mysql-test/r/net_buffer_length_basic.result: update test results reflecting more correct warnings mysql-test/r/net_read_timeout_basic.result: update test results reflecting more correct warnings mysql-test/r/net_write_timeout_basic.result: update test results reflecting more correct warnings mysql-test/r/optimizer_prune_level_basic.result: update test results reflecting more correct warnings mysql-test/r/optimizer_search_depth_basic.result: update test results reflecting more correct warnings mysql-test/r/preload_buffer_size_basic.result: update test results reflecting more correct warnings mysql-test/r/ps.result: update test results reflecting more correct warnings mysql-test/r/read_buffer_size_basic.result: update test results reflecting more correct warnings mysql-test/r/read_rnd_buffer_size_basic.result: update test results reflecting more correct warnings mysql-test/r/slave_net_timeout_basic.result: update test results reflecting more correct warnings mysql-test/r/slow_launch_time_basic.result: update test results reflecting more correct warnings mysql-test/r/table_definition_cache_basic.result: update test results reflecting more correct warnings mysql-test/r/table_lock_wait_timeout_basic.result: update test results reflecting more correct warnings mysql-test/r/table_open_cache_basic.result: update test results reflecting more correct warnings mysql-test/r/variables.result: add test case that throws error (rather than warning) in the middle of trying to set a system-variable. mysql-test/t/variables.test: add test case that throws error (rather than warning) in the middle of trying to set a system-variable. sql/set_var.cc: Add comments. Prevent double-warnings. Through warnings for negative values given to unsigned system-variables. Process errors and warnings at check() stage rather than update() stage, since we may only issue warnings at the latter. --- .../r/auto_increment_increment_basic.result | 4 +- .../r/auto_increment_increment_func.result | 2 +- .../r/auto_increment_offset_basic.result | 4 +- .../r/auto_increment_offset_func.result | 2 +- mysql-test/r/concurrent_insert_basic.result | 2 + mysql-test/r/connect_timeout_basic.result | 2 +- mysql-test/r/default_week_format_basic.result | 4 + .../r/delayed_insert_timeout_basic.result | 2 +- .../r/div_precision_increment_basic.result | 4 + mysql-test/r/expire_logs_days_basic.result | 4 + .../r/group_concat_max_len_basic.result | 4 +- mysql-test/r/interactive_timeout_basic.result | 4 +- mysql-test/r/max_allowed_packet_basic.result | 2 +- mysql-test/r/max_binlog_size_basic.result | 4 +- mysql-test/r/max_connections_basic.result | 4 +- mysql-test/r/max_delayed_threads_basic.result | 4 + mysql-test/r/max_error_count_basic.result | 8 + .../r/max_insert_delayed_threads_basic.result | 4 + .../r/max_length_for_sort_data_basic.result | 4 +- .../r/max_prepared_stmt_count_basic.result | 4 + mysql-test/r/max_relay_log_size_basic.result | 4 + mysql-test/r/max_sort_length_basic.result | 4 +- .../r/max_sp_recursion_depth_basic.result | 8 + .../r/myisam_data_pointer_size_basic.result | 2 +- mysql-test/r/net_buffer_length_basic.result | 2 +- mysql-test/r/net_read_timeout_basic.result | 4 +- mysql-test/r/net_write_timeout_basic.result | 4 +- .../r/optimizer_prune_level_basic.result | 4 + .../r/optimizer_search_depth_basic.result | 4 + mysql-test/r/preload_buffer_size_basic.result | 4 +- mysql-test/r/ps.result | 2 + mysql-test/r/read_buffer_size_basic.result | 4 +- .../r/read_rnd_buffer_size_basic.result | 4 +- mysql-test/r/slave_net_timeout_basic.result | 4 +- mysql-test/r/slow_launch_time_basic.result | 4 + .../r/table_definition_cache_basic.result | 2 +- .../r/table_lock_wait_timeout_basic.result | 4 +- mysql-test/r/table_open_cache_basic.result | 4 +- mysql-test/r/variables.result | 35 +++- mysql-test/t/variables.test | 35 ++++ sql/set_var.cc | 181 +++++++++++++----- 41 files changed, 297 insertions(+), 94 deletions(-) diff --git a/mysql-test/r/auto_increment_increment_basic.result b/mysql-test/r/auto_increment_increment_basic.result index c453d2322cf..75f76a60b33 100644 --- a/mysql-test/r/auto_increment_increment_basic.result +++ b/mysql-test/r/auto_increment_increment_basic.result @@ -61,7 +61,7 @@ SELECT @@global.auto_increment_increment; 1 SET @@global.auto_increment_increment = -1024; Warnings: -Warning 1292 Truncated incorrect auto-increment-increment value: '0' +Warning 1292 Truncated incorrect auto_increment_increment value: '-1024' SELECT @@global.auto_increment_increment; @@global.auto_increment_increment 1 @@ -89,7 +89,7 @@ SELECT @@session.auto_increment_increment; 1 SET @@session.auto_increment_increment = -2; Warnings: -Warning 1292 Truncated incorrect auto-increment-increment value: '0' +Warning 1292 Truncated incorrect auto_increment_increment value: '-2' SELECT @@session.auto_increment_increment; @@session.auto_increment_increment 1 diff --git a/mysql-test/r/auto_increment_increment_func.result b/mysql-test/r/auto_increment_increment_func.result index f0f1ada6d95..eeaa3949886 100644 --- a/mysql-test/r/auto_increment_increment_func.result +++ b/mysql-test/r/auto_increment_increment_func.result @@ -169,7 +169,7 @@ id name ## Verifying behavior of variable with negative value ## SET @@auto_increment_increment = -10; Warnings: -Warning 1292 Truncated incorrect auto-increment-increment value: '0' +Warning 1292 Truncated incorrect auto_increment_increment value: '-10' INSERT into t1(name) values('Record_17'); INSERT into t1(name) values('Record_18'); SELECT * from t1; diff --git a/mysql-test/r/auto_increment_offset_basic.result b/mysql-test/r/auto_increment_offset_basic.result index b5ccca8ce56..f91037cb7cf 100644 --- a/mysql-test/r/auto_increment_offset_basic.result +++ b/mysql-test/r/auto_increment_offset_basic.result @@ -61,7 +61,7 @@ SELECT @@global.auto_increment_offset; 1 SET @@global.auto_increment_offset = -1024; Warnings: -Warning 1292 Truncated incorrect auto-increment-offset value: '0' +Warning 1292 Truncated incorrect auto_increment_offset value: '-1024' SELECT @@global.auto_increment_offset; @@global.auto_increment_offset 1 @@ -94,7 +94,7 @@ SELECT @@session.auto_increment_offset; 1 SET @@session.auto_increment_offset = -2; Warnings: -Warning 1292 Truncated incorrect auto-increment-offset value: '0' +Warning 1292 Truncated incorrect auto_increment_offset value: '-2' SELECT @@session.auto_increment_offset; @@session.auto_increment_offset 1 diff --git a/mysql-test/r/auto_increment_offset_func.result b/mysql-test/r/auto_increment_offset_func.result index 5c953544e73..e166cb149f6 100644 --- a/mysql-test/r/auto_increment_offset_func.result +++ b/mysql-test/r/auto_increment_offset_func.result @@ -178,7 +178,7 @@ id name ## Assigning -ve value to variable ## SET @@auto_increment_offset = -10; Warnings: -Warning 1292 Truncated incorrect auto-increment-offset value: '0' +Warning 1292 Truncated incorrect auto_increment_offset value: '-10' SELECT @@auto_increment_offset = -10; @@auto_increment_offset = -10 0 diff --git a/mysql-test/r/concurrent_insert_basic.result b/mysql-test/r/concurrent_insert_basic.result index e6614ea6abb..2c7fc4296dd 100644 --- a/mysql-test/r/concurrent_insert_basic.result +++ b/mysql-test/r/concurrent_insert_basic.result @@ -28,6 +28,8 @@ SELECT @@global.concurrent_insert; 2 '#--------------------FN_DYNVARS_018_04-------------------------#' SET @@global.concurrent_insert = -1; +Warnings: +Warning 1292 Truncated incorrect concurrent_insert value: '-1' Select @@global.concurrent_insert; @@global.concurrent_insert 0 diff --git a/mysql-test/r/connect_timeout_basic.result b/mysql-test/r/connect_timeout_basic.result index 7cdd747fc15..cc84405cf86 100644 --- a/mysql-test/r/connect_timeout_basic.result +++ b/mysql-test/r/connect_timeout_basic.result @@ -35,7 +35,7 @@ SELECT @@global.connect_timeout; 2 SET @@global.connect_timeout = -1024; Warnings: -Warning 1292 Truncated incorrect connect_timeout value: '0' +Warning 1292 Truncated incorrect connect_timeout value: '-1024' SELECT @@global.connect_timeout; @@global.connect_timeout 2 diff --git a/mysql-test/r/default_week_format_basic.result b/mysql-test/r/default_week_format_basic.result index d513ef1c41e..aa5e0b264d3 100644 --- a/mysql-test/r/default_week_format_basic.result +++ b/mysql-test/r/default_week_format_basic.result @@ -64,6 +64,8 @@ SELECT @@global.default_week_format; @@global.default_week_format 7 SET @@global.default_week_format = -1024; +Warnings: +Warning 1292 Truncated incorrect default_week_format value: '-1024' SELECT @@global.default_week_format; @@global.default_week_format 0 @@ -100,6 +102,8 @@ SELECT @@session.default_week_format; @@session.default_week_format 7 SET @@session.default_week_format = -2; +Warnings: +Warning 1292 Truncated incorrect default_week_format value: '-2' SELECT @@session.default_week_format; @@session.default_week_format 0 diff --git a/mysql-test/r/delayed_insert_timeout_basic.result b/mysql-test/r/delayed_insert_timeout_basic.result index 4049907eb80..e8eab4da3cc 100644 --- a/mysql-test/r/delayed_insert_timeout_basic.result +++ b/mysql-test/r/delayed_insert_timeout_basic.result @@ -35,7 +35,7 @@ SELECT @@global.delayed_insert_timeout; 1 SET @@global.delayed_insert_timeout = -1024; Warnings: -Warning 1292 Truncated incorrect delayed_insert_timeout value: '0' +Warning 1292 Truncated incorrect delayed_insert_timeout value: '-1024' SELECT @@global.delayed_insert_timeout; @@global.delayed_insert_timeout 1 diff --git a/mysql-test/r/div_precision_increment_basic.result b/mysql-test/r/div_precision_increment_basic.result index d0311afa681..f78855fcaae 100644 --- a/mysql-test/r/div_precision_increment_basic.result +++ b/mysql-test/r/div_precision_increment_basic.result @@ -78,6 +78,8 @@ SELECT @@global.div_precision_increment; @@global.div_precision_increment 30 SET @@global.div_precision_increment = -1024; +Warnings: +Warning 1292 Truncated incorrect div_precision_increment value: '-1024' SELECT @@global.div_precision_increment; @@global.div_precision_increment 0 @@ -100,6 +102,8 @@ SELECT @@session.div_precision_increment; @@session.div_precision_increment 30 SET @@session.div_precision_increment = -2; +Warnings: +Warning 1292 Truncated incorrect div_precision_increment value: '-2' SELECT @@session.div_precision_increment; @@session.div_precision_increment 0 diff --git a/mysql-test/r/expire_logs_days_basic.result b/mysql-test/r/expire_logs_days_basic.result index 66aa5fa42a5..1abab8e68b0 100644 --- a/mysql-test/r/expire_logs_days_basic.result +++ b/mysql-test/r/expire_logs_days_basic.result @@ -32,6 +32,8 @@ SELECT @@global.expire_logs_days; 21 '#--------------------FN_DYNVARS_029_04-------------------------#' SET @@global.expire_logs_days = -1; +Warnings: +Warning 1292 Truncated incorrect expire_logs_days value: '-1' SELECT @@global.expire_logs_days; @@global.expire_logs_days 0 @@ -53,6 +55,8 @@ SELECT @@global.expire_logs_days; @@global.expire_logs_days 99 SET @@global.expire_logs_days = -1024; +Warnings: +Warning 1292 Truncated incorrect expire_logs_days value: '-1024' SELECT @@global.expire_logs_days; @@global.expire_logs_days 0 diff --git a/mysql-test/r/group_concat_max_len_basic.result b/mysql-test/r/group_concat_max_len_basic.result index 5704f00c014..4821ca91308 100644 --- a/mysql-test/r/group_concat_max_len_basic.result +++ b/mysql-test/r/group_concat_max_len_basic.result @@ -65,7 +65,7 @@ SELECT @@global.group_concat_max_len; 4 SET @@global.group_concat_max_len = -1024; Warnings: -Warning 1292 Truncated incorrect group_concat_max_len value: '0' +Warning 1292 Truncated incorrect group_concat_max_len value: '-1024' SELECT @@global.group_concat_max_len; @@global.group_concat_max_len 4 @@ -91,7 +91,7 @@ SELECT @@session.group_concat_max_len; 4 SET @@session.group_concat_max_len = -2; Warnings: -Warning 1292 Truncated incorrect group_concat_max_len value: '0' +Warning 1292 Truncated incorrect group_concat_max_len value: '-2' SELECT @@session.group_concat_max_len; @@session.group_concat_max_len 4 diff --git a/mysql-test/r/interactive_timeout_basic.result b/mysql-test/r/interactive_timeout_basic.result index 0777596db07..519fef8a6e5 100644 --- a/mysql-test/r/interactive_timeout_basic.result +++ b/mysql-test/r/interactive_timeout_basic.result @@ -61,7 +61,7 @@ SELECT @@global.interactive_timeout; 1 SET @@global.interactive_timeout = -1024; Warnings: -Warning 1292 Truncated incorrect interactive_timeout value: '0' +Warning 1292 Truncated incorrect interactive_timeout value: '-1024' SELECT @@global.interactive_timeout; @@global.interactive_timeout 1 @@ -89,7 +89,7 @@ SELECT @@session.interactive_timeout; 1 SET @@session.interactive_timeout = -2; Warnings: -Warning 1292 Truncated incorrect interactive_timeout value: '0' +Warning 1292 Truncated incorrect interactive_timeout value: '-2' SELECT @@session.interactive_timeout; @@session.interactive_timeout 1 diff --git a/mysql-test/r/max_allowed_packet_basic.result b/mysql-test/r/max_allowed_packet_basic.result index 0745d5a36e1..ca5b87f19cb 100644 --- a/mysql-test/r/max_allowed_packet_basic.result +++ b/mysql-test/r/max_allowed_packet_basic.result @@ -76,7 +76,7 @@ SELECT @@global.max_allowed_packet; 1024 SET @@global.max_allowed_packet = -1024; Warnings: -Warning 1292 Truncated incorrect max_allowed_packet value: '0' +Warning 1292 Truncated incorrect max_allowed_packet value: '-1024' SELECT @@global.max_allowed_packet; @@global.max_allowed_packet 1024 diff --git a/mysql-test/r/max_binlog_size_basic.result b/mysql-test/r/max_binlog_size_basic.result index 291b687f76c..658289628b0 100644 --- a/mysql-test/r/max_binlog_size_basic.result +++ b/mysql-test/r/max_binlog_size_basic.result @@ -39,7 +39,7 @@ SELECT @@global.max_binlog_size; '#--------------------FN_DYNVARS_072_04-------------------------#' SET @@global.max_binlog_size = -1; Warnings: -Warning 1292 Truncated incorrect max_binlog_size value: '0' +Warning 1292 Truncated incorrect max_binlog_size value: '-1' SELECT @@global.max_binlog_size; @@global.max_binlog_size 4096 @@ -56,7 +56,7 @@ SELECT @@global.max_binlog_size; 1073741824 SET @@global.max_binlog_size = -1024; Warnings: -Warning 1292 Truncated incorrect max_binlog_size value: '0' +Warning 1292 Truncated incorrect max_binlog_size value: '-1024' SELECT @@global.max_binlog_size; @@global.max_binlog_size 4096 diff --git a/mysql-test/r/max_connections_basic.result b/mysql-test/r/max_connections_basic.result index ccedff01c54..d917cd97b25 100644 --- a/mysql-test/r/max_connections_basic.result +++ b/mysql-test/r/max_connections_basic.result @@ -39,7 +39,7 @@ SELECT @@global.max_connections; '#--------------------FN_DYNVARS_074_04-------------------------#' SET @@global.max_connections = -1; Warnings: -Warning 1292 Truncated incorrect max_connections value: '0' +Warning 1292 Truncated incorrect max_connections value: '-1' SELECT @@global.max_connections; @@global.max_connections 1 @@ -56,7 +56,7 @@ SELECT @@global.max_connections; 100000 SET @@global.max_connections = -1024; Warnings: -Warning 1292 Truncated incorrect max_connections value: '0' +Warning 1292 Truncated incorrect max_connections value: '-1024' SELECT @@global.max_connections; @@global.max_connections 1 diff --git a/mysql-test/r/max_delayed_threads_basic.result b/mysql-test/r/max_delayed_threads_basic.result index e0b2a3ee1cd..946c24e3082 100644 --- a/mysql-test/r/max_delayed_threads_basic.result +++ b/mysql-test/r/max_delayed_threads_basic.result @@ -76,10 +76,14 @@ SELECT @@session.max_delayed_threads; 16383 '#------------------FN_DYNVARS_075_05-----------------------#' SET @@global.max_delayed_threads = -1024; +Warnings: +Warning 1292 Truncated incorrect max_delayed_threads value: '-1024' SELECT @@global.max_delayed_threads; @@global.max_delayed_threads 0 SET @@global.max_delayed_threads = -1; +Warnings: +Warning 1292 Truncated incorrect max_delayed_threads value: '-1' SELECT @@global.max_delayed_threads; @@global.max_delayed_threads 0 diff --git a/mysql-test/r/max_error_count_basic.result b/mysql-test/r/max_error_count_basic.result index 2046a5e9dfa..7be8e0f37a3 100644 --- a/mysql-test/r/max_error_count_basic.result +++ b/mysql-test/r/max_error_count_basic.result @@ -63,10 +63,14 @@ SELECT @@session.max_error_count; 65534 '#------------------FN_DYNVARS_076_05-----------------------#' SET @@global.max_error_count = -1; +Warnings: +Warning 1292 Truncated incorrect max_error_count value: '-1' SELECT @@global.max_error_count; @@global.max_error_count 0 SET @@global.max_error_count = -1024; +Warnings: +Warning 1292 Truncated incorrect max_error_count value: '-1024' SELECT @@global.max_error_count; @@global.max_error_count 0 @@ -93,6 +97,8 @@ SELECT @@global.max_error_count; @@global.max_error_count 65535 SET @@session.max_error_count = -1; +Warnings: +Warning 1292 Truncated incorrect max_error_count value: '-1' SELECT @@session.max_error_count; @@session.max_error_count 0 @@ -102,6 +108,8 @@ SELECT @@session.max_error_count; @@session.max_error_count 65535 SET @@session.max_error_count = -2; +Warnings: +Warning 1292 Truncated incorrect max_error_count value: '-2' SELECT @@session.max_error_count; @@session.max_error_count 0 diff --git a/mysql-test/r/max_insert_delayed_threads_basic.result b/mysql-test/r/max_insert_delayed_threads_basic.result index 31c1fcec396..2f2f7f0c0fc 100644 --- a/mysql-test/r/max_insert_delayed_threads_basic.result +++ b/mysql-test/r/max_insert_delayed_threads_basic.result @@ -77,10 +77,14 @@ SELECT @@session.max_insert_delayed_threads; 16383 '#------------------FN_DYNVARS_078_05-----------------------#' SET @@global.max_insert_delayed_threads = -1024; +Warnings: +Warning 1292 Truncated incorrect max_insert_delayed_threads value: '-1024' SELECT @@global.max_insert_delayed_threads; @@global.max_insert_delayed_threads 0 SET @@global.max_insert_delayed_threads = -1; +Warnings: +Warning 1292 Truncated incorrect max_insert_delayed_threads value: '-1' SELECT @@global.max_insert_delayed_threads; @@global.max_insert_delayed_threads 0 diff --git a/mysql-test/r/max_length_for_sort_data_basic.result b/mysql-test/r/max_length_for_sort_data_basic.result index 3edd3e86262..8936946c774 100644 --- a/mysql-test/r/max_length_for_sort_data_basic.result +++ b/mysql-test/r/max_length_for_sort_data_basic.result @@ -71,7 +71,7 @@ SELECT @@session.max_length_for_sort_data; '#------------------FN_DYNVARS_080_05-----------------------#' SET @@global.max_length_for_sort_data = -1024; Warnings: -Warning 1292 Truncated incorrect max_length_for_sort_data value: '0' +Warning 1292 Truncated incorrect max_length_for_sort_data value: '-1024' SELECT @@global.max_length_for_sort_data; @@global.max_length_for_sort_data 4 @@ -111,7 +111,7 @@ SELECT @@session.max_length_for_sort_data; 8388608 SET @@session.max_length_for_sort_data = -1; Warnings: -Warning 1292 Truncated incorrect max_length_for_sort_data value: '0' +Warning 1292 Truncated incorrect max_length_for_sort_data value: '-1' SELECT @@session.max_length_for_sort_data; @@session.max_length_for_sort_data 4 diff --git a/mysql-test/r/max_prepared_stmt_count_basic.result b/mysql-test/r/max_prepared_stmt_count_basic.result index ebc7da8c7f8..9c28c287980 100644 --- a/mysql-test/r/max_prepared_stmt_count_basic.result +++ b/mysql-test/r/max_prepared_stmt_count_basic.result @@ -36,6 +36,8 @@ SELECT @@global.max_prepared_stmt_count; 65535 '#--------------------FN_DYNVARS_081_04-------------------------#' SET @@global.max_prepared_stmt_count = -1; +Warnings: +Warning 1292 Truncated incorrect max_prepared_stmt_count value: '-1' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count 0 @@ -51,6 +53,8 @@ SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count 1048576 SET @@global.max_prepared_stmt_count = -1024; +Warnings: +Warning 1292 Truncated incorrect max_prepared_stmt_count value: '-1024' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count 0 diff --git a/mysql-test/r/max_relay_log_size_basic.result b/mysql-test/r/max_relay_log_size_basic.result index c0042f497ad..168459cf7b6 100644 --- a/mysql-test/r/max_relay_log_size_basic.result +++ b/mysql-test/r/max_relay_log_size_basic.result @@ -38,6 +38,8 @@ SELECT @@global.max_relay_log_size; 'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; '#--------------------FN_DYNVARS_082_04-------------------------#' SET @@global.max_relay_log_size = -1; +Warnings: +Warning 1292 Truncated incorrect max_relay_log_size value: '-1' SELECT @@global.max_relay_log_size; @@global.max_relay_log_size 0 @@ -53,6 +55,8 @@ SELECT @@global.max_relay_log_size; @@global.max_relay_log_size 1073741824 SET @@global.max_relay_log_size = -1024; +Warnings: +Warning 1292 Truncated incorrect max_relay_log_size value: '-1024' SELECT @@global.max_relay_log_size; @@global.max_relay_log_size 0 diff --git a/mysql-test/r/max_sort_length_basic.result b/mysql-test/r/max_sort_length_basic.result index 73dd31ea4e7..f0a9ca83376 100644 --- a/mysql-test/r/max_sort_length_basic.result +++ b/mysql-test/r/max_sort_length_basic.result @@ -71,7 +71,7 @@ SELECT @@session.max_sort_length; '#------------------FN_DYNVARS_084_05-----------------------#' SET @@global.max_sort_length = -1024; Warnings: -Warning 1292 Truncated incorrect max_sort_length value: '0' +Warning 1292 Truncated incorrect max_sort_length value: '-1024' SELECT @@global.max_sort_length; @@global.max_sort_length 4 @@ -111,7 +111,7 @@ SELECT @@session.max_sort_length; 8388608 SET @@session.max_sort_length = -1; Warnings: -Warning 1292 Truncated incorrect max_sort_length value: '0' +Warning 1292 Truncated incorrect max_sort_length value: '-1' SELECT @@session.max_sort_length; @@session.max_sort_length 4 diff --git a/mysql-test/r/max_sp_recursion_depth_basic.result b/mysql-test/r/max_sp_recursion_depth_basic.result index 8c79f3c5fc7..e5f267253f4 100644 --- a/mysql-test/r/max_sp_recursion_depth_basic.result +++ b/mysql-test/r/max_sp_recursion_depth_basic.result @@ -74,6 +74,8 @@ SELECT @@session.max_sp_recursion_depth; 150 '#------------------FN_DYNVARS_085_05-----------------------#' SET @@global.max_sp_recursion_depth = -1024; +Warnings: +Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1024' SELECT @@global.max_sp_recursion_depth; @@global.max_sp_recursion_depth 0 @@ -84,6 +86,8 @@ SELECT @@global.max_sp_recursion_depth; @@global.max_sp_recursion_depth 255 SET @@global.max_sp_recursion_depth = -1; +Warnings: +Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1' SELECT @@global.max_sp_recursion_depth; @@global.max_sp_recursion_depth 0 @@ -110,6 +114,8 @@ SELECT @@session.max_sp_recursion_depth; @@session.max_sp_recursion_depth 255 SET @@session.max_sp_recursion_depth = -1; +Warnings: +Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1' SELECT @@session.max_sp_recursion_depth; @@session.max_sp_recursion_depth 0 @@ -120,6 +126,8 @@ SELECT @@session.max_sp_recursion_depth; @@session.max_sp_recursion_depth 255 SET @@session.max_sp_recursion_depth = -001; +Warnings: +Warning 1292 Truncated incorrect max_sp_recursion_depth value: '-1' SELECT @@session.max_sp_recursion_depth; @@session.max_sp_recursion_depth 0 diff --git a/mysql-test/r/myisam_data_pointer_size_basic.result b/mysql-test/r/myisam_data_pointer_size_basic.result index d2b0bebe029..86f7788fcdf 100644 --- a/mysql-test/r/myisam_data_pointer_size_basic.result +++ b/mysql-test/r/myisam_data_pointer_size_basic.result @@ -48,7 +48,7 @@ ERROR HY000: Variable 'myisam_data_pointer_size' is a GLOBAL variable and should '#------------------FN_DYNVARS_093_05-----------------------#' SET @@global.myisam_data_pointer_size = -1; Warnings: -Warning 1292 Truncated incorrect myisam_data_pointer_size value: '0' +Warning 1292 Truncated incorrect myisam_data_pointer_size value: '-1' SELECT @@global.myisam_data_pointer_size; @@global.myisam_data_pointer_size 2 diff --git a/mysql-test/r/net_buffer_length_basic.result b/mysql-test/r/net_buffer_length_basic.result index be7e9082332..07f933b5a4b 100644 --- a/mysql-test/r/net_buffer_length_basic.result +++ b/mysql-test/r/net_buffer_length_basic.result @@ -50,7 +50,7 @@ SELECT @@global.net_buffer_length; 1024 SET @@global.net_buffer_length = -1024; Warnings: -Warning 1292 Truncated incorrect net_buffer_length value: '0' +Warning 1292 Truncated incorrect net_buffer_length value: '-1024' SELECT @@global.net_buffer_length; @@global.net_buffer_length 1024 diff --git a/mysql-test/r/net_read_timeout_basic.result b/mysql-test/r/net_read_timeout_basic.result index 90a6ef72718..aeee25c6526 100644 --- a/mysql-test/r/net_read_timeout_basic.result +++ b/mysql-test/r/net_read_timeout_basic.result @@ -61,7 +61,7 @@ SELECT @@global.net_read_timeout; 1 SET @@global.net_read_timeout = -1024; Warnings: -Warning 1292 Truncated incorrect net_read_timeout value: '0' +Warning 1292 Truncated incorrect net_read_timeout value: '-1024' SELECT @@global.net_read_timeout; @@global.net_read_timeout 1 @@ -89,7 +89,7 @@ SELECT @@session.net_read_timeout; 1 SET @@session.net_read_timeout = -2; Warnings: -Warning 1292 Truncated incorrect net_read_timeout value: '0' +Warning 1292 Truncated incorrect net_read_timeout value: '-2' SELECT @@session.net_read_timeout; @@session.net_read_timeout 1 diff --git a/mysql-test/r/net_write_timeout_basic.result b/mysql-test/r/net_write_timeout_basic.result index 35a2cf069e3..8857b8c0e37 100644 --- a/mysql-test/r/net_write_timeout_basic.result +++ b/mysql-test/r/net_write_timeout_basic.result @@ -61,7 +61,7 @@ SELECT @@global.net_write_timeout; 1 SET @@global.net_write_timeout = -1024; Warnings: -Warning 1292 Truncated incorrect net_write_timeout value: '0' +Warning 1292 Truncated incorrect net_write_timeout value: '-1024' SELECT @@global.net_write_timeout; @@global.net_write_timeout 1 @@ -89,7 +89,7 @@ SELECT @@session.net_write_timeout; 1 SET @@session.net_write_timeout = -2; Warnings: -Warning 1292 Truncated incorrect net_write_timeout value: '0' +Warning 1292 Truncated incorrect net_write_timeout value: '-2' SELECT @@session.net_write_timeout; @@session.net_write_timeout 1 diff --git a/mysql-test/r/optimizer_prune_level_basic.result b/mysql-test/r/optimizer_prune_level_basic.result index 46fe70c40d0..c126569ebcd 100644 --- a/mysql-test/r/optimizer_prune_level_basic.result +++ b/mysql-test/r/optimizer_prune_level_basic.result @@ -81,6 +81,8 @@ ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level' SET @@global.optimizer_prune_level = FELSE; ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level' SET @@global.optimizer_prune_level = -1024; +Warnings: +Warning 1292 Truncated incorrect optimizer_prune_level value: '-1024' SELECT @@global.optimizer_prune_level; @@global.optimizer_prune_level 0 @@ -107,6 +109,8 @@ ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level' SET @@session.optimizer_prune_level = 'OFN'; ERROR 42000: Incorrect argument type to variable 'optimizer_prune_level' SET @@session.optimizer_prune_level = -2; +Warnings: +Warning 1292 Truncated incorrect optimizer_prune_level value: '-2' SELECT @@session.optimizer_prune_level; @@session.optimizer_prune_level 0 diff --git a/mysql-test/r/optimizer_search_depth_basic.result b/mysql-test/r/optimizer_search_depth_basic.result index 9c26339839e..9c49ae7e73f 100644 --- a/mysql-test/r/optimizer_search_depth_basic.result +++ b/mysql-test/r/optimizer_search_depth_basic.result @@ -72,6 +72,8 @@ SELECT @@global.optimizer_search_depth; @@global.optimizer_search_depth 63 SET @@global.optimizer_search_depth = -1; +Warnings: +Warning 1292 Truncated incorrect optimizer_search_depth value: '-1' SELECT @@global.optimizer_search_depth; @@global.optimizer_search_depth 0 @@ -98,6 +100,8 @@ SELECT @@session.optimizer_search_depth; @@session.optimizer_search_depth 63 SET @@session.optimizer_search_depth = -2; +Warnings: +Warning 1292 Truncated incorrect optimizer_search_depth value: '-2' SELECT @@session.optimizer_search_depth; @@session.optimizer_search_depth 0 diff --git a/mysql-test/r/preload_buffer_size_basic.result b/mysql-test/r/preload_buffer_size_basic.result index 775b670d3bc..fd8bdd222d2 100644 --- a/mysql-test/r/preload_buffer_size_basic.result +++ b/mysql-test/r/preload_buffer_size_basic.result @@ -77,7 +77,7 @@ SELECT @@global.preload_buffer_size; 1024 SET @@global.preload_buffer_size = -1; Warnings: -Warning 1292 Truncated incorrect preload_buffer_size value: '0' +Warning 1292 Truncated incorrect preload_buffer_size value: '-1' SELECT @@global.preload_buffer_size; @@global.preload_buffer_size 1024 @@ -111,7 +111,7 @@ SELECT @@session.preload_buffer_size; 1024 SET @@session.preload_buffer_size = -2; Warnings: -Warning 1292 Truncated incorrect preload_buffer_size value: '0' +Warning 1292 Truncated incorrect preload_buffer_size value: '-2' SELECT @@session.preload_buffer_size; @@session.preload_buffer_size 1024 diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 05b2d18889b..df996f0f515 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -803,6 +803,8 @@ select @@max_prepared_stmt_count; @@max_prepared_stmt_count 16382 set global max_prepared_stmt_count=-1; +Warnings: +Warning 1292 Truncated incorrect max_prepared_stmt_count value: '-1' select @@max_prepared_stmt_count; @@max_prepared_stmt_count 0 diff --git a/mysql-test/r/read_buffer_size_basic.result b/mysql-test/r/read_buffer_size_basic.result index 799f7b56235..fe4fa4138c1 100644 --- a/mysql-test/r/read_buffer_size_basic.result +++ b/mysql-test/r/read_buffer_size_basic.result @@ -81,7 +81,7 @@ SELECT @@global.read_buffer_size= 8200 OR @@global.read_buffer_size= 8228 ; 1 SET @@global.read_buffer_size = -1024; Warnings: -Warning 1292 Truncated incorrect read_buffer_size value: '0' +Warning 1292 Truncated incorrect read_buffer_size value: '-1024' SELECT @@global.read_buffer_size= 8200 OR @@global.read_buffer_size= 8228 ; @@global.read_buffer_size= 8200 OR @@global.read_buffer_size= 8228 1 @@ -107,7 +107,7 @@ SELECT @@session.read_buffer_size= 8200 OR @@session.read_buffer_size= 8228 ; 1 SET @@session.read_buffer_size = -2; Warnings: -Warning 1292 Truncated incorrect read_buffer_size value: '0' +Warning 1292 Truncated incorrect read_buffer_size value: '-2' SELECT @@session.read_buffer_size= 8200 OR @@session.read_buffer_size= 8228 ; @@session.read_buffer_size= 8200 OR @@session.read_buffer_size= 8228 1 diff --git a/mysql-test/r/read_rnd_buffer_size_basic.result b/mysql-test/r/read_rnd_buffer_size_basic.result index c51b0591054..f0c73409430 100644 --- a/mysql-test/r/read_rnd_buffer_size_basic.result +++ b/mysql-test/r/read_rnd_buffer_size_basic.result @@ -83,7 +83,7 @@ SELECT @@global.read_rnd_buffer_size= 8200 OR @@global.read_rnd_buffer_size= 822 1 SET @@global.read_rnd_buffer_size = -1024; Warnings: -Warning 1292 Truncated incorrect read_rnd_buffer_size value: '0' +Warning 1292 Truncated incorrect read_rnd_buffer_size value: '-1024' SELECT @@global.read_rnd_buffer_size= 8200 OR @@global.read_rnd_buffer_size= 8228; @@global.read_rnd_buffer_size= 8200 OR @@global.read_rnd_buffer_size= 8228 1 @@ -109,7 +109,7 @@ SELECT @@session.read_rnd_buffer_size= 8200 OR @@session.read_rnd_buffer_size= 8 1 SET @@session.read_rnd_buffer_size = -2; Warnings: -Warning 1292 Truncated incorrect read_rnd_buffer_size value: '0' +Warning 1292 Truncated incorrect read_rnd_buffer_size value: '-2' SELECT @@session.read_rnd_buffer_size= 8200 OR @@session.read_rnd_buffer_size= 8228; @@session.read_rnd_buffer_size= 8200 OR @@session.read_rnd_buffer_size= 8228 1 diff --git a/mysql-test/r/slave_net_timeout_basic.result b/mysql-test/r/slave_net_timeout_basic.result index d672d0152d7..fb8812745cc 100644 --- a/mysql-test/r/slave_net_timeout_basic.result +++ b/mysql-test/r/slave_net_timeout_basic.result @@ -58,13 +58,13 @@ ERROR HY000: Variable 'slave_net_timeout' is a GLOBAL variable and should be set '#------------------FN_DYNVARS_146_05-----------------------#' SET @@global.slave_net_timeout = -1; Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '0' +Warning 1292 Truncated incorrect slave_net_timeout value: '-1' SELECT @@global.slave_net_timeout; @@global.slave_net_timeout 1 SET @@global.slave_net_timeout = -2147483648; Warnings: -Warning 1292 Truncated incorrect slave_net_timeout value: '0' +Warning 1292 Truncated incorrect slave_net_timeout value: '-2147483648' SELECT @@global.slave_net_timeout; @@global.slave_net_timeout 1 diff --git a/mysql-test/r/slow_launch_time_basic.result b/mysql-test/r/slow_launch_time_basic.result index c42942fba1a..da13af4f4e8 100644 --- a/mysql-test/r/slow_launch_time_basic.result +++ b/mysql-test/r/slow_launch_time_basic.result @@ -36,6 +36,8 @@ SELECT @@global.slow_launch_time; 65536 '#--------------------FN_DYNVARS_150_04-------------------------#' SET @@global.slow_launch_time = -1; +Warnings: +Warning 1292 Truncated incorrect slow_launch_time value: '-1' SELECT @@global.slow_launch_time; @@global.slow_launch_time 0 @@ -57,6 +59,8 @@ SELECT @@global.slow_launch_time; @@global.slow_launch_time 31536000 SET @@global.slow_launch_time = -1024; +Warnings: +Warning 1292 Truncated incorrect slow_launch_time value: '-1024' SELECT @@global.slow_launch_time; @@global.slow_launch_time 0 diff --git a/mysql-test/r/table_definition_cache_basic.result b/mysql-test/r/table_definition_cache_basic.result index 5f0e1960358..612d4138003 100644 --- a/mysql-test/r/table_definition_cache_basic.result +++ b/mysql-test/r/table_definition_cache_basic.result @@ -45,7 +45,7 @@ SELECT @@global.table_definition_cache; 256 SET @@global.table_definition_cache = -1024; Warnings: -Warning 1292 Truncated incorrect table_definition_cache value: '0' +Warning 1292 Truncated incorrect table_definition_cache value: '-1024' SELECT @@global.table_definition_cache; @@global.table_definition_cache 256 diff --git a/mysql-test/r/table_lock_wait_timeout_basic.result b/mysql-test/r/table_lock_wait_timeout_basic.result index 13771980188..a500581c228 100644 --- a/mysql-test/r/table_lock_wait_timeout_basic.result +++ b/mysql-test/r/table_lock_wait_timeout_basic.result @@ -37,13 +37,13 @@ SELECT @@global.table_lock_wait_timeout ; '#--------------------FN_DYNVARS_001_04-------------------------#' SET @@global.table_lock_wait_timeout = -1; Warnings: -Warning 1292 Truncated incorrect table_lock_wait_timeout value: '0' +Warning 1292 Truncated incorrect table_lock_wait_timeout value: '-1' SET @@global.table_lock_wait_timeout= 100000000000; Warnings: Warning 1292 Truncated incorrect table_lock_wait_timeout value: '100000000000' SET @@global.table_lock_wait_timeout= -1024; Warnings: -Warning 1292 Truncated incorrect table_lock_wait_timeout value: '0' +Warning 1292 Truncated incorrect table_lock_wait_timeout value: '-1024' SET @@global.table_lock_wait_timeout= 0; Warnings: Warning 1292 Truncated incorrect table_lock_wait_timeout value: '0' diff --git a/mysql-test/r/table_open_cache_basic.result b/mysql-test/r/table_open_cache_basic.result index ca02d32386f..080bcb6537e 100644 --- a/mysql-test/r/table_open_cache_basic.result +++ b/mysql-test/r/table_open_cache_basic.result @@ -39,7 +39,7 @@ SELECT @@global.table_open_cache ; '#--------------------FN_DYNVARS_001_04-------------------------#' SET @@global.table_open_cache = -1; Warnings: -Warning 1292 Truncated incorrect table_open_cache value: '0' +Warning 1292 Truncated incorrect table_open_cache value: '-1' SELECT @@global.table_open_cache ; @@global.table_open_cache 1 @@ -51,7 +51,7 @@ SELECT @@global.table_open_cache ; 524288 SET @@global.table_open_cache = -1024; Warnings: -Warning 1292 Truncated incorrect table_open_cache value: '0' +Warning 1292 Truncated incorrect table_open_cache value: '-1024' SELECT @@global.table_open_cache ; @@global.table_open_cache 1 diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index ac78d8e1871..9fe565f938c 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -703,7 +703,7 @@ VARIABLE_NAME VARIABLE_VALUE MYISAM_DATA_POINTER_SIZE 7 SET GLOBAL table_open_cache=-1; Warnings: -Warning 1292 Truncated incorrect table_open_cache value: '0' +Warning 1292 Truncated incorrect table_open_cache value: '-1' SHOW VARIABLES LIKE 'table_open_cache'; Variable_name Value table_open_cache 1 @@ -1337,3 +1337,36 @@ SET @@session.thread_stack= 7; ERROR HY000: Variable 'thread_stack' is a read only variable SET @@global.thread_stack= 7; ERROR HY000: Variable 'thread_stack' is a read only variable +SELECT @@global.expire_logs_days INTO @old_eld; +SET GLOBAL expire_logs_days = -1; +Warnings: +Warning 1292 Truncated incorrect expire_logs_days value: '-1' +needs to've been adjusted (0) +SELECT @@global.expire_logs_days; +@@global.expire_logs_days +0 +SET GLOBAL expire_logs_days = 11; +SET @old_mode=@@sql_mode; +SET SESSION sql_mode = 'TRADITIONAL'; +SET GLOBAL expire_logs_days = 100; +ERROR 42000: Variable 'expire_logs_days' can't be set to the value of '100' +needs to be unchanged (11) +SELECT @@global.expire_logs_days; +@@global.expire_logs_days +11 +SET SESSION sql_mode = @old_mode; +SET GLOBAL expire_logs_days = 100; +Warnings: +Warning 1292 Truncated incorrect expire_logs_days value: '100' +needs to've been adjusted (99) +SELECT @@global.expire_logs_days; +@@global.expire_logs_days +99 +SET GLOBAL expire_logs_days = 11; +SET GLOBAL expire_logs_days = 99; +needs to pass with no warnings (99) +SELECT @@global.expire_logs_days; +@@global.expire_logs_days +99 +SET GLOBAL expire_logs_days = @old_eld; +End of 5.1 tests diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 828cb3a2916..9b611558447 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -1077,3 +1077,38 @@ SET @@session.thread_stack= 7; --error ER_INCORRECT_GLOBAL_LOCAL_VAR SET @@global.thread_stack= 7; # + +# +# Bug #40657 - assertion with out of range variables and traditional sql_mode +# + +SELECT @@global.expire_logs_days INTO @old_eld; + +SET GLOBAL expire_logs_days = -1; +--echo needs to've been adjusted (0) +SELECT @@global.expire_logs_days; + +SET GLOBAL expire_logs_days = 11; +SET @old_mode=@@sql_mode; +SET SESSION sql_mode = 'TRADITIONAL'; +--error ER_WRONG_VALUE_FOR_VAR +SET GLOBAL expire_logs_days = 100; +--echo needs to be unchanged (11) +SELECT @@global.expire_logs_days; +SET SESSION sql_mode = @old_mode; + +SET GLOBAL expire_logs_days = 100; +--echo needs to've been adjusted (99) +SELECT @@global.expire_logs_days; + +SET GLOBAL expire_logs_days = 11; +SET GLOBAL expire_logs_days = 99; +--echo needs to pass with no warnings (99) +SELECT @@global.expire_logs_days; + +# cleanup +SET GLOBAL expire_logs_days = @old_eld; + + + +--echo End of 5.1 tests diff --git a/sql/set_var.cc b/sql/set_var.cc index a371c1113ef..e2f3590311c 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -134,8 +134,8 @@ static int check_max_delayed_threads(THD *thd, set_var *var); static void fix_thd_mem_root(THD *thd, enum_var_type type); static void fix_trans_mem_root(THD *thd, enum_var_type type); static void fix_server_id(THD *thd, enum_var_type type); -static ulonglong fix_unsigned(THD *, ulonglong, const struct my_option *); -static bool get_unsigned(THD *thd, set_var *var); +static int get_unsigned(THD *thd, set_var *var); +static bool fix_unsigned(THD *, ulonglong *, bool, const struct my_option *); bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd, const char *name, longlong val); static KEY_CACHE *create_key_cache(const char *name, uint length); @@ -1365,6 +1365,19 @@ static void fix_server_id(THD *thd, enum_var_type type) } +/** + Throw warning (error in STRICT mode) if value for variable needed bounding. + Only call from check(), not update(), because an error in update() would be + bad mojo. Plug-in interface also uses this. + + @param thd thread handle + @param fixed did we have to correct the value? (throw warn/err if so) + @param unsignd is value's type unsigned? + @param name variable's name + @param val variable's value + + @retval TRUE on error, FALSE otherwise (warning or OK) + */ bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd, const char *name, longlong val) { @@ -1390,17 +1403,44 @@ bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd, return FALSE; } -static ulonglong fix_unsigned(THD *thd, ulonglong num, - const struct my_option *option_limits) -{ - my_bool fixed= FALSE; - ulonglong out= getopt_ull_limit_value(num, option_limits, &fixed); - throw_bounds_warning(thd, fixed, TRUE, option_limits->name, (longlong) num); - return out; +/** + check an unsigned user-supplied value for a systemvariable against bounds. + if we needed to adjust the value, throw a warning/error. + + @param thd thread handle + @param num the value the user gave + @param warn throw warning/error (FALSE if we get here from + get_unsigned(), so we don't throw two warnings if + user supplies negative value to an unsigned variable) + @param option_limits the bounds-record + + @retval TRUE on error, FALSE otherwise (warning or OK) + */ +static bool fix_unsigned(THD *thd, ulonglong *num, bool warn, + const struct my_option *option_limits) +{ + my_bool fixed = FALSE; + ulonglong unadjusted= *num; + + *num= getopt_ull_limit_value(unadjusted, option_limits, &fixed); + + return warn && throw_bounds_warning(thd, fixed, TRUE, option_limits->name, + (longlong) unadjusted); + } -static bool get_unsigned(THD *thd, set_var *var) + +/** + Get unsigned system-variable. + Negative value does not wrap around, but becomes zero. + + @param thd thread handle + @param var the system-variable to get + + @retval 0 - OK, 1 - warning, 2 - error + */ +static int get_unsigned(THD *thd, set_var *var) { if (var->value->unsigned_flag) var->save_result.ulonglong_value= (ulonglong) var->value->val_int(); @@ -1408,6 +1448,8 @@ static bool get_unsigned(THD *thd, set_var *var) { longlong v= var->value->val_int(); var->save_result.ulonglong_value= (ulonglong) ((v < 0) ? 0 : v); + if (v < 0) + return throw_bounds_warning(thd, TRUE, FALSE, var->var->name, v) ? 2 : 1; } return 0; } @@ -1423,29 +1465,33 @@ sys_var_long_ptr(sys_var_chain *chain, const char *name_arg, ulong *value_ptr_ar bool sys_var_long_ptr_global::check(THD *thd, set_var *var) { - return get_unsigned(thd, var); -} + bool ret = FALSE; + int got_warnings= get_unsigned(thd, var); -bool sys_var_long_ptr_global::update(THD *thd, set_var *var) -{ - ulonglong tmp= var->save_result.ulonglong_value; - pthread_mutex_lock(guard); - if (option_limits) - *value= (ulong) fix_unsigned(thd, tmp, option_limits); + if (got_warnings == 2) + ret= TRUE; + else if (option_limits) + ret= fix_unsigned(thd, &var->save_result.ulonglong_value, + (got_warnings == 0), option_limits); else { #if SIZEOF_LONG < SIZEOF_LONG_LONG /* Avoid overflows on 32 bit systems */ - if (tmp > ULONG_MAX) + if (var->save_result.ulonglong_value > ULONG_MAX) { - tmp= ULONG_MAX; - throw_bounds_warning(thd, TRUE, TRUE, name, - (longlong) var->save_result.ulonglong_value); + ret= throw_bounds_warning(thd, TRUE, TRUE, name, + (longlong) var->save_result.ulonglong_value); + var->save_result.ulonglong_value= ULONG_MAX; } #endif - *value= (ulong) tmp; } + return ret; +} +bool sys_var_long_ptr_global::update(THD *thd, set_var *var) +{ + pthread_mutex_lock(guard); + *value= (ulong) var->save_result.ulonglong_value; pthread_mutex_unlock(guard); return 0; } @@ -1466,9 +1512,8 @@ bool sys_var_ulonglong_ptr::update(THD *thd, set_var *var) ulonglong tmp= var->save_result.ulonglong_value; pthread_mutex_lock(&LOCK_global_system_variables); if (option_limits) - *value= (ulonglong) fix_unsigned(thd, tmp, option_limits); - else - *value= (ulonglong) tmp; + fix_unsigned(thd, &tmp, FALSE, option_limits); + *value= (ulonglong) tmp; pthread_mutex_unlock(&LOCK_global_system_variables); return 0; } @@ -1518,35 +1563,47 @@ uchar *sys_var_enum_const::value_ptr(THD *thd, enum_var_type type, bool sys_var_thd_ulong::check(THD *thd, set_var *var) { - return (get_unsigned(thd, var) || - (check_func && (*check_func)(thd, var))); -} + ulonglong tmp; + int got_warnings= get_unsigned(thd, var); -bool sys_var_thd_ulong::update(THD *thd, set_var *var) -{ - ulonglong tmp= var->save_result.ulonglong_value; + if (got_warnings == 2) + return TRUE; + + tmp= var->save_result.ulonglong_value; /* Don't use bigger value than given with --maximum-variable-name=.. */ if ((ulong) tmp > max_system_variables.*offset) { - throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp); + if (throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp)) + return TRUE; tmp= max_system_variables.*offset; } if (option_limits) - tmp= (ulong) fix_unsigned(thd, tmp, option_limits); + { + if (fix_unsigned(thd, &tmp, (got_warnings == 0), option_limits)) + return TRUE; + } #if SIZEOF_LONG < SIZEOF_LONG_LONG else if (tmp > ULONG_MAX) { + if (throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp)) + return TRUE; tmp= ULONG_MAX; - throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) var->save_result.ulonglong_value); } #endif + var->save_result.ulonglong_value= (ulong) tmp; + + return ((check_func && (*check_func)(thd, var))); +} + +bool sys_var_thd_ulong::update(THD *thd, set_var *var) +{ if (var->type == OPT_GLOBAL) - global_system_variables.*offset= (ulong) tmp; + global_system_variables.*offset= (ulong) var->save_result.ulonglong_value; else - thd->variables.*offset= (ulong) tmp; + thd->variables.*offset= (ulong) var->save_result.ulonglong_value; return 0; } @@ -1585,7 +1642,8 @@ bool sys_var_thd_ha_rows::update(THD *thd, set_var *var) tmp= max_system_variables.*offset; if (option_limits) - tmp= (ha_rows) fix_unsigned(thd, tmp, option_limits); + fix_unsigned(thd, &tmp, FALSE, option_limits); + if (var->type == OPT_GLOBAL) { /* Lock is needed to make things safe on 32 bit systems */ @@ -1626,27 +1684,44 @@ uchar *sys_var_thd_ha_rows::value_ptr(THD *thd, enum_var_type type, bool sys_var_thd_ulonglong::check(THD *thd, set_var *var) { - return get_unsigned(thd, var); + ulonglong tmp; + int got_warnings= get_unsigned(thd, var); + + if (got_warnings == 2) + return TRUE; + + tmp= var->save_result.ulonglong_value; + + if (tmp > max_system_variables.*offset) + { + if (throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp)) + return TRUE; + tmp= max_system_variables.*offset; + } + + if (option_limits) + { + if (fix_unsigned(thd, &tmp, (got_warnings == 0), option_limits)) + return TRUE; + } + + var->save_result.ulonglong_value= tmp; + + return FALSE; } bool sys_var_thd_ulonglong::update(THD *thd, set_var *var) { - ulonglong tmp= var->save_result.ulonglong_value; - - if (tmp > max_system_variables.*offset) - tmp= max_system_variables.*offset; - - if (option_limits) - tmp= fix_unsigned(thd, tmp, option_limits); if (var->type == OPT_GLOBAL) { /* Lock is needed to make things safe on 32 bit systems */ pthread_mutex_lock(&LOCK_global_system_variables); - global_system_variables.*offset= (ulonglong) tmp; + global_system_variables.*offset= (ulonglong) + var->save_result.ulonglong_value; pthread_mutex_unlock(&LOCK_global_system_variables); } else - thd->variables.*offset= (ulonglong) tmp; + thd->variables.*offset= (ulonglong) var->save_result.ulonglong_value; return 0; } @@ -2278,8 +2353,8 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var) goto end; } - key_cache->param_buff_size= - (ulonglong) fix_unsigned(thd, tmp, option_limits); + fix_unsigned(thd, &tmp, FALSE, option_limits); + key_cache->param_buff_size= (ulonglong) tmp; /* If key cache didn't existed initialize it, else resize it */ key_cache->in_init= 1; @@ -2307,7 +2382,7 @@ end: */ bool sys_var_key_cache_long::update(THD *thd, set_var *var) { - ulong tmp= (ulong) var->value->val_int(); + ulonglong tmp= (ulonglong) (ulong) var->value->val_int(); LEX_STRING *base_name= &var->base; bool error= 0; @@ -2332,8 +2407,8 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var) if (key_cache->in_init) goto end; - *((ulong*) (((char*) key_cache) + offset))= - (ulong) fix_unsigned(thd, tmp, option_limits); + fix_unsigned(thd, &tmp, FALSE, option_limits); + *((ulong*) (((char*) key_cache) + offset))= (ulong) tmp; /* Don't create a new key cache if it didn't exist From 7099d7bc2bdf4513abcc8e4b20d583ac1262e156 Mon Sep 17 00:00:00 2001 From: "Tatiana A. Nurnberg" Date: Tue, 24 Feb 2009 16:42:18 +0100 Subject: [PATCH 03/21] Bug#40657: assertion with out of range variables and traditional sql_mode In STRICT mode, out-of-bounds values caused an error message to be queued (rather than just a warning), without any further error-like processing happening. (The error is queued during update, at which time it's too late. For it to be processed properly, it would need to be queued during check-stage.) The assertion rightfully complains that we're trying to send an OK while having an error queued. Changeset breaks a lot of tests out into check-stage. This also allows us to send more correct warnings/error messages. sql/set_var.cc: cleanup: fold get_unsigned() and fix_unsigned() into one, as well as all the semi-common code from the ::check functions. --- sql/set_var.cc | 184 ++++++++++++++++++++++--------------------------- 1 file changed, 81 insertions(+), 103 deletions(-) diff --git a/sql/set_var.cc b/sql/set_var.cc index e2f3590311c..ff32ec2458e 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -134,8 +134,6 @@ static int check_max_delayed_threads(THD *thd, set_var *var); static void fix_thd_mem_root(THD *thd, enum_var_type type); static void fix_trans_mem_root(THD *thd, enum_var_type type); static void fix_server_id(THD *thd, enum_var_type type); -static int get_unsigned(THD *thd, set_var *var); -static bool fix_unsigned(THD *, ulonglong *, bool, const struct my_option *); bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd, const char *name, longlong val); static KEY_CACHE *create_key_cache(const char *name, uint length); @@ -1406,42 +1404,49 @@ bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd, /** check an unsigned user-supplied value for a systemvariable against bounds. - if we needed to adjust the value, throw a warning/error. @param thd thread handle - @param num the value the user gave - @param warn throw warning/error (FALSE if we get here from - get_unsigned(), so we don't throw two warnings if - user supplies negative value to an unsigned variable) - @param option_limits the bounds-record + @param num the value to limit + @param option_limits the bounds-record, or NULL - @retval TRUE on error, FALSE otherwise (warning or OK) + @retval whether or not we needed to bound */ -static bool fix_unsigned(THD *thd, ulonglong *num, bool warn, - const struct my_option *option_limits) +static my_bool bound_unsigned(THD *thd, ulonglong *num, + const struct my_option *option_limits) { my_bool fixed = FALSE; ulonglong unadjusted= *num; - *num= getopt_ull_limit_value(unadjusted, option_limits, &fixed); - - return warn && throw_bounds_warning(thd, fixed, TRUE, option_limits->name, - (longlong) unadjusted); + if (option_limits) + *num= getopt_ull_limit_value(unadjusted, option_limits, &fixed); + return fixed; } /** Get unsigned system-variable. Negative value does not wrap around, but becomes zero. + Check user-supplied value for a systemvariable against bounds. + If we needed to adjust the value, throw a warning or error depending + on SQL-mode. - @param thd thread handle - @param var the system-variable to get + @param thd thread handle + @param var the system-variable to get + @param user_max a limit given with --maximum-variable-name=... or 0 + @param bound2ulong pass TRUE if size is ulong, not ulonglong. function + will then bound on systems where it's necessary. - @retval 0 - OK, 1 - warning, 2 - error + @retval TRUE on error, FALSE otherwise (warning or OK) */ -static int get_unsigned(THD *thd, set_var *var) +static bool get_unsigned(THD *thd, set_var *var, ulonglong user_max, + my_bool bound2ulong) { + int warnings= 0; + ulonglong unadjusted; + const struct my_option *limits= var->var->option_limits; + + /* get_unsigned() */ if (var->value->unsigned_flag) var->save_result.ulonglong_value= (ulonglong) var->value->val_int(); else @@ -1449,9 +1454,57 @@ static int get_unsigned(THD *thd, set_var *var) longlong v= var->value->val_int(); var->save_result.ulonglong_value= (ulonglong) ((v < 0) ? 0 : v); if (v < 0) - return throw_bounds_warning(thd, TRUE, FALSE, var->var->name, v) ? 2 : 1; + { + warnings++; + if (throw_bounds_warning(thd, TRUE, FALSE, var->var->name, v)) + return TRUE; /* warning was promoted to error, give up */ + } } - return 0; + + unadjusted= var->save_result.ulonglong_value; + + /* max, if any */ + + if ((user_max > 0) && (unadjusted > user_max)) + { + var->save_result.ulonglong_value= user_max; + + if ((warnings == 0) && throw_bounds_warning(thd, TRUE, TRUE, + var->var->name, + (longlong) unadjusted)) + return TRUE; + + warnings++; + } + + /* fix_unsigned() */ + if (limits) + { + my_bool fixed; + + var->save_result.ulonglong_value= getopt_ull_limit_value(unadjusted, + limits, &fixed); + + if ((warnings == 0) && throw_bounds_warning(thd, fixed, TRUE, limits->name, + (longlong) unadjusted)) + return TRUE; + } + else if (bound2ulong) + { +#if SIZEOF_LONG < SIZEOF_LONG_LONG + /* Avoid overflows on 32 bit systems */ + if (var->save_result.ulonglong_value > ULONG_MAX) + { + var->save_result.ulonglong_value= ULONG_MAX; + if ((warnings == 0) && throw_bounds_warning(thd, TRUE, TRUE, + var->var->name, + (longlong) unadjusted)) + return TRUE; + } +#endif + } + + return FALSE; } @@ -1465,27 +1518,7 @@ sys_var_long_ptr(sys_var_chain *chain, const char *name_arg, ulong *value_ptr_ar bool sys_var_long_ptr_global::check(THD *thd, set_var *var) { - bool ret = FALSE; - int got_warnings= get_unsigned(thd, var); - - if (got_warnings == 2) - ret= TRUE; - else if (option_limits) - ret= fix_unsigned(thd, &var->save_result.ulonglong_value, - (got_warnings == 0), option_limits); - else - { -#if SIZEOF_LONG < SIZEOF_LONG_LONG - /* Avoid overflows on 32 bit systems */ - if (var->save_result.ulonglong_value > ULONG_MAX) - { - ret= throw_bounds_warning(thd, TRUE, TRUE, name, - (longlong) var->save_result.ulonglong_value); - var->save_result.ulonglong_value= ULONG_MAX; - } -#endif - } - return ret; + return get_unsigned(thd, var, 0, TRUE); } bool sys_var_long_ptr_global::update(THD *thd, set_var *var) @@ -1511,8 +1544,7 @@ bool sys_var_ulonglong_ptr::update(THD *thd, set_var *var) { ulonglong tmp= var->save_result.ulonglong_value; pthread_mutex_lock(&LOCK_global_system_variables); - if (option_limits) - fix_unsigned(thd, &tmp, FALSE, option_limits); + bound_unsigned(thd, &tmp, option_limits); *value= (ulonglong) tmp; pthread_mutex_unlock(&LOCK_global_system_variables); return 0; @@ -1563,38 +1595,8 @@ uchar *sys_var_enum_const::value_ptr(THD *thd, enum_var_type type, bool sys_var_thd_ulong::check(THD *thd, set_var *var) { - ulonglong tmp; - int got_warnings= get_unsigned(thd, var); - - if (got_warnings == 2) + if (get_unsigned(thd, var, max_system_variables.*offset, TRUE)) return TRUE; - - tmp= var->save_result.ulonglong_value; - - /* Don't use bigger value than given with --maximum-variable-name=.. */ - if ((ulong) tmp > max_system_variables.*offset) - { - if (throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp)) - return TRUE; - tmp= max_system_variables.*offset; - } - - if (option_limits) - { - if (fix_unsigned(thd, &tmp, (got_warnings == 0), option_limits)) - return TRUE; - } -#if SIZEOF_LONG < SIZEOF_LONG_LONG - else if (tmp > ULONG_MAX) - { - if (throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp)) - return TRUE; - tmp= ULONG_MAX; - } -#endif - - var->save_result.ulonglong_value= (ulong) tmp; - return ((check_func && (*check_func)(thd, var))); } @@ -1641,8 +1643,7 @@ bool sys_var_thd_ha_rows::update(THD *thd, set_var *var) if ((ha_rows) tmp > max_system_variables.*offset) tmp= max_system_variables.*offset; - if (option_limits) - fix_unsigned(thd, &tmp, FALSE, option_limits); + bound_unsigned(thd, &tmp, option_limits); if (var->type == OPT_GLOBAL) { @@ -1684,30 +1685,7 @@ uchar *sys_var_thd_ha_rows::value_ptr(THD *thd, enum_var_type type, bool sys_var_thd_ulonglong::check(THD *thd, set_var *var) { - ulonglong tmp; - int got_warnings= get_unsigned(thd, var); - - if (got_warnings == 2) - return TRUE; - - tmp= var->save_result.ulonglong_value; - - if (tmp > max_system_variables.*offset) - { - if (throw_bounds_warning(thd, TRUE, TRUE, name, (longlong) tmp)) - return TRUE; - tmp= max_system_variables.*offset; - } - - if (option_limits) - { - if (fix_unsigned(thd, &tmp, (got_warnings == 0), option_limits)) - return TRUE; - } - - var->save_result.ulonglong_value= tmp; - - return FALSE; + return get_unsigned(thd, var, max_system_variables.*offset, FALSE); } bool sys_var_thd_ulonglong::update(THD *thd, set_var *var) @@ -2353,7 +2331,7 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var) goto end; } - fix_unsigned(thd, &tmp, FALSE, option_limits); + bound_unsigned(thd, &tmp, option_limits); key_cache->param_buff_size= (ulonglong) tmp; /* If key cache didn't existed initialize it, else resize it */ @@ -2407,7 +2385,7 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var) if (key_cache->in_init) goto end; - fix_unsigned(thd, &tmp, FALSE, option_limits); + bound_unsigned(thd, &tmp, option_limits); *((ulong*) (((char*) key_cache) + offset))= (ulong) tmp; /* From 71913e350a2dc1964d1298d14d4c5d692c419ce1 Mon Sep 17 00:00:00 2001 From: "Tatiana A. Nurnberg" Date: Fri, 27 Feb 2009 10:27:00 +0100 Subject: [PATCH 04/21] Bug#40657: assertion with out of range variables and traditional sql_mode In STRICT mode, out-of-bounds values caused an error message to be queued (rather than just a warning), without any further error-like processing happening. (The error is queued during update, at which time it's too late. For it to be processed properly, it would need to be queued during check-stage.) The assertion rightfully complains that we're trying to send an OK while having an error queued. Changeset breaks a lot of tests out into check-stage. This also allows us to send more correct warnings/error messages. sql/set_var.cc: cleanup: fold get_unsigned() and fix_unsigned() into one, as well as all the semi-common code from the ::check functions. --- sql/set_var.cc | 66 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/sql/set_var.cc b/sql/set_var.cc index ff32ec2458e..01cdecfca5b 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -1405,22 +1405,38 @@ bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd, /** check an unsigned user-supplied value for a systemvariable against bounds. + TODO: This is a wrapper function to call clipping from within an update() + function. Calling bounds from within update() is fair game in theory, + but we can only send warnings from in there, not errors, and besides, + it violates our model of separating check from update phase. + To avoid breaking out of the server with an ASSERT() in strict mode, + we pretend we're not in strict mode when we go through here. Bug#43233 + was opened to remind us to replace this kludge with The Right Thing, + which of course is to do the check in the actual check phase, and then + throw an error or warning accordingly. + @param thd thread handle @param num the value to limit - @param option_limits the bounds-record, or NULL - - @retval whether or not we needed to bound + @param option_limits the bounds-record, or NULL if none */ -static my_bool bound_unsigned(THD *thd, ulonglong *num, +static void bound_unsigned(THD *thd, ulonglong *num, const struct my_option *option_limits) { - my_bool fixed = FALSE; - ulonglong unadjusted= *num; - if (option_limits) + { + my_bool fixed = FALSE; + ulonglong unadjusted= *num; + *num= getopt_ull_limit_value(unadjusted, option_limits, &fixed); - return fixed; + if (fixed) + { + ulong ssm= thd->variables.sql_mode; + thd->variables.sql_mode&= ~MODE_STRICT_ALL_TABLES; + throw_bounds_warning(thd, fixed, TRUE, option_limits->name, unadjusted); + thd->variables.sql_mode= ssm; + } + } } @@ -1445,6 +1461,7 @@ static bool get_unsigned(THD *thd, set_var *var, ulonglong user_max, int warnings= 0; ulonglong unadjusted; const struct my_option *limits= var->var->option_limits; + struct my_option fallback; /* get_unsigned() */ if (var->value->unsigned_flag) @@ -1477,32 +1494,33 @@ static bool get_unsigned(THD *thd, set_var *var, ulonglong user_max, warnings++; } + /* + if the sysvar doesn't have a proper bounds record but the check + function would like bounding to ULONG where its size differs from + that of ULONGLONG, we make up a bogus limits record here and let + the usual suspects handle the actual limiting. + */ + + if (!limits && bound2ulong) + { + bzero(&fallback, sizeof(fallback)); + fallback.var_type= GET_ULONG; + limits= &fallback; + } + /* fix_unsigned() */ if (limits) { my_bool fixed; - var->save_result.ulonglong_value= getopt_ull_limit_value(unadjusted, + var->save_result.ulonglong_value= getopt_ull_limit_value(var->save_result. + ulonglong_value, limits, &fixed); if ((warnings == 0) && throw_bounds_warning(thd, fixed, TRUE, limits->name, (longlong) unadjusted)) return TRUE; } - else if (bound2ulong) - { -#if SIZEOF_LONG < SIZEOF_LONG_LONG - /* Avoid overflows on 32 bit systems */ - if (var->save_result.ulonglong_value > ULONG_MAX) - { - var->save_result.ulonglong_value= ULONG_MAX; - if ((warnings == 0) && throw_bounds_warning(thd, TRUE, TRUE, - var->var->name, - (longlong) unadjusted)) - return TRUE; - } -#endif - } return FALSE; } @@ -2334,7 +2352,7 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var) bound_unsigned(thd, &tmp, option_limits); key_cache->param_buff_size= (ulonglong) tmp; - /* If key cache didn't existed initialize it, else resize it */ + /* If key cache didn't exist initialize it, else resize it */ key_cache->in_init= 1; pthread_mutex_unlock(&LOCK_global_system_variables); From 63c9bb320f9541898142a170a1b8c8bcb76a354e Mon Sep 17 00:00:00 2001 From: Leonard Zhou Date: Sat, 28 Feb 2009 09:35:18 +0800 Subject: [PATCH 05/21] BUG#39526 sql_mode not retained in binary log for CREATE PROCEDURE Set wrong sql_mode when creating a procedure. So that the sql_mode can't be writen into binary log correctly. Restore the current session sql_mode right before generating the binlog event when creating a procedure. mysql-test/suite/binlog/r/binlog_sql_mode.result: Test result mysql-test/suite/binlog/t/binlog_sql_mode.test: Test file for sql_mode testing sql/sp.cc: Restore the current session sql_mode right before generating the binlog event. --- .../suite/binlog/r/binlog_sql_mode.result | 46 +++++++++++ .../suite/binlog/t/binlog_sql_mode.test | 76 +++++++++++++++++++ sql/sp.cc | 4 +- 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/binlog/r/binlog_sql_mode.result create mode 100644 mysql-test/suite/binlog/t/binlog_sql_mode.test diff --git a/mysql-test/suite/binlog/r/binlog_sql_mode.result b/mysql-test/suite/binlog/r/binlog_sql_mode.result new file mode 100644 index 00000000000..e306040502d --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_sql_mode.result @@ -0,0 +1,46 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +SET @old_sql_mode= @@global.sql_mode; +SET @old_binlog_format=@@session.binlog_format; +SET SESSION sql_mode=8; +Initialization +RESET MASTER; +CREATE TABLE t1 (id INT); +CREATE PROCEDURE testProc() SELECT * FROM t1; +CREATE VIEW testView as SELECT * from t1; +CREATE FUNCTION testFunc() +RETURNS INT +BEGIN +return 1; +END;| +CREATE TRIGGER testTrig BEFORE INSERT ON t1 +FOR EACH ROW BEGIN +UPDATE t1 SET id = id +1; +END;| +CREATE EVENT testEvent ON SCHEDULE +EVERY 1 DAY +DO +BEGIN +UPDATE t1 SET id = id +1; +END;| +Chceck Result +select +(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog")) +is not null; +(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog")) +is not null +1 +*** String sql_mode=0 is found: 0 *** +Clean Up +DROP PROCEDURE testProc; +DROP FUNCTION testFunc; +DROP TRIGGER testTrig; +DROP EVENT testEvent; +DROP VIEW testView; +DROP TABLE t1; +SET @@global.sql_mode= @old_sql_mode; +SET @@session.binlog_format=@old_binlog_format; diff --git a/mysql-test/suite/binlog/t/binlog_sql_mode.test b/mysql-test/suite/binlog/t/binlog_sql_mode.test new file mode 100644 index 00000000000..1777f8cb561 --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_sql_mode.test @@ -0,0 +1,76 @@ +# ==== Purpose ==== +# +# Test that sql_mode can correct restore before generating the binlog event +# when creating CREATEable objects. +# +# ==== Method ==== +# +# Scan binlog file to check if the sql_mode is still set to 0 before generating binlog event +# + +-- source include/master-slave.inc +-- source include/have_log_bin.inc + +# BUG#39526 sql_mode not retained in binary log for CREATE PROCEDURE + +SET @old_sql_mode= @@global.sql_mode; +SET @old_binlog_format=@@session.binlog_format; +let $MYSQLD_DATADIR= `select @@datadir`; +SET SESSION sql_mode=8; + +--echo Initialization + +RESET MASTER; +CREATE TABLE t1 (id INT); + +CREATE PROCEDURE testProc() SELECT * FROM t1; +CREATE VIEW testView as SELECT * from t1; + +DELIMITER |; +CREATE FUNCTION testFunc() + RETURNS INT + BEGIN + return 1; + END;| +DELIMITER ;| + +DELIMITER |; +CREATE TRIGGER testTrig BEFORE INSERT ON t1 + FOR EACH ROW BEGIN + UPDATE t1 SET id = id +1; + END;| +DELIMITER ;| + +DELIMITER |; +CREATE EVENT testEvent ON SCHEDULE + EVERY 1 DAY + DO + BEGIN + UPDATE t1 SET id = id +1; + END;| +DELIMITER ;| + +--echo Chceck Result + +let $MYSQLD_DATADIR= `select @@datadir`; +--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval select +(@a:=load_file("$MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog")) +is not null; +let $s_mode_unsigned= `select @a like "%@@session.sql_mode=0%" /* must return 0 */`; +echo *** String sql_mode=0 is found: $s_mode_unsigned ***; + +--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug39526.binlog + +--echo Clean Up + +DROP PROCEDURE testProc; +DROP FUNCTION testFunc; +DROP TRIGGER testTrig; +DROP EVENT testEvent; +DROP VIEW testView; +DROP TABLE t1; + +SET @@global.sql_mode= @old_sql_mode; +SET @@session.binlog_format=@old_binlog_format; diff --git a/sql/sp.cc b/sql/sp.cc index cc545992857..b2c7c389136 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -936,10 +936,12 @@ sp_create_routine(THD *thd, int type, sp_head *sp) ret= SP_INTERNAL_ERROR; goto done; } - + /* restore sql_mode when binloging */ + thd->variables.sql_mode= saved_mode; /* Such a statement can always go directly to binlog, no trans cache */ thd->binlog_query(THD::MYSQL_QUERY_TYPE, log_query.c_ptr(), log_query.length(), FALSE, FALSE); + thd->variables.sql_mode= 0; } } From 61f905cfa1e82a406f74ba890ab6d9a645556895 Mon Sep 17 00:00:00 2001 From: Staale Smedseng Date: Wed, 4 Mar 2009 13:18:56 +0100 Subject: [PATCH 06/21] Missing change to funcs_1.myisam_views after push of Bug#29458 --- mysql-test/suite/funcs_1/r/myisam_views.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/suite/funcs_1/r/myisam_views.result b/mysql-test/suite/funcs_1/r/myisam_views.result index 3884657c925..9b07a0ae45b 100644 --- a/mysql-test/suite/funcs_1/r/myisam_views.result +++ b/mysql-test/suite/funcs_1/r/myisam_views.result @@ -23044,7 +23044,7 @@ ERROR 42S02: Table 'test.v1' doesn't exist CHECK TABLE v1; Table Op Msg_type Msg_text test.v1 check Error Table 'test.v1' doesn't exist -test.v1 check error Corrupt +test.v1 check status Operation failed DESCRIBE v1; ERROR 42S02: Table 'test.v1' doesn't exist EXPLAIN SELECT * FROM v1; From 161b8d0b2ffae81015d6348c6ea42bff1ea41d93 Mon Sep 17 00:00:00 2001 From: Dmitry Lenev Date: Wed, 4 Mar 2009 15:33:56 +0300 Subject: [PATCH 07/21] Fix for bug #40702 "skip_name_resolve fails sporadically on pushbuild". Under new MTR the server is not restarted for every test, so threads started in the previous test case can show up in the results of SHOW PROCESSLIST statement in this test, causing a test failure. Since we are not really interested in results of SHOW PROCESSLIST in this test but rather in fact that server doesn't crash when executing this statement this fix simply disables output of this statement. mysql-test/r/skip_name_resolve.result: Disable SHOW PROCESSLIST output to make test immune to threads started in previous test cases. mysql-test/t/skip_name_resolve.test: Disable SHOW PROCESSLIST output to make test immune to threads started in previous test cases. --- mysql-test/r/skip_name_resolve.result | 3 --- mysql-test/t/skip_name_resolve.test | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/skip_name_resolve.result b/mysql-test/r/skip_name_resolve.result index 8ef52e75238..953cbf8a67e 100644 --- a/mysql-test/r/skip_name_resolve.result +++ b/mysql-test/r/skip_name_resolve.result @@ -9,6 +9,3 @@ select user(); user() # show processlist; -Id User Host db Command Time State Info - root test