patch 4.0
This commit is contained in:
@ -18,22 +18,26 @@
|
||||
#include "sql/resolver/ddl/ob_create_outline_stmt.h"
|
||||
#include "sql/session/ob_sql_session_info.h"
|
||||
|
||||
namespace oceanbase {
|
||||
namespace oceanbase
|
||||
{
|
||||
using namespace common;
|
||||
namespace sql {
|
||||
namespace sql
|
||||
{
|
||||
|
||||
int ObCreateOutlineResolver::resolve_sql_id(const ParseNode* node, ObCreateOutlineStmt& create_outline_stmt)
|
||||
|
||||
int ObCreateOutlineResolver::resolve_sql_id(const ParseNode *node, ObCreateOutlineStmt &create_outline_stmt)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (node->type_ != T_VARCHAR) {
|
||||
if (OB_ISNULL(node) || (node->type_ != T_CHAR && node->type_ != T_VARCHAR)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid sql id");
|
||||
} else {
|
||||
create_outline_stmt.get_sql_id() = ObString::make_string(node->str_value_);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObCreateOutlineResolver::resolve_hint(const ParseNode* node, ObCreateOutlineStmt& create_outline_stmt)
|
||||
int ObCreateOutlineResolver::resolve_hint(const ParseNode *node, ObCreateOutlineStmt &create_outline_stmt)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (node == NULL) {
|
||||
@ -45,7 +49,7 @@ int ObCreateOutlineResolver::resolve_hint(const ParseNode* node, ObCreateOutline
|
||||
if (node->type_ != T_HINT_OPTION_LIST) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
} else {
|
||||
char* buf = (char*)allocator_->alloc(node->str_len_ + 4);
|
||||
char *buf = (char *)allocator_->alloc(node->str_len_ + 4);
|
||||
if (NULL == buf) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
LOG_WARN("cannot alloc mem");
|
||||
@ -54,15 +58,19 @@ int ObCreateOutlineResolver::resolve_hint(const ParseNode* node, ObCreateOutline
|
||||
MEMCPY(buf + 3, node->str_value_, node->str_len_);
|
||||
buf[node->str_len_ + 3] = '\0';
|
||||
create_outline_stmt.get_hint() = ObString::make_string(buf);
|
||||
if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(
|
||||
*allocator_, session_info_->get_dtc_params(), create_outline_stmt.get_hint()))) {
|
||||
LOG_WARN("fail to convert sql text", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
for (int32_t i = 0; i < node->num_child_; i++) {
|
||||
ParseNode* hint_node = node->children_[i];
|
||||
for (int32_t i = 0; i < node->num_child_; i ++) {
|
||||
ParseNode *hint_node = node->children_[i];
|
||||
if (!hint_node) {
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
if (hint_node->type_ == T_MAX_CONCURRENT) {
|
||||
if (node->num_child_ > 1) {
|
||||
@ -77,24 +85,25 @@ int ObCreateOutlineResolver::resolve_hint(const ParseNode* node, ObCreateOutline
|
||||
LOG_WARN("child of max concurrent node should not be NULL", K(ret));
|
||||
} else if (hint_node->children_[0]->value_ >= 0) {
|
||||
create_outline_stmt.set_max_concurrent(hint_node->children_[0]->value_);
|
||||
} else { /*do nothing*/
|
||||
}
|
||||
} else {/*do nothing*/}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObCreateOutlineResolver::resolve(const ParseNode& parse_tree)
|
||||
int ObCreateOutlineResolver::resolve(const ParseNode &parse_tree)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ParseNode* node = const_cast<ParseNode*>(&parse_tree);
|
||||
ObCreateOutlineStmt* create_outline_stmt = NULL;
|
||||
ParseNode *node = const_cast<ParseNode *>(&parse_tree);
|
||||
ObCreateOutlineStmt *create_outline_stmt = NULL;
|
||||
if (OB_ISNULL(session_info_) || OB_ISNULL(allocator_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("session_info_ or allocator_ is NULL", KP(session_info_), K(allocator_), K(ret));
|
||||
} else if (OB_ISNULL(node) || OB_UNLIKELY(node->type_ != T_CREATE_OUTLINE) ||
|
||||
OB_UNLIKELY(node->num_child_ != OUTLINE_CHILD_COUNT)) {
|
||||
LOG_WARN("session_info_ or allocator_ is NULL",
|
||||
KP(session_info_), K(allocator_), K(ret));
|
||||
} else if (OB_ISNULL(node)
|
||||
|| OB_UNLIKELY(node->type_ != T_CREATE_OUTLINE)
|
||||
|| OB_UNLIKELY(node->num_child_ != OUTLINE_CHILD_COUNT)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("invalid parse tree", K(ret));
|
||||
} else if (OB_ISNULL(node->children_)) {
|
||||
@ -105,14 +114,14 @@ int ObCreateOutlineResolver::resolve(const ParseNode& parse_tree)
|
||||
LOG_ERROR("failed to create create_outline_stmt", K(ret));
|
||||
} else {
|
||||
stmt_ = create_outline_stmt;
|
||||
// set is_replace
|
||||
//set is_replace
|
||||
if (node->children_[0] != NULL) {
|
||||
create_outline_stmt->set_replace();
|
||||
}
|
||||
// set owner
|
||||
//set owner
|
||||
create_outline_stmt->set_owner(session_info_->get_user_name());
|
||||
create_outline_stmt->set_owner_id(session_info_->get_user_id());
|
||||
// set server version
|
||||
//set server version
|
||||
ObString server_version;
|
||||
if (OB_FAIL(ob_write_string(*allocator_, ObString(build_version()), server_version))) {
|
||||
LOG_WARN("failed to write string", K(ret));
|
||||
@ -120,7 +129,7 @@ int ObCreateOutlineResolver::resolve(const ParseNode& parse_tree)
|
||||
create_outline_stmt->set_server_version(server_version);
|
||||
}
|
||||
|
||||
// resolve database_name and outline_name
|
||||
//resolve database_name and outline_name
|
||||
if (OB_SUCC(ret)) {
|
||||
ObString db_name;
|
||||
ObString outline_name;
|
||||
@ -133,14 +142,14 @@ int ObCreateOutlineResolver::resolve(const ParseNode& parse_tree)
|
||||
}
|
||||
|
||||
if (node->children_[2]->value_ == 1) {
|
||||
// resolve outline_stmt
|
||||
//resolve outline_stmt
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(resolve_outline_stmt(
|
||||
node->children_[3], create_outline_stmt->get_outline_stmt(), create_outline_stmt->get_outline_sql()))) {
|
||||
if (OB_FAIL(resolve_outline_stmt(node->children_[3], create_outline_stmt->get_outline_stmt(),
|
||||
create_outline_stmt->get_outline_sql()))) {
|
||||
LOG_WARN("fail to resolve outline stmt", K(ret));
|
||||
}
|
||||
}
|
||||
// set outline_target
|
||||
//set outline_target
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(resolve_outline_target(node->children_[4], create_outline_stmt->get_target_sql()))) {
|
||||
LOG_WARN("fail to resolve outline target", K(ret));
|
||||
@ -154,19 +163,20 @@ int ObCreateOutlineResolver::resolve(const ParseNode& parse_tree)
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret) && ObSchemaChecker::is_ora_priv_check()) {
|
||||
CK(OB_NOT_NULL(schema_checker_));
|
||||
OZ(schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
|
||||
session_info_->get_priv_user_id(),
|
||||
ObString(""),
|
||||
stmt::T_CREATE_OUTLINE,
|
||||
session_info_->get_enable_role_array()),
|
||||
CK (OB_NOT_NULL(schema_checker_));
|
||||
OZ (schema_checker_->check_ora_ddl_priv(
|
||||
session_info_->get_effective_tenant_id(),
|
||||
session_info_->get_user_id());
|
||||
session_info_->get_priv_user_id(),
|
||||
ObString(""),
|
||||
stmt::T_CREATE_OUTLINE,
|
||||
session_info_->get_enable_role_array()),
|
||||
session_info_->get_effective_tenant_id(), session_info_->get_user_id());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
} // namespace sql
|
||||
} // namespace oceanbase
|
||||
}//sql
|
||||
}//oceanbase
|
||||
|
||||
Reference in New Issue
Block a user