diff options
author | anozdrin@mysql.com <> | 2005-12-07 17:01:17 +0300 |
---|---|---|
committer | anozdrin@mysql.com <> | 2005-12-07 17:01:17 +0300 |
commit | 0ff8f60b45552c7c78221f3e47219feafa63eb62 (patch) | |
tree | 82814a574624a8e813cc8dfad8c31d3fa4adf898 /sql/item_func.cc | |
parent | c6fc5d35ccfbfe2319d962e20d51b4b1db4a92ea (diff) | |
download | mariadb-git-0ff8f60b45552c7c78221f3e47219feafa63eb62.tar.gz |
Patch for WL#2894: Make stored routine variables work
according to the standard.
The idea is to use Field-classes to implement stored routines
variables. Also, we should provide facade to Item-hierarchy
by Item_field class (it is necessary, since SRVs take part
in expressions).
The patch fixes the following bugs:
- BUG#8702: Stored Procedures: No Error/Warning shown for inappropriate data
type matching;
- BUG#8768: Functions: For any unsigned data type, -ve values can be passed
and returned;
- BUG#8769: Functions: For Int datatypes, out of range values can be passed
and returned;
- BUG#9078: STORED PROCDURE: Decimal digits are not displayed when we use
DECIMAL datatype;
- BUG#9572: Stored procedures: variable type declarations ignored;
- BUG#12903: upper function does not work inside a function;
- BUG#13705: parameters to stored procedures are not verified;
- BUG#13808: ENUM type stored procedure parameter accepts non-enumerated
data;
- BUG#13909: Varchar Stored Procedure Parameter always BINARY string (ignores
CHARACTER SET);
- BUG#14161: Stored procedure cannot retrieve bigint unsigned;
- BUG#14188: BINARY variables have no 0x00 padding;
- BUG#15148: Stored procedure variables accept non-scalar values;
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index 89561e8eb17..0d3bd08b230 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -4716,7 +4716,7 @@ Item_func_sp::sp_result_field(void) const share->table_cache_key = empty_name; share->table_name = empty_name; } - field= m_sp->make_field(max_length, name, dummy_table); + field= m_sp->create_result_field(max_length, name, dummy_table); DBUG_RETURN(field); } @@ -4729,17 +4729,17 @@ Item_func_sp::sp_result_field(void) const 1 value = NULL or error */ -int +bool Item_func_sp::execute(Field **flp) { - Item *it; + THD *thd= current_thd; Field *f; - if (execute(&it)) - { - null_value= 1; - context->process_error(current_thd); - return 1; - } + + /* + Get field in virtual tmp table to store result. Create the field if + invoked first time. + */ + if (!(f= *flp)) { *flp= f= sp_result_field(); @@ -4748,20 +4748,33 @@ Item_func_sp::execute(Field **flp) f->null_ptr= (uchar *)&null_value; f->null_bit= 1; } - it->save_in_field(f, 1); - return null_value= f->is_null(); + + /* Execute function and store the return value in the field. */ + + if (execute_impl(thd, f)) + { + null_value= 1; + context->process_error(thd); + return TRUE; + } + + /* Check that the field (the value) is not NULL. */ + + null_value= f->is_null(); + + return null_value; } -int -Item_func_sp::execute(Item **itp) +bool +Item_func_sp::execute_impl(THD *thd, Field *return_value_fld) { - DBUG_ENTER("Item_func_sp::execute"); - THD *thd= current_thd; - int res= -1; + bool err_status= TRUE; Sub_statement_state statement_state; Security_context *save_security_ctx= thd->security_ctx, *save_ctx_func; + DBUG_ENTER("Item_func_sp::execute_impl"); + #ifndef NO_EMBEDDED_ACCESS_CHECKS if (context->security_ctx) { @@ -4778,7 +4791,7 @@ Item_func_sp::execute(Item **itp) function call into binlog. */ thd->reset_sub_statement_state(&statement_state, SUB_STMT_FUNCTION); - res= m_sp->execute_function(thd, args, arg_count, itp); + err_status= m_sp->execute_function(thd, args, arg_count, return_value_fld); thd->restore_sub_statement_state(&statement_state); #ifndef NO_EMBEDDED_ACCESS_CHECKS @@ -4788,7 +4801,7 @@ error: #else error: #endif - DBUG_RETURN(res); + DBUG_RETURN(err_status); } @@ -4884,7 +4897,7 @@ Item_func_sp::tmp_table_field(TABLE *t_arg) DBUG_ENTER("Item_func_sp::tmp_table_field"); if (m_sp) - res= m_sp->make_field(max_length, (const char *)name, t_arg); + res= m_sp->create_result_field(max_length, (const char*) name, t_arg); if (!res) res= Item_func::tmp_table_field(t_arg); |