branch-2.1: [Bug](sort) fix wrong result coz push down sort with null last #51472 (#51507)

Cherry-picked from #51472

Co-authored-by: Pxl <xl@selectdb.com>
This commit is contained in:
github-actions[bot]
2025-06-16 14:51:12 +08:00
committed by GitHub
parent 1ee58b216b
commit c9623c32f0
4 changed files with 199 additions and 6 deletions

View File

@ -2753,9 +2753,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
if (sortExpr instanceof SlotRef) {
SlotRef slotRef = (SlotRef) sortExpr;
if (sortColumn.equals(slotRef.getColumn())) {
// ORDER BY DESC NULLS FIRST can not be optimized to only read file tail,
// since NULLS is at file head but data is at tail
if (sortColumn.isAllowNull() && nullsFirsts.get(i) && !isAscOrders.get(i)) {
// [ORDER BY DESC NULLS FIRST] or [ORDER BY ASC NULLS LAST] can not be optimized
// to only read file tail, since NULLS is at file head but data is at tail
if (sortColumn.isAllowNull() && nullsFirsts.get(i) != isAscOrders.get(i)) {
return false;
}
} else {

View File

@ -1235,9 +1235,9 @@ public class OlapScanNode extends ScanNode {
if (sortExpr instanceof SlotRef) {
SlotRef slotRef = (SlotRef) sortExpr;
if (tableKey.equals(slotRef.getColumn())) {
// ORDER BY DESC NULLS FIRST can not be optimized to only read file tail,
// since NULLS is at file head but data is at tail
if (tableKey.isAllowNull() && nullsFirsts.get(i) && !isAscOrders.get(i)) {
// [ORDER BY DESC NULLS FIRST] or [ORDER BY ASC NULLS LAST] can not be optimized
// to only read file tail, since NULLS is at file head but data is at tail
if (tableKey.isAllowNull() && (nullsFirsts.get(i) != isAscOrders.get(i))) {
return false;
}
} else {

View File

@ -0,0 +1,129 @@
-- This file is automatically generated. You should know what you did if you want to edit this
-- !select --
3 3 \N c
-- !select --
3 3 \N c
2 2 2 b
-- !select --
3 3 \N c
2 2 2 b
1 1 1 a
-- !select --
3 3 \N c
2 2 2 b
1 1 1 a
-3 -3 \N c
-- !select --
3 3 \N c
2 2 2 b
1 1 1 a
-3 -3 \N c
\N 3 \N c
-- !select --
3 3 \N c
2 2 2 b
1 1 1 a
-3 -3 \N c
\N 3 \N c
-- !select --
\N 3 \N c
-- !select --
\N 3 \N c
3 3 \N c
-- !select --
\N 3 \N c
3 3 \N c
2 2 2 b
-- !select --
\N 3 \N c
3 3 \N c
2 2 2 b
1 1 1 a
-- !select --
\N 3 \N c
3 3 \N c
2 2 2 b
1 1 1 a
-3 -3 \N c
-- !select --
\N 3 \N c
3 3 \N c
2 2 2 b
1 1 1 a
-3 -3 \N c
-- !select --
-3 -3 \N c
-- !select --
-3 -3 \N c
1 1 1 a
-- !select --
-3 -3 \N c
1 1 1 a
2 2 2 b
-- !select --
-3 -3 \N c
1 1 1 a
2 2 2 b
3 3 \N c
-- !select --
-3 -3 \N c
1 1 1 a
2 2 2 b
3 3 \N c
\N 3 \N c
-- !select --
-3 -3 \N c
1 1 1 a
2 2 2 b
3 3 \N c
\N 3 \N c
-- !select --
\N 3 \N c
-- !select --
\N 3 \N c
-3 -3 \N c
-- !select --
\N 3 \N c
-3 -3 \N c
1 1 1 a
-- !select --
\N 3 \N c
-3 -3 \N c
1 1 1 a
2 2 2 b
-- !select --
\N 3 \N c
-3 -3 \N c
1 1 1 a
2 2 2 b
3 3 \N c
-- !select --
\N 3 \N c
-3 -3 \N c
1 1 1 a
2 2 2 b
3 3 \N c

View File

@ -0,0 +1,64 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
suite("test_orderby_limit") {
sql "drop table if exists d_table;"
sql """
create table d_table (
k1 int null,
k2 int not null,
k3 bigint null,
k4 varchar(100) null
)
duplicate key (k1,k2,k3)
distributed BY hash(k1) buckets 3
properties("replication_num" = "1");
"""
sql "insert into d_table select 1,1,1,'a';"
sql "insert into d_table select 2,2,2,'b';"
sql "insert into d_table select -3,-3,null,'c';"
sql "insert into d_table select 3,3,null,'c';"
sql "insert into d_table select null,3,null,'c';"
qt_select "select * from d_table order by k1 desc nulls last limit 1;"
qt_select "select * from d_table order by k1 desc nulls last limit 2;"
qt_select "select * from d_table order by k1 desc nulls last limit 3;"
qt_select "select * from d_table order by k1 desc nulls last limit 4;"
qt_select "select * from d_table order by k1 desc nulls last limit 5;"
qt_select "select * from d_table order by k1 desc nulls last limit 6;"
qt_select "select * from d_table order by k1 desc nulls first limit 1;"
qt_select "select * from d_table order by k1 desc nulls first limit 2;"
qt_select "select * from d_table order by k1 desc nulls first limit 3;"
qt_select "select * from d_table order by k1 desc nulls first limit 4;"
qt_select "select * from d_table order by k1 desc nulls first limit 5;"
qt_select "select * from d_table order by k1 desc nulls first limit 6;"
qt_select "select * from d_table order by k1 asc nulls last limit 1;"
qt_select "select * from d_table order by k1 asc nulls last limit 2;"
qt_select "select * from d_table order by k1 asc nulls last limit 3;"
qt_select "select * from d_table order by k1 asc nulls last limit 4;"
qt_select "select * from d_table order by k1 asc nulls last limit 5;"
qt_select "select * from d_table order by k1 asc nulls last limit 6;"
qt_select "select * from d_table order by k1 asc nulls first limit 1;"
qt_select "select * from d_table order by k1 asc nulls first limit 2;"
qt_select "select * from d_table order by k1 asc nulls first limit 3;"
qt_select "select * from d_table order by k1 asc nulls first limit 4;"
qt_select "select * from d_table order by k1 asc nulls first limit 5;"
qt_select "select * from d_table order by k1 asc nulls first limit 6;"
}