[CP] to issue<52330964>:fix pl temp memory leak

This commit is contained in:
hanr881
2023-11-21 03:40:38 +00:00
committed by ob-robot
parent 16a18009c6
commit 38f7d1e740

View File

@ -7063,6 +7063,14 @@ int ObSPIService::get_result(ObPLExecCtx *ctx,
if (OB_SUCC(ret) && table->get_count() > 0) { if (OB_SUCC(ret) && table->get_count() > 0) {
if (implicit_cursor == NULL || !implicit_cursor->get_in_forall()) { if (implicit_cursor == NULL || !implicit_cursor->get_in_forall()) {
// only clear table data, do not reset collection allocator // only clear table data, do not reset collection allocator
if (table->get_element_desc().is_composite_type()) {
for (int64_t i = 0; i < table->get_count(); ++i) {
int tmp_ret = OB_SUCCESS;
if ((tmp_ret = ObUserDefinedType::destruct_obj(table->get_data()[i], ctx->exec_ctx_->get_my_session())) != OB_SUCCESS) {
LOG_WARN("failed to destruct obj, memory may leak", K(ret), K(tmp_ret), K(i));
}
}
}
table->set_count(0); table->set_count(0);
table->set_first(OB_INVALID_INDEX); table->set_first(OB_INVALID_INDEX);
table->set_last(OB_INVALID_INDEX); table->set_last(OB_INVALID_INDEX);
@ -7735,7 +7743,8 @@ int ObSPIService::store_result(ObPLExecCtx *ctx,
//对于object而言, get_column_count是record的列数, 这里会整体拷贝object, 因此不能用get_column_count作为跳数 //对于object而言, get_column_count是record的列数, 这里会整体拷贝object, 因此不能用get_column_count作为跳数
start_idx += 0 == i ? 0 : 1; start_idx += 0 == i ? 0 : 1;
} }
if (OB_SUCC(ret) && !need_ignore) { if (OB_FAIL(ret)) {
} else if (!need_ignore) {
int64_t old_count = table->get_count(); int64_t old_count = table->get_count();
void *old_data = table->get_data(); void *old_data = table->get_data();
ObIAllocator *allocator = table->get_allocator(); ObIAllocator *allocator = table->get_allocator();
@ -7747,9 +7756,6 @@ int ObSPIService::store_result(ObPLExecCtx *ctx,
LOG_WARN("get a invalid address", K(bulk_addr), K(row_count), K(old_count), K(table->get_column_count()), K(table->get_data()), K(ret)); LOG_WARN("get a invalid address", K(bulk_addr), K(row_count), K(old_count), K(table->get_column_count()), K(table->get_data()), K(ret));
} else { } else {
table->set_count(append_mode ? old_count + row_count : row_count); table->set_count(append_mode ? old_count + row_count : row_count);
if (OB_NOT_NULL(table->get_data())) {
allocator->free(table->get_data());
}
table->set_data(reinterpret_cast<ObObj*>(bulk_addr)); table->set_data(reinterpret_cast<ObObj*>(bulk_addr));
table->set_first(1); table->set_first(1);
table->set_last(table->get_count()); table->set_last(table->get_count());
@ -7829,6 +7835,31 @@ int ObSPIService::store_result(ObPLExecCtx *ctx,
allocator->free(bulk_addr); allocator->free(bulk_addr);
} }
} }
} else {
// need free memory
if (is_type_record) {
for (int64_t j = 0; j < row_count; ++j) {
for (int64_t k = 0; k < table->get_column_count(); ++k) {
int64_t idx = j * column_count + start_idx + k;
if (obj_array.at(idx).is_pl_extend()) {
int tmp_ret = OB_SUCCESS;
if ((tmp_ret = ObUserDefinedType::destruct_obj(obj_array.at(idx), ctx->exec_ctx_->get_my_session())) != OB_SUCCESS) {
LOG_WARN("failed to destruct obj, memory may leak", K(ret), K(tmp_ret), K(idx), K(obj_array));
}
}
}
}
} else {
for (int64_t j = 0; j < row_count; ++j) {
int64_t idx = j * column_count + start_idx;
if (obj_array.at(idx).is_pl_extend()) {
int tmp_ret = OB_SUCCESS;
if ((tmp_ret = ObUserDefinedType::destruct_obj(obj_array.at(idx), ctx->exec_ctx_->get_my_session())) != OB_SUCCESS) {
LOG_WARN("failed to destruct obj, memory may leak", K(ret), K(tmp_ret), K(idx), K(obj_array));
}
}
}
}
} }
} }
} }