diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 27006807c6..e9b1ec0ae5 100644 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -991,7 +991,10 @@ int ObDDLService::generate_schema( if (OB_FAIL(schema_service->fetch_new_constraint_id(tenant_id, new_cst_id))) { LOG_WARN("failed to fetch new constraint id", K(ret)); } else if (FALSE_IT(cst.set_constraint_id(new_cst_id))) { - } else if (!cst.get_constraint_name_str().empty()) { + } else if (cst.get_constraint_name_str().empty()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cst name is empty", K(ret)); + } else { // Check whether the name of the constraint is repeated bool is_constraint_name_exist = false; if (OB_FAIL(check_constraint_name_is_exist(guard, schema, cst.get_constraint_name_str(), false, is_constraint_name_exist))) { @@ -1195,7 +1198,10 @@ int ObDDLService::deal_with_cst_for_alter_table( const ObCreateForeignKeyArg &foreign_key_arg = alter_table_arg.foreign_key_arg_list_.at(i); ObForeignKeyInfo foreign_key_info; // Check for duplicate foreign key constraint names - if (!foreign_key_arg.foreign_key_name_.empty()) { + if (foreign_key_arg.foreign_key_name_.empty()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fk name is empty", K(ret)); + } else { bool is_foreign_key_name_exist = true; if (OB_FAIL(check_constraint_name_is_exist(schema_guard, *table_schema, foreign_key_arg.foreign_key_name_, true, is_foreign_key_name_exist))) { LOG_WARN("fail to check foreign key name is exist or not", K(ret), K(foreign_key_arg.foreign_key_name_)); diff --git a/src/rootserver/ob_root_service.cpp b/src/rootserver/ob_root_service.cpp index 2f6a3a5209..4d5b59d232 100644 --- a/src/rootserver/ob_root_service.cpp +++ b/src/rootserver/ob_root_service.cpp @@ -3160,7 +3160,10 @@ int ObRootService::create_table(const ObCreateTableArg &arg, ObCreateTableRes &r const ObCreateForeignKeyArg &foreign_key_arg = arg.foreign_key_arg_list_.at(i); ObForeignKeyInfo foreign_key_info; // check for duplicate constraint names of foregin key - if (!foreign_key_arg.foreign_key_name_.empty()) { + if (foreign_key_arg.foreign_key_name_.empty()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fk name is empty", K(ret)); + } else { bool is_foreign_key_name_exist = true; if (OB_FAIL(ddl_service_.check_constraint_name_is_exist( schema_guard, table_schema, foreign_key_arg.foreign_key_name_, true, is_foreign_key_name_exist))) { diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index 059607780c..bc5481b88e 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -6045,6 +6045,10 @@ int ObDDLResolver::resolve_check_constraint_node( } else { cst_name.assign_ptr(cst_name_node->children_[0]->str_value_, static_cast(cst_name_node->children_[0]->str_len_)); } + if (cst_name.empty()) { + ret = OB_ERR_ZERO_LENGTH_IDENTIFIER; + SQL_RESV_LOG(WARN, "zero-length constraint name is illegal", K(ret)); + } } if (OB_SUCC(ret)) { bool need_reset_generated_name = is_sys_generated_cst_name; @@ -6208,6 +6212,9 @@ int ObDDLResolver::resolve_pk_constraint_node(const ParseNode &pk_cst_node, if (OB_FAIL(ObTableSchema::create_cons_name_automatically(cst_name, table_name_, *allocator_, CONSTRAINT_TYPE_PRIMARY_KEY, lib::is_oracle_mode()))) { SQL_RESV_LOG(WARN, "create cons name automatically failed", K(ret)); } + } else if (NULL == cst_name_node->str_value_ || 0 == cst_name_node->str_len_) { + ret = OB_ERR_ZERO_LENGTH_IDENTIFIER; + SQL_RESV_LOG(WARN, "zero-length constraint name is illegal", K(ret)); } else { cst_name.assign_ptr(cst_name_node->str_value_,static_cast(cst_name_node->str_len_)); } @@ -7252,7 +7259,34 @@ int ObDDLResolver::resolve_foreign_key_name(const ParseNode *constraint_node, ret = OB_INVALID_ARGUMENT; SQL_RESV_LOG(WARN, "invalid argument", K(ret), K(constraint_node->type_), K(constraint_node->num_child_), KP(constraint_node->children_)); } else if (OB_NOT_NULL(constraint_name = constraint_node->children_[0])) { - foreign_key_name.assign_ptr(constraint_name->str_value_, static_cast(constraint_name->str_len_)); + if (NULL == constraint_name->str_value_ || 0 == constraint_name->str_len_) { + ret = OB_ERR_ZERO_LENGTH_IDENTIFIER; + SQL_RESV_LOG(WARN, "zero-length constraint name is illegal", K(ret)); + } else { + foreign_key_name.assign_ptr(constraint_name->str_value_, static_cast(constraint_name->str_len_)); + // 检查一条 create table 语句里连续建多个外键时,外键名是否重复 + ObForeignKeyNameHashWrapper fk_key(foreign_key_name); + if (OB_HASH_EXIST == (ret = current_foreign_key_name_set_.exist_refactored(fk_key))) { + SQL_RESV_LOG(WARN, "duplicate fk name", K(ret), K(foreign_key_name)); + ret = OB_ERR_CANNOT_ADD_FOREIGN; + } else { + ret = OB_SUCCESS; + // 向 hash set 插入 fk_name + if (OB_FAIL(current_foreign_key_name_set_.set_refactored(fk_key))) { + SQL_RESV_LOG(WARN, "set foreign key name to hash set failed", K(ret), K(foreign_key_name)); + } + } + } + } else if (OB_FAIL(create_fk_cons_name_automatically(foreign_key_name))) { + SQL_RESV_LOG(WARN, "create cons name automatically failed", K(ret)); + } + } else { + // oracle mode + if (NULL == constraint_node->str_value_ || 0 == constraint_node->str_len_) { + ret = OB_ERR_ZERO_LENGTH_IDENTIFIER; + SQL_RESV_LOG(WARN, "zero-length constraint name is illegal", K(ret)); + } else { + foreign_key_name.assign_ptr(constraint_node->str_value_, static_cast(constraint_node->str_len_)); // 检查一条 create table 语句里连续建多个外键时,外键名是否重复 ObForeignKeyNameHashWrapper fk_key(foreign_key_name); if (OB_HASH_EXIST == (ret = current_foreign_key_name_set_.exist_refactored(fk_key))) { @@ -7265,23 +7299,6 @@ int ObDDLResolver::resolve_foreign_key_name(const ParseNode *constraint_node, SQL_RESV_LOG(WARN, "set foreign key name to hash set failed", K(ret), K(foreign_key_name)); } } - } else if (OB_FAIL(create_fk_cons_name_automatically(foreign_key_name))) { - SQL_RESV_LOG(WARN, "create cons name automatically failed", K(ret)); - } - } else { - // oracle mode - foreign_key_name.assign_ptr(constraint_node->str_value_, static_cast(constraint_node->str_len_)); - // 检查一条 create table 语句里连续建多个外键时,外键名是否重复 - ObForeignKeyNameHashWrapper fk_key(foreign_key_name); - if (OB_HASH_EXIST == (ret = current_foreign_key_name_set_.exist_refactored(fk_key))) { - SQL_RESV_LOG(WARN, "duplicate fk name", K(ret), K(foreign_key_name)); - ret = OB_ERR_CANNOT_ADD_FOREIGN; - } else { - ret = OB_SUCCESS; - // 向 hash set 插入 fk_name - if (OB_FAIL(current_foreign_key_name_set_.set_refactored(fk_key))) { - SQL_RESV_LOG(WARN, "set foreign key name to hash set failed", K(ret), K(foreign_key_name)); - } } } } else if (OB_FAIL(create_fk_cons_name_automatically(foreign_key_name))) { @@ -7681,8 +7698,11 @@ int ObDDLResolver::resolve_not_null_constraint_node( lib::is_oracle_mode()))) { SQL_RESV_LOG(WARN, "create cons name automatically failed", K(ret)); } + } else if (NULL == cst_name_node->str_value_ || 0 == cst_name_node->str_len_) { + ret = OB_ERR_ZERO_LENGTH_IDENTIFIER; + SQL_RESV_LOG(WARN, "zero-length constraint name is illegal", K(ret)); } else { - cst_name.assign_ptr(cst_name_node->str_value_,static_cast(cst_name_node->str_len_)); + cst_name.assign_ptr(cst_name_node->str_value_, static_cast(cst_name_node->str_len_)); } LOG_DEBUG("resolve not null constraint node mid", K(cst_name), K(cst_name_node)); if (OB_SUCC(ret)) {