diff options
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index 6ff743ed91d..1823f4bb7a5 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -150,9 +150,11 @@ Item_func::fix_fields(THD *thd, Item **ref) { DBUG_ASSERT(fixed == 0); Item **arg,**arg_end; + TABLE_LIST *save_emb_on_expr_nest= thd->thd_marker.emb_on_expr_nest; #ifndef EMBEDDED_LIBRARY // Avoid compiler warning uchar buff[STACK_BUFF_ALLOC]; // Max argument in function #endif + thd->thd_marker.emb_on_expr_nest= NULL; used_tables_cache= not_null_tables_cache= 0; const_item_cache=1; @@ -206,6 +208,7 @@ Item_func::fix_fields(THD *thd, Item **ref) if (thd->is_error()) // An error inside fix_length_and_dec occured return TRUE; fixed= 1; + thd->thd_marker.emb_on_expr_nest= save_emb_on_expr_nest; return FALSE; } @@ -225,6 +228,28 @@ Item_func::quick_fix_field() } +void Item_func::fix_after_pullout(st_select_lex *new_parent, Item **ref) +{ + Item **arg,**arg_end; + + used_tables_cache= not_null_tables_cache= 0; + const_item_cache=1; + + if (arg_count) + { + for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++) + { + (*arg)->fix_after_pullout(new_parent, arg); + Item *item= *arg; + + used_tables_cache|= item->used_tables(); + not_null_tables_cache|= item->not_null_tables(); + const_item_cache&= item->const_item(); + } + } +} + + bool Item_func::walk(Item_processor processor, bool walk_subquery, uchar *argument) { @@ -486,12 +511,12 @@ Field *Item_func::tmp_table_field(TABLE *table) return field; } - +/* bool Item_func::is_expensive_processor(uchar *arg) { return is_expensive(); } - +*/ my_decimal *Item_func::val_decimal(my_decimal *decimal_value) { @@ -2967,7 +2992,7 @@ udf_handler::fix_fields(THD *thd, Item_result_field *func, String *res= arguments[i]->val_str(&buffers[i]); if (arguments[i]->null_value) continue; - f_args.args[i]= (char*) res->c_ptr(); + f_args.args[i]= (char*) res->c_ptr_safe(); f_args.lengths[i]= res->length(); break; } |