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

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

commit 24a8836c5f375ef259d905c04200ddff359d6909
Author: zhangstar333 <[email protected]>
AuthorDate: Tue Mar 1 14:42:48 2022 +0800

    [Fix] Function percentile input null return null (#8238)
---
 be/src/exec/mysql_scanner.cpp                         |  1 -
 be/src/exprs/minmax_predicate.h                       |  1 +
 be/src/util/counts.h                                  |  2 +-
 be/src/vec/functions/function_json.cpp                |  8 ++++----
 be/src/vec/functions/function_string.cpp              | 18 +++++++++---------
 be/src/vec/functions/function_timestamp.cpp           |  9 +++++++--
 be/src/vec/functions/function_totype.h                |  4 ++--
 be/test/vec/function/function_string_test.cpp         | 19 +++++++++++++++++++
 .../sql-functions/aggregate-functions/percentile.md   |  8 ++++++++
 .../sql-functions/aggregate-functions/percentile.md   |  7 +++++++
 10 files changed, 58 insertions(+), 19 deletions(-)

diff --git a/be/src/exec/mysql_scanner.cpp b/be/src/exec/mysql_scanner.cpp
index a6be664..65f6e1e 100644
--- a/be/src/exec/mysql_scanner.cpp
+++ b/be/src/exec/mysql_scanner.cpp
@@ -41,7 +41,6 @@ MysqlScanner::~MysqlScanner() {
     if (_my_conn) {
         mysql_close(_my_conn);
         _my_conn = nullptr;
-        mysql_library_end();
     }
 }
 
diff --git a/be/src/exprs/minmax_predicate.h b/be/src/exprs/minmax_predicate.h
index 61f7f1f..1004560 100644
--- a/be/src/exprs/minmax_predicate.h
+++ b/be/src/exprs/minmax_predicate.h
@@ -25,6 +25,7 @@ namespace doris {
 // only used in Runtime Filter
 class MinMaxFuncBase {
 public:
+    virtual ~MinMaxFuncBase() = default;
     virtual void insert(const void* data) = 0;
     virtual bool find(void* data) = 0;
     virtual bool is_empty() = 0;
diff --git a/be/src/util/counts.h b/be/src/util/counts.h
index 6a3d103..dc1cd3d 100644
--- a/be/src/util/counts.h
+++ b/be/src/util/counts.h
@@ -109,7 +109,7 @@ public:
 
     doris_udf::DoubleVal terminate(double quantile) const {
         if (_counts.empty()) {
-            return doris_udf::DoubleVal();
+            return doris_udf::DoubleVal::null();
         }
 
         std::vector<std::pair<int64_t, uint32_t>> elems(_counts.begin(), 
_counts.end());
diff --git a/be/src/vec/functions/function_json.cpp 
b/be/src/vec/functions/function_json.cpp
index 466bc7b..ee4b6c9 100644
--- a/be/src/vec/functions/function_json.cpp
+++ b/be/src/vec/functions/function_json.cpp
@@ -224,7 +224,7 @@ struct GetJsonNumberType {
     using ReturnType = typename NumberType::ReturnType;
     using ColumnType = typename NumberType::ColumnType;
     using Container = typename ColumnType::Container;
-    static void vector_vector(const ColumnString::Chars& ldata,
+    static void vector_vector(FunctionContext* context, const 
ColumnString::Chars& ldata,
                               const ColumnString::Offsets& loffsets,
                               const ColumnString::Chars& rdata,
                               const ColumnString::Offsets& roffsets, 
Container& res,
@@ -314,9 +314,9 @@ struct GetJsonString {
     using ColumnType = ColumnString;
     using Chars = ColumnString::Chars;
     using Offsets = ColumnString::Offsets;
-    static void vector_vector(const Chars& ldata, const Offsets& loffsets, 
const Chars& rdata,
-                              const Offsets& roffsets, Chars& res_data, 
Offsets& res_offsets,
-                              NullMap& null_map) {
+    static void vector_vector(FunctionContext* context, const Chars& ldata, 
const Offsets& loffsets,
+                              const Chars& rdata, const Offsets& roffsets, 
Chars& res_data,
+                              Offsets& res_offsets, NullMap& null_map) {
         size_t input_rows_count = loffsets.size();
         res_offsets.resize(input_rows_count);
 
diff --git a/be/src/vec/functions/function_string.cpp 
b/be/src/vec/functions/function_string.cpp
index 94ed9c9..926e8ed 100644
--- a/be/src/vec/functions/function_string.cpp
+++ b/be/src/vec/functions/function_string.cpp
@@ -485,9 +485,9 @@ struct AesEncryptImpl {
     using Offsets = ColumnString::Offsets;
     using ReturnType = DataTypeString;
     using ColumnType = ColumnString;
-    static void vector_vector(const Chars& ldata, const Offsets& loffsets, 
const Chars& rdata,
-                              const Offsets& roffsets, Chars& res_data, 
Offsets& res_offsets,
-                              NullMap& null_map_data) {
+    static void vector_vector(FunctionContext* context, const Chars& ldata, 
const Offsets& loffsets,
+                              const Chars& rdata, const Offsets& roffsets, 
Chars& res_data,
+                              Offsets& res_offsets, NullMap& null_map_data) {
         DCHECK_EQ(loffsets.size(), roffsets.size());
         size_t input_rows_count = loffsets.size();
         res_offsets.resize(input_rows_count);
@@ -525,9 +525,9 @@ struct AesDecryptImpl {
     using Offsets = ColumnString::Offsets;
     using ReturnType = DataTypeString;
     using ColumnType = ColumnString;
-    static void vector_vector(const Chars& ldata, const Offsets& loffsets, 
const Chars& rdata,
-                              const Offsets& roffsets, Chars& res_data, 
Offsets& res_offsets,
-                              NullMap& null_map_data) {
+    static void vector_vector(FunctionContext* context, const Chars& ldata, 
const Offsets& loffsets,
+                              const Chars& rdata, const Offsets& roffsets, 
Chars& res_data,
+                              Offsets& res_offsets, NullMap& null_map_data) {
         DCHECK_EQ(loffsets.size(), roffsets.size());
         size_t input_rows_count = loffsets.size();
         res_offsets.resize(input_rows_count);
@@ -646,9 +646,9 @@ struct StringAppendTrailingCharIfAbsent {
     using Offsets = ColumnString::Offsets;
     using ReturnType = DataTypeString;
     using ColumnType = ColumnString;
-    static void vector_vector(const Chars& ldata, const Offsets& loffsets, 
const Chars& rdata,
-                              const Offsets& roffsets, Chars& res_data, 
Offsets& res_offsets,
-                              NullMap& null_map_data) {
+    static void vector_vector(FunctionContext* context, const Chars& ldata, 
const Offsets& loffsets,
+                              const Chars& rdata, const Offsets& roffsets, 
Chars& res_data,
+                              Offsets& res_offsets, NullMap& null_map_data) {
         DCHECK_EQ(loffsets.size(), roffsets.size());
         size_t input_rows_count = loffsets.size();
         res_offsets.resize(input_rows_count);
diff --git a/be/src/vec/functions/function_timestamp.cpp 
b/be/src/vec/functions/function_timestamp.cpp
index f5216e9..45dc20a 100644
--- a/be/src/vec/functions/function_timestamp.cpp
+++ b/be/src/vec/functions/function_timestamp.cpp
@@ -34,7 +34,7 @@ struct StrToDate {
     using ReturnType = DataTypeDateTime;
     using ColumnType = ColumnVector<Int64>;
 
-    static void vector_vector(const ColumnString::Chars& ldata,
+    static void vector_vector(FunctionContext* context, const 
ColumnString::Chars& ldata,
                               const ColumnString::Offsets& loffsets,
                               const ColumnString::Chars& rdata,
                               const ColumnString::Offsets& roffsets, 
ColumnType::Container& res,
@@ -52,7 +52,12 @@ struct StrToDate {
             if (!ts_val.from_date_format_str(r_raw_str, r_str_size, l_raw_str, 
l_str_size)) {
                 null_map[i] = 1;
             }
-            ts_val.to_datetime();
+            if (context->impl()->get_return_type().type ==
+                doris_udf::FunctionContext::Type::TYPE_DATETIME) {
+                ts_val.to_datetime();
+            } else {
+                ts_val.cast_to_date();
+            }
         }
     }
 };
diff --git a/be/src/vec/functions/function_totype.h 
b/be/src/vec/functions/function_totype.h
index 425a09b..83ddc0c 100644
--- a/be/src/vec/functions/function_totype.h
+++ b/be/src/vec/functions/function_totype.h
@@ -383,10 +383,10 @@ public:
         if constexpr (std::is_same_v<typename Impl::ReturnType, 
DataTypeString>) {
             auto& res_data = res->get_chars();
             auto& res_offsets = res->get_offsets();
-            Impl::vector_vector(ldata, loffsets, rdata, roffsets, res_data, 
res_offsets,
+            Impl::vector_vector(context, ldata, loffsets, rdata, roffsets, 
res_data, res_offsets,
                                 null_map->get_data());
         } else {
-            Impl::vector_vector(ldata, loffsets, rdata, roffsets, 
res->get_data(),
+            Impl::vector_vector(context, ldata, loffsets, rdata, roffsets, 
res->get_data(),
                                 null_map->get_data());
         }
 
diff --git a/be/test/vec/function/function_string_test.cpp 
b/be/test/vec/function/function_string_test.cpp
index 60184fc..e32d911 100644
--- a/be/test/vec/function/function_string_test.cpp
+++ b/be/test/vec/function/function_string_test.cpp
@@ -744,6 +744,25 @@ TEST(function_string_test, function_coalesce_test) {
     }
 }
 
+TEST(function_string_test, function_str_to_date_test) {
+    std::string func_name = "str_to_date";
+    InputTypeSet input_types = {
+            TypeIndex::String,
+            TypeIndex::String,
+    };
+    DataSet data_set = {
+            {{Null(), std::string("%Y-%m-%d %H:%i:%s")}, {Null()}},
+            {{std::string("2014-12-21 12:34:56"), std::string("%Y-%m-%d 
%H:%i:%s")},
+             str_to_data_time("2014-12-21 12:34:56", false)},
+            {{std::string("2014-12-21 12:34%3A56"), std::string("%Y-%m-%d 
%H:%i%%3A%s")},
+             str_to_data_time("2014-12-21 12:34:56", false)},
+            {{std::string("11/09/2011"), std::string("%m/%d/%Y")},
+             str_to_data_time("2011-11-09", false)},
+            {{std::string("2020-09-01"), std::string("%Y-%m-%d %H:%i:%s")},
+             str_to_data_time("2020-09-01 00:00:00", false)}};
+    check_function<DataTypeDateTime, true>(func_name, input_types, data_set);
+}
+
 } // namespace doris::vectorized
 
 int main(int argc, char** argv) {
diff --git 
a/docs/en/sql-reference/sql-functions/aggregate-functions/percentile.md 
b/docs/en/sql-reference/sql-functions/aggregate-functions/percentile.md
index 7fc0e51..c22a4f5 100644
--- a/docs/en/sql-reference/sql-functions/aggregate-functions/percentile.md
+++ b/docs/en/sql-reference/sql-functions/aggregate-functions/percentile.md
@@ -44,6 +44,14 @@ MySQL > select `table`, percentile(cost_time,0.99) from 
log_statis group by `tab
 +----------+--------------------------------------+
 | test     |                                54.22 |
 +----------+--------------------------------------+
+
+MySQL > select percentile(NULL,0.3) from table1;
++-----------------------+
+| percentile(NULL, 0.3) |
++-----------------------+
+|                  NULL |
++-----------------------+
+
 ```
 
 ## keyword
diff --git 
a/docs/zh-CN/sql-reference/sql-functions/aggregate-functions/percentile.md 
b/docs/zh-CN/sql-reference/sql-functions/aggregate-functions/percentile.md
index 0ca2415..dfbe24f 100755
--- a/docs/zh-CN/sql-reference/sql-functions/aggregate-functions/percentile.md
+++ b/docs/zh-CN/sql-reference/sql-functions/aggregate-functions/percentile.md
@@ -44,6 +44,13 @@ MySQL > select `table`, percentile(cost_time,0.99) from 
log_statis group by `tab
 +----------+--------------------------------------+
 | test     |                                54.22 |
 +----------+--------------------------------------+
+
+MySQL > select percentile(NULL,0.3) from table1;
++-----------------------+
+| percentile(NULL, 0.3) |
++-----------------------+
+|                  NULL |
++-----------------------+
 ```
 
 ## keyword

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to