fix core when using same pl var in bulk collect into cluase

This commit is contained in:
obdev
2022-12-12 13:07:50 +00:00
committed by ob-robot
parent 0002773a49
commit e97de44b97

View File

@ -591,6 +591,7 @@ int ObDMLResolver::resolve_into_variables(const ParseNode *node,
ObRawExpr *expr = NULL;
ParseNode *ch_node = NULL;
ObBitSet<> user_var_idx;
common::hash::ObHashSet<ObString> pl_var_name;
for (int64_t i = 0; OB_SUCC(ret) && i < into_node->num_child_; ++i) {
ch_node = into_node->children_[i];
expr = NULL;
@ -600,14 +601,29 @@ int ObDMLResolver::resolve_into_variables(const ParseNode *node,
|| T_OBJ_ACCESS_REF == ch_node->type_ /*Oracle Mode for pl_var*/
|| T_QUESTIONMARK == ch_node->type_));/*Oracle Mode for dynamic sql*/
if (OB_SUCC(ret)) {
ObString var_name(ch_node->str_len_, ch_node->str_value_);
if (T_USER_VARIABLE_IDENTIFIER == ch_node->type_) {
ObString var_name(ch_node->str_len_, ch_node->str_value_);
ObCharset::casedn(CS_TYPE_UTF8MB4_GENERAL_CI, var_name);
OZ (user_vars.push_back(var_name));
OZ (user_var_idx.add_member(i));
} else {
if (OB_NOT_NULL(params_.secondary_namespace_)) { //PL语句的Prepare阶段
CK(OB_NOT_NULL(params_.allocator_), OB_NOT_NULL(params_.expr_factory_));
if (OB_FAIL(ret)) {
} else if (1 != node->value_ || var_name.empty()) { // bulk collect into
// do nothing
} else if (!pl_var_name.created() && OB_FAIL(pl_var_name.create(4))) {
LOG_WARN("init hash failed", K(ret));
} else if (OB_FAIL(pl_var_name.set_refactored(var_name, 0))) {
LOG_WARN("failed to set_refactored", K(ret));
//change error number
if (OB_HASH_EXIST == ret) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("Bulk Collection Into not support use same var much times", K(ret), K(i), K(var_name));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "Bulk Collection use same var much times");
}
}
OZ (pl::ObPLResolver::resolve_raw_expr(*ch_node,
*params_.allocator_,
@ -651,6 +667,10 @@ int ObDMLResolver::resolve_into_variables(const ParseNode *node,
}
}
}
//destory the hash table whether the ret is OB_SUCC or not
if (pl_var_name.created()) {
pl_var_name.destroy();
}
if (OB_SUCC(ret)) {
if (NULL == params_.secondary_namespace_
&& params_.is_prepare_protocol_