From 6a749c8f583464d2755fc95a16038ed7d52c3bb3 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Thu, 14 Oct 2004 15:47:00 +0300 Subject: [PATCH 1/2] we can't rely on current variables implementation, so have to use String pointer returned by val_str fixed handling errors in case of out of memory in SQL interfase of prepared statements --- sql/sql_parse.cc | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e7a013e19ea..44b0049529e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2005,6 +2005,7 @@ mysql_execute_command(THD *thd) CHARSET_INFO *to_cs= thd->variables.collation_connection; bool need_conversion; user_var_entry *entry; + String *pstr= &str; uint32 unused; /* Convert @var contents to string in connection character set. Although @@ -2020,26 +2021,43 @@ mysql_execute_command(THD *thd) String *pstr; my_bool is_var_null; pstr= entry->val_str(&is_var_null, &str, NOT_FIXED_DEC); + /* + NULL value of variable checked early as entry->value so here + we can't get NULL in normal conditions + */ DBUG_ASSERT(!is_var_null); if (!pstr) - send_error(thd, ER_OUT_OF_RESOURCES); - DBUG_ASSERT(pstr == &str); + { + res= -1; + break; // EOM (error should be reported by allocator) + } } else + { + /* + variable absent or equal to NULL, so we need to set variable to + something reasonable to get readable error message during parsing + */ str.set("NULL", 4, &my_charset_latin1); - need_conversion= - String::needs_conversion(str.length(), str.charset(), to_cs, &unused); + } - query_len= need_conversion? (str.length() * to_cs->mbmaxlen) : - str.length(); + need_conversion= + String::needs_conversion(pstr->length(), pstr->charset(), + to_cs, &unused); + + query_len= need_conversion? (pstr->length() * to_cs->mbmaxlen) : + pstr->length(); if (!(query_str= alloc_root(&thd->mem_root, query_len+1))) - send_error(thd, ER_OUT_OF_RESOURCES); + { + res= -1; + break; // EOM (error should be reported by allocator) + } if (need_conversion) - query_len= copy_and_convert(query_str, query_len, to_cs, str.ptr(), - str.length(), str.charset()); + query_len= copy_and_convert(query_str, query_len, to_cs, pstr->ptr(), + pstr->length(), pstr->charset()); else - memcpy(query_str, str.ptr(), str.length()); + memcpy(query_str, pstr->ptr(), pstr->length()); query_str[query_len]= 0; } else From 7bee6db380db11cb86e28f38a06975c06710124c Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Thu, 21 Oct 2004 10:58:03 +0300 Subject: [PATCH 2/2] force assigning error handler for all mem_roots --- sql/sql_class.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f1c75a3b365..9dcff60dfed 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -222,7 +222,7 @@ THD::THD() init(); /* Initialize sub structures */ - init_alloc_root(&warn_root, WARN_ALLOC_BLOCK_SIZE, WARN_ALLOC_PREALLOC_SIZE); + init_sql_alloc(&warn_root, WARN_ALLOC_BLOCK_SIZE, WARN_ALLOC_PREALLOC_SIZE); user_connect=(USER_CONN *)0; hash_init(&user_vars, &my_charset_bin, USER_VARS_HASH_SIZE, 0, 0, (hash_get_key) get_var_key, @@ -258,7 +258,7 @@ THD::THD() transaction.trans_log.end_of_file= max_binlog_cache_size; } #endif - init_alloc_root(&transaction.mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0); + init_sql_alloc(&transaction.mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0); { ulong tmp=sql_rnd_with_mutex(); randominit(&rand, tmp + (ulong) &rand, tmp + (ulong) ::query_id); @@ -1421,7 +1421,7 @@ Item_arena::Item_arena(bool init_mem_root) state(CONVENTIONAL_EXECUTION) { if (init_mem_root) - init_alloc_root(&mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0); + init_sql_alloc(&mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0); }