diff --git a/fe/src/main/java/org/apache/doris/load/Load.java b/fe/src/main/java/org/apache/doris/load/Load.java index d72f3aebae1470..858ee51a155730 100644 --- a/fe/src/main/java/org/apache/doris/load/Load.java +++ b/fe/src/main/java/org/apache/doris/load/Load.java @@ -17,6 +17,7 @@ package org.apache.doris.load; +import org.apache.doris.catalog.AggregateType; import org.apache.doris.analysis.BinaryPredicate; import org.apache.doris.analysis.CancelLoadStmt; import org.apache.doris.analysis.ColumnSeparator; @@ -734,6 +735,15 @@ public static void checkAndCreateSource(Database db, DataDescription dataDescrip throw new DdlException("Column has no default value. column: " + columnName); } + // check negative for sum aggreate type + if (dataDescription.isNegative()) { + for (Column column : tableSchema) { + if (!column.isKey() && column.getAggregationType() != AggregateType.SUM) { + throw new DdlException("Column is not SUM AggreateType. column:" + column.getName()); + } + } + } + // check hll for (Column column : tableSchema) { if (column.getDataType() == PrimitiveType.HLL) { diff --git a/fe/src/main/java/org/apache/doris/planner/BrokerScanNode.java b/fe/src/main/java/org/apache/doris/planner/BrokerScanNode.java index 2db53ece1b8705..fbc6327d3d678d 100644 --- a/fe/src/main/java/org/apache/doris/planner/BrokerScanNode.java +++ b/fe/src/main/java/org/apache/doris/planner/BrokerScanNode.java @@ -17,7 +17,9 @@ package org.apache.doris.planner; +import org.apache.doris.catalog.AggregateType; import org.apache.doris.analysis.Analyzer; +import org.apache.doris.analysis.ArithmeticExpr; import org.apache.doris.analysis.BinaryPredicate; import org.apache.doris.analysis.BrokerDesc; import org.apache.doris.analysis.Expr; @@ -25,6 +27,7 @@ import org.apache.doris.analysis.FunctionCallExpr; import org.apache.doris.analysis.FunctionName; import org.apache.doris.analysis.FunctionParams; +import org.apache.doris.analysis.IntLiteral; import org.apache.doris.analysis.NullLiteral; import org.apache.doris.analysis.SlotDescriptor; import org.apache.doris.analysis.SlotRef; @@ -381,6 +384,7 @@ private void finalizeParams(ParamCreateContext context) throws UserException, An } } + boolean isNegative = context.fileGroup.isNegative(); for (SlotDescriptor destSlotDesc : desc.getSlots()) { if (!destSlotDesc.isMaterialized()) { continue; @@ -412,6 +416,10 @@ private void finalizeParams(ParamCreateContext context) throws UserException, An } } + if (isNegative && destSlotDesc.getColumn().getAggregationType() == AggregateType.SUM) { + expr = new ArithmeticExpr(ArithmeticExpr.Operator.MULTIPLY, expr, new IntLiteral(-1)); + expr.analyze(analyzer); + } expr = castToSlot(destSlotDesc, expr); context.params.putToExpr_of_dest_slot(destSlotDesc.getId().asInt(), expr.treeToThrift()); }