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]
