From 87ad8877d4eaae4707a9ed4bcf2afb09ebe61194 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 24 Apr 2023 04:41:24 +0000 Subject: [PATCH] [BUGFIX] fix lob delete with MINIMAL mode --- deps/easy/src/io/easy_negotiation.c | 12 +++---- src/observer/mysql/ob_query_driver.cpp | 8 +++-- src/sql/das/ob_das_dml_ctx_define.cpp | 20 +++++++---- src/sql/resolver/dml/ob_del_upd_resolver.cpp | 35 ++++++++++++++++++++ src/sql/resolver/dml/ob_del_upd_resolver.h | 1 + src/sql/resolver/dml/ob_delete_resolver.cpp | 2 ++ 6 files changed, 63 insertions(+), 15 deletions(-) diff --git a/deps/easy/src/io/easy_negotiation.c b/deps/easy/src/io/easy_negotiation.c index 7cd2a0199..a2613c4db 100644 --- a/deps/easy/src/io/easy_negotiation.c +++ b/deps/easy/src/io/easy_negotiation.c @@ -88,9 +88,9 @@ static int easy_decode_uint64(char *buf, const int64_t data_len, int64_t *pos, u *val |= (((uint64_t)((*(buf + (*pos)++))) & 0xff)); } - return ret; -} - + return ret; +} + static int easy_decode_uint16(char *buf, const int64_t data_len, int64_t *pos, uint16_t *val) { int ret = (NULL != buf && data_len - *pos >= 2) ? EASY_OK : EASY_ERROR; @@ -140,9 +140,9 @@ static int easy_encode_negotiation_msg(easy_negotiation_msg_t *ne_msg, char *buf static int easy_decode_negotiation_msg(easy_negotiation_msg_t *ne_msg, char *recv_buf, int64_t recv_buf_len, int64_t *decode_len) { int ret = EASY_OK; - int64_t pos = 0; - - if (NULL == ne_msg || NULL == recv_buf || NULL == decode_len) { + int64_t pos = 0; + + if (NULL == ne_msg || NULL == recv_buf || NULL == decode_len) { easy_error_log("easy_decode_negotiation_msg, invalid param!"); return EASY_ERROR; } diff --git a/src/observer/mysql/ob_query_driver.cpp b/src/observer/mysql/ob_query_driver.cpp index 77fd447be..56b25810b 100644 --- a/src/observer/mysql/ob_query_driver.cpp +++ b/src/observer/mysql/ob_query_driver.cpp @@ -519,11 +519,12 @@ int ObQueryDriver::process_lob_locator_results(ObObj& value, // refer to sz/aibo1m // 3. if client does not support use_lob_locator ,,return full lob data without locator header bool is_lob_type = value.is_lob() || value.is_json() || value.is_geometry() || value.is_lob_locator(); + bool is_actual_return_lob_locator = is_use_lob_locator && !value.is_json(); if (!is_lob_type) { // not lob types, do nothing } else if (value.is_null() || value.is_nop_value()) { // do nothing - } else if (is_use_lob_locator && is_lob_type && lib::is_oracle_mode()) { + } else if (is_actual_return_lob_locator && is_lob_type && lib::is_oracle_mode()) { // Should be ObLobType (cluster version < 4.1), or Text/Json/Gis with lob header ObLobLocatorV2 loc(value.get_string(), value.has_lob_header()); if (loc.is_lob_locator_v1()) {// do nothing, lob locator version 1 @@ -571,7 +572,7 @@ int ObQueryDriver::process_lob_locator_results(ObObj& value, ret = OB_INVALID_ARGUMENT; LOG_WARN("Lob: invalid lob locator", K(value), K(GET_MIN_CLUSTER_VERSION())); } - } else if ((!is_use_lob_locator && lib::is_oracle_mode()) + } else if ((!is_actual_return_lob_locator && lib::is_oracle_mode()) || lib::is_mysql_mode()) { // Should remove locator header and read full lob data ObString data; @@ -715,8 +716,9 @@ int ObQueryDriver::convert_text_value_charset(ObObj& value, LOG_WARN("Lob: invalid collation", K(from_collation_type), K(to_collation_type), K(ret)); } else if (CS_TYPE_BINARY != from_collation_type && CS_TYPE_BINARY != to_collation_type && strcmp(from_charset_info->csname, to_charset_info->csname) != 0) { + bool is_actual_return_lob_locator = session->is_client_use_lob_locator() && !value.is_json(); if (value.is_lob_storage() && value.has_lob_header() && OB_NOT_NULL(session) && - session->is_client_use_lob_locator() && lib::is_oracle_mode()) { + is_actual_return_lob_locator && lib::is_oracle_mode()) { ObLobLocatorV2 lob; ObString inrow_data; if (OB_FAIL(process_lob_locator_results(value, diff --git a/src/sql/das/ob_das_dml_ctx_define.cpp b/src/sql/das/ob_das_dml_ctx_define.cpp index 19b65637d..b055cf4aa 100644 --- a/src/sql/das/ob_das_dml_ctx_define.cpp +++ b/src/sql/das/ob_das_dml_ctx_define.cpp @@ -144,14 +144,22 @@ int ObDASDMLIterator::get_next_spatial_index_row(ObNewRow *&row) int64_t geo_idx = -1; ObString geo_wkb; ObObjMeta geo_meta; - for (uint64_t i = 0; i < main_ctdef_->column_ids_.count() && geo_idx == -1; i++) { + bool has_old_row = !main_ctdef_->old_row_projector_.empty(); + for (uint64_t i = 0; OB_SUCC(ret) && i < main_ctdef_->column_ids_.count() && geo_idx == -1; i++) { + int64_t projector_idx = has_old_row ? main_ctdef_->old_row_projector_.at(i) : i; if (geo_col_id == main_ctdef_->column_ids_.at(i)) { - geo_idx = i; - geo_wkb = sr->cells()[i].get_string(); - geo_meta = main_ctdef_->column_types_.at(i); + if (projector_idx >= sr->cnt_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid index for sr", K(ret), KPC(sr), K(i), K(main_ctdef_->old_row_projector_)); + } else { + geo_idx = i; + geo_wkb = sr->cells()[projector_idx].get_string(); + geo_meta = main_ctdef_->column_types_.at(i); + } } } - if (geo_idx == -1) { + if (OB_FAIL(ret)) { + } else if (geo_idx == -1) { ret = OB_INVALID_ARGUMENT; LOG_WARN("can't get geo col idx", K(ret), K(geo_col_id)); } else if (OB_FAIL(ObTextStringHelper::read_real_string_data(&allocator_, geo_meta.get_type(), @@ -159,7 +167,7 @@ int ObDASDMLIterator::get_next_spatial_index_row(ObNewRow *&row) LOG_WARN("fail to get real geo data", K(ret)); } else if (OB_FAIL(ObDASUtils::generate_spatial_index_rows(allocator_, *das_ctdef_, geo_wkb, *row_projector_, *sr, *spatial_rows))) { - LOG_WARN("generate spatial_index_rows failed", K(ret), K(geo_col_id), K(geo_wkb)); + LOG_WARN("generate spatial_index_rows failed", K(ret), K(geo_col_id), K(geo_wkb), K(geo_idx), KPC(sr)); } } } diff --git a/src/sql/resolver/dml/ob_del_upd_resolver.cpp b/src/sql/resolver/dml/ob_del_upd_resolver.cpp index 5373f31b3..8c8a65e6d 100644 --- a/src/sql/resolver/dml/ob_del_upd_resolver.cpp +++ b/src/sql/resolver/dml/ob_del_upd_resolver.cpp @@ -1726,6 +1726,41 @@ int ObDelUpdResolver::add_all_columns_to_stmt(const TableItem &table_item, return ret; } +int ObDelUpdResolver::add_all_lob_columns_to_stmt(const TableItem &table_item, + ObIArray &column_exprs) +{ + int ret = OB_SUCCESS; + const ObTableSchema *table_schema = NULL; + const TableItem& base_table_item = table_item.get_base_table_item(); + if (OB_ISNULL(params_.session_info_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("params_.session_info_ is null", K(ret)); + } else if (OB_FAIL(schema_checker_->get_table_schema(params_.session_info_->get_effective_tenant_id(), + base_table_item.ref_id_, + table_schema, + base_table_item.is_link_table()))) { + LOG_WARN("not find table schema", K(ret), K(base_table_item)); + } else if (OB_ISNULL(table_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(table_schema), K(ret)); + } else { + ObTableSchema::const_column_iterator iter = table_schema->column_begin(); + ObTableSchema::const_column_iterator end = table_schema->column_end(); + for (; OB_SUCC(ret) && iter != end; ++iter) { + const ObColumnSchemaV2 *column = *iter; + if (OB_ISNULL(column)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid column schema", K(column)); + } else if (!column->get_meta_type().is_lob_storage()) { + // do nothing + } else if (OB_FAIL(add_column_to_stmt(table_item, *column, column_exprs))) { + LOG_WARN("add column item to stmt failed", K(ret)); + } + } //end for + } + return ret; +} + int ObDelUpdResolver::add_all_columns_to_stmt_for_trigger(const TableItem &table_item, ObIArray &column_exprs) { diff --git a/src/sql/resolver/dml/ob_del_upd_resolver.h b/src/sql/resolver/dml/ob_del_upd_resolver.h index 7c0664e81..8d3a24e03 100644 --- a/src/sql/resolver/dml/ob_del_upd_resolver.h +++ b/src/sql/resolver/dml/ob_del_upd_resolver.h @@ -220,6 +220,7 @@ protected: int create_session_row_label_expr(ObDmlTableInfo& table_info, uint64_t column_id, ObRawExpr *&expr); int add_select_items(ObSelectStmt &select_stmt, const ObIArray& select_items); int add_select_list_for_set_stmt(ObSelectStmt &select_stmt); + int add_all_lob_columns_to_stmt(const TableItem &table_item, ObIArray &column_exprs); protected: int generate_insert_table_info(const TableItem &table_item, ObInsertTableInfo &table_info, diff --git a/src/sql/resolver/dml/ob_delete_resolver.cpp b/src/sql/resolver/dml/ob_delete_resolver.cpp index ba051dae3..ec80fa8c2 100644 --- a/src/sql/resolver/dml/ob_delete_resolver.cpp +++ b/src/sql/resolver/dml/ob_delete_resolver.cpp @@ -419,6 +419,8 @@ int ObDeleteResolver::generate_delete_table_info(const TableItem &table_item) } else if (OB_FAIL(add_all_index_rowkey_to_stmt(table_item, table_info->column_exprs_))) { LOG_WARN("fail to add relate column to stmt", K(ret), K(table_item)); + } else if (OB_FAIL(add_all_lob_columns_to_stmt(table_item, table_info->column_exprs_))) { + LOG_WARN("fail to add lob column to stmt", K(ret), K(table_item)); } if (OB_SUCC(ret)) { table_info->table_id_ = table_item.table_id_;