summaryrefslogtreecommitdiff
path: root/sql/set_var.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/set_var.cc')
-rw-r--r--sql/set_var.cc236
1 files changed, 176 insertions, 60 deletions
diff --git a/sql/set_var.cc b/sql/set_var.cc
index e4adbb0a318..60b0d24430d 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -87,6 +87,8 @@ static void fix_max_join_size(THD *thd, enum_var_type type);
static void fix_query_cache_size(THD *thd, enum_var_type type);
static void fix_query_cache_min_res_unit(THD *thd, enum_var_type type);
static void fix_key_buffer_size(THD *thd, enum_var_type type);
+static void fix_myisam_max_extra_sort_file_size(THD *thd, enum_var_type type);
+static void fix_myisam_max_sort_file_size(THD *thd, enum_var_type type);
static byte *get_error_count(THD *thd);
static byte *get_warning_count(THD *thd);
@@ -101,13 +103,16 @@ sys_var_long_ptr sys_binlog_cache_size("binlog_cache_size",
&binlog_cache_size);
sys_var_thd_ulong sys_bulk_insert_buff_size("bulk_insert_buffer_size",
&SV::bulk_insert_buff_size);
-sys_var_str sys_charset("character_set",
+sys_var_character_set_server sys_character_set_server("character_set_server");
+sys_var_str sys_charset_system("character_set_system",
sys_check_charset,
sys_update_charset,
sys_set_default_charset);
-sys_var_collation_client sys_collation_client("collation_client");
+sys_var_character_set_database sys_character_set_database("character_set_database");
+sys_var_character_set_client sys_character_set_client("character_set_client");
+sys_var_character_set_connection sys_character_set_connection("character_set_connection");
+sys_var_character_set_results sys_character_set_results("character_set_results");
sys_var_collation_connection sys_collation_connection("collation_connection");
-sys_var_collation_results sys_collation_results("collation_results");
sys_var_bool_ptr sys_concurrent_insert("concurrent_insert",
&myisam_concurrent_insert);
sys_var_long_ptr sys_connect_timeout("connect_timeout",
@@ -184,8 +189,9 @@ sys_var_thd_ulong sys_max_tmp_tables("max_tmp_tables",
&SV::max_tmp_tables);
sys_var_long_ptr sys_max_write_lock_count("max_write_lock_count",
&max_write_lock_count);
-sys_var_thd_ulonglong sys_myisam_max_extra_sort_file_size("myisam_max_extra_sort_file_size", &SV::myisam_max_extra_sort_file_size);
-sys_var_thd_ulonglong sys_myisam_max_sort_file_size("myisam_max_sort_file_size", &SV::myisam_max_sort_file_size);
+sys_var_thd_ulonglong sys_myisam_max_extra_sort_file_size("myisam_max_extra_sort_file_size", &SV::myisam_max_extra_sort_file_size, fix_myisam_max_extra_sort_file_size, 1);
+sys_var_thd_ulonglong sys_myisam_max_sort_file_size("myisam_max_sort_file_size", &SV::myisam_max_sort_file_size, fix_myisam_max_sort_file_size, 1);
+sys_var_thd_ulong sys_myisam_repair_threads("myisam_repair_threads", &SV::myisam_repair_threads);
sys_var_thd_ulong sys_myisam_sort_buffer_size("myisam_sort_buffer_size", &SV::myisam_sort_buff_size);
sys_var_thd_ulong sys_net_buffer_length("net_buffer_length",
&SV::net_buffer_length);
@@ -229,6 +235,7 @@ sys_var_bool_ptr sys_slave_compressed_protocol("slave_compressed_protocol",
sys_var_long_ptr sys_slave_net_timeout("slave_net_timeout",
&slave_net_timeout);
#endif
+sys_var_bool_ptr sys_readonly("read_only", &opt_readonly);
sys_var_long_ptr sys_slow_launch_time("slow_launch_time",
&slow_launch_time);
sys_var_thd_ulong sys_sort_buffer("sort_buffer_size",
@@ -249,6 +256,11 @@ sys_var_thd_ulong sys_tmp_table_size("tmp_table_size",
&SV::tmp_table_size);
sys_var_thd_ulong sys_net_wait_timeout("wait_timeout",
&SV::net_wait_timeout);
+
+#ifdef HAVE_INNOBASE_DB
+sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct",
+ &srv_max_buf_pool_modified_pct);
+#endif
/*
Variables that are bits in THD
*/
@@ -267,7 +279,7 @@ static sys_var_thd_bit sys_sql_big_tables("sql_big_tables",
#endif
static sys_var_thd_bit sys_big_selects("sql_big_selects",
set_option_bit,
- OPTION_BIG_TABLES);
+ OPTION_BIG_SELECTS);
static sys_var_thd_bit sys_log_off("sql_log_off",
set_option_bit,
OPTION_LOG_OFF);
@@ -349,9 +361,12 @@ sys_var *sys_variables[]=
&sys_binlog_cache_size,
&sys_buffer_results,
&sys_bulk_insert_buff_size,
- &sys_collation_client,
+ &sys_character_set_server,
+ &sys_character_set_database,
+ &sys_character_set_client,
+ &sys_character_set_connection,
+ &sys_character_set_results,
&sys_collation_connection,
- &sys_collation_results,
&sys_concurrent_insert,
&sys_connect_timeout,
&sys_default_week_format,
@@ -395,6 +410,7 @@ sys_var *sys_variables[]=
&sys_max_write_lock_count,
&sys_myisam_max_extra_sort_file_size,
&sys_myisam_max_sort_file_size,
+ &sys_myisam_repair_threads,
&sys_myisam_sort_buffer_size,
&sys_net_buffer_length,
&sys_net_read_timeout,
@@ -426,6 +442,7 @@ sys_var *sys_variables[]=
&sys_slave_net_timeout,
&sys_slave_skip_counter,
#endif
+ &sys_readonly,
&sys_slow_launch_time,
&sys_sort_buffer,
&sys_sql_big_tables,
@@ -439,6 +456,9 @@ sys_var *sys_variables[]=
&sys_timestamp,
&sys_tmp_table_size,
&sys_tx_isolation,
+#ifdef HAVE_INNOBASE_DB
+ &sys_innodb_max_dirty_pages_pct,
+#endif
&sys_unique_checks,
&sys_warning_count
};
@@ -463,11 +483,13 @@ struct show_var_st init_vars[]= {
#endif
{sys_binlog_cache_size.name,(char*) &sys_binlog_cache_size, SHOW_SYS},
{sys_bulk_insert_buff_size.name,(char*) &sys_bulk_insert_buff_size,SHOW_SYS},
- {sys_charset.name, (char*) &sys_charset, SHOW_SYS},
- {"character_sets", (char*) &charsets_list, SHOW_CHAR_PTR},
- {sys_collation_client.name, (char*) &sys_collation_client, SHOW_SYS},
+ {sys_character_set_server.name, (char*) &sys_character_set_server,SHOW_SYS},
+ {sys_charset_system.name, (char*) &sys_charset_system, SHOW_SYS},
+ {sys_character_set_database.name, (char*) &sys_character_set_database,SHOW_SYS},
+ {sys_character_set_client.name,(char*) &sys_character_set_client,SHOW_SYS},
+ {sys_character_set_connection.name,(char*) &sys_character_set_connection,SHOW_SYS},
+ {sys_character_set_results.name,(char*) &sys_character_set_results, SHOW_SYS},
{sys_collation_connection.name,(char*) &sys_collation_connection, SHOW_SYS},
- {sys_collation_results.name, (char*) &sys_collation_results, SHOW_SYS},
{sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS},
{sys_connect_timeout.name, (char*) &sys_connect_timeout, SHOW_SYS},
{"datadir", mysql_real_data_home, SHOW_CHAR},
@@ -514,6 +536,7 @@ struct show_var_st init_vars[]= {
{"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG},
{"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR},
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
+ {sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS},
#endif
{sys_interactive_timeout.name,(char*) &sys_interactive_timeout, SHOW_SYS},
{sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS},
@@ -550,13 +573,14 @@ struct show_var_st init_vars[]= {
{sys_max_prep_stmt_count.name,(char*) &sys_max_prep_stmt_count, SHOW_SYS},
{sys_max_sort_length.name, (char*) &sys_max_sort_length, SHOW_SYS},
{sys_max_user_connections.name,(char*) &sys_max_user_connections, SHOW_SYS},
- {sys_max_tmp_tables.name, (char*) &sys_max_tmp_tables, SHOW_SYS},
+ {sys_max_tmp_tables.name, (char*) &sys_max_tmp_tables, SHOW_SYS},
{sys_max_write_lock_count.name, (char*) &sys_max_write_lock_count,SHOW_SYS},
{sys_myisam_max_extra_sort_file_size.name,
(char*) &sys_myisam_max_extra_sort_file_size,
SHOW_SYS},
- {sys_myisam_max_sort_file_size.name,
- (char*) &sys_myisam_max_sort_file_size,
+ {sys_myisam_max_sort_file_size.name, (char*) &sys_myisam_max_sort_file_size,
+ SHOW_SYS},
+ {sys_myisam_repair_threads.name, (char*) &sys_myisam_repair_threads,
SHOW_SYS},
{"myisam_recover_options", (char*) &myisam_recover_options_str, SHOW_CHAR_PTR},
{sys_myisam_sort_buffer_size.name, (char*) &sys_myisam_sort_buffer_size, SHOW_SYS},
@@ -595,6 +619,7 @@ struct show_var_st init_vars[]= {
#ifdef HAVE_REPLICATION
{sys_slave_net_timeout.name,(char*) &sys_slave_net_timeout, SHOW_SYS},
#endif
+ {sys_readonly.name, (char*) &sys_readonly, SHOW_SYS},
{"skip_external_locking", (char*) &my_disable_locking, SHOW_MY_BOOL},
{"skip_networking", (char*) &opt_disable_networking, SHOW_BOOL},
{"skip_show_database", (char*) &opt_skip_show_db, SHOW_BOOL},
@@ -661,6 +686,21 @@ static void fix_low_priority_updates(THD *thd, enum_var_type type)
}
+static void
+fix_myisam_max_extra_sort_file_size(THD *thd, enum_var_type type)
+{
+ myisam_max_extra_temp_length=
+ (my_off_t) global_system_variables.myisam_max_extra_sort_file_size;
+}
+
+
+static void
+fix_myisam_max_sort_file_size(THD *thd, enum_var_type type)
+{
+ myisam_max_temp_length=
+ (my_off_t) global_system_variables.myisam_max_sort_file_size;
+}
+
/*
Set the OPTION_BIG_SELECTS flag if max_join_size == HA_POS_ERROR
*/
@@ -911,15 +951,22 @@ byte *sys_var_thd_ha_rows::value_ptr(THD *thd, enum_var_type type)
bool sys_var_thd_ulonglong::update(THD *thd, set_var *var)
{
+ ulonglong tmp= var->value->val_int();
+
+ if ((ulonglong) tmp > max_system_variables.*offset)
+ tmp= max_system_variables.*offset;
+
+ if (option_limits)
+ tmp= (ulong) getopt_ull_limit_value(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= var->value->val_int();
+ global_system_variables.*offset= (ulonglong) tmp;
pthread_mutex_unlock(&LOCK_global_system_variables);
}
else
- thd->variables.*offset= var->value->val_int();
+ thd->variables.*offset= (ulonglong) tmp;
return 0;
}
@@ -1010,6 +1057,7 @@ err:
bool sys_var::check_set(THD *thd, set_var *var, TYPELIB *enum_names)
{
+ bool not_used;
char buff[80], *error= 0;
uint error_len= 0;
String str(buff, sizeof(buff), system_charset_info), *res;
@@ -1019,7 +1067,7 @@ bool sys_var::check_set(THD *thd, set_var *var, TYPELIB *enum_names)
if (!(res= var->value->val_str(&str)))
goto err;
var->save_result.ulong_value= (ulong)
- find_set(enum_names, res->c_ptr(), res->length(), &error, &error_len);
+ find_set(enum_names, res->c_ptr(), res->length(), &error, &error_len, &not_used);
if (error_len)
{
strmake(buff, error, min(sizeof(buff), error_len));
@@ -1202,7 +1250,7 @@ CHARSET_INFO *get_old_charset_by_name(const char *name)
for (c= old_conv; c->old_name; c++)
{
if (!my_strcasecmp(&my_charset_latin1,name,c->old_name))
- return get_charset_by_name(c->new_name,MYF(0));
+ return get_charset_by_csname(c->new_name,MY_CS_PRIMARY,MYF(0));
}
return NULL;
}
@@ -1216,7 +1264,31 @@ bool sys_var_collation::check(THD *thd, set_var *var)
if (!(res=var->value->val_str(&str)))
res= &empty_string;
- if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0))) &&
+ if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0))))
+ {
+ my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), res->c_ptr());
+ return 1;
+ }
+ var->save_result.charset= tmp; // Save for update
+ return 0;
+}
+
+bool sys_var_character_set::check(THD *thd, set_var *var)
+{
+ CHARSET_INFO *tmp;
+ char buff[80];
+ String str(buff,sizeof(buff), system_charset_info), *res;
+
+ if (!(res=var->value->val_str(&str)))
+ {
+ if (!nullable)
+ {
+ my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), "NULL");
+ return 1;
+ }
+ tmp= NULL;
+ }
+ else if (!(tmp=get_charset_by_csname(res->c_ptr(),MY_CS_PRIMARY,MYF(0))) &&
!(tmp=get_old_charset_by_name(res->c_ptr())))
{
my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), res->c_ptr());
@@ -1226,83 +1298,127 @@ bool sys_var_collation::check(THD *thd, set_var *var)
return 0;
}
-bool sys_var_collation_client::update(THD *thd, set_var *var)
+bool sys_var_character_set::update(THD *thd, set_var *var)
{
- if (var->type == OPT_GLOBAL)
- global_system_variables.collation_client= var->save_result.charset;
- else
- thd->variables.collation_client= var->save_result.charset;
+ ci_ptr(thd,var->type)[0]= var->save_result.charset;
return 0;
}
-byte *sys_var_collation_client::value_ptr(THD *thd, enum_var_type type)
+byte *sys_var_character_set::value_ptr(THD *thd, enum_var_type type)
{
- CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
- global_system_variables.collation_client :
- thd->variables.collation_client);
- return cs ? (byte*) cs->name : (byte*) "";
+ CHARSET_INFO *cs= ci_ptr(thd,type)[0];
+ return cs ? (byte*) cs->csname : (byte*) "NULL";
}
-void sys_var_collation_client::set_default(THD *thd, enum_var_type type)
+
+CHARSET_INFO ** sys_var_character_set_connection::ci_ptr(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ return &global_system_variables.collation_connection;
+ else
+ return &thd->variables.collation_connection;
+}
+
+void sys_var_character_set_connection::set_default(THD *thd, enum_var_type type)
{
if (type == OPT_GLOBAL)
- global_system_variables.collation_client= default_charset_info;
+ global_system_variables.collation_connection= default_charset_info;
else
- thd->variables.collation_client= global_system_variables.collation_client;
+ thd->variables.collation_connection= global_system_variables.collation_connection;
}
-bool sys_var_collation_connection::update(THD *thd, set_var *var)
+CHARSET_INFO ** sys_var_character_set_client::ci_ptr(THD *thd, enum_var_type type)
{
- if (var->type == OPT_GLOBAL)
- global_system_variables.collation_connection= var->save_result.charset;
+ if (type == OPT_GLOBAL)
+ return &global_system_variables.character_set_client;
else
- thd->variables.collation_connection= var->save_result.charset;
- return 0;
+ return &thd->variables.character_set_client;
}
-byte *sys_var_collation_connection::value_ptr(THD *thd, enum_var_type type)
+void sys_var_character_set_client::set_default(THD *thd, enum_var_type type)
{
- CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
- global_system_variables.collation_connection :
- thd->variables.collation_connection);
- return cs ? (byte*) cs->name : (byte*) "";
+ if (type == OPT_GLOBAL)
+ global_system_variables.character_set_client= default_charset_info;
+ else
+ thd->variables.character_set_client= global_system_variables.character_set_client;
}
-void sys_var_collation_connection::set_default(THD *thd, enum_var_type type)
+CHARSET_INFO ** sys_var_character_set_results::ci_ptr(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ return &global_system_variables.character_set_results;
+ else
+ return &thd->variables.character_set_results;
+}
+
+void sys_var_character_set_results::set_default(THD *thd, enum_var_type type)
{
if (type == OPT_GLOBAL)
- global_system_variables.collation_connection= default_charset_info;
+ global_system_variables.character_set_results= default_charset_info;
else
- thd->variables.collation_connection= global_system_variables.collation_connection;
+ thd->variables.character_set_results= global_system_variables.character_set_results;
+}
+
+CHARSET_INFO ** sys_var_character_set_server::ci_ptr(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ return &global_system_variables.character_set_server;
+ else
+ return &thd->variables.character_set_server;
}
-bool sys_var_collation_results::update(THD *thd, set_var *var)
+void sys_var_character_set_server::set_default(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ global_system_variables.character_set_server= default_charset_info;
+ else
+ thd->variables.character_set_server= global_system_variables.character_set_server;
+}
+
+CHARSET_INFO ** sys_var_character_set_database::ci_ptr(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ return &global_system_variables.character_set_database;
+ else
+ return &thd->variables.character_set_database;
+}
+
+void sys_var_character_set_database::set_default(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ global_system_variables.character_set_database= default_charset_info;
+ else
+ thd->variables.character_set_database= thd->db_charset;
+}
+
+bool sys_var_collation_connection::update(THD *thd, set_var *var)
{
if (var->type == OPT_GLOBAL)
- global_system_variables.collation_results= var->save_result.charset;
+ global_system_variables.collation_connection= var->save_result.charset;
else
- thd->variables.collation_results= var->save_result.charset;
+ thd->variables.collation_connection= var->save_result.charset;
return 0;
}
-byte *sys_var_collation_results::value_ptr(THD *thd, enum_var_type type)
+byte *sys_var_collation_connection::value_ptr(THD *thd, enum_var_type type)
{
CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
- global_system_variables.collation_results :
- thd->variables.collation_results);
- return cs ? (byte*) cs->name : (byte*) "";
+ global_system_variables.collation_connection :
+ thd->variables.collation_connection);
+ return cs ? (byte*) cs->name : (byte*) "NULL";
}
-void sys_var_collation_results::set_default(THD *thd, enum_var_type type)
+void sys_var_collation_connection::set_default(THD *thd, enum_var_type type)
{
if (type == OPT_GLOBAL)
- global_system_variables.collation_results= default_charset_info;
+ global_system_variables.collation_connection= default_charset_info;
else
- thd->variables.collation_results= global_system_variables.collation_results;
+ thd->variables.collation_connection= global_system_variables.collation_connection;
}
+
/*****************************************************************************
Functions to handle SET NAMES and SET CHARACTER SET
*****************************************************************************/
@@ -1314,9 +1430,9 @@ int set_var_collation_client::check(THD *thd)
int set_var_collation_client::update(THD *thd)
{
- thd->variables.collation_client= collation_client;
+ thd->variables.character_set_client= character_set_client;
+ thd->variables.character_set_results= character_set_results;
thd->variables.collation_connection= collation_connection;
- thd->variables.collation_results= collation_results;
thd->protocol_simple.init(thd);
thd->protocol_prep.init(thd);
return 0;
@@ -1635,7 +1751,7 @@ sys_var *find_sys_var(const char *str, uint length)
int sql_set_variables(THD *thd, List<set_var_base> *var_list)
{
int error= 0;
- List_iterator<set_var_base> it(*var_list);
+ List_iterator_fast<set_var_base> it(*var_list);
set_var_base *var;
while ((var=it++))
@@ -1751,5 +1867,5 @@ int set_var_password::update(THD *thd)
#ifdef __GNUC__
template class List<set_var_base>;
-template class List_iterator<set_var_base>;
+template class List_iterator_fast<set_var_base>;
#endif