diff --git a/src/rootserver/ob_ddl_operator.cpp b/src/rootserver/ob_ddl_operator.cpp index 357898751e..a46c2e9f8a 100644 --- a/src/rootserver/ob_ddl_operator.cpp +++ b/src/rootserver/ob_ddl_operator.cpp @@ -1636,36 +1636,34 @@ int ObDDLOperator::sync_version_for_cascade_table( { int ret = OB_SUCCESS; uint64_t id = OB_INVALID_ID; - const ObTableSchema *schema = NULL; ObSchemaService *schema_service = schema_service_.get_schema_service(); if (OB_ISNULL(schema_service)) { ret = OB_ERR_SYS; RS_LOG(ERROR, "schema_service must not null"); } else { for (int64_t i = 0; i < table_ids.count() && OB_SUCC(ret); i++) { - ObSchemaGetterGuard schema_guard; id = table_ids.at(i); int64_t new_schema_version = OB_INVALID_VERSION; - ObTableSchema tmp_schema; - if (OB_FAIL(schema_service_.get_tenant_schema_guard(tenant_id, schema_guard))) { - RS_LOG(WARN, "get schema guard failed", K(ret), K(tenant_id), K(id)); - } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id, id, schema))) { - LOG_WARN("fail to get table schema", K(ret), K(tenant_id), K(id)); - } else if (!schema) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("schema is NULL", K(ret)); - } else if (OB_FAIL(tmp_schema.assign(*schema))) { - LOG_WARN("fail to assign schema", K(ret), KPC(schema)); - } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { - LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); - } else if (OB_FAIL(schema_service->get_table_sql_service().sync_schema_version_for_history( - trans, - tmp_schema, - new_schema_version))) { - RS_LOG(WARN, "fail to sync schema version", K(ret)); - } else { - LOG_INFO("synced schema version for depend table", K(id), - "from", schema->get_schema_version(), "to", new_schema_version); + int64_t old_schema_version = OB_INVALID_VERSION; + HEAP_VAR(ObTableSchema, table_schema) { + ObRefreshSchemaStatus schema_status; + schema_status.tenant_id_ = tenant_id; + if (OB_FAIL(schema_service->get_table_schema_from_inner_table( + schema_status, id, trans, table_schema))) { + LOG_WARN("get_table_schema failed", K(ret), K(id), K(tenant_id)); + } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { + LOG_WARN("fail to gen new schema_version", K(ret), K(id), K(tenant_id)); + } else { + old_schema_version = table_schema.get_schema_version(); + if (OB_FAIL(schema_service->get_table_sql_service().sync_schema_version_for_history( + trans, + table_schema, + new_schema_version))) { + RS_LOG(WARN, "fail to sync schema version", K(ret), K(id), K(tenant_id)); + } else { + LOG_INFO("synced schema version for depend table", K(id), "from", old_schema_version, "to", new_schema_version); + } + } } } } diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index 50f42bd294..e09e34e6c4 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -6712,45 +6712,52 @@ int ObResolverUtils::check_foreign_key_columns_type(const bool is_mysql_compat_m LOG_USER_ERROR(OB_ERR_TOO_MANY_ROWKEY_COLUMNS, OB_USER_MAX_ROWKEY_COLUMN_NUMBER); LOG_WARN("the count of foreign key columns should be between [1,64]", K(ret), K(child_columns.count()), K(parent_columns.count())); } else { + uint64_t child_table_id = child_table_schema.get_table_id(); + uint64_t parent_table_id = parent_table_schema.get_table_id(); for (int64_t i = 0; OB_SUCC(ret) && i < parent_columns.count(); ++i) { - const ObColumnSchemaV2 *child_col = NULL; - const ObColumnSchemaV2 *parent_col = parent_table_schema.get_column_schema(parent_columns.at(i)); - if (NULL == column) { // table-level fk - child_col = child_table_schema.get_column_schema(child_columns.at(i)); - } else { // column level fk - child_col = column; - } - if (OB_FAIL(ret)) { - } else if (OB_ISNULL(child_col)) { - ret = OB_ERR_COLUMN_NOT_FOUND; - LOG_WARN("child column is not exist", K(ret)); - } else if (OB_ISNULL(parent_col)) { - ret = OB_ERR_COLUMN_NOT_FOUND; - LOG_WARN("parent column is not exist", K(ret)); - } else if ((child_col->get_data_type() != parent_col->get_data_type()) - && !is_synonymous_type(child_col->get_data_type(), - parent_col->get_data_type())) { - // 这里类型必须相同的 + if (child_table_id == parent_table_id && 0 == parent_columns.at(i).compare(child_columns.at(i))) { ret = OB_ERR_CANNOT_ADD_FOREIGN; - LOG_WARN("Column data types between child table and parent table are different", K(ret), - K(child_col->get_data_type()), - K(parent_col->get_data_type())); - } else if (ob_is_string_type(child_col->get_data_type())) { - // 列类型一致,对于数据宽度要求子表大于父表, 目前只考虑 string 类型, - if (child_col->get_collation_type() != parent_col->get_collation_type()) { + LOG_WARN("Child table is same as parent table and child column is same as parant column", K(ret), K(child_table_id), K(parent_table_id), K(parent_columns.at(i)), K(child_columns.at(i))); + } else { + const ObColumnSchemaV2 *child_col = NULL; + const ObColumnSchemaV2 *parent_col = parent_table_schema.get_column_schema(parent_columns.at(i)); + if (NULL == column) { // table-level fk + child_col = child_table_schema.get_column_schema(child_columns.at(i)); + } else { // column level fk + child_col = column; + } + if (OB_FAIL(ret)) { + } else if (OB_ISNULL(child_col)) { + ret = OB_ERR_COLUMN_NOT_FOUND; + LOG_WARN("child column is not exist", K(ret)); + } else if (OB_ISNULL(parent_col)) { + ret = OB_ERR_COLUMN_NOT_FOUND; + LOG_WARN("parent column is not exist", K(ret)); + } else if ((child_col->get_data_type() != parent_col->get_data_type()) + && !is_synonymous_type(child_col->get_data_type(), + parent_col->get_data_type())) { + // 这里类型必须相同的 ret = OB_ERR_CANNOT_ADD_FOREIGN; - LOG_WARN("The collation types are different", K(ret), - K(child_col->get_collation_type()), - K(parent_col->get_collation_type())); - } else if (is_mysql_compat_mode && - (child_col->get_data_length() < parent_col->get_data_length())) { - ret = OB_ERR_INVALID_CHILD_COLUMN_LENGTH_FK; - LOG_USER_ERROR(OB_ERR_INVALID_CHILD_COLUMN_LENGTH_FK, - child_col->get_column_name_str().length(), - child_col->get_column_name_str().ptr(), - parent_col->get_column_name_str().length(), - parent_col->get_column_name_str().ptr()); - } else { } // 对于其他bit/int/number /datetime/time/year 不做data_length要求 + LOG_WARN("Column data types between child table and parent table are different", K(ret), + K(child_col->get_data_type()), + K(parent_col->get_data_type())); + } else if (ob_is_string_type(child_col->get_data_type())) { + // 列类型一致,对于数据宽度要求子表大于父表, 目前只考虑 string 类型, + if (child_col->get_collation_type() != parent_col->get_collation_type()) { + ret = OB_ERR_CANNOT_ADD_FOREIGN; + LOG_WARN("The collation types are different", K(ret), + K(child_col->get_collation_type()), + K(parent_col->get_collation_type())); + } else if (is_mysql_compat_mode && + (child_col->get_data_length() < parent_col->get_data_length())) { + ret = OB_ERR_INVALID_CHILD_COLUMN_LENGTH_FK; + LOG_USER_ERROR(OB_ERR_INVALID_CHILD_COLUMN_LENGTH_FK, + child_col->get_column_name_str().length(), + child_col->get_column_name_str().ptr(), + parent_col->get_column_name_str().length(), + parent_col->get_column_name_str().ptr()); + } else { } // 对于其他bit/int/number /datetime/time/year 不做data_length要求 + } } } }