summaryrefslogtreecommitdiff
path: root/sql/mysqld.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/mysqld.cc')
-rw-r--r--sql/mysqld.cc47
1 files changed, 45 insertions, 2 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index eca6e37da15..18c93f676ac 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1286,7 +1286,7 @@ struct my_rnd_struct sql_rand; ///< used by sql_class.cc:THD::THD()
@param level log message level
@param format log message format string
*/
-
+C_MODE_START
static void buffered_option_error_reporter(enum loglevel level,
const char *format, ...)
{
@@ -1299,6 +1299,33 @@ static void buffered_option_error_reporter(enum loglevel level,
buffered_logs.buffer(level, buffer);
}
+
+/**
+ Character set and collation error reporter that prints to sql error log.
+ @param level log message level
+ @param format log message format string
+
+ This routine is used to print character set and collation
+ warnings and errors inside an already running mysqld server,
+ e.g. when a character set or collation is requested for the very first time
+ and its initialization does not go well for some reasons.
+
+ Note: At early mysqld initialization stage,
+ when error log is not yet available,
+ we use buffered_option_error_reporter() instead,
+ to print general character set subsystem initialization errors,
+ such as Index.xml syntax problems, bad XML tag hierarchy, etc.
+*/
+static void charset_error_reporter(enum loglevel level,
+ const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ vprint_msg_to_log(level, format, args);
+ va_end(args);
+}
+C_MODE_END
+
struct passwd *user_info;
static pthread_t select_thread;
#endif
@@ -3377,6 +3404,7 @@ void my_message_sql(uint error, const char *str, myf MyFlags)
#ifndef EMBEDDED_LIBRARY
extern "C" void *my_str_malloc_mysqld(size_t size);
extern "C" void my_str_free_mysqld(void *ptr);
+extern "C" void *my_str_realloc_mysqld(void *ptr, size_t size);
void *my_str_malloc_mysqld(size_t size)
{
@@ -3388,6 +3416,11 @@ void my_str_free_mysqld(void *ptr)
{
my_free(ptr);
}
+
+void *my_str_realloc_mysqld(void *ptr, size_t size)
+{
+ return my_realloc(ptr, size, MYF(MY_FAE));
+}
#endif /* EMBEDDED_LIBRARY */
@@ -4543,6 +4576,15 @@ static int init_server_components()
buffered_logs.cleanup();
#endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */
+#ifndef EMBEDDED_LIBRARY
+ /*
+ Now that the logger is available, redirect character set
+ errors directly to the logger
+ (instead of the buffered_logs used at the server startup time).
+ */
+ my_charset_error_reporter= charset_error_reporter;
+#endif
+
if (xid_cache_init())
{
sql_print_error("Out of memory");
@@ -5221,10 +5263,11 @@ int mysqld_main(int argc, char **argv)
#endif
/*
- Initialize my_str_malloc() and my_str_free()
+ Initialize my_str_malloc(), my_str_realloc() and my_str_free()
*/
my_str_malloc= &my_str_malloc_mysqld;
my_str_free= &my_str_free_mysqld;
+ my_str_realloc= &my_str_realloc_mysqld;
/*
init signals & alarm