diff options
author | unknown <bell@sanja.is.com.ua> | 2004-10-15 17:02:17 +0300 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2004-10-15 17:02:17 +0300 |
commit | 4b379778c822e780722cf08333ad461564113131 (patch) | |
tree | 99992d55390095263b9a6cd458b57764e2a7d8d5 /sql | |
parent | f125849dd1fa2b7eaca3aea5f84d7d79fb201ec2 (diff) | |
parent | 8141b058ff58ce58079efb02a5b2d730a1b46c81 (diff) | |
download | mariadb-git-4b379778c822e780722cf08333ad461564113131.tar.gz |
Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.1
into sanja.is.com.ua:/home/bell/mysql/bk/work-sub-4.1
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_parse.cc | 36 |
1 files changed, 27 insertions, 9 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); + String::needs_conversion(pstr->length(), pstr->charset(), + to_cs, &unused); - query_len= need_conversion? (str.length() * to_cs->mbmaxlen) : - str.length(); + 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 |