Commit e98a4473 authored by monty@narttu.mysql.fi's avatar monty@narttu.mysql.fi

Fix that round(0.1,1) == round(0.1,1)

parent 21cc72bf
...@@ -679,20 +679,28 @@ double Item_func_round::val() ...@@ -679,20 +679,28 @@ double Item_func_round::val()
double value=args[0]->val(); double value=args[0]->val();
int dec=(int) args[1]->val_int(); int dec=(int) args[1]->val_int();
uint abs_dec=abs(dec); uint abs_dec=abs(dec);
double tmp;
/*
tmp2 is here to avoid return the value with 80 bit precision
This will fix that the test round(0.1,1) = round(0.1,1) is true
*/
volatile double tmp2;
if ((null_value=args[0]->null_value || args[1]->null_value)) if ((null_value=args[0]->null_value || args[1]->null_value))
return 0.0; return 0.0;
double tmp=(abs_dec < array_elements(log_10) ? tmp=(abs_dec < array_elements(log_10) ?
log_10[abs_dec] : pow(10.0,(double) abs_dec)); log_10[abs_dec] : pow(10.0,(double) abs_dec));
if (truncate) if (truncate)
{ {
if (value >= 0) if (value >= 0)
return dec < 0 ? floor(value/tmp)*tmp : floor(value*tmp)/tmp; tmp2= dec < 0 ? floor(value/tmp)*tmp : floor(value*tmp)/tmp;
else else
return dec < 0 ? ceil(value/tmp)*tmp : ceil(value*tmp)/tmp; tmp2= dec < 0 ? ceil(value/tmp)*tmp : ceil(value*tmp)/tmp;
} }
return dec < 0 ? rint(value/tmp)*tmp : rint(value*tmp)/tmp; else
tmp2=dec < 0 ? rint(value/tmp)*tmp : rint(value*tmp)/tmp;
return tmp2;
} }
......
...@@ -1815,7 +1815,8 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type) ...@@ -1815,7 +1815,8 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
if (init_thr_lock() || thd->store_globals()) if (init_thr_lock() || thd->store_globals())
{ {
end_thread(thd,0); thd->cleanup();
delete thd;
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
...@@ -2096,6 +2097,7 @@ extern "C" pthread_handler_decl(handle_slave_io,arg) ...@@ -2096,6 +2097,7 @@ extern "C" pthread_handler_decl(handle_slave_io,arg)
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff // needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
my_thread_init(); my_thread_init();
DBUG_ENTER("handle_slave_io");
#ifndef DBUG_OFF #ifndef DBUG_OFF
slave_begin: slave_begin:
...@@ -2113,7 +2115,6 @@ extern "C" pthread_handler_decl(handle_slave_io,arg) ...@@ -2113,7 +2115,6 @@ extern "C" pthread_handler_decl(handle_slave_io,arg)
#endif #endif
thd= new THD; // note that contructor of THD uses DBUG_ ! thd= new THD; // note that contructor of THD uses DBUG_ !
DBUG_ENTER("handle_slave_io");
THD_CHECK_SENTRY(thd); THD_CHECK_SENTRY(thd);
pthread_detach_this_thread(); pthread_detach_this_thread();
...@@ -2370,6 +2371,7 @@ extern "C" pthread_handler_decl(handle_slave_sql,arg) ...@@ -2370,6 +2371,7 @@ extern "C" pthread_handler_decl(handle_slave_sql,arg)
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff // needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
my_thread_init(); my_thread_init();
DBUG_ENTER("handle_slave_sql");
#ifndef DBUG_OFF #ifndef DBUG_OFF
slave_begin: slave_begin:
...@@ -2382,7 +2384,6 @@ extern "C" pthread_handler_decl(handle_slave_sql,arg) ...@@ -2382,7 +2384,6 @@ extern "C" pthread_handler_decl(handle_slave_sql,arg)
#ifndef DBUG_OFF #ifndef DBUG_OFF
rli->events_till_abort = abort_slave_event_count; rli->events_till_abort = abort_slave_event_count;
#endif #endif
DBUG_ENTER("handle_slave_sql");
thd = new THD; // note that contructor of THD uses DBUG_ ! thd = new THD; // note that contructor of THD uses DBUG_ !
THD_CHECK_SENTRY(thd); THD_CHECK_SENTRY(thd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment