patch 4.0
This commit is contained in:
@ -15,18 +15,22 @@
|
||||
#include "sql/session/ob_sql_session_info.h"
|
||||
#include "observer/ob_server.h"
|
||||
|
||||
namespace oceanbase {
|
||||
namespace oceanbase
|
||||
{
|
||||
using namespace common;
|
||||
using namespace share::schema;
|
||||
namespace sql {
|
||||
namespace sql
|
||||
{
|
||||
|
||||
ObCreateTableLikeResolver::ObCreateTableLikeResolver(ObResolverParams& params) : ObDDLResolver(params)
|
||||
{}
|
||||
ObCreateTableLikeResolver::ObCreateTableLikeResolver(ObResolverParams ¶ms)
|
||||
: ObDDLResolver(params)
|
||||
{
|
||||
}
|
||||
|
||||
ObCreateTableLikeResolver::~ObCreateTableLikeResolver()
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
int ObCreateTableLikeResolver::resolve(const ParseNode& parse_tree)
|
||||
int ObCreateTableLikeResolver::resolve(const ParseNode &parse_tree)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
bool is_temporary_table = false;
|
||||
@ -37,19 +41,20 @@ int ObCreateTableLikeResolver::resolve(const ParseNode& parse_tree)
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
SQL_RESV_LOG(WARN, "invalid parse tree", K(ret));
|
||||
} else {
|
||||
ObCreateTableLikeStmt* create_table_like_stmt = NULL;
|
||||
ObCreateTableLikeStmt *create_table_like_stmt = NULL;
|
||||
if (NULL == (create_table_like_stmt = create_stmt<ObCreateTableLikeStmt>())) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
SQL_RESV_LOG(ERROR, "failed to create create_table_like stmt", K(ret));
|
||||
} else {
|
||||
stmt_ = create_table_like_stmt;
|
||||
}
|
||||
// resolve temporary option
|
||||
//resolve temporary option
|
||||
if (OB_SUCC(ret)) {
|
||||
if (NULL != parse_tree.children_[0]) {
|
||||
if (T_TEMPORARY != parse_tree.children_[0]->type_) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
SQL_RESV_LOG(WARN, "invalid argument.", K(ret), K(parse_tree.children_[0]->type_));
|
||||
SQL_RESV_LOG(WARN, "invalid argument.",
|
||||
K(ret), K(parse_tree.children_[0]->type_));
|
||||
} else {
|
||||
is_temporary_table = true;
|
||||
}
|
||||
@ -76,7 +81,7 @@ int ObCreateTableLikeResolver::resolve(const ParseNode& parse_tree)
|
||||
create_table_like_stmt->set_table_type(share::schema::USER_TABLE);
|
||||
}
|
||||
}
|
||||
// if not exist
|
||||
//if not exist
|
||||
if (OB_SUCC(ret)) {
|
||||
if (NULL != parse_tree.children_[1]) {
|
||||
create_table_like_stmt->set_if_not_exist(true);
|
||||
@ -86,38 +91,47 @@ int ObCreateTableLikeResolver::resolve(const ParseNode& parse_tree)
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
ParseNode* new_relation_node = parse_tree.children_[2];
|
||||
ParseNode* origin_relation_node = parse_tree.children_[3];
|
||||
ParseNode *new_relation_node = parse_tree.children_[2];
|
||||
ParseNode *origin_relation_node = parse_tree.children_[3];
|
||||
if (NULL != new_relation_node && NULL != origin_relation_node) {
|
||||
// resolve table
|
||||
//resolve table
|
||||
ObString origin_table_name;
|
||||
ObString origin_database_name;
|
||||
ObString new_table_name;
|
||||
ObString new_database_name;
|
||||
if (OB_FAIL(resolve_table_relation_node(new_relation_node, new_table_name, new_database_name))) {
|
||||
SQL_RESV_LOG(WARN, "failed to resolve table name.", K(new_table_name), K(new_database_name), K(ret));
|
||||
} else if (OB_FAIL(
|
||||
resolve_table_relation_node(origin_relation_node, origin_table_name, origin_database_name))) {
|
||||
SQL_RESV_LOG(WARN, "failed to resolve origin name.", K(origin_table_name), K(origin_database_name), K(ret));
|
||||
} else if (ObString(OB_RECYCLEBIN_SCHEMA_NAME) == new_database_name ||
|
||||
ObSchemaUtils::is_public_database(new_database_name, lib::is_oracle_mode())) {
|
||||
if (OB_FAIL(resolve_table_relation_node(new_relation_node,
|
||||
new_table_name,
|
||||
new_database_name))) {
|
||||
SQL_RESV_LOG(WARN, "failed to resolve table name.",
|
||||
K(new_table_name), K(new_database_name), K(ret));
|
||||
} else if (OB_FAIL(resolve_table_relation_node(origin_relation_node,
|
||||
origin_table_name,
|
||||
origin_database_name))) {
|
||||
SQL_RESV_LOG(WARN, "failed to resolve origin name.",
|
||||
K(origin_table_name), K(origin_database_name), K(ret));
|
||||
} else if (ObString(OB_RECYCLEBIN_SCHEMA_NAME) == new_database_name
|
||||
|| ObString(OB_PUBLIC_SCHEMA_NAME) == new_database_name) {
|
||||
ret = OB_OP_NOT_ALLOW;
|
||||
SQL_RESV_LOG(WARN,
|
||||
"create table in recyclebin database is not allowed",
|
||||
K(ret),
|
||||
K(new_table_name),
|
||||
K(new_database_name),
|
||||
K(origin_table_name),
|
||||
K(origin_database_name));
|
||||
SQL_RESV_LOG(WARN, "create table in recyclebin database is not allowed", K(ret),
|
||||
K(new_table_name), K(new_database_name),
|
||||
K(origin_table_name), K(origin_database_name));
|
||||
} else {
|
||||
bool db_equal = false;
|
||||
bool table_equal = false;
|
||||
if (OB_FAIL(ObResolverUtils::name_case_cmp(
|
||||
session_info_, origin_database_name, new_database_name, OB_TABLE_NAME_CLASS, db_equal))) {
|
||||
SQL_RESV_LOG(WARN, "failed to compare db names", K(origin_database_name), K(new_database_name), K(ret));
|
||||
} else if (OB_FAIL(ObResolverUtils::name_case_cmp(
|
||||
session_info_, origin_table_name, new_table_name, OB_TABLE_NAME_CLASS, table_equal))) {
|
||||
SQL_RESV_LOG(WARN, "failed to compare table names", K(origin_table_name), K(new_table_name), K(ret));
|
||||
if (OB_FAIL(ObResolverUtils::name_case_cmp(session_info_,
|
||||
origin_database_name,
|
||||
new_database_name,
|
||||
OB_TABLE_NAME_CLASS,
|
||||
db_equal))) {
|
||||
SQL_RESV_LOG(WARN, "failed to compare db names", K(origin_database_name),
|
||||
K(new_database_name), K(ret));
|
||||
} else if (OB_FAIL(ObResolverUtils::name_case_cmp(session_info_,
|
||||
origin_table_name,
|
||||
new_table_name,
|
||||
OB_TABLE_NAME_CLASS,
|
||||
table_equal))) {
|
||||
SQL_RESV_LOG(WARN, "failed to compare table names", K(origin_table_name),
|
||||
K(new_table_name), K(ret));
|
||||
} else if (db_equal && table_equal) {
|
||||
ret = OB_ERR_NONUNIQ_TABLE;
|
||||
LOG_USER_ERROR(OB_ERR_NONUNIQ_TABLE, origin_table_name.length(), origin_table_name.ptr());
|
||||
@ -135,18 +149,11 @@ int ObCreateTableLikeResolver::resolve(const ParseNode& parse_tree)
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
bool strict_mode = true;
|
||||
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 {
|
||||
obrpc::ObCreateTableMode create_mode =
|
||||
strict_mode ? obrpc::OB_CREATE_TABLE_MODE_STRICT : obrpc::OB_CREATE_TABLE_MODE_LOOSE;
|
||||
create_table_like_stmt->set_create_mode(create_mode);
|
||||
}
|
||||
create_table_like_stmt->set_define_user_id(session_info_->get_priv_user_id());
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
} // namespace sql
|
||||
} // namespace oceanbase
|
||||
} //namespace common
|
||||
} //namespace oceanbase
|
||||
|
||||
Reference in New Issue
Block a user