This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new bab7581054e [fix](delete) fix potential delete fail after adding 
columns (#25817)
bab7581054e is described below

commit bab7581054ec7dbc4fdc3ba6f7c8da6542cfeb9c
Author: Siyang Tang <[email protected]>
AuthorDate: Tue Oct 24 21:45:21 2023 +0800

    [fix](delete) fix potential delete fail after adding columns (#25817)
---
 be/src/olap/delete_handler.cpp | 47 +++++++++++++++++++++++++++++++-----------
 be/src/olap/delete_handler.h   |  2 +-
 be/src/olap/push_handler.cpp   | 25 ----------------------
 be/src/olap/tablet_schema.cpp  |  1 +
 4 files changed, 37 insertions(+), 38 deletions(-)

diff --git a/be/src/olap/delete_handler.cpp b/be/src/olap/delete_handler.cpp
index 886d11a8722..f05a6c86e29 100644
--- a/be/src/olap/delete_handler.cpp
+++ b/be/src/olap/delete_handler.cpp
@@ -249,6 +249,27 @@ Status DeleteHandler::check_condition_valid(const 
TabletSchema& schema, const TC
         }
     }
 
+    if (!cond.__isset.column_unique_id) {
+        LOG(WARNING) << "column=" << cond.column_name
+                     << " in predicate does not have uid, table id=" << 
schema.table_id();
+        // TODO(tsy): make it fail here after FE forbidding 
hard-link-schema-change
+        return Status::OK();
+    }
+    if (schema.field_index(cond.column_unique_id) == -1) {
+        const auto& err_msg =
+                fmt::format("column id does not exists in table={}, schema 
version={},",
+                            schema.table_id(), schema.schema_version());
+        return Status::Error<DELETE_INVALID_CONDITION>(err_msg);
+    }
+    if (!iequal(schema.column_by_uid(cond.column_unique_id).name(), 
cond.column_name)) {
+        const auto& err_msg = fmt::format(
+                "colum name={} does not belongs to column uid={}, which column 
name={}, "
+                "delete_cond.column_name ={}",
+                cond.column_name, cond.column_unique_id,
+                schema.column_by_uid(cond.column_unique_id).name(), 
cond.column_name);
+        return Status::Error<DELETE_INVALID_CONDITION>(err_msg);
+    }
+
     return Status::OK();
 }
 
