You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by zh...@apache.org on 2019/09/23 11:56:26 UTC

[incubator-doris] branch master updated: Support cast datetime to decimal (#1849)

This is an automated email from the ASF dual-hosted git repository.

zhaoc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new c3fccb7  Support cast datetime to decimal (#1849)
c3fccb7 is described below

commit c3fccb7a495a24f7e58f8756424abaa0e7de47af
Author: ZHAO Chun <bu...@gmail.com>
AuthorDate: Mon Sep 23 19:56:20 2019 +0800

    Support cast datetime to decimal (#1849)
---
 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 +
 fe/src/main/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 88b6e08..8c19b39 100644
--- a/be/src/exprs/decimal_operators.cpp
+++ b/be/src/exprs/decimal_operators.cpp
@@ -77,6 +77,20 @@ DecimalVal DecimalOperators::cast_to_decimal_val(
 }
 
 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) {
         return DecimalVal::null();
diff --git a/be/src/exprs/decimal_operators.h b/be/src/exprs/decimal_operators.h
index 766c734..a46532c 100644
--- a/be/src/exprs/decimal_operators.h
+++ b/be/src/exprs/decimal_operators.h
@@ -41,6 +41,7 @@ public:
     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 b15bc40..0a57321 100644
--- a/be/src/exprs/decimalv2_operators.cpp
+++ b/be/src/exprs/decimalv2_operators.cpp
@@ -77,6 +77,19 @@ DecimalV2Val DecimalV2Operators::cast_to_decimalv2_val(
 }
 
 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) {
         return DecimalV2Val::null();
diff --git a/be/src/exprs/decimalv2_operators.h b/be/src/exprs/decimalv2_operators.h
index 5a404b9..8030985 100644
--- a/be/src/exprs/decimalv2_operators.h
+++ b/be/src/exprs/decimalv2_operators.h
@@ -41,6 +41,7 @@ public:
     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 18334f1..ba1c819 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 class CastExpr extends Expr {
                 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;
                 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org