Fix incorrect plan sharing causing crash
This commit is contained in:
@ -6076,10 +6076,12 @@ int ObSPIService::spi_interface_impl(pl::ObPLExecCtx *ctx, const char *interface
|
|||||||
LOG_WARN("Argument passed in is NULL", K(ctx), K(interface_name), K(ret));
|
LOG_WARN("Argument passed in is NULL", K(ctx), K(interface_name), K(ret));
|
||||||
} else if (OB_ISNULL(ctx->exec_ctx_)
|
} else if (OB_ISNULL(ctx->exec_ctx_)
|
||||||
|| OB_ISNULL(ctx->params_)
|
|| OB_ISNULL(ctx->params_)
|
||||||
|| OB_ISNULL(ctx->result_)) {
|
|| OB_ISNULL(ctx->result_)
|
||||||
|
|| OB_ISNULL(ctx->exec_ctx_->get_my_session())) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("Invalid context", K(ctx->exec_ctx_), K(ctx->params_), K(ctx->result_));
|
LOG_WARN("Invalid context", K(ctx->exec_ctx_), K(ctx->params_), K(ctx->result_));
|
||||||
} else {
|
} else {
|
||||||
|
ctx->exec_ctx_->get_my_session()->init_use_rich_format();
|
||||||
ObString name(interface_name);
|
ObString name(interface_name);
|
||||||
PL_C_INTERFACE_t fp = GCTX.pl_engine_->get_interface_service().get_entry(name);
|
PL_C_INTERFACE_t fp = GCTX.pl_engine_->get_interface_service().get_entry(name);
|
||||||
if (nullptr != fp) {
|
if (nullptr != fp) {
|
||||||
|
|||||||
@ -2312,6 +2312,7 @@ OB_INLINE int ObPlanCache::construct_plan_cache_key(ObSQLSessionInfo &session,
|
|||||||
pc_key.namespace_ = ns;
|
pc_key.namespace_ = ns;
|
||||||
pc_key.sys_vars_str_ = session.get_sys_var_in_pc_str();
|
pc_key.sys_vars_str_ = session.get_sys_var_in_pc_str();
|
||||||
pc_key.config_str_ = session.get_config_in_pc_str();
|
pc_key.config_str_ = session.get_config_in_pc_str();
|
||||||
|
pc_key.use_rich_vector_format_ = session.use_rich_format();
|
||||||
pc_key.is_weak_read_ = is_weak;
|
pc_key.is_weak_read_ = is_weak;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,7 +56,7 @@ struct ObPlanCacheKey : public ObILibCacheKey
|
|||||||
db_id_(common::OB_INVALID_ID),
|
db_id_(common::OB_INVALID_ID),
|
||||||
sessid_(0),
|
sessid_(0),
|
||||||
mode_(PC_TEXT_MODE),
|
mode_(PC_TEXT_MODE),
|
||||||
is_weak_read_(false) {}
|
flag_(0) {}
|
||||||
|
|
||||||
inline void reset()
|
inline void reset()
|
||||||
{
|
{
|
||||||
@ -67,7 +67,7 @@ struct ObPlanCacheKey : public ObILibCacheKey
|
|||||||
mode_ = PC_TEXT_MODE;
|
mode_ = PC_TEXT_MODE;
|
||||||
sys_vars_str_.reset();
|
sys_vars_str_.reset();
|
||||||
config_str_.reset();
|
config_str_.reset();
|
||||||
is_weak_read_ = false;
|
flag_ = 0;
|
||||||
namespace_ = NS_INVALID;
|
namespace_ = NS_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ struct ObPlanCacheKey : public ObILibCacheKey
|
|||||||
sessid_ = pc_key.sessid_;
|
sessid_ = pc_key.sessid_;
|
||||||
mode_ = pc_key.mode_;
|
mode_ = pc_key.mode_;
|
||||||
namespace_ = pc_key.namespace_;
|
namespace_ = pc_key.namespace_;
|
||||||
is_weak_read_ = pc_key.is_weak_read_;
|
flag_ = pc_key.flag_;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -116,6 +116,7 @@ struct ObPlanCacheKey : public ObILibCacheKey
|
|||||||
hash_ret = common::murmurhash(&db_id_, sizeof(uint64_t), hash_ret);
|
hash_ret = common::murmurhash(&db_id_, sizeof(uint64_t), hash_ret);
|
||||||
hash_ret = common::murmurhash(&sessid_, sizeof(uint32_t), hash_ret);
|
hash_ret = common::murmurhash(&sessid_, sizeof(uint32_t), hash_ret);
|
||||||
hash_ret = common::murmurhash(&mode_, sizeof(PlanCacheMode), hash_ret);
|
hash_ret = common::murmurhash(&mode_, sizeof(PlanCacheMode), hash_ret);
|
||||||
|
hash_ret = common::murmurhash(&flag_, sizeof(flag_), hash_ret);
|
||||||
hash_ret = sys_vars_str_.hash(hash_ret);
|
hash_ret = sys_vars_str_.hash(hash_ret);
|
||||||
hash_ret = config_str_.hash(hash_ret);
|
hash_ret = config_str_.hash(hash_ret);
|
||||||
hash_ret = common::murmurhash(&namespace_, sizeof(ObLibCacheNameSpace), hash_ret);
|
hash_ret = common::murmurhash(&namespace_, sizeof(ObLibCacheNameSpace), hash_ret);
|
||||||
@ -133,7 +134,7 @@ struct ObPlanCacheKey : public ObILibCacheKey
|
|||||||
mode_ == pc_key.mode_ &&
|
mode_ == pc_key.mode_ &&
|
||||||
sys_vars_str_ == pc_key.sys_vars_str_ &&
|
sys_vars_str_ == pc_key.sys_vars_str_ &&
|
||||||
config_str_ == pc_key.config_str_ &&
|
config_str_ == pc_key.config_str_ &&
|
||||||
is_weak_read_ == pc_key.is_weak_read_ &&
|
flag_ == pc_key.flag_ &&
|
||||||
namespace_ == pc_key.namespace_;
|
namespace_ == pc_key.namespace_;
|
||||||
|
|
||||||
return cmp_ret;
|
return cmp_ret;
|
||||||
@ -145,7 +146,7 @@ struct ObPlanCacheKey : public ObILibCacheKey
|
|||||||
K_(mode),
|
K_(mode),
|
||||||
K_(sys_vars_str),
|
K_(sys_vars_str),
|
||||||
K_(config_str),
|
K_(config_str),
|
||||||
K_(is_weak_read),
|
K_(flag),
|
||||||
K_(namespace));
|
K_(namespace));
|
||||||
//通过name来进行查找,一般是shared sql/procedure
|
//通过name来进行查找,一般是shared sql/procedure
|
||||||
//cursor用这种方式,对应的namespace是CRSR
|
//cursor用这种方式,对应的namespace是CRSR
|
||||||
@ -158,7 +159,16 @@ struct ObPlanCacheKey : public ObILibCacheKey
|
|||||||
PlanCacheMode mode_;
|
PlanCacheMode mode_;
|
||||||
common::ObString sys_vars_str_;
|
common::ObString sys_vars_str_;
|
||||||
common::ObString config_str_;
|
common::ObString config_str_;
|
||||||
bool is_weak_read_;
|
union
|
||||||
|
{
|
||||||
|
uint16_t flag_;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint16_t is_weak_read_ : 1;
|
||||||
|
uint16_t use_rich_vector_format_ : 1;
|
||||||
|
uint16_t reserved_ : 14; // reserved
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
//记录快速化参数后不需要扣参数的原始字符串及相关信息
|
//记录快速化参数后不需要扣参数的原始字符串及相关信息
|
||||||
|
|||||||
Reference in New Issue
Block a user