Fix default value of ObDecimalIntType

This commit is contained in:
obdev 2024-02-07 09:11:08 +00:00 committed by ob-robot
parent 44fa79977a
commit 3d5ba46e84
7 changed files with 46 additions and 7 deletions

View File

@ -1050,7 +1050,7 @@ bool ObObj::is_zero() const
return ret;
}
int ObObj::build_not_strict_default_value()
int ObObj::build_not_strict_default_value(int16_t precision)
{
int ret = OB_SUCCESS;
const ObObjType &data_type = meta_.get_type();
@ -1190,7 +1190,14 @@ int ObObj::build_not_strict_default_value()
break;
}
case ObDecimalIntType: {
set_decimal_int(0, 0, nullptr);
const ObDecimalInt *decint = nullptr;
int32_t int_bytes = 0;
if (OB_FAIL(wide::ObDecimalIntConstValue::get_zero_value_byte_precision(precision, decint,
int_bytes))) {
_OB_LOG(WARN, "get zero value failed, ret=%u", ret);
} else {
set_decimal_int(int_bytes, 0, const_cast<ObDecimalInt *>(decint));
}
break;
}
default:

View File

@ -1219,7 +1219,7 @@ public:
explicit ObObj(ObObjType type);
inline void reset();
//when in not strict sql mode, build default value refer to data type
int build_not_strict_default_value();
int build_not_strict_default_value(int16_t precision);
static ObObj make_min_obj();
static ObObj make_max_obj();
static ObObj make_nop_obj();

View File

@ -1063,7 +1063,7 @@
{ \
def_obj.set_type(data_type); \
if (is_mysql_mode()) { \
if (OB_FAIL(def_obj.build_not_strict_default_value())) { \
if (OB_FAIL(def_obj.build_not_strict_default_value(column.get_data_precision()))) { \
SQL_LOG(WARN, "failed to build not strict default json value", K(ret)); \
} else { \
res_obj.set_json_value(data_type, def_obj.get_string().ptr(), \

View File

@ -84,6 +84,8 @@ const ObDecimalInt *ObDecimalIntConstValue::MAX_DECINT[OB_MAX_DECIMAL_POSSIBLE_P
const ObDecimalInt *ObDecimalIntConstValue::MAX_UPPER[OB_MAX_DECIMAL_POSSIBLE_PRECISION + 1] = {nullptr};
const ObDecimalInt *ObDecimalIntConstValue::MIN_LOWER[OB_MAX_DECIMAL_POSSIBLE_PRECISION + 1] = {nullptr};
const ObDecimalInt *ObDecimalIntConstValue::ZERO_VALUES[5] = {nullptr};
// init ObDecimalIntConstValue
int ObDecimalIntConstValue::init_const_values(ObIAllocator &alloc, const lib::ObMemAttr &attr)
{
@ -143,6 +145,20 @@ int ObDecimalIntConstValue::init_const_values(ObIAllocator &alloc, const lib::Ob
MAX_UPPER[precision] = max_decint;
}
} // for end
// init zero values
char *zero_buf = nullptr;
int buf_size = sizeof(int32_t) + sizeof(int64_t) + sizeof(int128_t) + sizeof(int256_t) + sizeof(int512_t);
if (OB_ISNULL(zero_buf = (char *)allocator.alloc(buf_size))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
COMMON_LOG(WARN, "allocate memory failed", K(ret));
} else {
MEMSET(zero_buf, 0, buf_size);
ZERO_VALUES[0] = reinterpret_cast<const ObDecimalInt *>(zero_buf);
ZERO_VALUES[1] = reinterpret_cast<const ObDecimalInt *>(zero_buf + sizeof(int32_t));
ZERO_VALUES[2] = reinterpret_cast<const ObDecimalInt *>(zero_buf + sizeof(int32_t) + sizeof(int64_t));
ZERO_VALUES[3] = reinterpret_cast<const ObDecimalInt *>(zero_buf + sizeof(int32_t) + sizeof(int64_t) + sizeof(int128_t));
ZERO_VALUES[3] = reinterpret_cast<const ObDecimalInt *>(zero_buf + sizeof(int32_t) + sizeof(int64_t) + sizeof(int128_t) + sizeof(int256_t));
}
return ret;
}

View File

@ -431,6 +431,20 @@ public:
}
}
inline static int get_zero_value_byte_precision(int16_t precision, const ObDecimalInt *&decint, int32_t &int_bytes)
{
int ret = OB_SUCCESS;
ObDecimalIntWideType dec_type = get_decimalint_type(precision);
if (OB_UNLIKELY(dec_type == DECIMAL_INT_MAX)) {
ret = OB_ERR_UNEXPECTED;
COMMON_LOG(WARN, "invalid precision", K(precision));
} else {
decint = ZERO_VALUES[dec_type];
int_bytes = ((int32_t(1)) << dec_type) * sizeof(int32_t);
}
return ret;
}
inline static const ObDecimalInt* get_max_upper(ObPrecision prec)
{
OB_ASSERT(prec <= OB_MAX_DECIMAL_POSSIBLE_PRECISION);
@ -463,6 +477,8 @@ private:
static const ObDecimalInt *MAX_UPPER[OB_MAX_DECIMAL_POSSIBLE_PRECISION + 1];
// MYSQL_MIN_LOWER
static const ObDecimalInt *MIN_LOWER[OB_MAX_DECIMAL_POSSIBLE_PRECISION + 1];
static const ObDecimalInt *ZERO_VALUES[5];
};
// helper functions

View File

@ -6611,7 +6611,7 @@ int ObDDLService::resolve_orig_default_value(ObColumnSchemaV2 &alter_column_sche
} else {
ObObj default_value;
default_value.set_type(alter_column_schema.get_data_type());
if (OB_FAIL(default_value.build_not_strict_default_value())) {
if (OB_FAIL(default_value.build_not_strict_default_value(alter_column_schema.get_accuracy().get_precision()))) {
LOG_WARN("failed to build not strict default value", K(ret));
} else if (OB_FAIL(alter_column_schema.set_orig_default_value(default_value))) {
LOG_WARN("failed to set orig default value", K(ret));

View File

@ -755,7 +755,7 @@ int ObDefaultValueUtils::build_default_expr_not_strict_static(
default_value.set_null();
} else {
default_value.set_type(column_schema->get_data_type());
if (OB_FAIL(default_value.build_not_strict_default_value())) {
if (OB_FAIL(default_value.build_not_strict_default_value(column_schema->get_accuracy().get_precision()))) {
LOG_WARN("failed to build not strict default value info", K(column_schema), K(ret));
} else if (default_value.is_string_type()) {
default_value.set_collation_level(CS_LEVEL_IMPLICIT);
@ -810,7 +810,7 @@ int ObDefaultValueUtils::build_default_expr_not_strict(const ColumnItem *column,
default_value.set_null();
} else {
default_value.set_type(column->get_column_type()->get_type());
if (OB_FAIL(default_value.build_not_strict_default_value())) {
if (OB_FAIL(default_value.build_not_strict_default_value(column->get_column_type()->get_accuracy().get_precision()))) {
LOG_WARN("failed to build not strict default value info", K(column), K(ret));
} else if (default_value.is_string_type()) {
default_value.set_collation_level(CS_LEVEL_IMPLICIT);