diff --git a/be/src/olap/push_handler.cpp b/be/src/olap/push_handler.cpp index 9cc3c94c09..63f9644306 100644 --- a/be/src/olap/push_handler.cpp +++ b/be/src/olap/push_handler.cpp @@ -17,6 +17,7 @@ #include "olap/push_handler.h" +#include #include #include #include @@ -25,6 +26,7 @@ #include #include #include +#include #include #include @@ -138,6 +140,33 @@ 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()); + LOG(WARNING) << err_msg; + DCHECK(false); + return Status::Aborted(err_msg); + } + if (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_unique_id, + tablet_schema.column_by_uid(delete_cond.column_unique_id).name()); + LOG(WARNING) << err_msg; + DCHECK(false); + 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/fe/fe-core/src/main/java/org/apache/doris/task/PushTask.java b/fe/fe-core/src/main/java/org/apache/doris/task/PushTask.java index fb61fe356d..95f3c19ed2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/task/PushTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/task/PushTask.java @@ -40,6 +40,9 @@ import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; public class PushTask extends AgentTask { private static final Logger LOG = LogManager.getLogger(PushTask.class); @@ -127,33 +130,36 @@ public class PushTask extends AgentTask { break; case DELETE: List tConditions = new ArrayList(); + Map colNameToColDesc = columnsDesc.stream() + .collect(Collectors.toMap(TColumn::getColumnName, Function.identity())); for (Predicate condition : conditions) { TCondition tCondition = new TCondition(); ArrayList conditionValues = new ArrayList(); + SlotRef slotRef = (SlotRef) condition.getChild(0); + String columnName = slotRef.getColumnName(); + tCondition.setColumnName(columnName); + int uniqueId = colNameToColDesc.get(columnName).getColUniqueId(); + if (uniqueId >= 0) { + tCondition.setColumnUniqueId(uniqueId); + } if (condition instanceof BinaryPredicate) { BinaryPredicate binaryPredicate = (BinaryPredicate) condition; - String columnName = ((SlotRef) binaryPredicate.getChild(0)).getColumnName(); String value = ((LiteralExpr) binaryPredicate.getChild(1)).getStringValue(); Operator op = binaryPredicate.getOp(); - tCondition.setColumnName(columnName); tCondition.setConditionOp(op.toString()); conditionValues.add(value); } else if (condition instanceof IsNullPredicate) { IsNullPredicate isNullPredicate = (IsNullPredicate) condition; - String columnName = ((SlotRef) isNullPredicate.getChild(0)).getColumnName(); String op = "IS"; String value = "NULL"; if (isNullPredicate.isNotNull()) { value = "NOT NULL"; } - tCondition.setColumnName(columnName); tCondition.setConditionOp(op); conditionValues.add(value); } else if (condition instanceof InPredicate) { InPredicate inPredicate = (InPredicate) condition; - String columnName = ((SlotRef) inPredicate.getChild(0)).getColumnName(); String op = inPredicate.isNotIn() ? "!*=" : "*="; - tCondition.setColumnName(columnName); tCondition.setConditionOp(op); for (int i = 1; i <= inPredicate.getInElementNum(); i++) { conditionValues.add(inPredicate.getChild(i).getStringValue());