Commit 6a749c8f authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

we can't rely on current variables implementation, so have to use String...

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
parent 2f8f0f2e
...@@ -2005,6 +2005,7 @@ mysql_execute_command(THD *thd) ...@@ -2005,6 +2005,7 @@ mysql_execute_command(THD *thd)
CHARSET_INFO *to_cs= thd->variables.collation_connection; CHARSET_INFO *to_cs= thd->variables.collation_connection;
bool need_conversion; bool need_conversion;
user_var_entry *entry; user_var_entry *entry;
String *pstr= &str;
uint32 unused; uint32 unused;
/* /*
Convert @var contents to string in connection character set. Although Convert @var contents to string in connection character set. Although
...@@ -2020,26 +2021,43 @@ mysql_execute_command(THD *thd) ...@@ -2020,26 +2021,43 @@ mysql_execute_command(THD *thd)
String *pstr; String *pstr;
my_bool is_var_null; my_bool is_var_null;
pstr= entry->val_str(&is_var_null, &str, NOT_FIXED_DEC); 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); DBUG_ASSERT(!is_var_null);
if (!pstr) if (!pstr)
send_error(thd, ER_OUT_OF_RESOURCES); {
DBUG_ASSERT(pstr == &str); res= -1;
break; // EOM (error should be reported by allocator)
}
} }
else 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); str.set("NULL", 4, &my_charset_latin1);
}
need_conversion= need_conversion=
String::needs_conversion(str.length(), str.charset(), to_cs, &unused); String::needs_conversion(pstr->length(), pstr->charset(),
to_cs, &unused);
query_len= need_conversion? (str.length() * to_cs->mbmaxlen) : query_len= need_conversion? (pstr->length() * to_cs->mbmaxlen) :
str.length(); pstr->length();
if (!(query_str= alloc_root(&thd->mem_root, query_len+1))) 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) if (need_conversion)
query_len= copy_and_convert(query_str, query_len, to_cs, str.ptr(), query_len= copy_and_convert(query_str, query_len, to_cs, pstr->ptr(),
str.length(), str.charset()); pstr->length(), pstr->charset());
else else
memcpy(query_str, str.ptr(), str.length()); memcpy(query_str, pstr->ptr(), pstr->length());
query_str[query_len]= 0; query_str[query_len]= 0;
} }
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment