to issue<55252583>:fix two alter package issues
This commit is contained in:
@ -159,6 +159,10 @@ int ObAlterPackageResolver::compile_package(const ObString& db_name,
|
||||
package_guard,
|
||||
*(params_.sql_proxy_));
|
||||
bool has_error = false;
|
||||
char buf[OB_MAX_PROC_ENV_LENGTH];
|
||||
int64_t pos = 0;
|
||||
OZ (ObExecEnv::gen_exec_env(*session_info_, buf, OB_MAX_PROC_ENV_LENGTH, pos));
|
||||
OZ (ob_write_string(*allocator_, ObString(pos, buf), pkg_arg.exec_env_));
|
||||
OZ (package_guard.init());
|
||||
OZ (schema_checker_->get_package_info(session_info_->get_effective_tenant_id(),
|
||||
db_name,
|
||||
@ -242,32 +246,48 @@ int ObAlterPackageResolver::compile_package(const ObString& db_name,
|
||||
&package_spec_ast));
|
||||
OZ (analyze_package(compiler, &(package_spec_ast.get_body()->get_namespace()),
|
||||
package_body_ast, db_name, package_body_info, error_info, has_error));
|
||||
if (OB_SUCC(ret) && !has_error) {
|
||||
// if has_error, don't need to update routine route sql
|
||||
if (OB_SUCC(ret)) {
|
||||
ObArray<const ObRoutineInfo *> routine_infos;
|
||||
ObSEArray<ObRoutineInfo, 2> routine_spec_infos;
|
||||
ObPLRoutineTable &spec_routine_table = package_spec_ast.get_routine_table();
|
||||
ObPLRoutineTable &body_routine_table = package_body_ast.get_routine_table();
|
||||
OZ (schema_checker_->get_schema_guard()->get_routine_infos_in_package(
|
||||
session_info_->get_effective_tenant_id(),
|
||||
package_spec_info->get_package_id(),
|
||||
routine_infos));
|
||||
if (OB_SUCC(ret) && routine_infos.empty() && spec_routine_table.get_count() > 1) {
|
||||
OZ (ObCreatePackageResolver::resolve_functions_spec(
|
||||
*package_spec_info, routine_spec_infos, spec_routine_table));
|
||||
CK (routine_spec_infos.count() > 0);
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < routine_spec_infos.count(); ++i) {
|
||||
OZ (routine_infos.push_back(&routine_spec_infos.at(i)));
|
||||
session_info_->get_effective_tenant_id(),
|
||||
package_spec_info->get_package_id(),
|
||||
routine_infos));
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (!has_error) {
|
||||
// if has_error, don't need to update routine route sql
|
||||
ObSEArray<ObRoutineInfo, 2> routine_spec_infos;
|
||||
ObPLRoutineTable &spec_routine_table = package_spec_ast.get_routine_table();
|
||||
ObPLRoutineTable &body_routine_table = package_body_ast.get_routine_table();
|
||||
if (OB_SUCC(ret) && routine_infos.empty() && spec_routine_table.get_count() > 1) {
|
||||
OZ (ObCreatePackageResolver::resolve_functions_spec(
|
||||
*package_spec_info, routine_spec_infos, spec_routine_table));
|
||||
CK (routine_spec_infos.count() > 0);
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < routine_spec_infos.count(); ++i) {
|
||||
OZ (routine_infos.push_back(&routine_spec_infos.at(i)));
|
||||
}
|
||||
}
|
||||
OZ (ObCreatePackageBodyResolver::update_routine_route_sql(*allocator_,
|
||||
*session_info_,
|
||||
pkg_arg.public_routine_infos_,
|
||||
spec_routine_table,
|
||||
body_routine_table,
|
||||
routine_infos));
|
||||
if (OB_FAIL(ret)) {
|
||||
pkg_arg.public_routine_infos_.reset();
|
||||
}
|
||||
} else if (0 != package_body_info->get_exec_env().case_compare(pkg_arg.exec_env_)) {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < routine_infos.count(); ++i) {
|
||||
OZ (pkg_arg.public_routine_infos_.push_back(*routine_infos.at(i)));
|
||||
}
|
||||
}
|
||||
OZ (ObCreatePackageBodyResolver::update_routine_route_sql(*allocator_,
|
||||
*session_info_,
|
||||
pkg_arg.public_routine_infos_,
|
||||
spec_routine_table,
|
||||
body_routine_table,
|
||||
routine_infos));
|
||||
if (OB_FAIL(ret)) {
|
||||
pkg_arg.public_routine_infos_.reset();
|
||||
// TODO:actually,“alter package compile” should replace package spec and package body
|
||||
// but if we will alter package body, it only send package body info rpc, so we can only collect package body dep
|
||||
if (OB_SUCC(ret)) {
|
||||
ObString dep_attr;
|
||||
OZ (ObDependencyInfo::collect_dep_infos(package_body_ast.get_dependency_table(),
|
||||
pkg_arg.dependency_infos_,
|
||||
ObObjectType::PACKAGE_BODY,
|
||||
0, dep_attr, dep_attr));
|
||||
}
|
||||
}
|
||||
COLLECT_PACKAGE_INFO(pkg_arg, package_body_info);
|
||||
|
||||
Reference in New Issue
Block a user