@@ -316,8 +337,12 @@ Status DeleteHandler::_parse_column_pred(TabletSchemaSPtr 
complete_schema,
     for (const auto& sub_predicate : sub_pred_list) {
         TCondition condition;
         RETURN_IF_ERROR(parse_condition(sub_predicate, &condition));
-        int32_t col_unique_id =
-                
delete_pred_related_schema->column(condition.column_name).unique_id();
+        int32_t col_unique_id;
+        if constexpr (std::is_same_v<SubPredType, DeletePredicatePB>) {
+            col_unique_id = sub_predicate.col_unique_id;
+        } else {
+            col_unique_id = 
delete_pred_related_schema->column(condition.column_name).unique_id();
+        }
         condition.__set_column_unique_id(col_unique_id);
         const auto& column = complete_schema->column_by_uid(col_unique_id);
         uint32_t index = complete_schema->field_index(col_unique_id);
@@ -345,7 +370,7 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
                            bool with_sub_pred_v2) {
     DCHECK(!_is_inited) << "reinitialize delete handler.";
     DCHECK(version >= 0) << "invalid parameters. version=" << version;
-    _predicate_arena.reset(new vectorized::Arena());
+    _predicate_arena = std::make_unique<vectorized::Arena>();
 
     for (const auto& delete_pred : delete_preds) {
         // Skip the delete condition with large version
@@ -354,7 +379,7 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
         }
         // Need the tablet schema at the delete condition to parse the 
accurate column
         const auto& delete_pred_related_schema = delete_pred->tablet_schema();
-        auto& delete_condition = delete_pred->delete_predicate();
+        const auto& delete_condition = delete_pred->delete_predicate();
         DeleteConditions temp;
         temp.filter_version = delete_pred->version().first;
         if (with_sub_pred_v2) {
@@ -368,8 +393,8 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
         for (const auto& in_predicate : delete_condition.in_predicates()) {
             TCondition condition;
             condition.__set_column_name(in_predicate.column_name());
-            condition.__set_column_unique_id(
-                    
delete_pred_related_schema->column(condition.column_name).unique_id());
+            auto col_unique_id = in_predicate.column_unique_id();
+            condition.__set_column_unique_id(col_unique_id);
 
             if (in_predicate.is_not_in()) {
                 condition.__set_condition_op("!*=");
@@ -379,8 +404,6 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
             for (const auto& value : in_predicate.values()) {
                 condition.condition_values.push_back(value);
             }
-            int32_t col_unique_id =
-                    
delete_pred_related_schema->column(condition.column_name).unique_id();
             const auto& column = tablet_schema->column_by_uid(col_unique_id);
             uint32_t index = tablet_schema->field_index(col_unique_id);
             temp.column_predicate_vec.push_back(
@@ -401,7 +424,7 @@ void DeleteHandler::finalize() {
     }
 
     for (auto& cond : _del_conds) {
-        for (auto pred : cond.column_predicate_vec) {
+        for (const auto* pred : cond.column_predicate_vec) {
             delete pred;
         }
     }
@@ -414,12 +437,12 @@ void DeleteHandler::get_delete_conditions_after_version(
         int64_t version, AndBlockColumnPredicate* 
and_block_column_predicate_ptr,
         std::unordered_map<int32_t, std::vector<const ColumnPredicate*>>*
                 del_predicates_for_zone_map) const {
-    for (auto& del_cond : _del_conds) {
+    for (const auto& del_cond : _del_conds) {
         if (del_cond.filter_version > version) {
             // now, only query support delete column predicate operator
             if (!del_cond.column_predicate_vec.empty()) {
                 if (del_cond.column_predicate_vec.size() == 1) {
-                    auto single_column_block_predicate =
+                    auto* single_column_block_predicate =
                             new 
SingleColumnBlockPredicate(del_cond.column_predicate_vec[0]);
                     and_block_column_predicate_ptr->add_column_predicate(
                             single_column_block_predicate);
@@ -432,7 +455,7 @@ void DeleteHandler::get_delete_conditions_after_version(
                     
(*del_predicates_for_zone_map)[del_cond.column_predicate_vec[0]->column_id()]
                             .push_back(del_cond.column_predicate_vec[0]);
                 } else {
-                    auto or_column_predicate = new OrBlockColumnPredicate();
+                    auto* or_column_predicate = new OrBlockColumnPredicate();
 
                     // build or_column_predicate
                     // when delete from where a = 1 and b = 2, we can not use 
del_predicates_for_zone_map to filter zone page,
diff --git a/be/src/olap/delete_handler.h b/be/src/olap/delete_handler.h
index 429de58b4ed..c3365a80cf2 100644
--- a/be/src/olap/delete_handler.h
+++ b/be/src/olap/delete_handler.h
@@ -102,7 +102,7 @@ public:
     //     * Status::Error<DELETE_INVALID_PARAMETERS>(): input parameters are 
not valid
     //     * Status::Error<MEM_ALLOC_FAILED>(): alloc memory failed
     Status init(TabletSchemaSPtr tablet_schema,
-                const std::vector<RowsetMetaSharedPtr>& delete_conditions, 
int64_t version,
+                const std::vector<RowsetMetaSharedPtr>& delete_preds, int64_t 
version,
                 bool with_sub_pred_v2 = false);
 
     [[nodiscard]] bool empty() const { return _del_conds.empty(); }
diff --git a/be/src/olap/push_handler.cpp b/be/src/olap/push_handler.cpp
index 02a764dd358..ee62c5baf66 100644
--- a/be/src/olap/push_handler.cpp
+++ b/be/src/olap/push_handler.cpp
@@ -141,31 +141,6 @@ Status 
PushHandler::_do_streaming_ingestion(TabletSharedPtr tablet, const TPushR
         DeletePredicatePB del_pred;
         TabletSchema tablet_schema;
         tablet_schema.copy_from(*tablet->tablet_schema());
-        for (const auto& delete_cond : request.delete_conditions) {
-            if (!delete_cond.__isset.column_unique_id) {
-                LOG(WARNING) << "column=" << delete_cond.column_name
-                             << " in predicate does not have uid, table id="
-                             << tablet_schema.table_id();
-                // TODO(tsy): make it fail here after FE forbidding 
hard-link-schema-change
-                continue;
-            }
-            if (tablet_schema.field_index(delete_cond.column_unique_id) == -1) 
{
-                const auto& err_msg =
-                        fmt::format("column id={} does not exists, table 
id={}",
-                                    delete_cond.column_unique_id, 
tablet_schema.table_id());
-                return Status::Aborted(err_msg);
-            }
-            if 
(!iequal(tablet_schema.column_by_uid(delete_cond.column_unique_id).name(),
-                        delete_cond.column_name)) {
-                const auto& err_msg = fmt::format(
-                        "colum name={} does not belongs to column uid={}, 
which column name={}, "
-                        "delete_cond.column_name ={}",
-                        delete_cond.column_name, delete_cond.column_unique_id,
-                        
tablet_schema.column_by_uid(delete_cond.column_unique_id).name(),
-                        delete_cond.column_name);
-                return Status::Aborted(err_msg);
-            }
-        }
         if (!request.columns_desc.empty() && 
request.columns_desc[0].col_unique_id >= 0) {
             tablet_schema.clear_columns();
             for (const auto& column_desc : request.columns_desc) {
diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp
index 833ad15a15d..103ae7c8fd7 100644
--- a/be/src/olap/tablet_schema.cpp
+++ b/be/src/olap/tablet_schema.cpp
@@ -761,6 +761,7 @@ void TabletSchema::copy_from(const TabletSchema& 
tablet_schema) {
     TabletSchemaPB tablet_schema_pb;
     tablet_schema.to_schema_pb(&tablet_schema_pb);
     init_from_pb(tablet_schema_pb);
+    _table_id = tablet_schema.table_id();
 }
 
 std::string TabletSchema::to_key() const {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to