This is an automated email from the ASF dual-hosted git repository.
panxiaolei pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new e8bafdf576 [Bug](upgrade) fix core dump at join node when rolling
upgrade (#22763)
e8bafdf576 is described below
commit e8bafdf5763a0686883dd2ef732a5371c7a1df85
Author: Pxl <[email protected]>
AuthorDate: Wed Aug 9 13:27:50 2023 +0800
[Bug](upgrade) fix core dump at join node when rolling upgrade (#22763)
fix core dump at join node when rolling upgrade
---
be/src/vec/columns/column_nullable.cpp | 2 +-
be/src/vec/common/assert_cast.h | 35 +++++++++++++++++++++++++++++++---
2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/be/src/vec/columns/column_nullable.cpp
b/be/src/vec/columns/column_nullable.cpp
index bda5029c31..6ef951dcd4 100644
--- a/be/src/vec/columns/column_nullable.cpp
+++ b/be/src/vec/columns/column_nullable.cpp
@@ -293,7 +293,7 @@ void ColumnNullable::insert_range_from(const IColumn& src,
size_t start, size_t
void ColumnNullable::insert_indices_from(const IColumn& src, const int*
indices_begin,
const int* indices_end) {
- const ColumnNullable& src_concrete = assert_cast<const
ColumnNullable&>(src);
+ const ColumnNullable& src_concrete = assert_cast_safe<const
ColumnNullable&>(src);
get_nested_column().insert_indices_from(src_concrete.get_nested_column(),
indices_begin,
indices_end);
_get_null_map_column().insert_indices_from(src_concrete.get_null_map_column(),
indices_begin,
diff --git a/be/src/vec/common/assert_cast.h b/be/src/vec/common/assert_cast.h
index 922cb74c61..a853f8a8ab 100644
--- a/be/src/vec/common/assert_cast.h
+++ b/be/src/vec/common/assert_cast.h
@@ -25,7 +25,9 @@
#include <typeindex>
#include <typeinfo>
+#include "common/exception.h"
#include "common/logging.h"
+#include "common/status.h"
#include "fmt/format.h"
#include "vec/common/demangle.h"
@@ -38,8 +40,10 @@ To assert_cast(From&& from) {
#ifndef NDEBUG
try {
if constexpr (std::is_pointer_v<To>) {
- if (typeid(*from) == typeid(std::remove_pointer_t<To>)) return
static_cast<To>(from);
- if constexpr (std::is_pointer_v<From>) {
+ if (typeid(*from) == typeid(std::remove_pointer_t<To>)) {
+ return static_cast<To>(from);
+ }
+ if constexpr (std::is_pointer_v<std::remove_reference_t<From>>) {
if (auto ptr = dynamic_cast<To>(from); ptr != nullptr) {
return ptr;
}
@@ -48,7 +52,9 @@ To assert_cast(From&& from) {
demangle(typeid(To).name()));
}
} else {
- if (typeid(from) == typeid(To)) return static_cast<To>(from);
+ if (typeid(from) == typeid(To)) {
+ return static_cast<To>(from);
+ }
}
} catch (const std::exception& e) {
LOG(FATAL) << "assert cast err:" << e.what();
@@ -61,3 +67,26 @@ To assert_cast(From&& from) {
return static_cast<To>(from);
#endif
}
+
+// there is a performance loss in the release version, but it can avoid core
dump
+template <typename To, typename From>
+To assert_cast_safe(From&& from) {
+ if constexpr (std::is_pointer_v<To>) {
+ if (typeid(*from) == typeid(std::remove_pointer_t<To>)) {
+ return static_cast<To>(from);
+ }
+ if constexpr (std::is_pointer_v<std::remove_reference_t<From>>) {
+ if (auto ptr = dynamic_cast<To>(from); ptr != nullptr) {
+ return ptr;
+ }
+ throw doris::Exception(doris::ErrorCode::INTERNAL_ERROR, "Bad cast
from type:{}* to {}",
+ demangle(typeid(*from).name()),
demangle(typeid(To).name()));
+ }
+ } else {
+ if (typeid(from) == typeid(To)) {
+ return static_cast<To>(from);
+ }
+ }
+ throw doris::Exception(doris::ErrorCode::INTERNAL_ERROR, "Bad cast from
type:{} to {}",
+ demangle(typeid(from).name()),
demangle(typeid(To).name()));
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]