[CP] to issue<58172804><58155112>:fix stask oversize core & memory leak under exception
This commit is contained in:
parent
4dac24f564
commit
6325bd4a43
@ -221,6 +221,8 @@ int ObPLCodeGenerateVisitor::visit(const ObPLDeclareVarStmt &s)
|
||||
ObLLVMType ir_type;
|
||||
ObLLVMValue value;
|
||||
bool is_complex_type_var = false;
|
||||
ObLLVMValue stack;
|
||||
OZ (generator_.get_helper().stack_save(stack));
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < s.get_index().count(); ++i) {
|
||||
const ObPLVar *var = s.get_var(i);
|
||||
CK (OB_NOT_NULL(var));
|
||||
@ -387,6 +389,7 @@ int ObPLCodeGenerateVisitor::visit(const ObPLDeclareVarStmt &s)
|
||||
}
|
||||
|
||||
OZ (generator_.generate_spi_pl_profiler_after_record(s));
|
||||
OZ (generator_.get_helper().stack_restore(stack));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -807,8 +807,10 @@ int ObPLPackageManager::set_package_var_val(const ObPLResolveCtx &resolve_ctx,
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObPLPackageState *package_state = NULL;
|
||||
bool need_free_new = false;
|
||||
bool need_free_old = false;
|
||||
ObObj old_var_val;
|
||||
ObObj new_var_val = var_val;
|
||||
ObObj new_var_val;
|
||||
const ObPLVar *var = NULL;
|
||||
CK (package_id != OB_INVALID_ID);
|
||||
CK (var_idx != OB_INVALID_INDEX);
|
||||
@ -826,6 +828,7 @@ int ObPLPackageManager::set_package_var_val(const ObPLResolveCtx &resolve_ctx,
|
||||
NULL,
|
||||
false,
|
||||
new_var_val), K(package_id), K(var_idx), K(var_val));
|
||||
OX (need_free_new = true);
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (var->get_type().is_cursor_type()) {
|
||||
OV (var_val.is_tinyint() || var_val.is_number() || var_val.is_decimal_int(), OB_ERR_UNEXPECTED, K(var_val));
|
||||
@ -860,21 +863,27 @@ int ObPLPackageManager::set_package_var_val(const ObPLResolveCtx &resolve_ctx,
|
||||
new_var_val), K(package_id), K(var_idx), K(var_val));
|
||||
}
|
||||
LOG_DEBUG("deserialize package var", K(package_id), K(var_idx), K(var_val), K(new_var_val));
|
||||
} else {
|
||||
new_var_val = var_val;
|
||||
}
|
||||
if (OB_SUCC(ret) && var->is_not_null() && new_var_val.is_null()) {
|
||||
ret = OB_ERR_NUMERIC_OR_VALUE_ERROR;
|
||||
LOG_WARN("not null check violated", K(var->is_not_null()), K(var_val.is_null()), K(ret));
|
||||
}
|
||||
OZ (package_state->set_package_var_val(var_idx, new_var_val, !need_deserialize));
|
||||
|
||||
OX (need_free_old = true);
|
||||
OX (need_free_new = false);
|
||||
OZ (update_special_package_status(resolve_ctx, package_id, *var, old_var_val, new_var_val));
|
||||
|
||||
if (OB_NOT_NULL(var) && var->get_type().is_cursor_type() && !var->get_type().is_cursor_var()) {
|
||||
// package ref cursor variable, refrence outside, do not destruct it.
|
||||
} else if (OB_FAIL(ret)) {
|
||||
OZ (ObUserDefinedType::destruct_obj(new_var_val, &(resolve_ctx.session_info_)));
|
||||
} else {
|
||||
OZ (ObUserDefinedType::destruct_obj(old_var_val, &(resolve_ctx.session_info_)));
|
||||
if (OB_FAIL(ret) && need_free_new) {
|
||||
ObUserDefinedType::destruct_obj(new_var_val, &(resolve_ctx.session_info_));
|
||||
}
|
||||
if (need_free_old) {
|
||||
ObUserDefinedType::destruct_obj(old_var_val, &(resolve_ctx.session_info_));
|
||||
}
|
||||
}
|
||||
if (!need_deserialize) {
|
||||
OZ (package_state->update_changed_vars(var_idx));
|
||||
|
Loading…
x
Reference in New Issue
Block a user