Loading mysql-test/t/ps.test +141 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,9 @@ set @fvar= 123.4567; prepare stmt1 from @fvar; drop table t1,t2; deallocate prepare stmt3; deallocate prepare stmt4; deallocate prepare stmt5; # # Bug #4105: Server crash on attempt to prepare a statement with character Loading Loading @@ -257,6 +260,7 @@ prepare `ü` from 'select 1234'; execute `ü` ; set names latin1; execute ``; deallocate prepare ``; set names default; Loading Loading @@ -921,6 +925,143 @@ select length(a) from t1; drop table t1; deallocate prepare stmt; # # Bug#16248 "WHERE (col1,col2) IN ((?,?)) gives wrong results": # check that ROW implementation is reexecution-friendly. # create table t1 (col1 integer, col2 integer); insert into t1 values(100,100),(101,101),(102,102),(103,103); prepare stmt from 'select col1, col2 from t1 where (col1, col2) in ((?,?))'; set @a=100, @b=100; execute stmt using @a,@b; set @a=101, @b=101; execute stmt using @a,@b; set @a=102, @b=102; execute stmt using @a,@b; set @a=102, @b=103; execute stmt using @a,@b; deallocate prepare stmt; drop table t1; # # Bug#16365 Prepared Statements: DoS with too many open statements # Check that the limit @@max_prpeared_stmt_count works. # # Save the old value set @old_max_prepared_stmt_count= @@max_prepared_stmt_count; # # Disable prepared statement protocol: in this test we set # @@max_prepared_stmt_count to 0 or 1 and would like to test the limit # manually. # --disable_ps_protocol # # A. Check that the new variables are present in SHOW VARIABLES list. # show variables like 'max_prepared_stmt_count'; show variables like 'prepared_stmt_count'; # # B. Check that the new variables are selectable. # select @@max_prepared_stmt_count, @@prepared_stmt_count; # # C. Check that max_prepared_stmt_count is settable (global only), # whereas prepared_stmt_count is readonly. # set global max_prepared_stmt_count=-1; select @@max_prepared_stmt_count; set global max_prepared_stmt_count=10000000000000000; select @@max_prepared_stmt_count; set global max_prepared_stmt_count=default; select @@max_prepared_stmt_count; --error 1229 # ER_GLOBAL_VARIABLE set @@max_prepared_stmt_count=1; --error 1229 # ER_GLOBAL_VARIABLE set max_prepared_stmt_count=1; --error 1229 # ER_GLOBAL_VARIABLE set local max_prepared_stmt_count=1; --error 1229 # ER_GLOBAL_VARIABLE set local prepared_stmt_count=0; --error 1229 # ER_GLOBAL_VARIABLE set @@prepared_stmt_count=0; --error 1232 # ER_WRONG_TYPE_FOR_VAR set global prepared_stmt_count=1; # set to a reasonable limit works set global max_prepared_stmt_count=1; select @@max_prepared_stmt_count; # # D. Check that the variables actually work. # set global max_prepared_stmt_count=0; select @@max_prepared_stmt_count, @@prepared_stmt_count; --error 1105 # ER_UNKNOWN_ERROR prepare stmt from "select 1"; select @@prepared_stmt_count; set global max_prepared_stmt_count=1; prepare stmt from "select 1"; select @@prepared_stmt_count; --error 1105 # ER_UNKNOWN_ERROR prepare stmt1 from "select 1"; select @@prepared_stmt_count; deallocate prepare stmt; select @@prepared_stmt_count; # # E. Check that we can prepare a statement with the same name # successfully, without hitting the limit. # prepare stmt from "select 1"; select @@prepared_stmt_count; prepare stmt from "select 2"; select @@prepared_stmt_count; # # F. We can set the max below the current count. In this case no new # statements should be allowed to prepare. # select @@prepared_stmt_count, @@max_prepared_stmt_count; set global max_prepared_stmt_count=0; --error 1105 # ER_UNKNOWN_ERROR prepare stmt from "select 1"; # Result: the old statement is deallocated, the new is not created. --error 1243 # ER_UNKNOWN_STMT_HANDLER execute stmt; select @@prepared_stmt_count; --error 1105 # ER_UNKNOWN_ERROR prepare stmt from "select 1"; select @@prepared_stmt_count; # # G. Show that the variables are up to date even after a connection with all # statements in it was terminated. # set global max_prepared_stmt_count=3; select @@max_prepared_stmt_count, @@prepared_stmt_count; prepare stmt from "select 1"; connect (con1,localhost,root,,); connection con1; prepare stmt from "select 2"; prepare stmt1 from "select 3"; --error 1105 # ER_UNKNOWN_ERROR prepare stmt2 from "select 4"; connection default; --error 1105 # ER_UNKNOWN_ERROR prepare stmt2 from "select 4"; select @@max_prepared_stmt_count, @@prepared_stmt_count; disconnect con1; connection default; # Wait for the connection to die: deal with a possible race deallocate prepare stmt; let $count= `select @@prepared_stmt_count`; if ($count) { --sleep 2 let $count= `select @@prepared_stmt_count`; } select @@max_prepared_stmt_count, @@prepared_stmt_count; # # Restore the old value. # set global max_prepared_stmt_count= @old_max_prepared_stmt_count; --enable_ps_protocol # End of 4.1 tests # Loading sql/item_row.cc +15 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ */ Item_row::Item_row(List<Item> &arg): Item(), used_tables_cache(0), array_holder(1), const_item_cache(1), with_null(0) Item(), used_tables_cache(0), const_item_cache(1), with_null(0) { //TODO: think placing 2-3 component items in item (as it done for function) Loading Loading @@ -85,6 +85,20 @@ bool Item_row::fix_fields(THD *thd, Item **ref) } void Item_row::cleanup() { DBUG_ENTER("Item_row::cleanup"); Item::cleanup(); /* Reset to the original values */ used_tables_cache= 0; const_item_cache= 1; with_null= 0; DBUG_VOID_RETURN; } void Item_row::split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields) { Loading sql/item_row.h +1 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ class Item_row: public Item Item **items; table_map used_tables_cache; uint arg_count; bool array_holder; bool const_item_cache; bool with_null; public: Loading @@ -29,7 +28,6 @@ class Item_row: public Item items(item->items), used_tables_cache(item->used_tables_cache), arg_count(item->arg_count), array_holder(0), const_item_cache(item->const_item_cache), with_null(0) {} Loading Loading @@ -62,6 +60,7 @@ class Item_row: public Item return 0; }; bool fix_fields(THD *thd, Item **ref); void cleanup(); void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields); table_map used_tables() const { return used_tables_cache; }; bool const_item() const { return const_item_cache; }; Loading sql/mysql_priv.h +2 −0 Original line number Diff line number Diff line Loading @@ -1166,6 +1166,7 @@ extern ulong slave_net_timeout, slave_trans_retries; extern uint max_user_connections; extern ulong what_to_log,flush_time; extern ulong query_buff_size, thread_stack; extern ulong max_prepared_stmt_count, prepared_stmt_count; extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit; extern ulong max_binlog_size, max_relay_log_size; extern ulong rpl_recovery_rank, thread_cache_size; Loading Loading @@ -1215,6 +1216,7 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_read_lock, LOCK_global_system_variables, LOCK_user_conn, LOCK_prepared_stmt_count, LOCK_bytes_sent, LOCK_bytes_received; #ifdef HAVE_OPENSSL extern pthread_mutex_t LOCK_des_key_file; Loading sql/mysqld.cc +32 −1 Original line number Diff line number Diff line Loading @@ -409,6 +409,22 @@ ulong specialflag=0; ulong binlog_cache_use= 0, binlog_cache_disk_use= 0; ulong max_connections, max_connect_errors; uint max_user_connections= 0; /* Limit of the total number of prepared statements in the server. Is necessary to protect the server against out-of-memory attacks. */ ulong max_prepared_stmt_count; /* Current total number of prepared statements in the server. This number is exact, and therefore may not be equal to the difference between `com_stmt_prepare' and `com_stmt_close' (global status variables), as the latter ones account for all registered attempts to prepare a statement (including unsuccessful ones). Prepared statements are currently connection-local: if the same SQL query text is prepared in two different connections, this counts as two distinct prepared statements. */ ulong prepared_stmt_count=0; ulong thread_id=1L,current_pid; ulong slow_launch_threads = 0, sync_binlog_period; ulong expire_logs_days = 0; Loading Loading @@ -488,6 +504,14 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count, LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received, LOCK_global_system_variables, LOCK_user_conn, LOCK_slave_list, LOCK_active_mi; /* The below lock protects access to two global server variables: max_prepared_stmt_count and prepared_stmt_count. These variables set the limit and hold the current total number of prepared statements in the server, respectively. As PREPARE/DEALLOCATE rate in a loaded server may be fairly high, we need a dedicated lock. */ pthread_mutex_t LOCK_prepared_stmt_count; #ifdef HAVE_OPENSSL pthread_mutex_t LOCK_des_key_file; #endif Loading Loading @@ -1197,6 +1221,7 @@ static void clean_up_mutexes() (void) pthread_mutex_destroy(&LOCK_global_system_variables); (void) pthread_mutex_destroy(&LOCK_global_read_lock); (void) pthread_mutex_destroy(&LOCK_uuid_generator); (void) pthread_mutex_destroy(&LOCK_prepared_stmt_count); (void) pthread_cond_destroy(&COND_thread_count); (void) pthread_cond_destroy(&COND_refresh); (void) pthread_cond_destroy(&COND_thread_cache); Loading Loading @@ -2765,6 +2790,7 @@ static int init_thread_environment() (void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_global_read_lock, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_prepared_stmt_count, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_uuid_generator, MY_MUTEX_INIT_FAST); #ifdef HAVE_OPENSSL (void) pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST); Loading Loading @@ -4503,7 +4529,8 @@ enum options_mysqld OPT_MAX_BINLOG_CACHE_SIZE, OPT_MAX_BINLOG_SIZE, OPT_MAX_CONNECTIONS, OPT_MAX_CONNECT_ERRORS, OPT_MAX_DELAYED_THREADS, OPT_MAX_HEP_TABLE_SIZE, OPT_MAX_JOIN_SIZE, OPT_MAX_RELAY_LOG_SIZE, OPT_MAX_SORT_LENGTH, OPT_MAX_JOIN_SIZE, OPT_MAX_PREPARED_STMT_COUNT, OPT_MAX_RELAY_LOG_SIZE, OPT_MAX_SORT_LENGTH, OPT_MAX_SEEKS_FOR_KEY, OPT_MAX_TMP_TABLES, OPT_MAX_USER_CONNECTIONS, OPT_MAX_LENGTH_FOR_SORT_DATA, OPT_MAX_WRITE_LOCK_COUNT, OPT_BULK_INSERT_BUFFER_SIZE, Loading Loading @@ -5638,6 +5665,10 @@ The minimum value for this variable is 4096.", (gptr*) &global_system_variables.max_length_for_sort_data, (gptr*) &max_system_variables.max_length_for_sort_data, 0, GET_ULONG, REQUIRED_ARG, 1024, 4, 8192*1024L, 0, 1, 0}, {"max_prepared_stmt_count", OPT_MAX_PREPARED_STMT_COUNT, "Maximum numbrer of prepared statements in the server.", (gptr*) &max_prepared_stmt_count, (gptr*) &max_prepared_stmt_count, 0, GET_ULONG, REQUIRED_ARG, 16382, 0, 1*1024*1024, 0, 1, 0}, {"max_relay_log_size", OPT_MAX_RELAY_LOG_SIZE, "If non-zero: relay log will be rotated automatically when the size exceeds this value; if zero (the default): when the size exceeds max_binlog_size. 0 excepted, the minimum value for this variable is 4096.", (gptr*) &max_relay_log_size, (gptr*) &max_relay_log_size, 0, GET_ULONG, Loading Loading
mysql-test/t/ps.test +141 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,9 @@ set @fvar= 123.4567; prepare stmt1 from @fvar; drop table t1,t2; deallocate prepare stmt3; deallocate prepare stmt4; deallocate prepare stmt5; # # Bug #4105: Server crash on attempt to prepare a statement with character Loading Loading @@ -257,6 +260,7 @@ prepare `ü` from 'select 1234'; execute `ü` ; set names latin1; execute ``; deallocate prepare ``; set names default; Loading Loading @@ -921,6 +925,143 @@ select length(a) from t1; drop table t1; deallocate prepare stmt; # # Bug#16248 "WHERE (col1,col2) IN ((?,?)) gives wrong results": # check that ROW implementation is reexecution-friendly. # create table t1 (col1 integer, col2 integer); insert into t1 values(100,100),(101,101),(102,102),(103,103); prepare stmt from 'select col1, col2 from t1 where (col1, col2) in ((?,?))'; set @a=100, @b=100; execute stmt using @a,@b; set @a=101, @b=101; execute stmt using @a,@b; set @a=102, @b=102; execute stmt using @a,@b; set @a=102, @b=103; execute stmt using @a,@b; deallocate prepare stmt; drop table t1; # # Bug#16365 Prepared Statements: DoS with too many open statements # Check that the limit @@max_prpeared_stmt_count works. # # Save the old value set @old_max_prepared_stmt_count= @@max_prepared_stmt_count; # # Disable prepared statement protocol: in this test we set # @@max_prepared_stmt_count to 0 or 1 and would like to test the limit # manually. # --disable_ps_protocol # # A. Check that the new variables are present in SHOW VARIABLES list. # show variables like 'max_prepared_stmt_count'; show variables like 'prepared_stmt_count'; # # B. Check that the new variables are selectable. # select @@max_prepared_stmt_count, @@prepared_stmt_count; # # C. Check that max_prepared_stmt_count is settable (global only), # whereas prepared_stmt_count is readonly. # set global max_prepared_stmt_count=-1; select @@max_prepared_stmt_count; set global max_prepared_stmt_count=10000000000000000; select @@max_prepared_stmt_count; set global max_prepared_stmt_count=default; select @@max_prepared_stmt_count; --error 1229 # ER_GLOBAL_VARIABLE set @@max_prepared_stmt_count=1; --error 1229 # ER_GLOBAL_VARIABLE set max_prepared_stmt_count=1; --error 1229 # ER_GLOBAL_VARIABLE set local max_prepared_stmt_count=1; --error 1229 # ER_GLOBAL_VARIABLE set local prepared_stmt_count=0; --error 1229 # ER_GLOBAL_VARIABLE set @@prepared_stmt_count=0; --error 1232 # ER_WRONG_TYPE_FOR_VAR set global prepared_stmt_count=1; # set to a reasonable limit works set global max_prepared_stmt_count=1; select @@max_prepared_stmt_count; # # D. Check that the variables actually work. # set global max_prepared_stmt_count=0; select @@max_prepared_stmt_count, @@prepared_stmt_count; --error 1105 # ER_UNKNOWN_ERROR prepare stmt from "select 1"; select @@prepared_stmt_count; set global max_prepared_stmt_count=1; prepare stmt from "select 1"; select @@prepared_stmt_count; --error 1105 # ER_UNKNOWN_ERROR prepare stmt1 from "select 1"; select @@prepared_stmt_count; deallocate prepare stmt; select @@prepared_stmt_count; # # E. Check that we can prepare a statement with the same name # successfully, without hitting the limit. # prepare stmt from "select 1"; select @@prepared_stmt_count; prepare stmt from "select 2"; select @@prepared_stmt_count; # # F. We can set the max below the current count. In this case no new # statements should be allowed to prepare. # select @@prepared_stmt_count, @@max_prepared_stmt_count; set global max_prepared_stmt_count=0; --error 1105 # ER_UNKNOWN_ERROR prepare stmt from "select 1"; # Result: the old statement is deallocated, the new is not created. --error 1243 # ER_UNKNOWN_STMT_HANDLER execute stmt; select @@prepared_stmt_count; --error 1105 # ER_UNKNOWN_ERROR prepare stmt from "select 1"; select @@prepared_stmt_count; # # G. Show that the variables are up to date even after a connection with all # statements in it was terminated. # set global max_prepared_stmt_count=3; select @@max_prepared_stmt_count, @@prepared_stmt_count; prepare stmt from "select 1"; connect (con1,localhost,root,,); connection con1; prepare stmt from "select 2"; prepare stmt1 from "select 3"; --error 1105 # ER_UNKNOWN_ERROR prepare stmt2 from "select 4"; connection default; --error 1105 # ER_UNKNOWN_ERROR prepare stmt2 from "select 4"; select @@max_prepared_stmt_count, @@prepared_stmt_count; disconnect con1; connection default; # Wait for the connection to die: deal with a possible race deallocate prepare stmt; let $count= `select @@prepared_stmt_count`; if ($count) { --sleep 2 let $count= `select @@prepared_stmt_count`; } select @@max_prepared_stmt_count, @@prepared_stmt_count; # # Restore the old value. # set global max_prepared_stmt_count= @old_max_prepared_stmt_count; --enable_ps_protocol # End of 4.1 tests # Loading
sql/item_row.cc +15 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ */ Item_row::Item_row(List<Item> &arg): Item(), used_tables_cache(0), array_holder(1), const_item_cache(1), with_null(0) Item(), used_tables_cache(0), const_item_cache(1), with_null(0) { //TODO: think placing 2-3 component items in item (as it done for function) Loading Loading @@ -85,6 +85,20 @@ bool Item_row::fix_fields(THD *thd, Item **ref) } void Item_row::cleanup() { DBUG_ENTER("Item_row::cleanup"); Item::cleanup(); /* Reset to the original values */ used_tables_cache= 0; const_item_cache= 1; with_null= 0; DBUG_VOID_RETURN; } void Item_row::split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields) { Loading
sql/item_row.h +1 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ class Item_row: public Item Item **items; table_map used_tables_cache; uint arg_count; bool array_holder; bool const_item_cache; bool with_null; public: Loading @@ -29,7 +28,6 @@ class Item_row: public Item items(item->items), used_tables_cache(item->used_tables_cache), arg_count(item->arg_count), array_holder(0), const_item_cache(item->const_item_cache), with_null(0) {} Loading Loading @@ -62,6 +60,7 @@ class Item_row: public Item return 0; }; bool fix_fields(THD *thd, Item **ref); void cleanup(); void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields); table_map used_tables() const { return used_tables_cache; }; bool const_item() const { return const_item_cache; }; Loading
sql/mysql_priv.h +2 −0 Original line number Diff line number Diff line Loading @@ -1166,6 +1166,7 @@ extern ulong slave_net_timeout, slave_trans_retries; extern uint max_user_connections; extern ulong what_to_log,flush_time; extern ulong query_buff_size, thread_stack; extern ulong max_prepared_stmt_count, prepared_stmt_count; extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit; extern ulong max_binlog_size, max_relay_log_size; extern ulong rpl_recovery_rank, thread_cache_size; Loading Loading @@ -1215,6 +1216,7 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_read_lock, LOCK_global_system_variables, LOCK_user_conn, LOCK_prepared_stmt_count, LOCK_bytes_sent, LOCK_bytes_received; #ifdef HAVE_OPENSSL extern pthread_mutex_t LOCK_des_key_file; Loading
sql/mysqld.cc +32 −1 Original line number Diff line number Diff line Loading @@ -409,6 +409,22 @@ ulong specialflag=0; ulong binlog_cache_use= 0, binlog_cache_disk_use= 0; ulong max_connections, max_connect_errors; uint max_user_connections= 0; /* Limit of the total number of prepared statements in the server. Is necessary to protect the server against out-of-memory attacks. */ ulong max_prepared_stmt_count; /* Current total number of prepared statements in the server. This number is exact, and therefore may not be equal to the difference between `com_stmt_prepare' and `com_stmt_close' (global status variables), as the latter ones account for all registered attempts to prepare a statement (including unsuccessful ones). Prepared statements are currently connection-local: if the same SQL query text is prepared in two different connections, this counts as two distinct prepared statements. */ ulong prepared_stmt_count=0; ulong thread_id=1L,current_pid; ulong slow_launch_threads = 0, sync_binlog_period; ulong expire_logs_days = 0; Loading Loading @@ -488,6 +504,14 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count, LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received, LOCK_global_system_variables, LOCK_user_conn, LOCK_slave_list, LOCK_active_mi; /* The below lock protects access to two global server variables: max_prepared_stmt_count and prepared_stmt_count. These variables set the limit and hold the current total number of prepared statements in the server, respectively. As PREPARE/DEALLOCATE rate in a loaded server may be fairly high, we need a dedicated lock. */ pthread_mutex_t LOCK_prepared_stmt_count; #ifdef HAVE_OPENSSL pthread_mutex_t LOCK_des_key_file; #endif Loading Loading @@ -1197,6 +1221,7 @@ static void clean_up_mutexes() (void) pthread_mutex_destroy(&LOCK_global_system_variables); (void) pthread_mutex_destroy(&LOCK_global_read_lock); (void) pthread_mutex_destroy(&LOCK_uuid_generator); (void) pthread_mutex_destroy(&LOCK_prepared_stmt_count); (void) pthread_cond_destroy(&COND_thread_count); (void) pthread_cond_destroy(&COND_refresh); (void) pthread_cond_destroy(&COND_thread_cache); Loading Loading @@ -2765,6 +2790,7 @@ static int init_thread_environment() (void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_global_read_lock, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_prepared_stmt_count, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_uuid_generator, MY_MUTEX_INIT_FAST); #ifdef HAVE_OPENSSL (void) pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST); Loading Loading @@ -4503,7 +4529,8 @@ enum options_mysqld OPT_MAX_BINLOG_CACHE_SIZE, OPT_MAX_BINLOG_SIZE, OPT_MAX_CONNECTIONS, OPT_MAX_CONNECT_ERRORS, OPT_MAX_DELAYED_THREADS, OPT_MAX_HEP_TABLE_SIZE, OPT_MAX_JOIN_SIZE, OPT_MAX_RELAY_LOG_SIZE, OPT_MAX_SORT_LENGTH, OPT_MAX_JOIN_SIZE, OPT_MAX_PREPARED_STMT_COUNT, OPT_MAX_RELAY_LOG_SIZE, OPT_MAX_SORT_LENGTH, OPT_MAX_SEEKS_FOR_KEY, OPT_MAX_TMP_TABLES, OPT_MAX_USER_CONNECTIONS, OPT_MAX_LENGTH_FOR_SORT_DATA, OPT_MAX_WRITE_LOCK_COUNT, OPT_BULK_INSERT_BUFFER_SIZE, Loading Loading @@ -5638,6 +5665,10 @@ The minimum value for this variable is 4096.", (gptr*) &global_system_variables.max_length_for_sort_data, (gptr*) &max_system_variables.max_length_for_sort_data, 0, GET_ULONG, REQUIRED_ARG, 1024, 4, 8192*1024L, 0, 1, 0}, {"max_prepared_stmt_count", OPT_MAX_PREPARED_STMT_COUNT, "Maximum numbrer of prepared statements in the server.", (gptr*) &max_prepared_stmt_count, (gptr*) &max_prepared_stmt_count, 0, GET_ULONG, REQUIRED_ARG, 16382, 0, 1*1024*1024, 0, 1, 0}, {"max_relay_log_size", OPT_MAX_RELAY_LOG_SIZE, "If non-zero: relay log will be rotated automatically when the size exceeds this value; if zero (the default): when the size exceeds max_binlog_size. 0 excepted, the minimum value for this variable is 4096.", (gptr*) &max_relay_log_size, (gptr*) &max_relay_log_size, 0, GET_ULONG, Loading