diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 7530127550..fc2bd0f1ce 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -17337,7 +17337,9 @@ int ObPLResolver::get_udt_names( CK (OB_INVALID_ID != db_id); OZ (schema_guard.get_database_schema(tenant_id, db_id, db_schema)); CK (OB_NOT_NULL(db_schema)); - OX (database_name = db_schema->get_database_name_str()); + if (OB_SUCC(ret) && resolve_ctx_.session_info_.get_database_name().case_compare(db_schema->get_database_name_str()) != 0) { + OX (database_name = db_schema->get_database_name_str()); + } OX (udt_name = udt_info->get_type_name()); } return ret; diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index e995e0c1cb..2d5e9f96e7 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -1080,10 +1080,10 @@ private: ObPLFunctionAST &func, int64_t &idx); int check_update_column(const ObPLBlockNS &ns, const ObIArray& access_idxs); - static int get_udt_names(ObSchemaGetterGuard &schema_guard, - const uint64_t udt_id, - ObString &database_name, - ObString &udt_name); + int get_udt_names(ObSchemaGetterGuard &schema_guard, + const uint64_t udt_id, + ObString &database_name, + ObString &udt_name); static int get_udt_database_name(ObSchemaGetterGuard &schema_guard, const uint64_t udt_id, ObString &db_name); static bool check_with_rowid(const ObString &routine_name, diff --git a/src/sql/resolver/expr/ob_raw_expr_printer.cpp b/src/sql/resolver/expr/ob_raw_expr_printer.cpp index b7d4569033..36174ddd33 100644 --- a/src/sql/resolver/expr/ob_raw_expr_printer.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_printer.cpp @@ -3241,16 +3241,66 @@ int ObRawExprPrinter::print_translate(ObSysFunRawExpr *expr) int ObRawExprPrinter::print(ObUDFRawExpr *expr) { int ret = OB_SUCCESS; - if (OB_ISNULL(buf_) || OB_ISNULL(pos_) || OB_ISNULL(expr)) { + if (OB_ISNULL(buf_) || OB_ISNULL(pos_) || OB_ISNULL(expr) || OB_ISNULL(schema_guard_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("stmt_ is NULL of buf_ is NULL or pos_ is NULL or expr is NULL", K(ret)); } else { - if (!print_params_.for_dblink_ && - !expr->get_database_name().empty() && - expr->get_database_name().case_compare("oceanbase") != 0) { - PRINT_IDENT_WITH_QUOT(expr->get_database_name()); - DATA_PRINTF("."); + if (!print_params_.for_dblink_) { + if (!expr->get_database_name().empty()) { + if (expr->get_database_name().case_compare("oceanbase") != 0) { + PRINT_IDENT_WITH_QUOT(expr->get_database_name()); + DATA_PRINTF("."); + } + } else if (OB_ISNULL(schema_guard_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema_guard for print raw expr is null", K(ret)); + } else { + +#define PRINT_IMPLICIT_DATABASE_NAME(OBJECT, object_id, get_object_info_func, get_name_func) \ +do { \ + const uint64_t tenant_id = pl::get_tenant_id_by_object_id(object_id); \ + const share::schema::ObDatabaseSchema *database_schema = NULL; \ + const share::schema::OBJECT *object_info = NULL; \ + ObSchemaChecker checker; \ + bool exist = false; \ + if (OB_SYS_TENANT_ID == tenant_id) { \ + } else if (OB_FAIL(schema_guard_->get_object_info_func(tenant_id, object_id, object_info))) { \ + LOG_WARN("failed to get udt info", K(ret), KPC(expr), K(tenant_id)); \ + } else if (OB_ISNULL(object_info)) { \ + ret = OB_ERR_UNEXPECTED; \ + LOG_WARN("object info is null", K(ret), KPC(expr), K(tenant_id)); \ + } else if (OB_FAIL(schema_guard_->get_database_schema(tenant_id, object_info->get_database_id(), database_schema))) { \ + LOG_WARN("failed to get database schema", K(ret), KPC(expr), K(tenant_id)); \ + } else if (OB_ISNULL(database_schema)) { \ + ret = OB_ERR_UNEXPECTED; \ + LOG_WARN("database schema info is null", K(ret), K(database_schema), KPC(expr), K(tenant_id)); \ + } else if (OB_FAIL(checker.init(*schema_guard_, schema_guard_->get_session_id()))) { \ + LOG_WARN("failed to init schema checker", K(ret)); \ + } else if (OB_FAIL(checker.check_exist_same_name_object_with_synonym(tenant_id, \ + database_schema->get_database_id(), \ + database_schema->get_database_name_str(), \ + exist))) { \ + LOG_WARN("failed to check exist same name object with database name", K(ret), KPC(database_schema)); \ + } else if (!exist) { \ + PRINT_IDENT_WITH_QUOT(database_schema->get_database_name_str()); \ + DATA_PRINTF("."); \ + } \ +} while (0) + + if (expr->get_pkg_id() != OB_INVALID_ID) { // package or udt udf + if (expr->get_is_udt_udf()) { + PRINT_IMPLICIT_DATABASE_NAME(ObUDTTypeInfo, expr->get_pkg_id(), get_udt_info, get_type_name); + } else if (!expr->is_pkg_body_udf()) { + PRINT_IMPLICIT_DATABASE_NAME(ObPackageInfo, expr->get_pkg_id(), get_package_info, get_package_name); + } + } else if (expr->get_udf_id() != OB_INVALID_ID && 0 == expr->get_subprogram_path().count()) { // standalone udf + PRINT_IMPLICIT_DATABASE_NAME(ObRoutineInfo, expr->get_udf_id(), get_routine_info, get_routine_name); + } + } + +#undef PRINT_IMPLICIT_DATABASE_NAME } + if (!expr->get_package_name().empty() && !expr->get_is_udt_cons()) { PRINT_IDENT_WITH_QUOT(expr->get_package_name()); diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result index f948b9d1ea..b5185625c7 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result @@ -1033,7 +1033,7 @@ a f8() 3 1 drop function f1| select * from v1| -ERROR 42000: FUNCTION f1 does not exist +ERROR 42000: FUNCTION test.f1 does not exist create function f1() returns int return (select sum(data) from t1) + (select sum(data) from v1)| select f1()| @@ -5951,7 +5951,7 @@ end| create view v1 as select 1 as one, f1() as days; show create view test.v1; View Create View character_set_client collation_connection -v1 CREATE VIEW `v1` AS select 1 AS `one`,`f1`() AS `days` utf8mb4 utf8mb4_general_ci +v1 CREATE VIEW `v1` AS select 1 AS `one`,`test`.`f1`() AS `days` utf8mb4 utf8mb4_general_ci select column_name from information_schema.columns where table_name='v1' and table_schema='test'; column_name