From b4e4b0407d9d245ed750333f6c7a0daac3aa5e14 Mon Sep 17 00:00:00 2001 From: 0xacc Date: Wed, 7 Feb 2024 20:04:16 +0000 Subject: [PATCH] [CP] [CP] [to #53119817] fix a .net driver compatibility issue --- .../virtual_table/ob_mysql_proc_table.cpp | 76 +++++++++++++++++-- .../virtual_table/ob_mysql_proc_table.h | 1 + .../ob_inner_table_schema.12001_12050.cpp | 32 +++----- .../inner_table/ob_inner_table_schema_def.py | 4 +- .../mysql/desc_virtual_table_in_mysql.result | 4 +- .../r/mysql/desc_virtual_table_in_sys.result | 4 +- 6 files changed, 89 insertions(+), 32 deletions(-) diff --git a/src/observer/virtual_table/ob_mysql_proc_table.cpp b/src/observer/virtual_table/ob_mysql_proc_table.cpp index 18a175c068..c1aff4e280 100644 --- a/src/observer/virtual_table/ob_mysql_proc_table.cpp +++ b/src/observer/virtual_table/ob_mysql_proc_table.cpp @@ -137,6 +137,21 @@ int ObMySQLProcTable::inner_get_next_row(common::ObNewRow *&row) break; } case (PARAM_LIST): { + const ObColumnSchemaV2 *tmp_column_schema = NULL; + bool type_is_lob = true; + if (OB_ISNULL(table_schema_) || + OB_ISNULL( + tmp_column_schema = + table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", + KR(ret), + KP(table_schema_), + KP(tmp_column_schema)); + } else { + type_is_lob = tmp_column_schema->get_meta_type().is_lob(); + } + if (nullptr != create_node) { if (T_SP_CREATE != create_node->type_ && T_SF_CREATE != create_node->type_ && OB_ISNULL(create_node->children_[2])) { ret = OB_ERR_UNEXPECTED; @@ -157,8 +172,20 @@ int ObMySQLProcTable::inner_get_next_row(common::ObNewRow *&row) K(value_str)); } } - OX (cells[col_idx].set_varchar(value_str)); - OX (cells[col_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset()))); + if (OB_FAIL(ret)) { + // do nothing + } else if (type_is_lob) { + cells[col_idx].set_lob_value(ObLongTextType, + value_str.ptr(), + value_str.length()); + ObCollationType cs_type = tmp_column_schema->get_collation_type() == CS_TYPE_BINARY + ? CS_TYPE_BINARY // when this column is longblob + : ObCharset::get_default_collation(ObCharset::get_default_charset()); // when this column is longtext + cells[col_idx].set_collation_type(cs_type); + } else { + cells[col_idx].set_varchar(value_str); + cells[col_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } } } else { char *param_list_buf = NULL; @@ -179,8 +206,19 @@ int ObMySQLProcTable::inner_get_next_row(common::ObNewRow *&row) SERVER_LOG(WARN, "Generate table definition failed"); } else { ObString value_str(static_cast(pos), static_cast(pos), param_list_buf); - cells[col_idx].set_varchar(value_str); - cells[col_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (type_is_lob) { + cells[col_idx].set_lob_value(ObLongTextType, + value_str.ptr(), + value_str.length()); + ObCollationType cs_type = tmp_column_schema->get_collation_type() == CS_TYPE_BINARY + ? CS_TYPE_BINARY // when this column is longblob + : ObCharset::get_default_collation(ObCharset::get_default_charset()); // when this column is longtext + cells[col_idx].set_collation_type(cs_type); + } else { + cells[col_idx].set_varchar(value_str); + cells[col_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } } } } @@ -190,6 +228,21 @@ int ObMySQLProcTable::inner_get_next_row(common::ObNewRow *&row) char *returns_buf = NULL; int64_t returns_buf_size = OB_MAX_VARCHAR_LENGTH; int64_t pos = 0; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + bool type_is_lob = true; + if (OB_ISNULL(table_schema_) || + OB_ISNULL( + tmp_column_schema = + table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", + KR(ret), + KP(table_schema_), + KP(tmp_column_schema)); + } else { + type_is_lob = tmp_column_schema->get_meta_type().is_lob(); + } + if (OB_UNLIKELY(NULL == (returns_buf = static_cast(allocator_->alloc(returns_buf_size))))) { ret = OB_ALLOCATE_MEMORY_FAILED; SERVER_LOG(WARN, "fail to alloc returns_buf", K(ret)); @@ -210,8 +263,19 @@ int ObMySQLProcTable::inner_get_next_row(common::ObNewRow *&row) } if (OB_SUCC(ret)) { ObString value_str(static_cast(pos), static_cast(pos), returns_buf); - cells[col_idx].set_varchar(value_str); - cells[col_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (type_is_lob) { + cells[col_idx].set_lob_value(ObLongTextType, + value_str.ptr(), + value_str.length()); + ObCollationType cs_type = tmp_column_schema->get_collation_type() == CS_TYPE_BINARY + ? CS_TYPE_BINARY // when this column is longblob + : ObCharset::get_default_collation(ObCharset::get_default_charset()); // when this column is longtext + cells[col_idx].set_collation_type(cs_type); + } else { + cells[col_idx].set_varchar(value_str); + cells[col_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } } } break; diff --git a/src/observer/virtual_table/ob_mysql_proc_table.h b/src/observer/virtual_table/ob_mysql_proc_table.h index e3958cc9a2..583b7765ca 100644 --- a/src/observer/virtual_table/ob_mysql_proc_table.h +++ b/src/observer/virtual_table/ob_mysql_proc_table.h @@ -21,6 +21,7 @@ namespace oceanbase namespace sql { class ObSQLSessionInfo; +class ObExecEnv; } namespace observer { diff --git a/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp b/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp index d267634a98..b60679c006 100644 --- a/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp @@ -1936,41 +1936,33 @@ int ObInnerTableSchema::proc_schema(ObTableSchema &table_schema) } if (OB_SUCC(ret)) { - ObObj param_list_default; - param_list_default.set_varchar(ObString::make_string("")); - ADD_COLUMN_SCHEMA_T("param_list", //column_name + ADD_COLUMN_SCHEMA("param_list", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObVarcharType, //column_type - CS_TYPE_INVALID, //column_collation_type - OB_MAX_VARCHAR_LENGTH, //column_length + ObLongTextType, //column_type + CS_TYPE_BINARY, //column_collation_type + 0, //column_length -1, //column_precision -1, //column_scale - false, //is_nullable - false, //is_autoincrement - param_list_default, - param_list_default); //default_value + true, //is_nullable + false); //is_autoincrement } if (OB_SUCC(ret)) { - ObObj returns_default; - returns_default.set_varchar(ObString::make_string("")); - ADD_COLUMN_SCHEMA_T("returns", //column_name + ADD_COLUMN_SCHEMA("returns", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObVarcharType, //column_type - CS_TYPE_INVALID, //column_collation_type - OB_MAX_VARCHAR_LENGTH, //column_length + ObLongTextType, //column_type + CS_TYPE_BINARY, //column_collation_type + 0, //column_length -1, //column_precision -1, //column_scale - false, //is_nullable - false, //is_autoincrement - returns_default, - returns_default); //default_value + true, //is_nullable + false); //is_autoincrement } if (OB_SUCC(ret)) { diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 7ced040cdc..54c380b54e 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -9459,8 +9459,8 @@ def_table_schema( ('sql_data_access', 'varchar:32', 'false', 'CONTAINS_SQL'), ('is_deterministic', 'varchar:4', 'false', 'NO'), ('security_type', 'varchar:10', 'false', 'DEFINER'), - ('param_list', 'varchar:OB_MAX_VARCHAR_LENGTH', 'false', ''), - ('returns', 'varchar:OB_MAX_VARCHAR_LENGTH', 'false', ''), + ('param_list', 'longblob', 'true'), + ('returns', 'longblob', 'true'), ('body', 'varchar:OB_MAX_VARCHAR_LENGTH', 'false', ''), ('definer', 'varchar:77', 'false', ''), ('created', 'timestamp'), diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result index 7a5dd09821..2579ccbb66 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result @@ -1563,8 +1563,8 @@ language varchar(4) NO SQL sql_data_access varchar(32) NO CONTAINS_SQL is_deterministic varchar(4) NO NO security_type varchar(10) NO DEFINER -param_list varchar(1048576) NO -returns varchar(1048576) NO +param_list longblob YES NULL +returns longblob YES NULL body varchar(1048576) NO definer varchar(77) NO created timestamp(6) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result index 87fc31aefa..de346ce218 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result @@ -2093,8 +2093,8 @@ language varchar(4) NO SQL sql_data_access varchar(32) NO CONTAINS_SQL is_deterministic varchar(4) NO NO security_type varchar(10) NO DEFINER -param_list varchar(1048576) NO -returns varchar(1048576) NO +param_list longblob YES NULL +returns longblob YES NULL body varchar(1048576) NO definer varchar(77) NO created timestamp(6) NO NULL