From c96889c1320d84182575588f3642af891bd173ed Mon Sep 17 00:00:00 2001 From: zhaochun Date: Mon, 23 Sep 2019 17:06:46 +0800 Subject: [PATCH] Support cast datetime to decimal --- be/src/exprs/decimal_operators.cpp | 14 ++++++++++++++ be/src/exprs/decimal_operators.h | 1 + be/src/exprs/decimalv2_operators.cpp | 13 +++++++++++++ be/src/exprs/decimalv2_operators.h | 1 + .../java/org/apache/doris/analysis/CastExpr.java | 4 ++-- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/be/src/exprs/decimal_operators.cpp b/be/src/exprs/decimal_operators.cpp index 88b6e0829bb30a..8c19b39735c432 100644 --- a/be/src/exprs/decimal_operators.cpp +++ b/be/src/exprs/decimal_operators.cpp @@ -76,6 +76,20 @@ DecimalVal DecimalOperators::cast_to_decimal_val( return result; } +DecimalVal DecimalOperators::cast_to_decimal_val( + FunctionContext* context, const DateTimeVal& val) { + if (val.is_null) { + return DecimalVal::null(); + } + + DateTimeValue dt_value = DateTimeValue::from_datetime_val(val); + + DecimalValue dv = dt_value.to_int64(); + DecimalVal result; + dv.to_decimal_val(&result); + return result; +} + DecimalVal DecimalOperators::cast_to_decimal_val( FunctionContext* context, const StringVal& val) { if (val.is_null) { diff --git a/be/src/exprs/decimal_operators.h b/be/src/exprs/decimal_operators.h index 766c734f712222..a46532ca5d3d6e 100644 --- a/be/src/exprs/decimal_operators.h +++ b/be/src/exprs/decimal_operators.h @@ -41,6 +41,7 @@ class DecimalOperators { static DecimalVal cast_to_decimal_val(FunctionContext*, const LargeIntVal&); static DecimalVal cast_to_decimal_val(FunctionContext*, const FloatVal&); static DecimalVal cast_to_decimal_val(FunctionContext*, const DoubleVal&); + static DecimalVal cast_to_decimal_val(FunctionContext*, const DateTimeVal&); static DecimalVal cast_to_decimal_val(FunctionContext*, const StringVal&); static BooleanVal cast_to_boolean_val(FunctionContext*, const DecimalVal&); diff --git a/be/src/exprs/decimalv2_operators.cpp b/be/src/exprs/decimalv2_operators.cpp index b15bc40863b1f8..0a5732123b5da2 100644 --- a/be/src/exprs/decimalv2_operators.cpp +++ b/be/src/exprs/decimalv2_operators.cpp @@ -76,6 +76,19 @@ DecimalV2Val DecimalV2Operators::cast_to_decimalv2_val( return result; } +DecimalV2Val DecimalV2Operators::cast_to_decimalv2_val( + FunctionContext* context, const DateTimeVal& val) { + if (val.is_null) { + return DecimalV2Val::null(); + } + + DateTimeValue dt_value = DateTimeValue::from_datetime_val(val); + DecimalV2Value dv(dt_value.to_int64(), 0); + DecimalV2Val result; + dv.to_decimal_val(&result); + return result; +} + DecimalV2Val DecimalV2Operators::cast_to_decimalv2_val( FunctionContext* context, const StringVal& val) { if (val.is_null) { diff --git a/be/src/exprs/decimalv2_operators.h b/be/src/exprs/decimalv2_operators.h index 5a404b98992b27..8030985d46566c 100644 --- a/be/src/exprs/decimalv2_operators.h +++ b/be/src/exprs/decimalv2_operators.h @@ -41,6 +41,7 @@ class DecimalV2Operators { static DecimalV2Val cast_to_decimalv2_val(FunctionContext*, const LargeIntVal&); static DecimalV2Val cast_to_decimalv2_val(FunctionContext*, const FloatVal&); static DecimalV2Val cast_to_decimalv2_val(FunctionContext*, const DoubleVal&); + static DecimalV2Val cast_to_decimalv2_val(FunctionContext*, const DateTimeVal&); static DecimalV2Val cast_to_decimalv2_val(FunctionContext*, const StringVal&); static BooleanVal cast_to_boolean_val(FunctionContext*, const DecimalV2Val&); diff --git a/fe/src/main/java/org/apache/doris/analysis/CastExpr.java b/fe/src/main/java/org/apache/doris/analysis/CastExpr.java index 18334f1b44e9ff..ba1c81977e19bf 100644 --- a/fe/src/main/java/org/apache/doris/analysis/CastExpr.java +++ b/fe/src/main/java/org/apache/doris/analysis/CastExpr.java @@ -103,8 +103,8 @@ public static void initBuiltins(FunctionSet functionSet) { if (fromType.isStringType() && toType.isBoolean()) { continue; } - // Disable casting from boolean/timestamp to decimal - if ((fromType.isBoolean() || fromType.isDateType()) && + // Disable casting from boolean to decimal + if (fromType.isBoolean() && (toType == Type.DECIMAL || toType == Type.DECIMALV2)) { continue; }