patch 4.0

This commit is contained in:
wangzelin.wzl
2022-10-24 10:34:53 +08:00
parent 4ad6e00ec3
commit 93a1074b0c
10533 changed files with 2588271 additions and 2299373 deletions

View File

@ -16,30 +16,38 @@
#include "share/ob_rpc_struct.h"
#include "sql/session/ob_sql_session_info.h"
namespace oceanbase {
namespace oceanbase
{
using namespace share;
using namespace share::schema;
using namespace common;
namespace sql {
namespace sql
{
ObTruncateTableResolver::ObTruncateTableResolver(ObResolverParams& params) : ObDDLResolver(params)
{}
ObTruncateTableResolver::ObTruncateTableResolver(ObResolverParams &params)
: ObDDLResolver(params)
{
}
ObTruncateTableResolver::~ObTruncateTableResolver()
{}
{
}
int ObTruncateTableResolver::resolve(const ParseNode& parser_tree)
int ObTruncateTableResolver::resolve(const ParseNode &parser_tree)
{
int ret = OB_SUCCESS;
ParseNode* node = const_cast<ParseNode*>(&parser_tree);
ObTruncateTableStmt* truncate_table_stmt = NULL;
if (OB_ISNULL(session_info_) || OB_ISNULL(node) || T_TRUNCATE_TABLE != node->type_ || OB_ISNULL(node->children_)) {
ParseNode *node = const_cast<ParseNode*>(&parser_tree);
ObTruncateTableStmt *truncate_table_stmt = NULL;
bool is_mysql_tmp_table = false;
if (OB_ISNULL(session_info_) || OB_ISNULL(node) ||
T_TRUNCATE_TABLE != node->type_ ||
OB_ISNULL(node->children_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("session_info_ is null or parser error", K(ret));
}
// create alter table stmt
//create alter table stmt
if (OB_SUCC(ret)) {
if (NULL == (truncate_table_stmt = create_stmt<ObTruncateTableStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
@ -47,18 +55,53 @@ int ObTruncateTableResolver::resolve(const ParseNode& parser_tree)
} else {
stmt_ = truncate_table_stmt;
}
ParseNode* relation_node = node->children_[TABLE_NODE];
ParseNode *relation_node = node->children_[TABLE_NODE];
if (OB_SUCC(ret)) {
if (NULL != relation_node) {
// resolve table
//resolve table
ObString table_name;
ObString database_name;
if (OB_FAIL(resolve_table_relation_node(relation_node, table_name, database_name))) {
LOG_WARN("failed to resolve table name.", K(table_name), K(database_name), K(ret));
if (OB_FAIL(resolve_table_relation_node(relation_node,
table_name,
database_name))) {
LOG_WARN("failed to resolve table name.",
K(table_name), K(database_name), K(ret));
} else {
truncate_table_stmt->set_table_name(table_name);
truncate_table_stmt->set_database_name(database_name);
truncate_table_stmt->set_tenant_id(session_info_->get_effective_tenant_id());
if (ObSchemaChecker::is_ora_priv_check()) {
uint64_t tenant_id = session_info_->get_effective_tenant_id();
const share::schema::ObTableSchema *table_schema = NULL;
if (OB_ISNULL(schema_checker_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("schema checker ptr is null", K(ret));
} else if (OB_FAIL(schema_checker_->get_table_schema(tenant_id,
database_name,
table_name,
false,
table_schema))) {
if (OB_TABLE_NOT_EXIST == ret) {
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(database_name),
to_cstring(table_name));
}
LOG_WARN("fail to get table schema", K(ret));
} else if (OB_FAIL(schema_checker_->check_ora_ddl_priv(
tenant_id,
session_info_->get_priv_user_id(),
database_name,
table_schema->get_table_id(),
static_cast<uint64_t>(share::schema::ObObjectType::TABLE),
stmt::T_TRUNCATE_TABLE,
session_info_->get_enable_role_array()))) {
if (OB_TABLE_NOT_EXIST == ret) {
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(database_name),
to_cstring(table_name));
}
LOG_WARN("failed to check ora ddl priv", K(database_name), K(table_name),
K(session_info_->get_priv_user_id()), K(ret));
}
}
}
} else {
ret = OB_ERR_PARSE_SQL;
@ -68,27 +111,32 @@ int ObTruncateTableResolver::resolve(const ParseNode& parser_tree)
}
if (OB_SUCC(ret)) {
bool strict_mode = true;
obrpc::ObTruncateTableArg& truncate_table_arg = truncate_table_stmt->get_truncate_table_arg();
ObObj is_ob_enable_truncate_table_flashback;
ObObj is_recyclebin;
if (OB_FAIL(session_info_->is_create_table_strict_mode(strict_mode))) {
SQL_RESV_LOG(WARN, "failed to get variable ob_create_table_strict_mode");
} else if (OB_FAIL(session_info_->get_sys_variable(share::SYS_VAR_RECYCLEBIN, is_recyclebin))) {
SQL_RESV_LOG(WARN, "get sys variable SYS_VAR_RECYCLEBIN failed", K(ret));
} else if (OB_FAIL(session_info_->get_sys_variable(
share::SYS_VAR_OB_ENABLE_TRUNCATE_FLASHBACK, is_ob_enable_truncate_table_flashback))) {
SQL_RESV_LOG(WARN, "get sys variable failed", K(ret));
const ObTableSchema *orig_table_schema = NULL;
if (OB_FAIL(schema_checker_->get_table_schema(truncate_table_stmt->get_tenant_id(),
truncate_table_stmt->get_database_name(),
truncate_table_stmt->get_table_name(),
false,
orig_table_schema))) {
LOG_WARN("fail to get table schema", K(ret), K(truncate_table_stmt->get_table_name()));
if (NULL == orig_table_schema && OB_TABLE_NOT_EXIST == ret) {
LOG_USER_ERROR(OB_TABLE_NOT_EXIST,
to_cstring(truncate_table_stmt->get_database_name()),
to_cstring(truncate_table_stmt->get_table_name()));
}
} else {
obrpc::ObCreateTableMode create_mode =
strict_mode ? obrpc::OB_CREATE_TABLE_MODE_STRICT : obrpc::OB_CREATE_TABLE_MODE_LOOSE;
truncate_table_stmt->set_create_mode(create_mode);
truncate_table_arg.to_recyclebin_ =
(is_ob_enable_truncate_table_flashback.get_bool() && is_recyclebin.get_bool());
const bool is_add_to_scheduler = orig_table_schema->is_user_table() ? true : false;
truncate_table_stmt->set_is_add_scheduler(is_add_to_scheduler);
if (orig_table_schema->is_oracle_tmp_table()) {
truncate_table_stmt->set_truncate_oracle_temp_table();
}
if (orig_table_schema->is_mysql_tmp_table()) {
is_mysql_tmp_table = true;
}
}
}
return ret;
}
} // namespace sql
} // namespace oceanbase
} //namespace common
} //namespace oceanbase