From 1e30cd924767791658fc895ca56aefaf14e2eb4c Mon Sep 17 00:00:00 2001 From: cqliang1995 Date: Thu, 20 Jul 2023 04:42:17 +0000 Subject: [PATCH] fix binary-float type error in dblink --- .../oblib/src/lib/mysqlclient/ob_mysql_result.cpp | 15 +++++++++------ .../src/lib/mysqlclient/ob_mysql_result_impl.cpp | 8 ++++---- src/sql/dblink/ob_dblink_utils.cpp | 9 ++++++++- src/sql/engine/table/ob_link_scan_op.cpp | 4 +++- src/sql/ob_sql_utils.cpp | 7 ------- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp b/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp index a6407151d..38a8b1b0b 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp +++ b/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp @@ -156,9 +156,7 @@ int ObMySQLResult::format_precision_scale_length(int16_t &precision, int16_t &sc } // format scale from others to oceanbase - if (DBLINK_DRV_OCI == link_type && (ObFloatType == ob_type || ObDoubleType == ob_type)) { - scale = OB_MIN_NUMBER_SCALE - 1; // binary_float and binar_double scale from oci is 0, need set to -85 - } else if (DBLINK_DRV_OCI == link_type && ObDateTimeType == ob_type) { + if (DBLINK_DRV_OCI == link_type && ObDateTimeType == ob_type) { scale = 0; } else if (tmp_scale < OB_MIN_NUMBER_SCALE || tmp_scale > OB_MAX_NUMBER_SCALE || (-1 == precision && ObNumberType == ob_type)) { @@ -181,10 +179,15 @@ int ObMySQLResult::format_precision_scale_length(int16_t &precision, int16_t &sc length = tmp_length; } } - if (ObDoubleType == ob_type || ObFloatType == ob_type) { + if (ObDoubleType == ob_type || ObUDoubleType == ob_type) { precision = -1; - scale = -1; - length = -1; + scale = -85; + length = 22; + } + if (ObFloatType == ob_type || ObUFloatType == ob_type) { + precision = -1; + scale = -85; + length = 12; } if (ObIntervalYMType == ob_type || ObIntervalDSType == ob_type) { precision = -1; diff --git a/deps/oblib/src/lib/mysqlclient/ob_mysql_result_impl.cpp b/deps/oblib/src/lib/mysqlclient/ob_mysql_result_impl.cpp index 99dc6d0e5..4601115a9 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_mysql_result_impl.cpp +++ b/deps/oblib/src/lib/mysqlclient/ob_mysql_result_impl.cpp @@ -652,16 +652,16 @@ int ObMySQLResultImpl::get_ob_type(ObObjType &ob_type, obmysql::EMySQLFieldType break; case obmysql::EMySQLFieldType::MYSQL_TYPE_FLOAT: if (is_unsigned_type) { - ob_type = ObFloatType; - } else { ob_type = ObUFloatType; + } else { + ob_type = ObFloatType; } break; case obmysql::EMySQLFieldType::MYSQL_TYPE_DOUBLE: if (is_unsigned_type) { - ob_type = ObDoubleType; - } else { ob_type = ObUDoubleType; + } else { + ob_type = ObDoubleType; } break; case obmysql::EMySQLFieldType::MYSQL_TYPE_TIMESTAMP: diff --git a/src/sql/dblink/ob_dblink_utils.cpp b/src/sql/dblink/ob_dblink_utils.cpp index 51d226f1e..9eda84250 100644 --- a/src/sql/dblink/ob_dblink_utils.cpp +++ b/src/sql/dblink/ob_dblink_utils.cpp @@ -680,4 +680,11 @@ int ObLinkStmtParam::read_next(const char *buf, int64_t buf_len, int64_t &pos, i } pos = ch - buf; return ret; -} \ No newline at end of file +} + +int64_t ObLinkStmtParam::get_param_len() +{ + return PARAM_LEN; +} + +const int64_t ObLinkStmtParam::PARAM_LEN = sizeof(char) * 2 + sizeof(uint16_t); diff --git a/src/sql/engine/table/ob_link_scan_op.cpp b/src/sql/engine/table/ob_link_scan_op.cpp index 784860b6a..dd36c70da 100644 --- a/src/sql/engine/table/ob_link_scan_op.cpp +++ b/src/sql/engine/table/ob_link_scan_op.cpp @@ -418,7 +418,9 @@ int ObLinkScanOp::inner_get_next_batch(const int64_t max_row_cnt) const ObIArray &output = spec_.output_; for (int64_t i = 0; OB_SUCC(ret) && i < output.count(); i++) { ObExpr *expr = output.at(i); - if (T_QUESTIONMARK != expr->type_ && + if (!expr->is_const_expr() && + T_FUN_SYS_REMOVE_CONST != expr->type_ && + T_QUESTIONMARK != expr->type_ && (ob_is_string_or_lob_type(expr->datum_meta_.type_) || ob_is_raw(expr->datum_meta_.type_) || ob_is_json(expr->datum_meta_.type_))) { ObDatum &datum = expr->locate_expr_datum(eval_ctx_); diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 1463eef1a..3d99672b4 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -3140,13 +3140,6 @@ int ObImplicitCursorInfo::merge_cursor(const ObImplicitCursorInfo &other) return ret; } -int64_t ObLinkStmtParam::get_param_len() -{ - return PARAM_LEN; -} - -const int64_t ObLinkStmtParam::PARAM_LEN = sizeof(char) * 2 + sizeof(uint16_t); - bool ObSQLUtils::is_same_type_for_compare(const ObObjMeta &meta1, const ObObjMeta &meta2) { bool is_same = false;