[Improvement](decimalv3) Add a config to check overflow for DECIMALV3 (#15463)

This commit is contained in:
Gabriel
2022-12-30 14:02:24 +08:00
committed by GitHub
parent 5db8b52441
commit 520b6d7910
12 changed files with 335 additions and 102 deletions

View File

@ -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));
}
}

View File

@ -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;
}

View File

@ -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);