int ObObj::set_decimal(const ObNumber &num, int8_t precision, int8_t scale, bool is_add /*= false*/) { int ret = OB_SUCCESS; set_flag(is_add); meta_.type_ = ObDecimalType; meta_.dec_precision_ = static_cast<uint8_t>(precision) & META_PREC_MASK; meta_.dec_scale_ = static_cast<uint8_t>(scale) & META_SCALE_MASK; int8_t nwords = 0; int8_t vscale = 0; uint32_t words[ObNumber::MAX_NWORDS]; ret = num.round_to(precision, scale, nwords, vscale, words); if (OB_SUCCESS == ret) { if (nwords <= 3) { meta_.dec_nwords_ = static_cast<uint8_t>(nwords - 1) & META_NWORDS_MASK; meta_.dec_vscale_ = static_cast<uint8_t>(vscale) & META_VSCALE_MASK; memcpy(reinterpret_cast<uint32_t*>(&val_len_), words, sizeof(uint32_t)*nwords); } else { //@todo, use ob_pool.h to allocate memory ret = OB_NOT_IMPLEMENT; } } return ret; }