[round](decimalv2) round precise decimalv2 value (#22258)
This commit is contained in:
@ -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())) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user