Ps bug repair about add literal_stmt_type_ in PsStmtInfo and check -0.0 in double_cell_str

This commit is contained in:
obdev
2023-08-18 10:40:28 +00:00
committed by ob-robot
parent a25829676b
commit 8f90d2a042
4 changed files with 14 additions and 2 deletions

View File

@ -898,6 +898,9 @@ int ObMySQLUtil::double_cell_str(char *buf, const int64_t len, double val,
LOG_WARN("invalid input", KP(buf), K(ret)); LOG_WARN("invalid input", KP(buf), K(ret));
} else { } else {
if (BINARY == type) { if (BINARY == type) {
if (std::fpclassify(val) == FP_ZERO && std::signbit(val)) {
val = val * -1; // if -0.0, change to 0.0
}
if (len - pos > DBL_SIZE) { if (len - pos > DBL_SIZE) {
MEMCPY(buf + pos, &val, DBL_SIZE); MEMCPY(buf + pos, &val, DBL_SIZE);
pos += DBL_SIZE; pos += DBL_SIZE;

View File

@ -866,6 +866,7 @@ int ObSql::fill_result_set(const ObPsStmtId stmt_id, const ObPsStmtInfo &stmt_in
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
result.set_statement_id(stmt_id); result.set_statement_id(stmt_id);
result.set_stmt_type(stmt_info.get_stmt_type()); result.set_stmt_type(stmt_info.get_stmt_type());
result.set_literal_stmt_type(stmt_info.get_literal_stmt_type());
const ObPsSqlMeta &sql_meta = stmt_info.get_ps_sql_meta(); const ObPsSqlMeta &sql_meta = stmt_info.get_ps_sql_meta();
result.set_p_param_fileds(const_cast<common::ParamsFieldIArray *>(&sql_meta.get_param_fields())); result.set_p_param_fileds(const_cast<common::ParamsFieldIArray *>(&sql_meta.get_param_fields()));
result.set_p_column_fileds(const_cast<common::ParamsFieldIArray *>(&sql_meta.get_column_fields())); result.set_p_column_fileds(const_cast<common::ParamsFieldIArray *>(&sql_meta.get_column_fields()));
@ -927,6 +928,8 @@ int ObSql::do_add_ps_cache(const PsCacheInfoCtx &info_ctx,
} else if (OB_ISNULL(ps_stmt_item) || OB_ISNULL(ref_stmt_info)) { } else if (OB_ISNULL(ps_stmt_item) || OB_ISNULL(ref_stmt_info)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("stmt_item or stmt_info is NULL", K(ret), KP(ps_stmt_item), KP(ref_stmt_info)); LOG_WARN("stmt_item or stmt_info is NULL", K(ret), KP(ps_stmt_item), KP(ref_stmt_info));
} else {
ref_stmt_info->set_literal_stmt_type(result.get_literal_stmt_type());
} }
if (NULL != ref_stmt_info) { if (NULL != ref_stmt_info) {
ref_stmt_info->set_is_sensitive_sql(info_ctx.is_sensitive_sql_); ref_stmt_info->set_is_sensitive_sql(info_ctx.is_sensitive_sql_);

View File

@ -282,7 +282,8 @@ ObPsStmtInfo::ObPsStmtInfo(ObIAllocator *inner_allocator)
is_sensitive_sql_(false), is_sensitive_sql_(false),
raw_sql_(), raw_sql_(),
raw_params_(inner_allocator), raw_params_(inner_allocator),
raw_params_idx_(inner_allocator) raw_params_idx_(inner_allocator),
literal_stmt_type_(stmt::T_NONE)
{ {
} }
@ -310,7 +311,8 @@ ObPsStmtInfo::ObPsStmtInfo(ObIAllocator *inner_allocator,
is_sensitive_sql_(false), is_sensitive_sql_(false),
raw_sql_(), raw_sql_(),
raw_params_(inner_allocator), raw_params_(inner_allocator),
raw_params_idx_(inner_allocator) raw_params_idx_(inner_allocator),
literal_stmt_type_(stmt::T_NONE)
{ {
} }
@ -455,6 +457,7 @@ int ObPsStmtInfo::deep_copy(const ObPsStmtInfo &other)
tenant_version_ = other.tenant_version_; tenant_version_ = other.tenant_version_;
is_expired_ = other.is_expired_; is_expired_ = other.is_expired_;
is_expired_evicted_ = other.is_expired_evicted_; is_expired_evicted_ = other.is_expired_evicted_;
literal_stmt_type_ = other.literal_stmt_type_;
if (other.get_dep_objs_cnt() > 0) { if (other.get_dep_objs_cnt() > 0) {
dep_objs_cnt_ = other.get_dep_objs_cnt(); dep_objs_cnt_ = other.get_dep_objs_cnt();
if (NULL == (dep_objs_ = reinterpret_cast<ObSchemaObjVersion *> if (NULL == (dep_objs_ = reinterpret_cast<ObSchemaObjVersion *>

View File

@ -150,6 +150,8 @@ public:
inline int64_t get_num_of_column() const { return ps_sql_meta_.get_column_size(); } inline int64_t get_num_of_column() const { return ps_sql_meta_.get_column_size(); }
inline stmt::StmtType get_stmt_type() const { return stmt_type_; } inline stmt::StmtType get_stmt_type() const { return stmt_type_; }
inline void set_stmt_type(stmt::StmtType stmt_type) { stmt_type_ = stmt_type; } inline void set_stmt_type(stmt::StmtType stmt_type) { stmt_type_ = stmt_type; }
inline stmt::StmtType get_literal_stmt_type() const { return literal_stmt_type_; }
inline void set_literal_stmt_type(stmt::StmtType stmt_type) { literal_stmt_type_ = stmt_type; }
const ObPsSqlKey& get_sql_key() const { return ps_key_; } const ObPsSqlKey& get_sql_key() const { return ps_key_; }
inline const common::ObString &get_ps_sql() const { return ps_key_.ps_sql_; } inline const common::ObString &get_ps_sql() const { return ps_key_.ps_sql_; }
inline const common::ObString &get_no_param_sql() const { return no_param_sql_; } inline const common::ObString &get_no_param_sql() const { return no_param_sql_; }
@ -257,6 +259,7 @@ private:
// raw_params_idx_: 0, 2 // raw_params_idx_: 0, 2
ObFixedArray<ObPCParam *, common::ObIAllocator> raw_params_; ObFixedArray<ObPCParam *, common::ObIAllocator> raw_params_;
ObFixedArray<int64_t, common::ObIAllocator> raw_params_idx_; ObFixedArray<int64_t, common::ObIAllocator> raw_params_idx_;
stmt::StmtType literal_stmt_type_;
}; };
struct TypeInfo { struct TypeInfo {