From f1dbf3b1b4d397647a4b243004f8ef415b3588f6 Mon Sep 17 00:00:00 2001 From: AnimationFan <3067477338@qq.com> Date: Wed, 22 May 2024 08:16:00 +0000 Subject: [PATCH] [CP] fix parser, not allow to create table with cg during updating --- src/share/schema/ob_schema_utils.cpp | 11 +++++++++++ src/share/schema/ob_schema_utils.h | 1 + src/share/schema/ob_table_schema.cpp | 4 ++++ .../resolver/ddl/ob_create_table_resolver.cpp | 16 ++++------------ src/sql/resolver/ddl/ob_create_table_resolver.h | 1 - src/sql/resolver/ddl/ob_ddl_resolver.cpp | 3 +++ 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/share/schema/ob_schema_utils.cpp b/src/share/schema/ob_schema_utils.cpp index c051ae113..f54c3dabc 100644 --- a/src/share/schema/ob_schema_utils.cpp +++ b/src/share/schema/ob_schema_utils.cpp @@ -1231,6 +1231,17 @@ int ObSchemaUtils::is_drop_column_only(const AlterTableSchema &alter_table_schem return ret; } +bool ObSchemaUtils::can_add_column_group(const ObTableSchema &table_schema) +{ + bool can_add_cg = false; + if (table_schema.is_user_table() + || table_schema.is_tmp_table() + || table_schema.is_index_table()) { + can_add_cg = true; + } + return can_add_cg; +} + } // end schema } // end share } // end oceanbase diff --git a/src/share/schema/ob_schema_utils.h b/src/share/schema/ob_schema_utils.h index 6f7e8d50f..0acc2129d 100644 --- a/src/share/schema/ob_schema_utils.h +++ b/src/share/schema/ob_schema_utils.h @@ -156,6 +156,7 @@ public: static int mock_default_cg( const uint64_t tenant_id, share::schema::ObTableSchema &new_table_schema); + static bool can_add_column_group(const ObTableSchema &table_schema); // Optimized method to batch get latest table schemas from cache or inner_table automatically. // diff --git a/src/share/schema/ob_table_schema.cpp b/src/share/schema/ob_table_schema.cpp index bd7b7971a..34340acb1 100644 --- a/src/share/schema/ob_table_schema.cpp +++ b/src/share/schema/ob_table_schema.cpp @@ -8690,6 +8690,10 @@ int ObTableSchema::add_column_group(const ObColumnGroupSchema &other) if (!other.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", KR(ret), K(other)); + } else if (other.get_column_group_type() != ObColumnGroupType::DEFAULT_COLUMN_GROUP + && !ObSchemaUtils::can_add_column_group(*this)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("only default column group is allowded to add to not user/tmp table", K(ret), K(other), KPC(this)); } else if (OB_FAIL(do_add_column_group(other))) { LOG_WARN("fail to do add column group", KR(ret), K(other)); } diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.cpp b/src/sql/resolver/ddl/ob_create_table_resolver.cpp index 640e787a9..0d94c530f 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_table_resolver.cpp @@ -3283,8 +3283,7 @@ int ObCreateTableResolver::resolve_column_group(const ParseNode *cg_node) LOG_WARN("fail to reserve", KR(ret), K(column_cnt)); } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { LOG_WARN("fail to get min data version", KR(ret), K(tenant_id)); - } else if (!(compat_version >= DATA_VERSION_4_3_0_0) - && can_add_column_group(table_schema)) { + } else if (!(compat_version >= DATA_VERSION_4_3_0_0)) { if (OB_NOT_NULL(cg_node) && (T_COLUMN_GROUP == cg_node->type_)) { ret = OB_NOT_SUPPORTED; LOG_WARN("can't support column store if version less than 4_1_0_0", KR(ret), K(compat_version)); @@ -3303,7 +3302,8 @@ int ObCreateTableResolver::resolve_column_group(const ParseNode *cg_node) if (OB_SUCC(ret) && OB_LIKELY(tenant_config.is_valid()) && nullptr == cg_node) { /* force to build each cg*/ - if (OB_FAIL(ObTableStoreFormat::find_table_store_type( + if (!ObSchemaUtils::can_add_column_group(table_schema)) { + } else if (OB_FAIL(ObTableStoreFormat::find_table_store_type( tenant_config->default_table_store_format.get_value_string(), table_store_type))) { LOG_WARN("fail to get table store format", K(ret), K(table_store_type)); @@ -3321,6 +3321,7 @@ int ObCreateTableResolver::resolve_column_group(const ParseNode *cg_node) /* force to build all cg*/ ObColumnGroupSchema all_cg; if (OB_FAIL(ret)) { + } else if (!ObSchemaUtils::can_add_column_group(table_schema)) { } else if (ObTableStoreFormat::is_row_with_column_store(table_store_type)) { bool is_all_cg_exist = false; if (OB_FAIL(table_schema.is_column_group_exist(OB_ALL_COLUMN_GROUP_NAME, is_all_cg_exist))) { @@ -3355,15 +3356,6 @@ int ObCreateTableResolver::resolve_column_group(const ParseNode *cg_node) return ret; } -bool ObCreateTableResolver::can_add_column_group(const ObTableSchema &table_schema) -{ - bool can_add_cg = false; - if (table_schema.is_user_table() - || table_schema.is_tmp_table()) { - can_add_cg = true; - } - return can_add_cg; -} int ObCreateTableResolver::add_inner_index_for_heap_gtt() { int ret = OB_SUCCESS; diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.h b/src/sql/resolver/ddl/ob_create_table_resolver.h index f0417fbf4..1ddb51082 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.h +++ b/src/sql/resolver/ddl/ob_create_table_resolver.h @@ -134,7 +134,6 @@ private: uint64_t gen_column_group_id(); int resolve_column_group(const ParseNode *cg_node); - bool can_add_column_group(const ObTableSchema &table_schema); int add_inner_index_for_heap_gtt(); int check_max_row_data_length(const ObTableSchema &table_schema); diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index 79cc4a4d9..6fc0bdf11 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -11929,6 +11929,9 @@ int ObDDLResolver::parse_column_group(const ParseNode *column_group_node, if (OB_ISNULL(column_group_node)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("column gorup node should not be null", K(ret)); + } else if (!ObSchemaUtils::can_add_column_group(table_schema)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("not supported table type to add column group", K(ret)); } else { dst_table_schema.set_max_used_column_group_id(table_schema.get_max_used_column_group_id()); }