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

yangzhg 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 71f167ac51 [fix](sort) fix nullable column sorting incorrectly (#13125)
71f167ac51 is described below

commit 71f167ac51464074f7590d9e2a405cd779514976
Author: luozenglin <37725793+luozeng...@users.noreply.github.com>
AuthorDate: Fri Oct 14 12:45:04 2022 +0800

    [fix](sort) fix nullable column sorting incorrectly (#13125)
---
 be/src/vec/core/sort_block.h                          | 19 ++++++++++++++++---
 regression-test/data/correctness_p0/test_sort.out     | 18 ++++++++++++++++++
 .../suites/correctness_p0/test_sort.groovy            |  4 ++++
 3 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/be/src/vec/core/sort_block.h b/be/src/vec/core/sort_block.h
index c7ff4c70e4..ef21d99d92 100644
--- a/be/src/vec/core/sort_block.h
+++ b/be/src/vec/core/sort_block.h
@@ -223,6 +223,8 @@ public:
             column.get_nested_column().sort_column(this, flags, perms, range, 
last_column);
         } else {
             const auto& null_map = column.get_null_map_data();
+            int limit = _limit;
+            std::vector<std::pair<size_t, size_t>> is_null_ranges;
             EqualRangeIterator iterator(flags, range.first, range.second);
             while (iterator.next()) {
                 int range_begin = iterator.range_begin;
@@ -259,15 +261,26 @@ public:
                         flags[not_null_range.first] = 0;
                     }
                     if (is_null_range.first < is_null_range.second) {
+                        // do not sort null values
                         std::fill(flags.begin() + is_null_range.first,
-                                  flags.begin() + is_null_range.second, 1);
+                                  flags.begin() + is_null_range.second, 0);
 
-                        flags[is_null_range.first] = 0;
+                        if (UNLIKELY(_limit > is_null_range.first &&
+                                     _limit <= is_null_range.second)) {
+                            _limit = is_null_range.second;
+                        }
+                        is_null_ranges.push_back(std::move(is_null_range));
                     }
                 }
             }
 
             column.get_nested_column().sort_column(this, flags, perms, range, 
last_column);
+            _limit = limit;
+            if (!last_column) {
+                for (const auto& nr : is_null_ranges) {
+                    std::fill(flags.begin() + nr.first + 1, flags.begin() + 
nr.second, 1);
+                }
+            }
         }
     }
 
@@ -452,7 +465,7 @@ private:
     }
 
     const ColumnWithSortDescription& _column_with_sort_desc;
-    const int _limit;
+    mutable int _limit;
     const int _nulls_direction;
     const int _direction;
 };
diff --git a/regression-test/data/correctness_p0/test_sort.out 
b/regression-test/data/correctness_p0/test_sort.out
index 095c7b2035..6f3c3484ed 100644
--- a/regression-test/data/correctness_p0/test_sort.out
+++ b/regression-test/data/correctness_p0/test_sort.out
@@ -2,3 +2,21 @@
 -- !sql --
 1
 
+-- !sql --
+\N     \N      \N      \N
+\N     1       \N      11011902
+\N     2       \N      11011903
+\N     3       \N      11011905
+\N     4       \N      -11011907
+\N     5       \N      -11011903
+\N     6       \N      123456
+\N     7       \N      7210457
+\N     8       \N      11011920
+\N     9       \N      11011902
+\N     10      \N      9223372036854775807
+\N     11      \N      -9223372036854775807
+\N     12      \N      9223372036854775807
+\N     13      \N      -9223372036854775807
+\N     14      \N      11011902
+\N     15      \N      11011920
+
diff --git a/regression-test/suites/correctness_p0/test_sort.groovy 
b/regression-test/suites/correctness_p0/test_sort.groovy
index ba77916d3b..4bda135ee8 100644
--- a/regression-test/suites/correctness_p0/test_sort.groovy
+++ b/regression-test/suites/correctness_p0/test_sort.groovy
@@ -53,4 +53,8 @@ suite("test_sort") {
     """
 
     sql "DROP TABLE test_sort_table"
+
+    qt_sql """
+        select b.k1, a.k1, b.k4, a.k4 from test_query_db.baseall a left join 
test_query_db.test b on a.k2 = b.k4  order by 1, 2, 3, 4;
+    """
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to