[round](decimalv2) round precise decimalv2 value (#22258)

This commit is contained in:
Gabriel
2023-07-27 10:00:36 +08:00
committed by GitHub
parent 163a38a527
commit 341c45974c
7 changed files with 57 additions and 18 deletions

View File

@ -1689,6 +1689,14 @@ public class FunctionCallExpr extends Expr {
&& (args[ix].isArrayType())
&& ((ArrayType) args[ix]).getItemType().isDecimalV3()))) {
continue;
} else if (!argTypes[i].matchesType(args[ix])
&& ROUND_FUNCTION_SET.contains(fnName.getFunction())
&& ConnectContext.get() != null
&& ConnectContext.get().getSessionVariable().roundPreciseDecimalV2Value
&& argTypes[i].isDecimalV2()
&& args[ix].isDecimalV3()) {
uncheckedCastChild(ScalarType.createDecimalV3Type(ScalarType.MAX_DECIMALV2_PRECISION,
((ScalarType) argTypes[i]).getScalarScale()), i);
} else if (!argTypes[i].matchesType(args[ix])
&& !(argTypes[i].isDecimalV3OrContainsDecimalV3()
&& args[ix].isDecimalV3OrContainsDecimalV3())) {

View File

@ -21,12 +21,14 @@ import org.apache.doris.analysis.ArithmeticExpr;
import org.apache.doris.analysis.BinaryPredicate;
import org.apache.doris.analysis.CastExpr;
import org.apache.doris.analysis.CompoundPredicate;
import org.apache.doris.analysis.FunctionCallExpr;
import org.apache.doris.analysis.InPredicate;
import org.apache.doris.analysis.IsNullPredicate;
import org.apache.doris.analysis.LikePredicate;
import org.apache.doris.analysis.MatchPredicate;
import org.apache.doris.builtins.ScalarBuiltins;
import org.apache.doris.catalog.Function.NullableMode;
import org.apache.doris.qe.ConnectContext;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
@ -453,6 +455,18 @@ public class FunctionSet<T> {
return false;
}
}
// If set `roundPreciseDecimalV2Value`, only use decimalv3 as target type to execute round function
if (ConnectContext.get() != null
&& ConnectContext.get().getSessionVariable().roundPreciseDecimalV2Value
&& FunctionCallExpr.ROUND_FUNCTION_SET.contains(desc.functionName())
&& descArgType.isDecimalV2() && candicateArgType.getPrimitiveType() != PrimitiveType.DECIMAL128) {
return false;
} else if (ConnectContext.get() != null
&& ConnectContext.get().getSessionVariable().roundPreciseDecimalV2Value
&& FunctionCallExpr.ROUND_FUNCTION_SET.contains(desc.functionName())
&& descArgType.isDecimalV2() && candicateArgType.getPrimitiveType() == PrimitiveType.DECIMAL128) {
return true;
}
if ((descArgType.isDecimalV3() && candicateArgType.isDecimalV2())
|| (descArgType.isDecimalV2() && candicateArgType.isDecimalV3())) {
return false;

View File

@ -363,6 +363,8 @@ public class SessionVariable implements Serializable, Writable {
public static final String CBO_NET_WEIGHT = "cbo_net_weight";
public static final String ROUND_PRECISE_DECIMALV2_VALUE = "round_precise_decimalv2_value";
public static final List<String> DEBUG_VARIABLES = ImmutableList.of(
SKIP_DELETE_PREDICATE,
SKIP_DELETE_BITMAP,
@ -377,6 +379,9 @@ public class SessionVariable implements Serializable, Writable {
// if it is setStmt, we needn't collect session origin value
public boolean isSingleSetVar = false;
@VariableMgr.VarAttr(name = ROUND_PRECISE_DECIMALV2_VALUE)
public boolean roundPreciseDecimalV2Value = false;
@VariableMgr.VarAttr(name = INSERT_VISIBLE_TIMEOUT_MS, needForward = true)
public long insertVisibleTimeoutMs = DEFAULT_INSERT_VISIBLE_TIMEOUT_MS;