You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
MCOL-174 Replace custom helpers::power() with standard pow(). helpers::power() breaks with #dec > 9
This commit is contained in:
@ -106,9 +106,9 @@ bool getUIntValFromParm(
|
|||||||
{
|
{
|
||||||
d.value = 0;
|
d.value = 0;
|
||||||
}
|
}
|
||||||
|
double dscale = d.scale;
|
||||||
int64_t tmpval = d.value / helpers::power(d.scale);
|
int64_t tmpval = d.value / pow(10.0, dscale);
|
||||||
int lefto = (d.value - tmpval * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
int lefto = (d.value - tmpval * pow(10.0, dscale)) / pow(10.0, dscale - 1);
|
||||||
|
|
||||||
if ( tmpval >= 0 && lefto > 4 )
|
if ( tmpval >= 0 && lefto > 4 )
|
||||||
tmpval++;
|
tmpval++;
|
||||||
|
@ -180,8 +180,9 @@ int64_t Func_cast_signed::getIntVal(Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
int64_t value = d.value / helpers::power(d.scale);
|
double dscale = d.scale;
|
||||||
int lefto = (d.value - value * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
int64_t value = d.value / pow(10.0, dscale);
|
||||||
|
int lefto = (d.value - value * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( value >= 0 && lefto > 4 )
|
if ( value >= 0 && lefto > 4 )
|
||||||
value++;
|
value++;
|
||||||
@ -328,14 +329,15 @@ uint64_t Func_cast_unsigned::getUintVal(Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
|
double dscale = d.scale;
|
||||||
|
|
||||||
if (d.value < 0)
|
if (d.value < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t value = d.value / helpers::power(d.scale);
|
uint64_t value = d.value / pow(10.0, dscale);
|
||||||
int lefto = (d.value - value * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
int lefto = (d.value - value * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( value >= 0 && lefto > 4 )
|
if ( value >= 0 && lefto > 4 )
|
||||||
value++;
|
value++;
|
||||||
|
@ -156,9 +156,10 @@ string Func_char::getStrVal(Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
|
double dscale = d.scale;
|
||||||
// get decimal and round up
|
// get decimal and round up
|
||||||
int value = d.value / helpers::power(d.scale);
|
int value = d.value / pow(10.0, dscale);
|
||||||
int lefto = (d.value - value * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
int lefto = (d.value - value * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( lefto > 4 )
|
if ( lefto > 4 )
|
||||||
value++;
|
value++;
|
||||||
|
@ -71,8 +71,9 @@ string Func_elt::getStrVal(rowgroup::Row& row,
|
|||||||
case CalpontSystemCatalog::DECIMAL:
|
case CalpontSystemCatalog::DECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
number = d.value / helpers::power(d.scale);
|
double dscale = d.scale;
|
||||||
int lefto = (d.value - number * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
number = d.value / pow(10.0, dscale);
|
||||||
|
int lefto = (d.value - number * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( number >= 0 && lefto > 4 )
|
if ( number >= 0 && lefto > 4 )
|
||||||
number++;
|
number++;
|
||||||
|
@ -68,8 +68,9 @@ uint64_t makedate(rowgroup::Row& row,
|
|||||||
case CalpontSystemCatalog::DECIMAL:
|
case CalpontSystemCatalog::DECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
year = d.value / helpers::power(d.scale);
|
double dscale = d.scale;
|
||||||
int lefto = (d.value - year * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
year = d.value / pow(10.0, dscale);
|
||||||
|
int lefto = (d.value - year * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( year >= 0 && lefto > 4 )
|
if ( year >= 0 && lefto > 4 )
|
||||||
year++;
|
year++;
|
||||||
@ -127,8 +128,9 @@ uint64_t makedate(rowgroup::Row& row,
|
|||||||
case CalpontSystemCatalog::DECIMAL:
|
case CalpontSystemCatalog::DECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[1]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[1]->data()->getDecimalVal(row, isNull);
|
||||||
int64_t tmp = d.value / helpers::power(d.scale);
|
double dscale = d.scale;
|
||||||
int lefto = (d.value - tmp * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
int64_t tmp = d.value / pow(10.0, dscale);
|
||||||
|
int lefto = (d.value - tmp * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( tmp >= 0 && lefto > 4 )
|
if ( tmp >= 0 && lefto > 4 )
|
||||||
tmp++;
|
tmp++;
|
||||||
|
@ -74,8 +74,9 @@ string Func_maketime::getStrVal(rowgroup::Row& row,
|
|||||||
case CalpontSystemCatalog::DECIMAL:
|
case CalpontSystemCatalog::DECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
hour = d.value / helpers::power(d.scale);
|
double dscale = d.scale;
|
||||||
int lefto = (d.value - hour * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
hour = d.value / pow(10.0, dscale);
|
||||||
|
int lefto = (d.value - hour * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( hour >= 0 && lefto > 4 )
|
if ( hour >= 0 && lefto > 4 )
|
||||||
hour++;
|
hour++;
|
||||||
@ -113,8 +114,9 @@ string Func_maketime::getStrVal(rowgroup::Row& row,
|
|||||||
case CalpontSystemCatalog::DECIMAL:
|
case CalpontSystemCatalog::DECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[1]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[1]->data()->getDecimalVal(row, isNull);
|
||||||
min = d.value / helpers::power(d.scale);
|
double dscale = d.scale;
|
||||||
int lefto = (d.value - min * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
min = d.value / pow(10.0, dscale);
|
||||||
|
int lefto = (d.value - min * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( min >= 0 && lefto > 4 )
|
if ( min >= 0 && lefto > 4 )
|
||||||
min++;
|
min++;
|
||||||
@ -158,8 +160,9 @@ string Func_maketime::getStrVal(rowgroup::Row& row,
|
|||||||
case CalpontSystemCatalog::DECIMAL:
|
case CalpontSystemCatalog::DECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[2]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[2]->data()->getDecimalVal(row, isNull);
|
||||||
sec = d.value / helpers::power(d.scale);
|
double dscale = d.scale;
|
||||||
int lefto = (d.value - sec * helpers::power(d.scale)) / helpers::power(d.scale - 1);
|
sec = d.value / pow(10.0, dscale);
|
||||||
|
int lefto = (d.value - sec * pow(10.0, dscale)) / pow(dscale - 1);
|
||||||
|
|
||||||
if ( sec >= 0 && lefto > 4 )
|
if ( sec >= 0 && lefto > 4 )
|
||||||
sec++;
|
sec++;
|
||||||
|
@ -74,10 +74,10 @@ IDB_Decimal Func_mod::getDecimalVal(Row& row,
|
|||||||
}
|
}
|
||||||
|
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
int64_t value = d.value / helpers::power(d.scale);
|
int64_t value = d.value / pow(10.0, d.scale);
|
||||||
int lefto = d.value % helpers::power(d.scale);
|
int lefto = d.value % pow(10.0, d.scale);
|
||||||
|
|
||||||
int64_t mod = (value % div) * helpers::power(d.scale) + lefto;
|
int64_t mod = (value % div) * pow(10.0, d.scale) + lefto;
|
||||||
|
|
||||||
retValue.value = mod;
|
retValue.value = mod;
|
||||||
retValue.scale = d.scale;
|
retValue.scale = d.scale;
|
||||||
@ -164,7 +164,7 @@ double Func_mod::getDoubleVal(Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
int64_t value = d.value / helpers::power(d.scale);
|
int64_t value = d.value / pow(10.0, d.scale);
|
||||||
|
|
||||||
mod = value % div;
|
mod = value % div;
|
||||||
}
|
}
|
||||||
@ -268,7 +268,7 @@ long double Func_mod::getLongDoubleVal(Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
int64_t value = d.value / helpers::power(d.scale);
|
int64_t value = d.value / pow(10.0, d.scale);
|
||||||
|
|
||||||
mod = value % div;
|
mod = value % div;
|
||||||
}
|
}
|
||||||
@ -375,7 +375,7 @@ int64_t Func_mod::getIntVal(Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
int64_t value = d.value / helpers::power(d.scale);
|
int64_t value = d.value / pow(10.0, d.scale);
|
||||||
|
|
||||||
mod = value % div;
|
mod = value % div;
|
||||||
}
|
}
|
||||||
@ -473,7 +473,7 @@ uint64_t Func_mod::getUIntVal(Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
int64_t value = d.value / helpers::power(d.scale);
|
int64_t value = d.value / pow(10.0, d.scale);
|
||||||
|
|
||||||
mod = value % div;
|
mod = value % div;
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ int64_t Func_period_diff::getIntVal(rowgroup::Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[0]->data()->getDecimalVal(row, isNull);
|
||||||
period1 = d.value / helpers::power(d.scale);
|
period1 = d.value / pow(10.0, d.scale);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ int64_t Func_period_diff::getIntVal(rowgroup::Row& row,
|
|||||||
case execplan::CalpontSystemCatalog::UDECIMAL:
|
case execplan::CalpontSystemCatalog::UDECIMAL:
|
||||||
{
|
{
|
||||||
IDB_Decimal d = parm[1]->data()->getDecimalVal(row, isNull);
|
IDB_Decimal d = parm[1]->data()->getDecimalVal(row, isNull);
|
||||||
period2 = d.value / helpers::power(d.scale);
|
period2 = d.value / pow(10.0, d.scale);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user