diff options
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 79 |
1 files changed, 47 insertions, 32 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index c9d3a506c94..251ecd00242 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -177,9 +177,7 @@ 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; uchar buff[STACK_BUFF_ALLOC]; // Max argument in function - thd->thd_marker.emb_on_expr_nest= NULL; used_tables_cache= not_null_tables_cache= 0; const_item_cache=1; @@ -233,7 +231,6 @@ 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; } @@ -1752,8 +1749,13 @@ longlong Item_func_int_div::val_int() return 0; } + my_decimal truncated; + const bool do_truncate= true; + if (my_decimal_round(E_DEC_FATAL_ERROR, &tmp, 0, do_truncate, &truncated)) + DBUG_ASSERT(false); + longlong res; - if (my_decimal2int(E_DEC_FATAL_ERROR, &tmp, unsigned_flag, &res) & + if (my_decimal2int(E_DEC_FATAL_ERROR, &truncated, unsigned_flag, &res) & E_DEC_OVERFLOW) raise_integer_overflow(); return res; @@ -5152,8 +5154,9 @@ longlong Item_func_get_user_var::val_int() */ -int get_var_with_binlog(THD *thd, enum_sql_command sql_command, - LEX_STRING &name, user_var_entry **out_entry) +static int +get_var_with_binlog(THD *thd, enum_sql_command sql_command, + LEX_STRING &name, user_var_entry **out_entry) { BINLOG_USER_VAR_EVENT *user_var_event; user_var_entry *var_entry; @@ -5283,7 +5286,7 @@ void Item_func_get_user_var::fix_length_and_dec() 'var_entry' is NULL only if there occured an error during the call to get_var_with_binlog. */ - if (var_entry) + if (!error && var_entry) { m_cached_result_type= var_entry->type; unsigned_flag= var_entry->unsigned_flag; @@ -5488,16 +5491,15 @@ void Item_func_get_system_var::fix_length_and_dec() switch (var->show_type()) { - case SHOW_LONG: - case SHOW_INT: case SHOW_HA_ROWS: + case SHOW_UINT: + case SHOW_ULONG: + case SHOW_ULONGLONG: unsigned_flag= TRUE; - collation.set_numeric(); - fix_char_length(MY_INT64_NUM_DECIMAL_DIGITS); - decimals=0; - break; - case SHOW_LONGLONG: - unsigned_flag= TRUE; + /* fall through */ + case SHOW_SINT: + case SHOW_SLONG: + case SHOW_SLONGLONG: collation.set_numeric(); fix_char_length(MY_INT64_NUM_DECIMAL_DIGITS); decimals=0; @@ -5532,13 +5534,11 @@ void Item_func_get_system_var::fix_length_and_dec() break; case SHOW_BOOL: case SHOW_MY_BOOL: - unsigned_flag= FALSE; collation.set_numeric(); fix_char_length(1); decimals=0; break; case SHOW_DOUBLE: - unsigned_flag= FALSE; decimals= 6; collation.set_numeric(); fix_char_length(DBL_DIG + 6); @@ -5562,9 +5562,12 @@ enum Item_result Item_func_get_system_var::result_type() const { case SHOW_BOOL: case SHOW_MY_BOOL: - case SHOW_INT: - case SHOW_LONG: - case SHOW_LONGLONG: + case SHOW_SINT: + case SHOW_SLONG: + case SHOW_SLONGLONG: + case SHOW_UINT: + case SHOW_ULONG: + case SHOW_ULONGLONG: case SHOW_HA_ROWS: return INT_RESULT; case SHOW_CHAR: @@ -5586,9 +5589,12 @@ enum_field_types Item_func_get_system_var::field_type() const { case SHOW_BOOL: case SHOW_MY_BOOL: - case SHOW_INT: - case SHOW_LONG: - case SHOW_LONGLONG: + case SHOW_SINT: + case SHOW_SLONG: + case SHOW_SLONGLONG: + case SHOW_UINT: + case SHOW_ULONG: + case SHOW_ULONGLONG: case SHOW_HA_ROWS: return MYSQL_TYPE_LONGLONG; case SHOW_CHAR: @@ -5657,9 +5663,12 @@ longlong Item_func_get_system_var::val_int() switch (var->show_type()) { - case SHOW_INT: get_sys_var_safe (uint); - case SHOW_LONG: get_sys_var_safe (ulong); - case SHOW_LONGLONG: get_sys_var_safe (ulonglong); + case SHOW_SINT: get_sys_var_safe (int); + case SHOW_SLONG: get_sys_var_safe (long); + case SHOW_SLONGLONG:get_sys_var_safe (longlong); + case SHOW_UINT: get_sys_var_safe (uint); + case SHOW_ULONG: get_sys_var_safe (ulong); + case SHOW_ULONGLONG:get_sys_var_safe (ulonglong); case SHOW_HA_ROWS: get_sys_var_safe (ha_rows); case SHOW_BOOL: get_sys_var_safe (bool); case SHOW_MY_BOOL: get_sys_var_safe (my_bool); @@ -5760,9 +5769,12 @@ String* Item_func_get_system_var::val_str(String* str) break; } - case SHOW_INT: - case SHOW_LONG: - case SHOW_LONGLONG: + case SHOW_SINT: + case SHOW_SLONG: + case SHOW_SLONGLONG: + case SHOW_UINT: + case SHOW_ULONG: + case SHOW_ULONGLONG: case SHOW_HA_ROWS: case SHOW_BOOL: case SHOW_MY_BOOL: @@ -5852,9 +5864,12 @@ double Item_func_get_system_var::val_real() cache_present|= GET_SYS_VAR_CACHE_DOUBLE; return cached_dval; } - case SHOW_INT: - case SHOW_LONG: - case SHOW_LONGLONG: + case SHOW_SINT: + case SHOW_SLONG: + case SHOW_SLONGLONG: + case SHOW_UINT: + case SHOW_ULONG: + case SHOW_ULONGLONG: case SHOW_HA_ROWS: case SHOW_BOOL: case SHOW_MY_BOOL: |