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

@ -14,22 +14,24 @@
#include "sql/resolver/ddl/ob_purge_resolver.h"
#include "share/ob_define.h"
namespace oceanbase {
namespace oceanbase
{
using namespace common;
namespace sql {
namespace sql
{
/**
* Purge table
*/
int ObPurgeTableResolver::resolve(const ParseNode& parser_tree)
int ObPurgeTableResolver::resolve(const ParseNode &parser_tree)
{
int ret = OB_SUCCESS;
ObPurgeTableStmt* purge_table_stmt = NULL;
ObPurgeTableStmt *purge_table_stmt = NULL;
if (OB_ISNULL(session_info_) || T_PURGE_TABLE != parser_tree.type_) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("session_info is null", K(ret));
}
// create Purge table stmt
//create Purge table stmt
if (OB_SUCC(ret)) {
if (NULL == (purge_table_stmt = create_stmt<ObPurgeTableStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
@ -39,31 +41,38 @@ int ObPurgeTableResolver::resolve(const ParseNode& parser_tree)
}
}
if (OB_SUCC(ret)) {
purge_table_stmt->set_tenant_id(session_info_->get_effective_tenant_id());
// Purge table
ParseNode* table_node = parser_tree.children_[TABLE_NODE];
ObString table_name;
//Purge table
ParseNode *table_node = parser_tree.children_[TABLE_NODE];
uint64_t tenant_id = session_info_->get_effective_tenant_id();
uint64_t db_id = OB_INVALID_ID;
ObString db_name;
ObString table_name;
if (OB_ISNULL(table_node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("table_node should not be null", K(ret));
} else if (resolve_table_relation_node(table_node, table_name, db_name, true /*get origin db_name*/)) {
} else if (OB_FAIL(resolve_table_relation_node(table_node, table_name, db_name))) {
LOG_WARN("failed to resolve_table_relation_node", K(ret));
} else if (!db_name.empty() && ObString(OB_RECYCLEBIN_SCHEMA_NAME) != db_name) {
ret = OB_TABLE_NOT_EXIST;
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(table_name), to_cstring(db_name));
} else if (session_info_->get_database_name() != db_name) {
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "purge tables in recyclebin dropped from other schema");
LOG_WARN("purge tables in recyclebin dropped from other schema is not supported",
K(ret), K(db_name), K(session_info_->get_database_name()));
LOG_WARN("purge table db.xx should not specified with db name", K(ret));
} else if (table_name.empty()) {
} else if (OB_FAIL(schema_checker_->get_database_id(tenant_id, db_name, db_id))) {
LOG_WARN("fail to get database id", K(ret), K(tenant_id), K(db_name));
} else if (table_name.empty()){
ret = OB_INVALID_ARGUMENT;
LOG_WARN("table name should not be empty", K(ret));
} else {
purge_table_stmt->set_tenant_id(tenant_id);
purge_table_stmt->set_database_id(db_id);
purge_table_stmt->set_table_name(table_name);
if (OB_SUCC(ret) && ObSchemaChecker::is_ora_priv_check()) {
OZ(schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
session_info_->get_priv_user_id(),
db_name,
stmt::T_PURGE_TABLE,
session_info_->get_enable_role_array()));
OZ (schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
session_info_->get_priv_user_id(),
ObString(OB_RECYCLEBIN_SCHEMA_NAME),
stmt::T_PURGE_TABLE,
session_info_->get_enable_role_array()));
}
}
}
@ -73,18 +82,18 @@ int ObPurgeTableResolver::resolve(const ParseNode& parser_tree)
/**
* Purge index
*/
int ObPurgeIndexResolver::resolve(const ParseNode& parser_tree)
int ObPurgeIndexResolver::resolve(const ParseNode &parser_tree)
{
int ret = OB_SUCCESS;
ObPurgeIndexStmt* purge_index_stmt = NULL;
ObPurgeIndexStmt *purge_index_stmt = NULL;
if (OB_ISNULL(session_info_) || OB_ISNULL(schema_checker_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("session_info or schema_checker is null", K(ret), K(schema_checker_), K(session_info_));
} else if (T_PURGE_INDEX != parser_tree.type_) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid parse tree", K(parser_tree.type_));
LOG_WARN("invalid parse tree", K(parser_tree.type_));
}
// create Purge table stmt
//create Purge table stmt
if (OB_SUCC(ret)) {
if (NULL == (purge_index_stmt = create_stmt<ObPurgeIndexStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
@ -94,39 +103,49 @@ int ObPurgeIndexResolver::resolve(const ParseNode& parser_tree)
}
}
if (OB_SUCC(ret)) {
purge_index_stmt->set_tenant_id(session_info_->get_effective_tenant_id());
// Purge table
ParseNode* table_node = parser_tree.children_[TABLE_NODE];
ObString table_name;
//Purge table
ParseNode *table_node = parser_tree.children_[TABLE_NODE];
uint64_t tenant_id = session_info_->get_effective_tenant_id();
uint64_t db_id = OB_INVALID_ID;
ObString db_name;
const share::schema::ObTableSchema* table_schema = NULL;
ObString table_name;
const share::schema::ObTableSchema *table_schema = NULL;
if (OB_ISNULL(table_node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("table_node should not be null", K(ret));
} else if (resolve_table_relation_node(table_node, table_name, db_name, true /*get origin db_name*/)) {
} else if (resolve_table_relation_node(table_node,
table_name,
db_name)){
LOG_WARN("failed to resolve_table_relation_node", K(ret));
} else if (!db_name.empty() && ObString(OB_RECYCLEBIN_SCHEMA_NAME) != db_name) {
ret = OB_TABLE_NOT_EXIST;
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(table_name), to_cstring(db_name));
LOG_WARN("purge table db.xx should not specified with db name", K(ret));
} else if (table_name.empty()) {
} else if (session_info_->get_database_name() != db_name){
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "purge indexes in recyclebin dropped from other schema");
LOG_WARN("purge indexes in recyclebin dropped from other schema is not supported",
K(ret), K(db_name), K(session_info_->get_database_name()));
} else if (OB_FAIL(schema_checker_->get_database_id(tenant_id, db_name, db_id))) {
LOG_WARN("fail to get database id", K(ret), K(tenant_id), K(db_name));
} else if (table_name.empty()){
ret = OB_INVALID_ARGUMENT;
LOG_WARN("table name should not be empty", K(ret));
} else {
UNUSED(schema_checker_->get_table_schema(purge_index_stmt->get_tenant_id(),
combine_id(purge_index_stmt->get_tenant_id(), OB_RECYCLEBIN_SCHEMA_ID),
table_name,
true, /*is_index*/
false, /*cte_table_fisrt*/
table_schema));
UNUSED(schema_checker_->get_table_schema(tenant_id,
OB_RECYCLEBIN_SCHEMA_ID,
table_name,
true, /*is_index*/
false, /*cte_table_fisrt*/
false/*is_hidden*/,
table_schema));
purge_index_stmt->set_tenant_id(tenant_id);
purge_index_stmt->set_database_id(db_id);
purge_index_stmt->set_table_name(table_name);
purge_index_stmt->set_table_id(OB_NOT_NULL(table_schema) ? table_schema->get_table_id() : OB_INVALID_ID);
if (OB_SUCC(ret) && ObSchemaChecker::is_ora_priv_check()) {
OZ(schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
session_info_->get_priv_user_id(),
db_name,
stmt::T_PURGE_INDEX,
session_info_->get_enable_role_array()));
OZ (schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
session_info_->get_priv_user_id(),
ObString(OB_RECYCLEBIN_SCHEMA_NAME),
stmt::T_PURGE_INDEX,
session_info_->get_enable_role_array()));
}
}
}
@ -135,15 +154,15 @@ int ObPurgeIndexResolver::resolve(const ParseNode& parser_tree)
/**
* Purge database
*/
int ObPurgeDatabaseResolver::resolve(const ParseNode& parser_tree)
int ObPurgeDatabaseResolver::resolve(const ParseNode &parser_tree)
{
int ret = OB_SUCCESS;
ObPurgeDatabaseStmt* purge_database_stmt = NULL;
ObPurgeDatabaseStmt *purge_database_stmt = NULL;
if (OB_ISNULL(session_info_) || T_PURGE_DATABASE != parser_tree.type_) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("session_info is null", K(ret));
}
// create Purge table stmt
//create Purge table stmt
if (OB_SUCC(ret)) {
if (NULL == (purge_database_stmt = create_stmt<ObPurgeDatabaseStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
@ -155,18 +174,24 @@ int ObPurgeDatabaseResolver::resolve(const ParseNode& parser_tree)
if (OB_SUCC(ret)) {
purge_database_stmt->set_tenant_id(session_info_->get_effective_tenant_id());
ObString db_name;
ParseNode* dbname_node = parser_tree.children_[DATABASE_NODE];
int32_t max_database_name_length = GET_MIN_CLUSTER_VERSION() < CLUSTER_CURRENT_VERSION
? OB_MAX_DATABASE_NAME_LENGTH - 1
: OB_MAX_DATABASE_NAME_LENGTH;
ParseNode *dbname_node = parser_tree.children_[DATABASE_NODE];
/**
* 在2.2.20版本上将命名长度比较逻辑由大于等于128字节时报错调整为大于128字节时报错后, 2.2.20以上版本
* 数据库名长度可以为128字节。 升级过程中高版本server序列化session info到低版本server时, 如果数据
* 库名长度为128字节会存在兼容性问题。 因此在升级过程中限制数据库名长度不超过127字节
*/
int32_t max_database_name_length = GET_MIN_CLUSTER_VERSION() < CLUSTER_CURRENT_VERSION ?
OB_MAX_DATABASE_NAME_LENGTH - 1 : OB_MAX_DATABASE_NAME_LENGTH;
if (OB_ISNULL(dbname_node) || OB_UNLIKELY(T_IDENT != dbname_node->type_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid parse tree", K(ret));
} else if (OB_UNLIKELY(static_cast<int32_t>(dbname_node->str_len_) > max_database_name_length)) {
} else if (OB_UNLIKELY(
static_cast<int32_t>(dbname_node->str_len_) > max_database_name_length)) {
ret = OB_ERR_TOO_LONG_IDENT;
LOG_USER_ERROR(OB_ERR_TOO_LONG_IDENT, (int)dbname_node->str_len_, dbname_node->str_value_);
} else {
db_name.assign_ptr(dbname_node->str_value_, static_cast<int32_t>(dbname_node->str_len_));
db_name.assign_ptr(dbname_node->str_value_,
static_cast<int32_t>(dbname_node->str_len_));
if (db_name.empty()) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("database_name is empty()", K(ret));
@ -178,18 +203,19 @@ int ObPurgeDatabaseResolver::resolve(const ParseNode& parser_tree)
return ret;
}
/**
* Purge tenant
*/
int ObPurgeTenantResolver::resolve(const ParseNode& parser_tree)
int ObPurgeTenantResolver::resolve(const ParseNode &parser_tree)
{
int ret = OB_SUCCESS;
ObPurgeTenantStmt* purge_tenant_stmt = NULL;
ObPurgeTenantStmt *purge_tenant_stmt = NULL;
if (OB_ISNULL(session_info_) || T_PURGE_TENANT != parser_tree.type_) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("session_info is null", K(ret));
}
// create Purge table stmt
//create Purge table stmt
if (OB_SUCC(ret)) {
if (NULL == (purge_tenant_stmt = create_stmt<ObPurgeTenantStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
@ -201,18 +227,24 @@ int ObPurgeTenantResolver::resolve(const ParseNode& parser_tree)
if (OB_SUCC(ret)) {
purge_tenant_stmt->set_tenant_id(session_info_->get_effective_tenant_id());
ObString tenant_name;
ParseNode* tenant_node = parser_tree.children_[TENANT_NODE];
int32_t max_database_name_length = GET_MIN_CLUSTER_VERSION() < CLUSTER_CURRENT_VERSION
? OB_MAX_DATABASE_NAME_LENGTH - 1
: OB_MAX_DATABASE_NAME_LENGTH;
ParseNode *tenant_node = parser_tree.children_[TENANT_NODE];
/**
* 在2.2.20版本上将命名长度比较逻辑由大于等于128字节时报错调整为大于128字节时报错后, 2.2.20以上版本
* 数据库名长度可以为128字节。 升级过程中高版本server序列化session info到低版本server时, 如果数据
* 库名长度为128字节会存在兼容性问题。 因此在升级过程中限制数据库名长度不超过127字节
*/
int32_t max_database_name_length = GET_MIN_CLUSTER_VERSION() < CLUSTER_CURRENT_VERSION ?
OB_MAX_DATABASE_NAME_LENGTH - 1 : OB_MAX_DATABASE_NAME_LENGTH;
if (OB_ISNULL(tenant_node) || OB_UNLIKELY(T_IDENT != tenant_node->type_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid parse tree", K(ret));
} else if (OB_UNLIKELY(static_cast<int32_t>(tenant_node->str_len_) > max_database_name_length)) {
} else if (OB_UNLIKELY(
static_cast<int32_t>(tenant_node->str_len_) > max_database_name_length)) {
ret = OB_ERR_TOO_LONG_IDENT;
LOG_USER_ERROR(OB_ERR_TOO_LONG_IDENT, (int)tenant_node->str_len_, tenant_node->str_value_);
} else {
tenant_name.assign_ptr(tenant_node->str_value_, static_cast<int32_t>(tenant_node->str_len_));
tenant_name.assign_ptr(tenant_node->str_value_,
static_cast<int32_t>(tenant_node->str_len_));
purge_tenant_stmt->set_tenant_name(tenant_name);
}
}
@ -222,15 +254,15 @@ int ObPurgeTenantResolver::resolve(const ParseNode& parser_tree)
/**
* Purge Recyclebin
*/
int ObPurgeRecycleBinResolver::resolve(const ParseNode& parser_tree)
int ObPurgeRecycleBinResolver::resolve(const ParseNode &parser_tree)
{
int ret = OB_SUCCESS;
ObPurgeRecycleBinStmt* purge_recyclebin_stmt = NULL;
ObPurgeRecycleBinStmt *purge_recyclebin_stmt = NULL;
if (OB_ISNULL(session_info_) || T_PURGE_RECYCLEBIN != parser_tree.type_) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("session_info is null", K(ret));
}
// create Purge table stmt
//create Purge table stmt
if (OB_SUCC(ret)) {
if (NULL == (purge_recyclebin_stmt = create_stmt<ObPurgeRecycleBinStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
@ -245,15 +277,15 @@ int ObPurgeRecycleBinResolver::resolve(const ParseNode& parser_tree)
purge_recyclebin_stmt->set_expire_time(current_time);
purge_recyclebin_stmt->set_purge_num(obrpc::ObPurgeRecycleBinArg::DEFAULT_PURGE_EACH_TIME);
if (OB_SUCC(ret) && ObSchemaChecker::is_ora_priv_check()) {
OZ(schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
session_info_->get_priv_user_id(),
ObString(""),
stmt::T_PURGE_RECYCLEBIN,
session_info_->get_enable_role_array()));
OZ (schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
session_info_->get_priv_user_id(),
ObString(""),
stmt::T_PURGE_RECYCLEBIN,
session_info_->get_enable_role_array()));
}
}
return ret;
}
} // namespace sql
} // namespace oceanbase
} //namespace sql
} //namespace oceanbase