summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/events.cc2
-rw-r--r--sql/item_strfunc.cc60
-rw-r--r--sql/mysqld.cc5
-rw-r--r--sql/scheduler.h2
-rw-r--r--sql/sql_class.cc15
5 files changed, 74 insertions, 10 deletions
diff --git a/sql/events.cc b/sql/events.cc
index 262c62bdbc8..73b8f2cda84 100644
--- a/sql/events.cc
+++ b/sql/events.cc
@@ -146,7 +146,7 @@ bool
Events::set_opt_event_scheduler(char *argument)
{
if (argument == NULL)
- opt_event_scheduler= Events::EVENTS_DISABLED;
+ opt_event_scheduler= Events::EVENTS_ON;
else
{
int type;
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 03c65c9d654..a7624c5bbcd 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -356,10 +356,35 @@ String *Item_func_concat::val_str(String *str)
}
else
{ // Two big const strings
- if (tmp_value.alloc(max_length) ||
- tmp_value.copy(*res) ||
- tmp_value.append(*res2))
+ /*
+ NOTE: We should be prudent in the initial allocation unit -- the
+ size of the arguments is a function of data distribution, which
+ can be any. Instead of overcommitting at the first row, we grow
+ the allocated amount by the factor of 2. This ensures that no
+ more than 25% of memory will be overcommitted on average.
+ */
+
+ uint concat_len= res->length() + res2->length();
+
+ if (tmp_value.alloced_length() < concat_len)
+ {
+ if (tmp_value.alloced_length() == 0)
+ {
+ if (tmp_value.alloc(concat_len))
+ goto null;
+ }
+ else
+ {
+ uint new_len = max(tmp_value.alloced_length() * 2, concat_len);
+
+ if (tmp_value.realloc(new_len))
+ goto null;
+ }
+ }
+
+ if (tmp_value.copy(*res) || tmp_value.append(*res2))
goto null;
+
res= &tmp_value;
use_as_buff=str;
}
@@ -679,8 +704,33 @@ String *Item_func_concat_ws::val_str(String *str)
}
else
{ // Two big const strings
- if (tmp_value.alloc(max_length) ||
- tmp_value.copy(*res) ||
+ /*
+ NOTE: We should be prudent in the initial allocation unit -- the
+ size of the arguments is a function of data distribution, which can
+ be any. Instead of overcommitting at the first row, we grow the
+ allocated amount by the factor of 2. This ensures that no more than
+ 25% of memory will be overcommitted on average.
+ */
+
+ uint concat_len= res->length() + sep_str->length() + res2->length();
+
+ if (tmp_value.alloced_length() < concat_len)
+ {
+ if (tmp_value.alloced_length() == 0)
+ {
+ if (tmp_value.alloc(concat_len))
+ goto null;
+ }
+ else
+ {
+ uint new_len = max(tmp_value.alloced_length() * 2, concat_len);
+
+ if (tmp_value.realloc(new_len))
+ goto null;
+ }
+ }
+
+ if (tmp_value.copy(*res) ||
tmp_value.append(*sep_str) ||
tmp_value.append(*res2))
goto null;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 4cf6e05751f..f65fee872ed 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -7745,12 +7745,13 @@ mysqld_get_one_option(int optid,
break;
}
case OPT_ONE_THREAD:
- global_system_variables.thread_handling= 2;
+ global_system_variables.thread_handling=
+ SCHEDULER_ONE_THREAD_PER_CONNECTION;
break;
case OPT_THREAD_HANDLING:
{
global_system_variables.thread_handling=
- find_type_or_exit(argument, &thread_handling_typelib, opt->name);
+ find_type_or_exit(argument, &thread_handling_typelib, opt->name)-1;
break;
}
case OPT_FT_BOOLEAN_SYNTAX:
diff --git a/sql/scheduler.h b/sql/scheduler.h
index 8351cefda4c..46bbd300cbb 100644
--- a/sql/scheduler.h
+++ b/sql/scheduler.h
@@ -40,7 +40,7 @@ public:
enum scheduler_types
{
- SCHEDULER_ONE_THREAD_PER_CONNECTION=1,
+ SCHEDULER_ONE_THREAD_PER_CONNECTION=0,
SCHEDULER_NO_THREADS,
SCHEDULER_POOL_OF_THREADS
};
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index a8bac731b87..b1db831318c 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -816,7 +816,20 @@ void THD::awake(THD::killed_state state_to_set)
if (!slave_thread)
thread_scheduler.post_kill_notification(this);
#ifdef SIGNAL_WITH_VIO_CLOSE
- close_active_vio();
+ if (this != current_thd)
+ {
+ /*
+ In addition to a signal, let's close the socket of the thread that
+ is being killed. This is to make sure it does not block if the
+ signal is lost. This needs to be done only on platforms where
+ signals are not a reliable interruption mechanism.
+
+ If we're killing ourselves, we know that we're not blocked, so this
+ hack is not used.
+ */
+
+ close_active_vio();
+ }
#endif
}
if (mysys_var)