[Improvement](decimal) print decimal according to the real precision and scale (#13437)

This commit is contained in:
Gabriel
2022-10-21 10:00:01 +08:00
committed by GitHub
parent d3f65aa746
commit 9a3c1f0867
23 changed files with 426 additions and 479 deletions

View File

@ -117,8 +117,8 @@ public class ArithmeticExpr extends Expr {
Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE),
Type.MAX_DECIMALV2_TYPE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMAL32, Type.DECIMAL32),
@ -164,8 +164,8 @@ public class ArithmeticExpr extends Expr {
Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE),
Type.MAX_DECIMALV2_TYPE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMAL32, Type.DECIMAL32),
@ -189,8 +189,8 @@ public class ArithmeticExpr extends Expr {
Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.MOD.getName(),
Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE),
Type.MAX_DECIMALV2_TYPE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.MOD.getName(),
Lists.<Type>newArrayList(Type.DECIMAL32, Type.DECIMAL32),
@ -309,7 +309,7 @@ public class ArithmeticExpr extends Expr {
if (pt1 == PrimitiveType.DOUBLE || pt2 == PrimitiveType.DOUBLE) {
return Type.DOUBLE;
} else if (pt1 == PrimitiveType.DECIMALV2 || pt2 == PrimitiveType.DECIMALV2) {
return Type.DECIMALV2;
return Type.MAX_DECIMALV2_TYPE;
} else if (pt1 == PrimitiveType.DECIMAL32 || pt2 == PrimitiveType.DECIMAL32) {
return Type.DECIMAL32;
} else if (pt1 == PrimitiveType.DECIMAL64 || pt2 == PrimitiveType.DECIMAL64) {

View File

@ -284,6 +284,11 @@ public class CastExpr extends Expr {
noOp = Type.matchExactType(childType, type);
if (noOp) {
// For decimalv2, we do not perform an actual cast between different precision/scale. Instead, we just
// set the target type as the child's type.
if (type.isDecimalV2() && childType.isDecimalV2()) {
getChild(0).setType(type);
}
return;
}

View File

@ -120,6 +120,7 @@ public enum ExpressionFunctions {
if (!(invoker.getSignature().returnType.isDate() && signature.getReturnType().isDateV2())
&& !(invoker.getSignature().returnType.isDatetime() && signature.getReturnType().isDatetimeV2())
&& !(invoker.getSignature().returnType.isDecimalV2() && signature.getReturnType().isDecimalV3())
&& !(invoker.getSignature().returnType.isDecimalV2() && signature.getReturnType().isDecimalV2())
&& !invoker.getSignature().returnType.equals(signature.getReturnType())) {
continue;
}
@ -135,6 +136,7 @@ public enum ExpressionFunctions {
if (!(argTypes1[i].isDate() && argTypes2[i].isDateV2())
&& !(argTypes1[i].isDatetime() && argTypes2[i].isDatetimeV2())
&& !(argTypes1[i].isDecimalV2() && argTypes2[i].isDecimalV3())
&& !(argTypes1[i].isDecimalV2() && argTypes2[i].isDecimalV2())
&& !argTypes1[i].equals(argTypes2[i])) {
match = false;
break;

View File

@ -17,8 +17,11 @@
package org.apache.doris.analysis;
import org.apache.doris.catalog.ScalarType;
import org.apache.doris.catalog.TableIf;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.Pair;
import org.apache.doris.common.UserException;
import org.apache.doris.rewrite.ExprRewriter;
@ -32,6 +35,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Representation of a set ops with its list of operands, and optional order by and limit.
@ -476,8 +480,20 @@ public class SetOperationStmt extends QueryStmt {
LOG.trace("SetOperationStmt.createMetadata: tupleId=" + tupleId.toString());
}
// One slot per expr in the select blocks. Use first select block as representative.
List<Expr> firstSelectExprs = operands.get(0).getQueryStmt().getResultExprs();
// When multiple operands exist here, we should use compatible type for each slot. For example,
// for `SELECT decimal(10,1) UNION ALL decimal(6,4)`, we should use decimal(10,4) as the result type.
List<Pair<Type, Boolean>> selectTypeWithNullable = operands.get(0).getQueryStmt().getResultExprs().stream()
.map(expr -> Pair.of(expr.getType(), expr.isNullable())).collect(Collectors.toList());
for (int i = 1; i < operands.size(); i++) {
for (int j = 1; j < selectTypeWithNullable.size(); j++) {
if (selectTypeWithNullable.get(j).first.isDecimalV2()
&& operands.get(i).getQueryStmt().getResultExprs().get(j).getType().isDecimalV2()) {
selectTypeWithNullable.get(j).first = ScalarType.getAssignmentCompatibleDecimalV2Type(
(ScalarType) selectTypeWithNullable.get(j).first,
(ScalarType) operands.get(i).getQueryStmt().getResultExprs().get(j).getType());
}
}
}
// TODO(zc) Column stats
/*
@ -497,12 +513,11 @@ public class SetOperationStmt extends QueryStmt {
*/
// Create tuple descriptor and slots.
for (int i = 0; i < firstSelectExprs.size(); ++i) {
Expr expr = firstSelectExprs.get(i);
for (int i = 0; i < selectTypeWithNullable.size(); ++i) {
SlotDescriptor slotDesc = analyzer.addSlotDescriptor(tupleDesc);
slotDesc.setLabel(getColLabels().get(i));
slotDesc.setType(expr.getType());
slotDesc.setIsNullable(expr.isNullable());
slotDesc.setType(selectTypeWithNullable.get(i).first);
slotDesc.setIsNullable(selectTypeWithNullable.get(i).second);
// TODO(zc)
// slotDesc.setStats(columnStats.get(i));
SlotRef outputSlotRef = new SlotRef(slotDesc);

View File

@ -140,7 +140,7 @@ public class FunctionSet<T> {
"8min_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
.put(Type.DATETIME,
"8min_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"8min_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_")
.put(Type.LARGEINT,
"8min_initIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextEPT_")
@ -172,7 +172,7 @@ public class FunctionSet<T> {
"8max_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
.put(Type.DATETIME,
"8max_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"8max_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_")
.put(Type.LARGEINT,
"8max_initIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextEPT_")
@ -204,7 +204,7 @@ public class FunctionSet<T> {
"3minIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DATETIME,
"3minIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"3minIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.LARGEINT,
"3minIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextERKT_PS6_")
@ -236,7 +236,7 @@ public class FunctionSet<T> {
"3maxIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DATETIME,
"3maxIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"3maxIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.LARGEINT,
"3maxIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextERKT_PS6_")
@ -268,7 +268,7 @@ public class FunctionSet<T> {
"8any_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
.put(Type.DATETIME,
"8any_initIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextEPT_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"8any_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_")
.put(Type.LARGEINT,
"8any_initIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextEPT_")
@ -300,7 +300,7 @@ public class FunctionSet<T> {
"3anyIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DATETIME,
"3anyIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"3anyIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.LARGEINT,
"3anyIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextERKT_PS6_")
@ -315,7 +315,7 @@ public class FunctionSet<T> {
.put(Type.FLOAT, Type.DOUBLE)
.put(Type.DOUBLE, Type.DOUBLE)
.put(Type.LARGEINT, Type.LARGEINT)
.put(Type.DECIMALV2, Type.DECIMALV2)
.put(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE)
.put(Type.DECIMAL32, Type.DECIMAL32)
.put(Type.DECIMAL64, Type.DECIMAL64)
.put(Type.DECIMAL128, Type.DECIMAL128)
@ -432,7 +432,7 @@ public class FunctionSet<T> {
.put(Type.BIGINT, Type.DOUBLE)
.put(Type.FLOAT, Type.DOUBLE)
.put(Type.DOUBLE, Type.DOUBLE)
.put(Type.DECIMALV2, Type.DECIMALV2)
.put(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE)
.put(Type.DECIMAL32, Type.DECIMAL32)
.put(Type.DECIMAL64, Type.DECIMAL64)
.put(Type.DECIMAL128, Type.DECIMAL128)
@ -452,7 +452,7 @@ public class FunctionSet<T> {
"14knuth_var_initEPN9doris_udf15FunctionContextEPNS1_9StringValE")
.put(Type.DOUBLE,
"14knuth_var_initEPN9doris_udf15FunctionContextEPNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"24decimalv2_knuth_var_initEPN9doris_udf15FunctionContextEPNS1_9StringValE")
.build();
@ -470,7 +470,7 @@ public class FunctionSet<T> {
"16knuth_var_updateIN9doris_udf8FloatValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
.put(Type.DOUBLE,
"16knuth_var_updateIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"16knuth_var_updateEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValEPNS1_9StringValE")
.build();
@ -489,7 +489,7 @@ public class FunctionSet<T> {
"16knuth_var_removeIN9doris_udf8FloatValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
.put(Type.DOUBLE,
"16knuth_var_removeIN9doris_udf9DoubleValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"16knuth_var_removeEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValEPNS1_9StringValE")
.build();
private static final Map<Type, String> STDDEV_MERGE_SYMBOL =
@ -506,7 +506,7 @@ public class FunctionSet<T> {
"15knuth_var_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_")
.put(Type.DOUBLE,
"15knuth_var_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"25decimalv2_knuth_var_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_")
.build();
@ -524,7 +524,7 @@ public class FunctionSet<T> {
"21knuth_stddev_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"21knuth_stddev_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"31decimalv2_knuth_stddev_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
@ -542,7 +542,7 @@ public class FunctionSet<T> {
"22knuth_stddev_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"22knuth_stddev_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"32decimalv2_knuth_stddev_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
@ -560,7 +560,7 @@ public class FunctionSet<T> {
"25knuth_stddev_pop_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"25knuth_stddev_pop_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"35decimalv2_knuth_stddev_pop_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
@ -578,7 +578,7 @@ public class FunctionSet<T> {
"26knuth_stddev_pop_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"26knuth_stddev_pop_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"36decimalv2_knuth_stddev_pop_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
@ -596,7 +596,7 @@ public class FunctionSet<T> {
"18knuth_var_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"18knuth_var_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"28decimalv2_knuth_var_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
@ -614,7 +614,7 @@ public class FunctionSet<T> {
"19knuth_var_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"19knuth_var_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"29decimalv2_knuth_var_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
@ -632,7 +632,7 @@ public class FunctionSet<T> {
"22knuth_var_pop_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"22knuth_var_pop_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"32decimalv2_knuth_var_pop_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
@ -650,7 +650,7 @@ public class FunctionSet<T> {
"23knuth_var_pop_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DOUBLE,
"23knuth_var_pop_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"33decimalv2_knuth_var_pop_get_valueEPN9doris_udf15FunctionContextERKNS1_9StringValE")
.build();
public static final String HLL_HASH = "hll_hash";
@ -682,7 +682,7 @@ public class FunctionSet<T> {
"10hll_updateIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
.put(Type.DATETIME,
"10hll_updateIN9doris_udf11DateTimeValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"10hll_updateIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
.put(Type.LARGEINT,
"10hll_updateIN9doris_udf11LargeIntValEEEvPNS2_15FunctionContextERKT_PNS2_9StringValE")
@ -703,7 +703,7 @@ public class FunctionSet<T> {
ImmutableMap.<Type, String>builder()
.put(Type.BOOLEAN,
"14offset_fn_initIN9doris_udf10BooleanValEEEvPNS2_15FunctionContextEPT_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"14offset_fn_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_")
.put(Type.TINYINT,
"14offset_fn_initIN9doris_udf10TinyIntValEEEvPNS2_15FunctionContextEPT_")
@ -736,7 +736,7 @@ public class FunctionSet<T> {
ImmutableMap.<Type, String>builder()
.put(Type.BOOLEAN,
"16offset_fn_updateIN9doris_udf10BooleanValEEEvPNS2_15FunctionContextERKT_RKNS2_9BigIntValES8_PS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"16offset_fn_updateIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_RKNS2_9BigIntValES8_PS6_")
.put(Type.TINYINT,
"16offset_fn_updateIN9doris_udf10TinyIntValEEEvPNS2_15"
@ -773,7 +773,7 @@ public class FunctionSet<T> {
ImmutableMap.<Type, String>builder()
.put(Type.BOOLEAN,
"15last_val_updateIN9doris_udf10BooleanValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"15last_val_updateIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.TINYINT,
"15last_val_updateIN9doris_udf10TinyIntValEEEvPNS2_15FunctionContextERKT_PS6_")
@ -806,7 +806,7 @@ public class FunctionSet<T> {
.put(Type.BOOLEAN,
"24first_val_rewrite_updateIN9doris_udf10BooleanValEEEvPNS2_15"
+ "FunctionContextERKT_RKNS2_9BigIntValEPS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"24first_val_rewrite_updateIN9doris_udf12DecimalV2ValEEEvPNS2_15"
+ "FunctionContextERKT_RKNS2_9BigIntValEPS6_")
.put(Type.TINYINT,
@ -850,7 +850,7 @@ public class FunctionSet<T> {
ImmutableMap.<Type, String>builder()
.put(Type.BOOLEAN,
"15last_val_removeIN9doris_udf10BooleanValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"15last_val_removeIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.TINYINT,
"15last_val_removeIN9doris_udf10TinyIntValEEEvPNS2_15FunctionContextERKT_PS6_")
@ -882,7 +882,7 @@ public class FunctionSet<T> {
ImmutableMap.<Type, String>builder()
.put(Type.BOOLEAN,
"16first_val_updateIN9doris_udf10BooleanValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"16first_val_updateIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextERKT_PS6_")
.put(Type.TINYINT,
"16first_val_updateIN9doris_udf10TinyIntValEEEvPNS2_15FunctionContextERKT_PS6_")
@ -1045,7 +1045,7 @@ public class FunctionSet<T> {
"_ZN5doris15BitmapFunctions21bitmap_intersect_initINS_13DateTimeValueEN9doris_udf11DateTimeValEEEvPNS3_15FunctionContextEPNS3_9StringValE")
.put(Type.DATETIME,
"_ZN5doris15BitmapFunctions21bitmap_intersect_initINS_13DateTimeValueEN9doris_udf11DateTimeValEEEvPNS3_15FunctionContextEPNS3_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"_ZN5doris15BitmapFunctions21bitmap_intersect_initINS_14DecimalV2ValueEN9doris_udf12DecimalV2ValEEEvPNS3_15FunctionContextEPNS3_9StringValE")
.put(Type.CHAR,
"_ZN5doris15BitmapFunctions21bitmap_intersect_initINS_11StringValueEN9doris_udf9StringValEEEvPNS3_15FunctionContextEPS4_")
@ -1075,7 +1075,7 @@ public class FunctionSet<T> {
"_ZN5doris15BitmapFunctions23bitmap_intersect_updateINS_13DateTimeValueEN9doris_udf11DateTimeValEEEvPNS3_15FunctionContextERKNS3_9StringValERKT0_iPSB_PS8_")
.put(Type.DATETIME,
"_ZN5doris15BitmapFunctions23bitmap_intersect_updateINS_13DateTimeValueEN9doris_udf11DateTimeValEEEvPNS3_15FunctionContextERKNS3_9StringValERKT0_iPSB_PS8_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"_ZN5doris15BitmapFunctions23bitmap_intersect_updateINS_14DecimalV2ValueEN9doris_udf12DecimalV2ValEEEvPNS3_15FunctionContextERKNS3_9StringValERKT0_iPSB_PS8_")
.put(Type.CHAR,
"_ZN5doris15BitmapFunctions23bitmap_intersect_updateINS_11StringValueEN9doris_udf9StringValEEEvPNS3_15FunctionContextERKS4_RKT0_iPSA_PS7_")
@ -1105,7 +1105,7 @@ public class FunctionSet<T> {
"_ZN5doris15BitmapFunctions22bitmap_intersect_mergeINS_13DateTimeValueEEEvPN9doris_udf15FunctionContextERKNS3_9StringValEPS7_")
.put(Type.DATETIME,
"_ZN5doris15BitmapFunctions22bitmap_intersect_mergeINS_13DateTimeValueEEEvPN9doris_udf15FunctionContextERKNS3_9StringValEPS7_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"_ZN5doris15BitmapFunctions22bitmap_intersect_mergeINS_14DecimalV2ValueEEEvPN9doris_udf15FunctionContextERKNS3_9StringValEPS7_")
.put(Type.CHAR,
"_ZN5doris15BitmapFunctions22bitmap_intersect_mergeINS_11StringValueEEEvPN9doris_udf15FunctionContextERKNS3_9StringValEPS7_")
@ -1135,7 +1135,7 @@ public class FunctionSet<T> {
"_ZN5doris15BitmapFunctions26bitmap_intersect_serializeINS_13DateTimeValueEEEN9doris_udf9StringValEPNS3_15FunctionContextERKS4_")
.put(Type.DATETIME,
"_ZN5doris15BitmapFunctions26bitmap_intersect_serializeINS_13DateTimeValueEEEN9doris_udf9StringValEPNS3_15FunctionContextERKS4_")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"_ZN5doris15BitmapFunctions26bitmap_intersect_serializeINS_14DecimalV2ValueEEEN9doris_udf9StringValEPNS3_15FunctionContextERKS4_")
.put(Type.CHAR,
"_ZN5doris15BitmapFunctions26bitmap_intersect_serializeINS_11StringValueEEEN9doris_udf9StringValEPNS3_15FunctionContextERKS4_")
@ -1165,7 +1165,7 @@ public class FunctionSet<T> {
"_ZN5doris15BitmapFunctions25bitmap_intersect_finalizeINS_13DateTimeValueEEEN9doris_udf9BigIntValEPNS3_15FunctionContextERKNS3_9StringValE")
.put(Type.DATETIME,
"_ZN5doris15BitmapFunctions25bitmap_intersect_finalizeINS_13DateTimeValueEEEN9doris_udf9BigIntValEPNS3_15FunctionContextERKNS3_9StringValE")
.put(Type.DECIMALV2,
.put(Type.MAX_DECIMALV2_TYPE,
"_ZN5doris15BitmapFunctions25bitmap_intersect_finalizeINS_14DecimalV2ValueEEEN9doris_udf9BigIntValEPNS3_15FunctionContextERKNS3_9StringValE")
.put(Type.CHAR,
"_ZN5doris15BitmapFunctions25bitmap_intersect_finalizeINS_11StringValueEEEN9doris_udf9BigIntValEPNS3_15FunctionContextERKNS3_9StringValE")
@ -1598,7 +1598,7 @@ public class FunctionSet<T> {
false, true, true));
// vectorized
// now we don't support datetime distinct
} else if (t.equals(Type.DECIMALV2)) {
} else if (t.equals(Type.MAX_DECIMALV2_TYPE)) {
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
Type.BIGINT,
Type.VARCHAR,
@ -1613,7 +1613,7 @@ public class FunctionSet<T> {
// vectorized
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t),
Type.BIGINT,
Type.DECIMALV2,
Type.MAX_DECIMALV2_TYPE,
prefix + "",
prefix + "",
prefix + "",
@ -1689,7 +1689,7 @@ public class FunctionSet<T> {
null,
prefix + MULTI_DISTINCT_SUM_FINALIZE_SYMBOL.get(t),
false, true, true, true));
} else if (t.equals(Type.DECIMALV2)) {
} else if (t.equals(Type.MAX_DECIMALV2_TYPE)) {
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t),
MULTI_DISTINCT_SUM_RETURN_TYPE.get(t),
Type.VARCHAR,
@ -1704,7 +1704,7 @@ public class FunctionSet<T> {
// vectorized
addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t),
MULTI_DISTINCT_SUM_RETURN_TYPE.get(t),
Type.DECIMALV2,
Type.MAX_DECIMALV2_TYPE,
prefix + "",
prefix + "",
prefix + "",
@ -2160,7 +2160,7 @@ public class FunctionSet<T> {
prefix + "10sum_removeIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, false, true, false));
addBuiltin(AggregateFunction.createBuiltin(name,
Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.DECIMALV2, prefix + "14init_zero_nullIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_",
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE, prefix + "14init_zero_nullIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionContextEPT_",
prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, null,
@ -2211,7 +2211,7 @@ public class FunctionSet<T> {
prefix + "10sum_removeIN9doris_udf9DoubleValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, false, true, false, true));
addBuiltin(AggregateFunction.createBuiltin(name,
Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.DECIMALV2, initNull,
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE, initNull,
prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
prefix + "3sumIN9doris_udf12DecimalV2ValES3_EEvPNS2_15FunctionContextERKT_PT0_",
null, null,
@ -2492,7 +2492,7 @@ public class FunctionSet<T> {
false, true, false));
addBuiltin(AggregateFunction.createBuiltin("avg",
Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.VARCHAR,
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE, Type.VARCHAR,
prefix + "18decimalv2_avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
prefix + "20decimalv2_avg_updateEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValEPNS1_9StringValE",
prefix + "19decimalv2_avg_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",
@ -2545,7 +2545,7 @@ public class FunctionSet<T> {
prefix + "12avg_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE",
false, true, false, true));
addBuiltin(AggregateFunction.createBuiltin("avg",
Lists.<Type>newArrayList(Type.DECIMALV2), Type.DECIMALV2, Type.DECIMALV2,
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE), Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE,
prefix + "18decimalv2_avg_initEPN9doris_udf15FunctionContextEPNS1_9StringValE",
prefix + "20decimalv2_avg_updateEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValEPNS1_9StringValE",
prefix + "19decimalv2_avg_mergeEPN9doris_udf15FunctionContextERKNS1_9StringValEPS4_",

View File

@ -77,6 +77,8 @@ public class ScalarType extends Type {
// Hive, mysql, sql server standard.
public static final int MAX_PRECISION = 38;
public static final int MAX_DECIMALV2_PRECISION = 27;
public static final int MAX_DECIMALV2_SCALE = 9;
public static final int MAX_DECIMAL32_PRECISION = 9;
public static final int MAX_DECIMAL64_PRECISION = 18;
public static final int MAX_DECIMAL128_PRECISION = 38;
@ -996,8 +998,12 @@ public class ScalarType extends Type {
return INVALID;
}
if (t1.isDecimalV2() && t2.isDecimalV2()) {
return getAssignmentCompatibleDecimalV2Type(t1, t2);
}
if (t1.isDecimalV2() || t2.isDecimalV2()) {
return DECIMALV2;
return MAX_DECIMALV2_TYPE;
}
PrimitiveType smallerType =
@ -1018,9 +1024,19 @@ public class ScalarType extends Type {
result = compatibilityMatrix[smallerType.ordinal()][largerType.ordinal()];
}
Preconditions.checkNotNull(result);
if (result == PrimitiveType.DECIMALV2) {
return Type.MAX_DECIMALV2_TYPE;
}
return createType(result);
}
public static ScalarType getAssignmentCompatibleDecimalV2Type(ScalarType t1, ScalarType t2) {
int targetPrecision = Math.max(t1.decimalPrecision(), t2.decimalPrecision());
int targetScale = Math.max(t1.decimalScale(), t2.decimalScale());
return ScalarType.createDecimalType(PrimitiveType.DECIMALV2,
targetPrecision, targetScale);
}
/**
* Returns true t1 can be implicitly cast to t2, false otherwise.
* If strict is true, only consider casts that result in no loss of precision.

View File

@ -69,6 +69,9 @@ public abstract class Type {
public static final ScalarType DEFAULT_DECIMALV2 = ScalarType.createDecimalType(PrimitiveType.DECIMALV2,
ScalarType.DEFAULT_PRECISION, ScalarType.DEFAULT_SCALE);
public static final ScalarType MAX_DECIMALV2_TYPE = ScalarType.createDecimalType(PrimitiveType.DECIMALV2,
ScalarType.MAX_DECIMALV2_PRECISION, ScalarType.MAX_DECIMALV2_SCALE);
public static final ScalarType DEFAULT_DECIMAL32 =
ScalarType.createDecimalType(PrimitiveType.DECIMAL32, ScalarType.MAX_DECIMAL32_PRECISION,
ScalarType.DEFAULT_SCALE);
@ -121,7 +124,7 @@ public abstract class Type {
numericTypes.addAll(integerTypes);
numericTypes.add(FLOAT);
numericTypes.add(DOUBLE);
numericTypes.add(DECIMALV2);
numericTypes.add(MAX_DECIMALV2_TYPE);
numericTypes.add(DECIMAL32);
numericTypes.add(DECIMAL64);
numericTypes.add(DECIMAL128);
@ -538,7 +541,7 @@ public abstract class Type {
case DOUBLE:
return DOUBLE;
case DECIMALV2:
return DECIMALV2;
return MAX_DECIMALV2_TYPE;
case DECIMAL32:
return DECIMAL32;
case DECIMAL64: