This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 31644412c85 [Bug](regression) fix bug of null in topn opt (#31669)
31644412c85 is described below
commit 31644412c85acaea5943787be6a4c0c9978a1089
Author: HappenLee <[email protected]>
AuthorDate: Sat Mar 2 08:07:51 2024 +0800
[Bug](regression) fix bug of null in topn opt (#31669)
---
be/src/olap/accept_null_predicate.h | 56 +++++++++++++++++--------------------
1 file changed, 26 insertions(+), 30 deletions(-)
diff --git a/be/src/olap/accept_null_predicate.h
b/be/src/olap/accept_null_predicate.h
index 35d2546582b..1f6f9f6ec35 100644
--- a/be/src/olap/accept_null_predicate.h
+++ b/be/src/olap/accept_null_predicate.h
@@ -65,15 +65,15 @@ public:
bool* flags) const override {
if (column.has_null()) {
// copy original flags
- auto original_flags_buf = std::make_unique<bool[]>(size);
- auto* original_flags = original_flags_buf.get();
+ bool original_flags[size];
memcpy(original_flags, flags, size * sizeof(bool));
+ const auto& nullable_col = assert_cast<const
vectorized::ColumnNullable&>(column);
// call evaluate_and and restore true for NULL rows
- _nested->evaluate_and(column, sel, size, flags);
+ _nested->evaluate_and(nullable_col.get_nested_column(), sel, size,
flags);
for (uint16_t i = 0; i < size; ++i) {
uint16_t idx = sel[i];
- if (original_flags[idx] && !flags[idx] &&
column.is_null_at(idx)) {
+ if (original_flags[i] && !flags[i] &&
nullable_col.is_null_at(idx)) {
flags[i] = true;
}
}
@@ -85,11 +85,13 @@ public:
void evaluate_or(const vectorized::IColumn& column, const uint16_t* sel,
uint16_t size,
bool* flags) const override {
if (column.has_null()) {
+ const auto& nullable_col = assert_cast<const
vectorized::ColumnNullable&>(column);
+ _nested->evaluate_or(nullable_col.get_nested_column(), sel, size,
flags);
+
// call evaluate_or and set true for NULL rows
- _nested->evaluate_or(column, sel, size, flags);
for (uint16_t i = 0; i < size; ++i) {
uint16_t idx = sel[i];
- if (!flags[idx] && column.is_null_at(idx)) {
+ if (!flags[i] && nullable_col.is_null_at(idx)) {
flags[i] = true;
}
}
@@ -118,14 +120,17 @@ public:
void evaluate_vec(const vectorized::IColumn& column, uint16_t size,
bool* flags) const override {
- _nested->evaluate_vec(column, size, flags);
if (column.has_null()) {
+ const auto& nullable_col = assert_cast<const
vectorized::ColumnNullable&>(column);
+ _nested->evaluate_vec(nullable_col.get_nested_column(), size,
flags);
for (uint16_t i = 0; i < size; ++i) {
- if (!flags[i] && column.is_null_at(i)) {
+ if (!flags[i] && nullable_col.is_null_at(i)) {
// set true for NULL rows
flags[i] = true;
}
}
+ } else {
+ _nested->evaluate_vec(column, size, flags);
}
}
@@ -133,14 +138,14 @@ public:
bool* flags) const override {
if (column.has_null()) {
// copy original flags
- auto original_flags_buf = std::make_unique<bool[]>(size);
- auto* original_flags = original_flags_buf.get();
+ bool original_flags[size];
memcpy(original_flags, flags, size * sizeof(bool));
+ const auto& nullable_col = assert_cast<const
vectorized::ColumnNullable&>(column);
// call evaluate_and_vec and restore true for NULL rows
- _nested->evaluate_and_vec(column, size, flags);
+ _nested->evaluate_and_vec(nullable_col.get_nested_column(), size,
flags);
for (uint16_t i = 0; i < size; ++i) {
- if (original_flags[i] && !flags[i] && column.is_null_at(i)) {
+ if (original_flags[i] && !flags[i] &&
nullable_col.is_null_at(i)) {
flags[i] = true;
}
}
@@ -155,44 +160,35 @@ private:
uint16_t _evaluate_inner(const vectorized::IColumn& column, uint16_t* sel,
uint16_t size) const override {
if (column.has_null()) {
+ if (size == 0) return 0;
// create selected_flags
- uint16_t max_idx = *std::max_element(sel, sel + size);
- auto selected_flags_ptr = std::make_unique<bool[]>(max_idx + 1);
- auto* selected_flags = selected_flags_ptr.get();
- // init to 0 / false
- memset(selected_flags, 0, (max_idx + 1) * sizeof(bool));
- for (uint16_t i = 0; i < size; ++i) {
- uint16_t row_idx = sel[i];
- if (column.is_null_at(row_idx)) {
- // set selected flag true for NULL value
- selected_flags[row_idx] = true;
- }
- }
+ uint16_t max_idx = sel[size - 1];
+ bool selected[max_idx + 1];
+ const auto& nullable_col = assert_cast<const
vectorized::ColumnNullable&>(column);
+ memcpy(selected, nullable_col.get_null_map_data().data(), (max_idx
+ 1) * sizeof(bool));
// call nested predicate evaluate
- uint16_t new_size = _nested->evaluate(column, sel, size);
+ uint16_t new_size =
_nested->evaluate(nullable_col.get_nested_column(), sel, size);
// process NULL values
if (new_size < size) {
// add rows selected by _nested->evaluate
for (uint16_t i = 0; i < new_size; ++i) {
uint16_t row_idx = sel[i];
- selected_flags[row_idx] = true;
+ selected[row_idx] = true;
}
// recaculate new_size and sel array
new_size = 0;
for (uint16_t row_idx = 0; row_idx < max_idx + 1; ++row_idx) {
- if (selected_flags[row_idx]) {
+ if (selected[row_idx]) {
sel[new_size++] = row_idx;
}
}
}
-
return new_size;
- } else {
- return _nested->evaluate(column, sel, size);
}
+ return _nested->evaluate(column, sel, size);
}
std::string _debug_string() const override {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]