diff options
author | unknown <sergefp@mysql.com> | 2004-06-07 12:09:10 +0400 |
---|---|---|
committer | unknown <sergefp@mysql.com> | 2004-06-07 12:09:10 +0400 |
commit | 1d4ee7f81c1fff2579c3aab8690f977e99a4840e (patch) | |
tree | d9e21b580f2c05293aaca3cb0c7ad13a850f0bad /sql/sql_parse.cc | |
parent | e9c4cea9dea039c79c99940007833d7dde2c59dc (diff) | |
download | mariadb-git-1d4ee7f81c1fff2579c3aab8690f977e99a4840e.tar.gz |
Post review fixes for "SQL Syntax for Prepared Statements".
mysql-test/r/ps.result:
Better error message
mysys/my_error.c:
Comments added
sql/item.cc:
Moved a chunk of code from sql_prepare.cc to Item_param::set_from_user_var
sql/item.h:
Moved a chunk of code from sql_prepare.cc to Item_param::set_from_user_var
sql/item_func.cc:
Code cleanup
sql/mysql_priv.h:
Code cleanup
sql/sql_class.cc:
Code cleanup
sql/sql_parse.cc:
use user_var_entry::val_str in PREPARE stmt FROM @var.
sql/sql_prepare.cc:
Post-review fixes and code cleanup.
sql/sql_yacc.yy:
Coding style fixes
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r-- | sql/sql_parse.cc | 80 |
1 files changed, 26 insertions, 54 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac304554d78..384d05ad94e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1976,86 +1976,59 @@ mysql_execute_command(THD *thd) break; } case SQLCOM_PREPARE: - { + { char *query_str; uint query_len; if (lex->prepared_stmt_code_is_varref) { /* This is PREPARE stmt FROM @var. */ String str; + String *pstr; CHARSET_INFO *to_cs= thd->variables.collation_connection; - CHARSET_INFO *from_cs; - const char *buf; - uint buf_len; bool need_conversion; - LINT_INIT(from_cs); /* protected by need_conversion */ user_var_entry *entry; uint32 unused; /* - Convert @var contents to string in connection character set. Although - it is known that int/real/NULL value cannot be a valid query we still - convert it for error messages to uniform. + Convert @var contents to string in connection character set. Although + it is known that int/real/NULL value cannot be a valid query we still + convert it for error messages to uniform. */ - if ((entry= - (user_var_entry*)hash_search(&thd->user_vars, + if ((entry= + (user_var_entry*)hash_search(&thd->user_vars, (byte*)lex->prepared_stmt_code.str, lex->prepared_stmt_code.length)) && entry->value) { - switch (entry->type) - { - case REAL_RESULT: - str.set(*(double*)entry->value, NOT_FIXED_DEC, to_cs); - buf_len= str.length(); - buf= str.ptr(); - need_conversion= false; - break; - case INT_RESULT: - str.set(*(longlong*)entry->value, to_cs); - buf_len= str.length(); - buf= str.ptr(); - need_conversion= false; - break; - case STRING_RESULT: - buf_len= entry->length; - buf= entry->value; - from_cs = entry->collation.collation; - need_conversion= String::needs_conversion(entry->length, from_cs, - to_cs, &unused); - break; - default: - buf= ""; - need_conversion= false; - buf_len= 0; - DBUG_ASSERT(0); - } + String *pstr; + my_bool is_var_null; + pstr= entry->val_str(&is_var_null, &str, NOT_FIXED_DEC); + DBUG_ASSERT(!is_var_null); + if (!pstr) + send_error(thd, ER_OUT_OF_RESOURCES); + DBUG_ASSERT(pstr == &str); } else - { - from_cs= &my_charset_bin; - str.set("NULL", 4, from_cs); - buf= str.ptr(); - buf_len= str.length(); - need_conversion= String::needs_conversion(str.length(), from_cs, - to_cs, &unused); - } - - query_len = need_conversion? (buf_len * to_cs->mbmaxlen) : buf_len; + 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(); if (!(query_str= alloc_root(&thd->mem_root, query_len+1))) send_error(thd, ER_OUT_OF_RESOURCES); - + if (need_conversion) - query_len= copy_and_convert(query_str, query_len, to_cs, buf, buf_len, - from_cs); + query_len= copy_and_convert(query_str, query_len, to_cs, str.ptr(), + str.length(), str.charset()); else - memcpy(query_str, buf, query_len); + memcpy(query_str, str.ptr(), str.length()); query_str[query_len]= 0; } else { query_str= lex->prepared_stmt_code.str; query_len= lex->prepared_stmt_code.length; - DBUG_PRINT("info", ("PREPARE: %.*s FROM '%.*s' \n", + DBUG_PRINT("info", ("PREPARE: %.*s FROM '%.*s' \n", lex->prepared_stmt_name.length, lex->prepared_stmt_name.str, query_len, query_str)); @@ -2068,7 +2041,7 @@ mysql_execute_command(THD *thd) } case SQLCOM_EXECUTE: { - DBUG_PRINT("info", ("EXECUTE: %.*s\n", + DBUG_PRINT("info", ("EXECUTE: %.*s\n", lex->prepared_stmt_name.length, lex->prepared_stmt_name.str)); mysql_sql_stmt_execute(thd, &lex->prepared_stmt_name); @@ -3559,7 +3532,6 @@ error: */ int check_one_table_access(THD *thd, ulong privilege, TABLE_LIST *tables) - { if (check_access(thd, privilege, tables->db, &tables->grant.privilege,0,0)) return 1; |