fix resultset's scale and precision not compatible with oracle
This commit is contained in:
@ -57,6 +57,7 @@ int ObMySQLResultSet::to_mysql_field(const ObField &field, ObMySQLField &mfield)
|
||||
}
|
||||
|
||||
ObScale decimals = mfield.accuracy_.get_scale();
|
||||
ObPrecision pre = mfield.accuracy_.get_precision();
|
||||
// TIMESTAMP、UNSIGNED通过map直接映射
|
||||
if (0 == field.type_name_.case_compare("SYS_REFCURSOR")) {
|
||||
mfield.type_ = MYSQL_TYPE_CURSOR;
|
||||
@ -69,6 +70,17 @@ int ObMySQLResultSet::to_mysql_field(const ObField &field, ObMySQLField &mfield)
|
||||
|
||||
mfield.type_owner_ = field.type_owner_;
|
||||
mfield.type_name_ = field.type_name_;
|
||||
// In this scenario, the precsion and scale of number are undefined,
|
||||
// and the internal implementation of ob is represented by an illegal value (-1, -85).
|
||||
// However, oracle is represented by 0. In order to be compatible with
|
||||
// the behavior of oracle, it is corrected to 0 here.
|
||||
if ((ObNumberType == field.type_.get_type()
|
||||
|| ObUNumberType == field.type_.get_type())
|
||||
&& lib::is_oracle_mode()) { // was decimal
|
||||
decimals = (decimals==NUMBER_SCALE_UNKNOWN_YET ? 0:decimals);
|
||||
pre = (pre==PRECISION_UNKNOWN_YET ? 0:pre);
|
||||
}
|
||||
mfield.accuracy_.set_precision(pre);
|
||||
mfield.accuracy_.set_scale(decimals);
|
||||
mfield.inout_mode_ = field.inout_mode_;
|
||||
if (OB_SUCC(ret)
|
||||
|
||||
Reference in New Issue
Block a user