static int decimal_bool(const ObObjCastParams ¶ms, const ObExprObj &in, ObExprObj &out) { UNUSED(params); OB_ASSERT(in.get_type() == ObDecimalType); out.set_bool(!in.get_decimal().is_zero()); return OB_SUCCESS; }
static int decimal_mtime(const ObObjCastParams ¶ms, const ObExprObj &in, ObExprObj &out) { int ret = OB_SUCCESS; UNUSED(params); OB_ASSERT(in.get_type() == ObDecimalType); int64_t i64 = 0; if (OB_SUCCESS != (ret = in.get_decimal().cast_to_int64(i64))) { jlog(WARNING, "failed to cast to int64, err=%d", ret); } else { out.set_mtime(static_cast<ObModifyTime> (i64)); } return ret; }
static int decimal_double(const ObObjCastParams ¶ms, const ObExprObj &in, ObExprObj &out) { UNUSED(params); OB_ASSERT(in.get_type() == ObDecimalType); // decimal -> string -> float char buf[ObNumber::MAX_PRINTABLE_SIZE]; memset(buf, 0, ObNumber::MAX_PRINTABLE_SIZE); in.get_decimal().to_string(buf, ObNumber::MAX_PRINTABLE_SIZE); double v = 0.0; if (1 == sscanf(buf, "%lf", &v)) { out.set_double(v); } else { out.set_double(0.0); } return OB_SUCCESS; }
static int decimal_varchar(const ObObjCastParams ¶ms, const ObExprObj &in, ObExprObj &out) { int ret = OB_SUCCESS; UNUSED(params); OB_ASSERT(in.get_type() == ObDecimalType); string varchar = out.get_varchar(); if (varchar.length() < ObNumber::MAX_PRINTABLE_SIZE) { jlog(WARNING, "output buffer for varchar not enough, buf_len=%d", varchar.length()); ret = OB_INVALID_ARGUMENT; } else { int64_t length = in.get_decimal().to_string((char*) varchar.data(), varchar.length()); string varchar2(varchar); out.set_varchar(varchar2); } return ret; }
BLOCK_FUNC() { ObExprObj t1; ObExprObj t2; ObExprObj res; int64_t i1 = 0; int64_t i2 = 0; const int64_t buf_len = ObNumber::MAX_PRINTABLE_SIZE; char res_buf[buf_len]; int err = OB_SUCCESS; // int add int t1.set_int(1); t2.set_int(2); EXPECT_EQ(OB_SUCCESS, t1.add(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_int(i2)); ASSERT_EQ(3, i2); // int add dec t1.set_int(1); t2.set_decimal("2.2"); EXPECT_EQ(OB_SUCCESS, t1.add(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("3.2", res_buf); // dec add dec t1.set_decimal("10"); t2.set_decimal("2.2"); EXPECT_EQ(OB_SUCCESS, t1.add(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("12.2", res_buf); // int sub int t1.set_int(4); t2.set_int(2); EXPECT_EQ(OB_SUCCESS, t1.sub(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_int(i2)); ASSERT_EQ(2, i2); // int sub dec t1.set_int(4); t2.set_decimal("3.0"); EXPECT_EQ(OB_SUCCESS, t1.sub(t2, res)); EXPECT_EQ(OB_SUCCESS, t1.sub(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("1.0", res_buf); // dec sub dec t1.set_decimal("4"); t2.set_decimal("2.0"); EXPECT_EQ(OB_SUCCESS, t1.sub(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("2.0", res_buf); // int mul int t1.set_int(4); t2.set_int(2); EXPECT_EQ(OB_SUCCESS, t1.mul(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_int(i2)); ASSERT_EQ(8, i2); // int mul dec t1.set_int(4); t2.set_decimal("2.0"); EXPECT_EQ(OB_SUCCESS, t1.mul(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("8.0", res_buf); // dec mul dec t1.set_decimal("4"); t2.set_decimal("2.0"); EXPECT_EQ(OB_SUCCESS, t1.mul(t2, res)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("8.0", res_buf); // int div int t1.set_int(6); t2.set_int(2); EXPECT_EQ(OB_SUCCESS, t1.div(t2, res, false)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("3.00000000000000000000000000000000000000", res_buf); EXPECT_EQ(OB_SUCCESS, t1.div(t2, res, true)); double d = 0.0; ASSERT_EQ(OB_SUCCESS, res.get_double(d)); ASSERT_EQ(3.0, d); // int div dec t1.set_int(6); t2.set_decimal("2.0"); EXPECT_EQ(OB_SUCCESS, t1.div(t2, res, false)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("3.00000000000000000000000000000000000000", res_buf); // dec div dec t1.set_decimal("6"); t2.set_decimal("2.0"); EXPECT_EQ(OB_SUCCESS, t1.div(t2, res, false)); ASSERT_EQ(OB_SUCCESS, res.get_decimal(res_buf, buf_len)); ASSERT_STREQ("3.00000000000000000000000000000000000000", res_buf); t1.set_int(5); t2.set_int(0); EXPECT_TRUE(OB_SUCCESS != t1.div(t2, res, false)); EXPECT_TRUE(true == res.is_null()); t1.set_decimal("5.0"); t2.set_int(0); EXPECT_TRUE(OB_SUCCESS != t1.div(t2, res, false)); EXPECT_EQ(true, res.is_null()); t1.set_int(5); t2.set_int(0); EXPECT_TRUE(OB_SUCCESS != t1.mod(t2, res)); EXPECT_EQ(true, res.is_null()); t1.set_int(5); t2.set_int(3); EXPECT_EQ(OB_SUCCESS, t1.mod(t2, res)); err = res.get_int(i1); EXPECT_TRUE(OB_SUCCESS == err); EXPECT_TRUE(i1 == 2); t1.set_int(5); t2.set_int(12); EXPECT_EQ(OB_SUCCESS, t1.mod(t2, res)); err = res.get_int(i1); EXPECT_TRUE(OB_SUCCESS == err); EXPECT_TRUE(i1 == 5); }