diff --git a/src/pl/ob_pl_package_manager.cpp b/src/pl/ob_pl_package_manager.cpp index 3594f8386..17f0c8bf0 100644 --- a/src/pl/ob_pl_package_manager.cpp +++ b/src/pl/ob_pl_package_manager.cpp @@ -1569,6 +1569,7 @@ int ObPLPackageManager::get_package_item_state(const ObPLResolveCtx &resolve_ctx } else if (!package_state->check_version(state_version)) { OZ (resolve_ctx.session_info_.del_package_state(package_id)); if (OB_SUCC(ret)) { + LOG_INFO("pakcage state expired, reconstruct package state", KPC(package_state), K(state_version)); package_state->reset(&(resolve_ctx.session_info_)); package_state->~ObPLPackageState(); session_allocator.free(package_state); diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index f428d7319..d38878009 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -7221,8 +7221,24 @@ int ObSPIService::get_result(ObPLExecCtx *ctx, } } } + // fetch row阶段可能会触发udf/trigger, udf/trigger内部触发package var的内存变化了, 导致bulk table记录的table地址异常 + // 因此这里重新计算一次package var table地址 for (int64_t i = 0; OB_SUCC(ret) && i < bulk_tables.count(); ++i) { - ObPLCollection *table = bulk_tables.at(i); + ObPLCollection *table = nullptr; + if (OB_NOT_NULL(into_exprs[i]) && + into_exprs[i]->get_expr_items().count() > 1 && + T_OP_GET_PACKAGE_VAR == into_exprs[i]->get_expr_items().at(1).get_item_type()) { + ObObjParam result_address; + ObPlCompiteWrite *composite_write = nullptr; + CK (is_obj_access_expression(*into_exprs[i])); + OZ (spi_calc_expr(ctx, into_exprs[i], OB_INVALID_INDEX, &result_address)); + OX (composite_write = reinterpret_cast(result_address.get_ext())); + CK (OB_NOT_NULL(composite_write)); + CK (OB_NOT_NULL(table = reinterpret_cast(composite_write->value_addr_))); + OX (bulk_tables.at(i) = table); + } else { + table = bulk_tables.at(i); + } CK (OB_NOT_NULL(table)); #ifdef OB_BUILD_ORACLE_PL if (OB_SUCC(ret) && table->is_varray()) {