1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

Merge pull request #1612 from tntnatbry/MCOL-4188-subquery-orderby-predicateop-fix-dev

MCOL-4188 Regression fixes for MCOL-641.
This commit is contained in:
Roman Nozdrin
2020-11-30 17:17:20 +03:00
committed by GitHub
3 changed files with 29 additions and 17 deletions

View File

@ -215,7 +215,9 @@ void PredicateOperator::setOpType(Type& l, Type& r)
{
// should following the result type that MySQL gives
fOperationType = l;
fOperationType.scale = (l.scale > r.scale ? l.scale : r.scale);
fOperationType.scale = std::max(l.scale, r.scale);
fOperationType.precision = std::max(l.precision, r.precision);
fOperationType.colWidth = std::max(l.colWidth, r.colWidth);
break;
}
@ -229,7 +231,9 @@ void PredicateOperator::setOpType(Type& l, Type& r)
case execplan::CalpontSystemCatalog::UBIGINT:
fOperationType.colDataType = execplan::CalpontSystemCatalog::DECIMAL;
fOperationType.scale = l.scale;
fOperationType.colWidth = 8;
fOperationType.precision = l.precision;
fOperationType.colWidth = (l.colWidth == datatypes::MAXDECIMALWIDTH) ?
l.colWidth : 8;
break;
default:
@ -261,7 +265,9 @@ void PredicateOperator::setOpType(Type& l, Type& r)
case execplan::CalpontSystemCatalog::UBIGINT:
fOperationType.colDataType = execplan::CalpontSystemCatalog::DECIMAL;
fOperationType.scale = r.scale;
fOperationType.colWidth = 8;
fOperationType.precision = r.precision;
fOperationType.colWidth = (r.colWidth == datatypes::MAXDECIMALWIDTH) ?
r.colWidth : 8;
break;
case execplan::CalpontSystemCatalog::LONGDOUBLE:

View File

@ -90,19 +90,23 @@ void getColumnValue(ConstantColumn** cc, uint64_t i, const Row& row, const strin
case CalpontSystemCatalog::DECIMAL:
case CalpontSystemCatalog::UDECIMAL:
data = row.getIntField(i);
oss << (data / IDB_pow[row.getScale(i)]);
if (row.getScale(i) > 0)
if (row.getColumnWidth(i) == datatypes::MAXDECIMALWIDTH)
{
if (data > 0)
oss << "." << (data % IDB_pow[row.getScale(i)]);
else if (data < 0)
oss << "." << (-data % IDB_pow[row.getScale(i)]);
}
int128_t val;
row.getInt128Field(i, val);
*cc = new ConstantColumn(oss.str(),
IDB_Decimal(data, row.getScale(i), row.getPrecision(i)));
IDB_Decimal dec(0, row.getScale(i), row.getPrecision(i), val);
*cc = new ConstantColumn(dec.toString(true), dec);
}
else
{
data = row.getIntField(i);
IDB_Decimal dec(data, row.getScale(i), row.getPrecision(i));
*cc = new ConstantColumn(dec.toString(), dec);
}
break;
case CalpontSystemCatalog::UTINYINT:
@ -119,7 +123,6 @@ void getColumnValue(ConstantColumn** cc, uint64_t i, const Row& row, const strin
oss << fixed << row.getFloatField(i);
*cc = new ConstantColumn(oss.str(), (double) row.getFloatField(i));
break;
break;
case CalpontSystemCatalog::DOUBLE:
oss << fixed << row.getDoubleField(i);

View File

@ -172,8 +172,11 @@ int WideDecimalCompare::operator()(IdbCompare* l, Row::Pointer r1, Row::Pointer
l->row2().setData(r2);
int ret = 0;
int128_t v1 = *(l->row1().getBinaryField_offset<int128_t>(keyColumnOffset));
int128_t v2 = *(l->row2().getBinaryField_offset<int128_t>(keyColumnOffset));
int128_t v1, v2;
l->row1().getInt128Field(fSpec.fIndex, v1);
l->row2().getInt128Field(fSpec.fIndex, v2);
bool v1IsNull = v1 == datatypes::Decimal128Null;
bool v2IsNull = v2 == datatypes::Decimal128Null;