summaryrefslogtreecommitdiff
path: root/sql/set_var.cc
diff options
context:
space:
mode:
authorhf@deer.mysql.r18.ru <>2003-01-20 18:59:45 +0400
committerhf@deer.mysql.r18.ru <>2003-01-20 18:59:45 +0400
commit389680e04e059cf78d3d7c929cb35c20064381fa (patch)
tree26bff9a8e2da794ce9796009e2fbd0d050252445 /sql/set_var.cc
parent1f6b6156773ae42f45cb2552cecbf52ef6964e23 (diff)
parentd14db3961d7f6839dd211ed3c136ddd8c709778c (diff)
downloadmariadb-git-389680e04e059cf78d3d7c929cb35c20064381fa.tar.gz
Conflicts resolving
Diffstat (limited to 'sql/set_var.cc')
-rw-r--r--sql/set_var.cc81
1 files changed, 78 insertions, 3 deletions
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 0cf2b50a6ea..89eb155bc63 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -218,8 +218,10 @@ sys_var_long_ptr sys_slow_launch_time("slow_launch_time",
&slow_launch_time);
sys_var_thd_ulong sys_sort_buffer("sort_buffer_size",
&SV::sortbuff_size);
-sys_var_thd_enum sys_table_type("table_type", &SV::table_type,
- &ha_table_typelib);
+sys_var_thd_sql_mode sys_sql_mode("sql_mode",
+ &SV::sql_mode);
+sys_var_thd_enum sys_table_type("table_type", &SV::table_type,
+ &ha_table_typelib);
sys_var_long_ptr sys_table_cache_size("table_cache",
&table_cache_size);
sys_var_long_ptr sys_thread_cache_size("thread_cache_size",
@@ -398,6 +400,7 @@ sys_var *sys_variables[]=
&sys_sql_big_tables,
&sys_sql_low_priority_updates,
&sys_sql_max_join_size,
+ &sys_sql_mode,
&sys_sql_warnings,
&sys_table_cache_size,
&sys_table_type,
@@ -552,7 +555,7 @@ struct show_var_st init_vars[]= {
{"socket", (char*) &mysql_unix_port, SHOW_CHAR_PTR},
#endif
{sys_sort_buffer.name, (char*) &sys_sort_buffer, SHOW_SYS},
- {"sql_mode", (char*) &opt_sql_mode, SHOW_LONG},
+ {sys_sql_mode.name, (char*) &sys_sql_mode, SHOW_SYS},
{"table_cache", (char*) &table_cache_size, SHOW_LONG},
{sys_table_type.name, (char*) &sys_table_type, SHOW_SYS},
{sys_thread_cache_size.name,(char*) &sys_thread_cache_size, SHOW_SYS},
@@ -946,6 +949,44 @@ err:
return 1;
}
+
+
+bool sys_var::check_set(THD *thd, set_var *var, TYPELIB *enum_names)
+{
+ char buff[80], *value, *error= 0;
+ uint error_len= 0;
+ String str(buff, sizeof(buff), system_charset_info), *res;
+
+ if (var->value->result_type() == STRING_RESULT)
+ {
+ if (!(res= var->value->val_str(&str)))
+ goto err;
+ (long) var->save_result.ulong_value= (ulong)
+ find_set(enum_names, res->c_ptr(), res->length(), &error, &error_len);
+ if (error_len)
+ {
+ strmake(buff, error, min(sizeof(buff), error_len));
+ goto err;
+ }
+ }
+ else
+ {
+ ulonglong tmp= var->value->val_int();
+ if (tmp >= enum_names->count)
+ {
+ llstr(tmp, buff);
+ goto err;
+ }
+ var->save_result.ulong_value= (ulong) tmp; // Save for update
+ }
+ return 0;
+
+err:
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name, buff);
+ return 1;
+}
+
+
/*
Return an Item for a variable. Used with @@[global.]variable_name
@@ -1022,6 +1063,40 @@ byte *sys_var_thd_enum::value_ptr(THD *thd, enum_var_type type)
}
+byte *sys_var_thd_sql_mode::value_ptr(THD *thd, enum_var_type type)
+{
+ ulong val;
+ char buff[256];
+ String tmp(buff, sizeof(buff), default_charset_info);
+ my_bool found= 0;
+
+ tmp.length(0);
+ val= ((type == OPT_GLOBAL) ? global_system_variables.*offset :
+ thd->variables.*offset);
+ for (uint i= 0; val; val>>= 1, i++)
+ {
+ if (val & 1)
+ {
+ tmp.append(enum_names->type_names[i]);
+ tmp.append(',');
+ }
+ }
+ if (tmp.length())
+ tmp.length(tmp.length() - 1);
+ return (byte*) thd->strdup(tmp.c_ptr());
+}
+
+
+void sys_var_thd_sql_mode::set_default(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ global_system_variables.*offset= 0;
+ else
+ thd->variables.*offset= global_system_variables.*offset;
+}
+
+
+
bool sys_var_thd_bit::update(THD *thd, set_var *var)
{
int res= (*update_func)(thd, var);