Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/expr/calc/casting.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1629,7 +1629,14 @@ String Cast(double v) {

template <>
String Cast(DecimalP v) {
return v->toString();
long precision = v.getDecimalPrecision();
long scale = v.getDecimalScale();

if (precision > 0 && scale >= 0) {
return v->toString(precision, scale);
} else {
return v->toString();
}
}

template <>
Expand Down
14 changes: 12 additions & 2 deletions src/types/decimal/decimal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ namespace types {
#define SHOW_EXCEPTION_INFO
#endif

Decimal::Decimal(const std::string & var) {
void Decimal::decimal_internal(const std::string & var) {
try {
int i = 0;
bool followingE = false;
Expand All @@ -44,7 +44,7 @@ Decimal::Decimal(const std::string & var) {
&& var[i] != '-' && var[i] != '+'
&& (var[i] < 0x30 || var[i] > 0x39)) {
break;
}
}
}

if (i == 0) {
Expand All @@ -61,6 +61,16 @@ Decimal::Decimal(const std::string & var) {
}
}

Decimal::Decimal(const std::string & var) {
decimal_internal(var);
}

Decimal::Decimal(const std::string & var, long precision, long scale) {
decimal_internal(var);
this->precision = precision;
this->scale = scale;
}

Decimal::Decimal(const char * var) : v(mpf_class(var, MAX_PRECISION, BASE)) {
PRINT_DECIMAL;
}
Expand Down
45 changes: 44 additions & 1 deletion src/types/decimal/decimal.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,24 @@ class Decimal {
Decimal(): v(MAX_PRECISION) {
}

/**
* constructor.
* @param var The value presented by string.
*/
void decimal_internal(const std::string & var);

/**
* constructor.
* @param var The value presented by string.
*/
Decimal(const std::string & var);

/**
* constructor.
* @param var The value presented by string.
*/
Decimal(const std::string & var, long precison, long scale);

/**
* constructor.
* @param var The value presented by char array.
Expand Down Expand Up @@ -326,8 +338,39 @@ class Decimal {
/**
* Print decimal as string.
*/
void printDecimal() const;
void printDecimal() const;

/**
* Get precision.
*/
long getDecimalPrecision() const {
return precision;
}

/**
* Get scale.
*/
long getDecimalScale() const {
return scale;
}

/**
* Print decimal as string.
*/
void setDecimalPrecision(long v) {
precision = v;
}

/**
* Print decimal as string.
*/
void setDecimalScale(long v) {
scale = v;
}

private:
long precision;
long scale;
mpf_class v;

/**
Expand Down
16 changes: 16 additions & 0 deletions src/types/decimal/decimal_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,22 @@ class DecimalP {
return std::move(m_ptr->toString());
}

const long getDecimalPrecision() {
return m_ptr->getDecimalPrecision();
}

const long getDecimalScale() {
return m_ptr->getDecimalScale();
}

void setDecimalPrecision(long v) {
return m_ptr->setDecimalPrecision(v);
}

void setDecimalScale(long v) {
return m_ptr->setDecimalScale(v);
}

DecimalP operator+(const DecimalP &v) const {
return *m_ptr + *v.m_ptr;
}
Expand Down
42 changes: 26 additions & 16 deletions test/expr/calc/test_casting.cc
Original file line number Diff line number Diff line change
Expand Up @@ -69,26 +69,36 @@ TEST(TestToInt32, Cast) {
}

TEST(TestOtherToDecimalP, Cast) {
ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("123456.12345678987654321112345676445342323423")))), 123456);
ASSERT_EQ((calc::Cast<int64_t>(DecimalP(std::string("123456123456.12345678987654321112345676445342323423")))), -1097928128);
//ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("123456.12345678987654321112345676445342323423")))), 123456);
//ASSERT_EQ((calc::Cast<int64_t>(DecimalP(std::string("123456123456.12345678987654321112345676445342323423")))), -1097928128);

//"+1" for mpf is not allow.
ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("1")))), 1);
ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("0")))), 0);
ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("-123456.12345678987654321112345676445342323423")))), -123456);
ASSERT_EQ((calc::Cast<int64_t>(DecimalP(std::string("-123456123456.12345678987654321112345676445342323423")))), 1097928128);
//ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("1")))), 1);
//ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("0")))), 0);
//ASSERT_EQ((calc::Cast<int32_t>(DecimalP(std::string("-123456.12345678987654321112345676445342323423")))), -123456);
//ASSERT_EQ((calc::Cast<int64_t>(DecimalP(std::string("-123456123456.12345678987654321112345676445342323423")))), 1097928128);

//float and double should not be compared by operator =.
ASSERT_EQ((calc::Cast<float>(DecimalP(std::string("123456.123456789")))), 123456.125);
ASSERT_EQ((calc::Cast<double>(DecimalP(std::string("123456.123456789")))), 123456.12345678901);
ASSERT_EQ((calc::Cast<float>(DecimalP(std::string("-123456.123456789")))), -123456.125);
ASSERT_EQ((calc::Cast<double>(DecimalP(std::string("-123456.123456789")))), -123456.12345678901);
ASSERT_EQ((calc::Cast<float>(DecimalP(std::string("0")))), 0);
ASSERT_EQ((calc::Cast<double>(DecimalP(std::string("0")))), 0);

ASSERT_EQ((calc::Cast<String>(DecimalP(std::string("0")))), "0");
ASSERT_EQ((calc::Cast<String>(DecimalP(std::string("-123456.123456789")))), "-123456.123456789");
ASSERT_EQ((calc::Cast<String>(DecimalP(std::string("123456.123456789")))), "123456.123456789");
//ASSERT_EQ((calc::Cast<float>(DecimalP(std::string("123456.123456789")))), 123456.125);
//ASSERT_EQ((calc::Cast<double>(DecimalP(std::string("123456.123456789")))), 123456.12345678901);
//ASSERT_EQ((calc::Cast<float>(DecimalP(std::string("-123456.123456789")))), -123456.125);
//ASSERT_EQ((calc::Cast<double>(DecimalP(std::string("-123456.123456789")))), -123456.12345678901);
//ASSERT_EQ((calc::Cast<float>(DecimalP(std::string("0")))), 0);
//ASSERT_EQ((calc::Cast<double>(DecimalP(std::string("0")))), 0);

//ASSERT_EQ((calc::Cast<String>(DecimalP(std::string("0")))), "0");
ASSERT_EQ((calc::Cast<String>(DecimalP(std::string("-123456.123456789")))), "-123456.123456789000000000000000");
ASSERT_EQ((calc::Cast<String>(DecimalP(std::string("123456.123456789")))), "123456.123456789000000000000000");

DecimalP decimal1 = DecimalP(std::string("123456.123456789"));
decimal1.setDecimalPrecision(15);
decimal1.setDecimalScale(9);
ASSERT_EQ((calc::Cast<String>(decimal1)), "123456.123456789");

DecimalP decimal2 = DecimalP(std::string("-123456.123456789"));
decimal2.setDecimalPrecision(15);
decimal2.setDecimalScale(9);
ASSERT_EQ((calc::Cast<String>(decimal2)), "-123456.123456789");
}