[to #51089409]fixed unsigned set in master
This commit is contained in:
@ -2683,7 +2683,6 @@ int ObMPStmtExecute::parse_integer_value(const uint32_t type,
|
|||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
bool cast_to_number = !(lib::is_mysql_mode() || is_complex_element || MYSQL_TYPE_TINY == type);
|
bool cast_to_number = !(lib::is_mysql_mode() || is_complex_element || MYSQL_TYPE_TINY == type);
|
||||||
int64_t res_val = 0;
|
int64_t res_val = 0;
|
||||||
ObObjType unsigned_type = is_unsigned ? ObUInt64Type : ObNumberType;
|
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case MYSQL_TYPE_TINY: {
|
case MYSQL_TYPE_TINY: {
|
||||||
PS_STATIC_DEFENSE_CHECK(checker, 1)
|
PS_STATIC_DEFENSE_CHECK(checker, 1)
|
||||||
@ -2702,10 +2701,15 @@ int ObMPStmtExecute::parse_integer_value(const uint32_t type,
|
|||||||
if (!cast_to_number) {
|
if (!cast_to_number) {
|
||||||
is_unsigned ? param.set_usmallint(value) : param.set_smallint(value);
|
is_unsigned ? param.set_usmallint(value) : param.set_smallint(value);
|
||||||
} else {
|
} else {
|
||||||
if (is_unsigned) {
|
|
||||||
unsigned_type = ObUSmallIntType;
|
|
||||||
}
|
|
||||||
res_val = static_cast<int64_t>(value);
|
res_val = static_cast<int64_t>(value);
|
||||||
|
if (is_unsigned) {
|
||||||
|
if (((1LL << 16) + res_val) < 1 || res_val > 0xFFFF) {
|
||||||
|
ret = OB_DECIMAL_OVERFLOW_WARN;
|
||||||
|
LOG_WARN("param is over flower.", K(res_val), K(type), K(ret));
|
||||||
|
} else {
|
||||||
|
res_val = res_val < 0 ? ((1LL << 16) + res_val) : res_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2718,10 +2722,15 @@ int ObMPStmtExecute::parse_integer_value(const uint32_t type,
|
|||||||
if (!cast_to_number) {
|
if (!cast_to_number) {
|
||||||
is_unsigned ? param.set_uint32(value) : param.set_int32(value);
|
is_unsigned ? param.set_uint32(value) : param.set_int32(value);
|
||||||
} else {
|
} else {
|
||||||
if (is_unsigned) {
|
|
||||||
unsigned_type = ObUInt32Type;
|
|
||||||
}
|
|
||||||
res_val = static_cast<int64_t>(value);
|
res_val = static_cast<int64_t>(value);
|
||||||
|
if (is_unsigned) {
|
||||||
|
if (((1LL << 32) + res_val) < 1 || res_val > 0xFFFFFFFF) {
|
||||||
|
ret = OB_DECIMAL_OVERFLOW_WARN;
|
||||||
|
LOG_WARN("param is over flower.", K(res_val), K(type), K(ret));
|
||||||
|
} else {
|
||||||
|
res_val = res_val < 0 ? ((1LL << 32) + res_val) : res_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2734,9 +2743,6 @@ int ObMPStmtExecute::parse_integer_value(const uint32_t type,
|
|||||||
if (!cast_to_number) {
|
if (!cast_to_number) {
|
||||||
is_unsigned ? param.set_uint(ObUInt64Type, value) : param.set_int(value);
|
is_unsigned ? param.set_uint(ObUInt64Type, value) : param.set_int(value);
|
||||||
} else {
|
} else {
|
||||||
if (is_unsigned) {
|
|
||||||
unsigned_type = ObUInt64Type;
|
|
||||||
}
|
|
||||||
res_val = value;
|
res_val = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2750,16 +2756,14 @@ int ObMPStmtExecute::parse_integer_value(const uint32_t type,
|
|||||||
}
|
}
|
||||||
if (OB_SUCC(ret) && cast_to_number) {
|
if (OB_SUCC(ret) && cast_to_number) {
|
||||||
number::ObNumber nb;
|
number::ObNumber nb;
|
||||||
if (OB_FAIL(nb.from(res_val, allocator))) {
|
if (is_unsigned && OB_FAIL(nb.from(static_cast<uint64_t>(res_val), allocator))) {
|
||||||
|
LOG_WARN("decode param to number failed", K(ret), K(res_val));
|
||||||
|
} else if (!is_unsigned && OB_FAIL(nb.from(static_cast<int64_t>(res_val), allocator))) {
|
||||||
LOG_WARN("decode param to number failed", K(ret), K(res_val));
|
LOG_WARN("decode param to number failed", K(ret), K(res_val));
|
||||||
} else {
|
|
||||||
if (is_unsigned) {
|
|
||||||
param.set_number(unsigned_type, nb);
|
|
||||||
} else {
|
} else {
|
||||||
param.set_number(nb);
|
param.set_number(nb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user