[Improvement](decimalv3) Add a config to check overflow for DECIMALV3 (#15463)
This commit is contained in:
@ -21,6 +21,7 @@
|
||||
package org.apache.doris.analysis;
|
||||
|
||||
import org.apache.doris.catalog.Function;
|
||||
import org.apache.doris.catalog.Function.NullableMode;
|
||||
import org.apache.doris.catalog.FunctionSet;
|
||||
import org.apache.doris.catalog.PrimitiveType;
|
||||
import org.apache.doris.catalog.ScalarFunction;
|
||||
@ -107,12 +108,13 @@ public class ArithmeticExpr extends Expr {
|
||||
|
||||
public static void initBuiltins(FunctionSet functionSet) {
|
||||
for (Type t : Type.getNumericTypes()) {
|
||||
NullableMode mode = t.isDecimalV3() ? NullableMode.CUSTOM : NullableMode.DEPEND_ON_ARGUMENT;
|
||||
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
|
||||
Operator.MULTIPLY.getName(), Lists.newArrayList(t, t), t));
|
||||
Operator.MULTIPLY.getName(), Lists.newArrayList(t, t), t, mode));
|
||||
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
|
||||
Operator.ADD.getName(), Lists.newArrayList(t, t), t));
|
||||
Operator.ADD.getName(), Lists.newArrayList(t, t), t, mode));
|
||||
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
|
||||
Operator.SUBTRACT.getName(), Lists.newArrayList(t, t), t));
|
||||
Operator.SUBTRACT.getName(), Lists.newArrayList(t, t), t, mode));
|
||||
}
|
||||
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
|
||||
Operator.DIVIDE.getName(),
|
||||
@ -173,15 +175,14 @@ public class ArithmeticExpr extends Expr {
|
||||
for (int j = 0; j < Type.getNumericTypes().size(); j++) {
|
||||
Type t2 = Type.getNumericTypes().get(j);
|
||||
|
||||
Type retType = Type.getNextNumType(Type.getAssignmentCompatibleType(t1, t2, false));
|
||||
NullableMode mode = retType.isDecimalV3() ? NullableMode.CUSTOM : NullableMode.DEPEND_ON_ARGUMENT;
|
||||
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
|
||||
Operator.MULTIPLY.getName(), Lists.newArrayList(t1, t2),
|
||||
Type.getNextNumType(Type.getAssignmentCompatibleType(t1, t2, false))));
|
||||
Operator.MULTIPLY.getName(), Lists.newArrayList(t1, t2), retType, mode));
|
||||
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
|
||||
Operator.ADD.getName(), Lists.newArrayList(t1, t2),
|
||||
Type.getNextNumType(Type.getAssignmentCompatibleType(t1, t2, false))));
|
||||
Operator.ADD.getName(), Lists.newArrayList(t1, t2), retType, mode));
|
||||
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
|
||||
Operator.SUBTRACT.getName(), Lists.newArrayList(t1, t2),
|
||||
Type.getNextNumType(Type.getAssignmentCompatibleType(t1, t2, false))));
|
||||
Operator.SUBTRACT.getName(), Lists.newArrayList(t1, t2), retType, mode));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
|
||||
package org.apache.doris.analysis;
|
||||
|
||||
import org.apache.doris.analysis.ArithmeticExpr.Operator;
|
||||
import org.apache.doris.catalog.Env;
|
||||
import org.apache.doris.catalog.Function;
|
||||
import org.apache.doris.catalog.FunctionSet;
|
||||
@ -31,6 +32,7 @@ import org.apache.doris.common.Config;
|
||||
import org.apache.doris.common.TreeNode;
|
||||
import org.apache.doris.common.io.Writable;
|
||||
import org.apache.doris.common.util.VectorizedUtil;
|
||||
import org.apache.doris.qe.ConnectContext;
|
||||
import org.apache.doris.statistics.ExprStats;
|
||||
import org.apache.doris.thrift.TExpr;
|
||||
import org.apache.doris.thrift.TExprNode;
|
||||
@ -2036,6 +2038,25 @@ public abstract class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
|
||||
if (fn.functionName().equalsIgnoreCase("concat_ws")) {
|
||||
return children.get(0).isNullable();
|
||||
}
|
||||
if (fn.functionName().equalsIgnoreCase(Operator.MULTIPLY.getName())
|
||||
&& fn.getReturnType().isDecimalV3()) {
|
||||
if (ConnectContext.get() != null
|
||||
&& ConnectContext.get().getSessionVariable().checkOverflowForDecimal()) {
|
||||
return true;
|
||||
} else {
|
||||
return hasNullableChild();
|
||||
}
|
||||
}
|
||||
if ((fn.functionName().equalsIgnoreCase(Operator.ADD.getName())
|
||||
|| fn.functionName().equalsIgnoreCase(Operator.SUBTRACT.getName()))
|
||||
&& fn.getReturnType().isDecimalV3()) {
|
||||
if (ConnectContext.get() != null
|
||||
&& ConnectContext.get().getSessionVariable().checkOverflowForDecimal()) {
|
||||
return true;
|
||||
} else {
|
||||
return hasNullableChild();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -189,6 +189,8 @@ public class SessionVariable implements Serializable, Writable {
|
||||
|
||||
public static final String ENABLE_PROJECTION = "enable_projection";
|
||||
|
||||
public static final String CHECK_OVERFLOW_FOR_DECIMAL = "check_overflow_for_decimal";
|
||||
|
||||
public static final String TRIM_TAILING_SPACES_FOR_EXTERNAL_TABLE_QUERY
|
||||
= "trim_tailing_spaces_for_external_table_query";
|
||||
|
||||
@ -542,6 +544,9 @@ public class SessionVariable implements Serializable, Writable {
|
||||
@VariableMgr.VarAttr(name = ENABLE_PROJECTION)
|
||||
private boolean enableProjection = true;
|
||||
|
||||
@VariableMgr.VarAttr(name = CHECK_OVERFLOW_FOR_DECIMAL)
|
||||
private boolean checkOverflowForDecimal = false;
|
||||
|
||||
/**
|
||||
* as the new optimizer is not mature yet, use this var
|
||||
* to control whether to use new optimizer, remove it when
|
||||
@ -1235,6 +1240,10 @@ public class SessionVariable implements Serializable, Writable {
|
||||
return enableProjection;
|
||||
}
|
||||
|
||||
public boolean checkOverflowForDecimal() {
|
||||
return checkOverflowForDecimal;
|
||||
}
|
||||
|
||||
public boolean isTrimTailingSpacesForExternalTableQuery() {
|
||||
return trimTailingSpacesForExternalTableQuery;
|
||||
}
|
||||
@ -1368,6 +1377,7 @@ public class SessionVariable implements Serializable, Writable {
|
||||
}
|
||||
|
||||
tResult.setEnableFunctionPushdown(enableFunctionPushdown);
|
||||
tResult.setCheckOverflowForDecimal(checkOverflowForDecimal);
|
||||
tResult.setFragmentTransmissionCompressionCodec(fragmentTransmissionCompressionCodec);
|
||||
tResult.setEnableLocalExchange(enableLocalExchange);
|
||||
tResult.setEnableNewShuffleHashMethod(enableNewShuffleHashMethod);
|
||||
|
||||
Reference in New Issue
Block a user