You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/04/11 06:03:46 UTC
[incubator-doris] 05/09: [fix](vectorized) core dump on ST_AsText (#8870)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit d3b051a442aa8dd113495a280cc4b465050d24e4
Author: morningman <mo...@163.com>
AuthorDate: Mon Apr 11 11:42:09 2022 +0800
[fix](vectorized) core dump on ST_AsText (#8870)
---
be/src/vec/functions/functions_geo.cpp | 36 ++++++++++++++++++++--------------
be/src/vec/functions/functions_geo.h | 1 -
2 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/be/src/vec/functions/functions_geo.cpp b/be/src/vec/functions/functions_geo.cpp
index ba4c370506..51b9cd5311 100644
--- a/be/src/vec/functions/functions_geo.cpp
+++ b/be/src/vec/functions/functions_geo.cpp
@@ -31,9 +31,12 @@ struct StPoint {
static const size_t NUM_ARGS = 2;
static Status execute(Block& block, const ColumnNumbers& arguments, size_t result) {
DCHECK_EQ(arguments.size(), 2);
- auto return_type = block.get_data_type(result);
- auto column_x = block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
- auto column_y = block.get_by_position(arguments[1]).column->convert_to_full_column_if_const();
+ auto return_type = remove_nullable(block.get_data_type(result));
+
+ auto column_x =
+ block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
+ auto column_y =
+ block.get_by_position(arguments[1]).column->convert_to_full_column_if_const();
const auto size = column_x->size();
@@ -67,14 +70,15 @@ struct StAsWktName {
static constexpr auto NAME = "st_aswkt";
};
-template<typename FunctionName>
+template <typename FunctionName>
struct StAsText {
static constexpr auto NEED_CONTEXT = false;
static constexpr auto NAME = FunctionName::NAME;
static const size_t NUM_ARGS = 1;
- static Status execute(Block& block, const ColumnNumbers& arguments,size_t result) {
+ static Status execute(Block& block, const ColumnNumbers& arguments, size_t result) {
DCHECK_EQ(arguments.size(), 1);
- auto return_type = block.get_data_type(result);
+ auto return_type = remove_nullable(block.get_data_type(result));
+
auto input = block.get_by_position(arguments[0]).column;
auto size = input->size();
@@ -106,9 +110,10 @@ struct StX {
static constexpr auto NEED_CONTEXT = false;
static constexpr auto NAME = "st_x";
static const size_t NUM_ARGS = 1;
- static Status execute(Block& block, const ColumnNumbers& arguments,size_t result) {
+ static Status execute(Block& block, const ColumnNumbers& arguments, size_t result) {
DCHECK_EQ(arguments.size(), 1);
- auto return_type = block.get_data_type(result);
+ auto return_type = remove_nullable(block.get_data_type(result));
+
auto input = block.get_by_position(arguments[0]).column;
auto size = input->size();
@@ -140,9 +145,10 @@ struct StY {
static constexpr auto NEED_CONTEXT = false;
static constexpr auto NAME = "st_y";
static const size_t NUM_ARGS = 1;
- static Status execute(Block& block, const ColumnNumbers& arguments,size_t result) {
+ static Status execute(Block& block, const ColumnNumbers& arguments, size_t result) {
DCHECK_EQ(arguments.size(), 1);
- auto return_type = block.get_data_type(result);
+ auto return_type = remove_nullable(block.get_data_type(result));
+
auto input = block.get_by_position(arguments[0]).column;
auto size = input->size();
@@ -176,7 +182,8 @@ struct StDistanceSphere {
static const size_t NUM_ARGS = 4;
static Status execute(Block& block, const ColumnNumbers& arguments, size_t result) {
DCHECK_EQ(arguments.size(), 4);
- auto return_type = block.get_data_type(result);
+ auto return_type = remove_nullable(block.get_data_type(result));
+
auto x_lng = block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
auto x_lat = block.get_by_position(arguments[1]).column->convert_to_full_column_if_const();
auto y_lng = block.get_by_position(arguments[2]).column->convert_to_full_column_if_const();
@@ -189,16 +196,15 @@ struct StDistanceSphere {
res = ColumnNullable::create(return_type->create_column(), ColumnUInt8::create());
for (int row = 0; row < size; ++row) {
- double distance;
+ double distance = 0;
if (!GeoPoint::ComputeDistance(x_lng->operator[](row).get<Float64>(),
x_lat->operator[](row).get<Float64>(),
y_lng->operator[](row).get<Float64>(),
- y_lat->operator[](row).get<Float64>(),
- &distance)) {
+ y_lat->operator[](row).get<Float64>(), &distance)) {
res->insert_data(nullptr, 0);
continue;
}
- res->insert_data(const_cast<const char*>((char*) &distance), 0);
+ res->insert_data(const_cast<const char*>((char*)&distance), 0);
}
block.replace_by_position(result, std::move(res));
diff --git a/be/src/vec/functions/functions_geo.h b/be/src/vec/functions/functions_geo.h
index d18b808c3f..3002c55a10 100644
--- a/be/src/vec/functions/functions_geo.h
+++ b/be/src/vec/functions/functions_geo.h
@@ -42,7 +42,6 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
- return Impl::execute(block, arguments, result);
if constexpr (Impl::NEED_CONTEXT) {
return Impl::execute(context, block, arguments, result);
} else {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org