From ea5bd71d32b6a9ce4ffe788aab545b95a5294449 Mon Sep 17 00:00:00 2001 From: yb0 Date: Mon, 20 Dec 2021 20:04:06 +0800 Subject: [PATCH] fix check text column bug during ctas --- src/sql/resolver/ddl/ob_create_table_resolver.cpp | 4 ++-- src/sql/resolver/ddl/ob_ddl_resolver.cpp | 11 +++++++---- src/sql/resolver/ddl/ob_ddl_resolver.h | 12 ++++-------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.cpp b/src/sql/resolver/ddl/ob_create_table_resolver.cpp index da1f1f9b8..e5c16bdd6 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_table_resolver.cpp @@ -1583,7 +1583,7 @@ int ObCreateTableResolver::resolve_table_elements_from_select(const ParseNode& p } else if (is_oracle_mode() && create_table_column_count > 0) { if (column.is_string_type()) { if (column.get_meta_type().is_lob()) { - if (OB_FAIL(check_text_column_length_and_promote(column, table_id_))) { + if (OB_FAIL(check_text_column_length_and_promote(column, table_id_, true))) { LOG_WARN("fail to check text or blob column length", K(ret), K(column)); } } else if (OB_FAIL(check_string_column_length(column, share::is_oracle_mode()))) { @@ -1626,7 +1626,7 @@ int ObCreateTableResolver::resolve_table_elements_from_select(const ParseNode& p } else { if (column.is_string_type()) { if (column.get_meta_type().is_lob()) { - if (OB_FAIL(check_text_column_length_and_promote(column, table_id_))) { + if (OB_FAIL(check_text_column_length_and_promote(column, table_id_, true))) { LOG_WARN("fail to check text or blob column length", K(ret), K(column)); } } else if (OB_FAIL(check_string_column_length(column, share::is_oracle_mode()))) { diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index 3e66c8776..0764d7360 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -2946,7 +2946,7 @@ int ObDDLResolver::check_urowid_column_length(const share::schema::ObColumnSchem } int ObDDLResolver::check_text_length(ObCharsetType cs_type, ObCollationType co_type, const char* name, ObObjType& type, - int32_t& length, bool need_rewrite_length) + int32_t& length, bool need_rewrite_length, const bool is_byte_length /* = false */) { int ret = OB_SUCCESS; int64_t mbmaxlen = 0; @@ -2954,9 +2954,10 @@ int ObDDLResolver::check_text_length(ObCharsetType cs_type, ObCollationType co_t if (!ob_is_text_tc(type) || CHARSET_INVALID == cs_type || CS_TYPE_INVALID == co_type) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(ERROR, "column infomation is error", K(cs_type), K(co_type), K(ret)); - } else if (OB_FAIL(ObCharset::get_mbmaxlen_by_coll(co_type, mbmaxlen))) { + } else if (!is_byte_length && OB_FAIL(ObCharset::get_mbmaxlen_by_coll(co_type, mbmaxlen))) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(WARN, "fail to get mbmaxlen", K(ret), K(co_type)); + } else if (is_byte_length && OB_FALSE_IT(mbmaxlen = 1)) { } else if (0 == mbmaxlen) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(ERROR, "mbmaxlen can not be 0", K(ret), K(co_type), K(mbmaxlen)); @@ -3025,7 +3026,8 @@ int ObDDLResolver::rewrite_text_length_mysql(ObObjType& type, int32_t& length) } // TODO texttc should care about the the defined length not the actual length -int ObDDLResolver::check_text_column_length_and_promote(ObColumnSchemaV2& column, int64_t table_id) +int ObDDLResolver::check_text_column_length_and_promote( + ObColumnSchemaV2& column, int64_t table_id, const bool is_byte_length /* = false */) { int ret = OB_SUCCESS; bool need_check_length = true; @@ -3041,7 +3043,8 @@ int ObDDLResolver::check_text_column_length_and_promote(ObColumnSchemaV2& column column.get_column_name(), type, length, - need_check_length))) { + need_check_length, + is_byte_length))) { LOG_WARN("failed to check text length", K(ret), K(column)); } else { column.set_data_type(type); diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.h b/src/sql/resolver/ddl/ob_ddl_resolver.h index f4c54b9a0..0e486c900 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.h +++ b/src/sql/resolver/ddl/ob_ddl_resolver.h @@ -142,13 +142,8 @@ public: static const int64_t DEFAULT_TABLE_DOP = 1; explicit ObDDLResolver(ObResolverParams& params); virtual ~ObDDLResolver(); - static int check_text_length(ObCharsetType cs_type, - ObCollationType co_type, - const char* name, - ObObjType& type, - int32_t& length, - bool need_rewrite_length); - + static int check_text_length(ObCharsetType cs_type, ObCollationType co_type, const char *name, ObObjType &type, + int32_t &length, bool need_rewrite_length, const bool is_byte_length = false); static int rewrite_text_length_mysql(ObObjType &type, int32_t &length); static int check_uniq_allow( share::schema::ObTableSchema& table_schema, obrpc::ObCreateIndexArg& index_arg, bool& allow); @@ -187,7 +182,8 @@ public: static int cast_enum_or_set_default_value( const share::schema::ObColumnSchemaV2& column, common::ObObjCastParams& params, common::ObObj& def_val); int check_partition_name_duplicate(ParseNode* node, bool is_oracle_modle = false); - static int check_text_column_length_and_promote(share::schema::ObColumnSchemaV2& column, int64_t table_id); + static int check_text_column_length_and_promote( + share::schema::ObColumnSchemaV2& column, int64_t table_id, const bool is_byte_length = false); static int get_enable_split_partition(const int64_t tenant_id, bool& enable_split_partition); typedef common::hash::ObPlacementHashSet IndexNameSet;