[fix](join) incorrect result of right anti join with nullable (#28301)
This commit is contained in:
@ -600,6 +600,7 @@ void HashJoinNode::_prepare_probe_block() {
|
||||
column_type.column = remove_nullable(column_type.column);
|
||||
column_type.type = remove_nullable(column_type.type);
|
||||
}
|
||||
_temp_probe_nullable_columns.clear();
|
||||
release_block_memory(_probe_block);
|
||||
}
|
||||
|
||||
@ -855,6 +856,7 @@ Status HashJoinNode::_extract_join_column(Block& block, ColumnUInt8::MutablePtr&
|
||||
ColumnRawPtrs& raw_ptrs,
|
||||
const std::vector<int>& res_col_ids) {
|
||||
DCHECK_EQ(_build_expr_ctxs.size(), _probe_expr_ctxs.size());
|
||||
_temp_probe_nullable_columns.clear();
|
||||
for (size_t i = 0; i < _build_expr_ctxs.size(); ++i) {
|
||||
if (_is_null_safe_eq_join[i]) {
|
||||
raw_ptrs[i] = block.get_by_position(res_col_ids[i]).column.get();
|
||||
@ -878,6 +880,15 @@ Status HashJoinNode::_extract_join_column(Block& block, ColumnUInt8::MutablePtr&
|
||||
raw_ptrs[i] = &col_nested;
|
||||
}
|
||||
} else {
|
||||
if constexpr (!BuildSide) {
|
||||
if (_join_op == TJoinOp::RIGHT_ANTI_JOIN &&
|
||||
_build_expr_ctxs[i]->root()->is_nullable()) {
|
||||
_temp_probe_nullable_columns.emplace_back(make_nullable(
|
||||
block.get_by_position(res_col_ids[i]).column->assume_mutable()));
|
||||
raw_ptrs[i] = _temp_probe_nullable_columns.back().get();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
raw_ptrs[i] = column;
|
||||
}
|
||||
}
|
||||
|
||||
@ -332,6 +332,10 @@ private:
|
||||
// mark the build hash table whether it needs to store null value
|
||||
std::vector<bool> _store_null_in_hash_table;
|
||||
|
||||
// In right anti join, if the probe side is not nullable and the build side is nullable,
|
||||
// we need to convert the probe column to nullable.
|
||||
std::vector<ColumnPtr> _temp_probe_nullable_columns;
|
||||
|
||||
std::vector<uint16_t> _probe_column_disguise_null;
|
||||
std::vector<uint16_t> _probe_column_convert_to_null;
|
||||
|
||||
|
||||
@ -0,0 +1,128 @@
|
||||
-- This file is automatically generated. You should know what you did if you want to edit this
|
||||
-- !sql1 --
|
||||
1 11 11 \N \N \N
|
||||
2 111 111 2 111 111
|
||||
3 1111 1111 3 1111 1111
|
||||
4 111 111 2 111 111
|
||||
|
||||
-- !sql2 --
|
||||
1 11 11 \N \N \N
|
||||
2 111 111 2 111 111
|
||||
3 1111 1111 3 1111 1111
|
||||
4 111 111 2 111 111
|
||||
|
||||
-- !sql3 --
|
||||
1 11 11 \N \N \N
|
||||
2 111 111 2 111 111
|
||||
3 1111 1111 3 1111 1111
|
||||
4 111 111 2 111 111
|
||||
|
||||
-- !anti_sql4 --
|
||||
1 11 11
|
||||
|
||||
-- !sql5 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
4 111 111
|
||||
|
||||
-- !anti_sql6 --
|
||||
1 11 11
|
||||
|
||||
-- !sql7 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
4 111 111
|
||||
|
||||
-- !anti_sql8 --
|
||||
1 11 11
|
||||
|
||||
-- !sql9 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
4 111 111
|
||||
|
||||
-- !anti_sql10 --
|
||||
1 11 11
|
||||
|
||||
-- !sql11 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
4 111 111
|
||||
|
||||
-- !anti_sql12 --
|
||||
1 11 11
|
||||
|
||||
-- !sql13 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
4 111 111
|
||||
|
||||
-- !anti_sql14 --
|
||||
1 \N \N
|
||||
4 \N \N
|
||||
|
||||
-- !sql15 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
|
||||
-- !anti_sql16 --
|
||||
1 \N \N
|
||||
4 \N \N
|
||||
|
||||
-- !sql17 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
|
||||
-- !anti_sql18 --
|
||||
1 \N \N
|
||||
4 \N \N
|
||||
|
||||
-- !sql19 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
|
||||
-- !anti_sql20 --
|
||||
1 \N \N
|
||||
4 \N \N
|
||||
|
||||
-- !sql21 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
|
||||
-- !anti_sql22 --
|
||||
1 \N \N
|
||||
4 \N \N
|
||||
|
||||
-- !sql23 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
|
||||
-- !anti_sql24 --
|
||||
1 11 11
|
||||
|
||||
-- !sql25 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
4 \N \N
|
||||
5 1111 1111
|
||||
|
||||
-- !anti_sql26 --
|
||||
|
||||
-- !sql27 --
|
||||
1 \N \N
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
4 \N \N
|
||||
|
||||
-- !anti_sql28 --
|
||||
|
||||
-- !sql29 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
|
||||
-- !anti_sql28 --
|
||||
|
||||
-- !sql29 --
|
||||
2 111 111
|
||||
3 1111 1111
|
||||
|
||||
@ -0,0 +1,282 @@
|
||||
// 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_half_join_nullable_build_side", "query,p0") {
|
||||
/// TODO: fix on pipelinex
|
||||
sql " set ENABLE_PIPELINE_X_ENGINE = 0; "
|
||||
sql " set disable_join_reorder = 1; "
|
||||
sql " drop table if exists test_half_join_nullable_build_side_l; ";
|
||||
sql " drop table if exists test_half_join_nullable_build_side_l2; ";
|
||||
sql " drop table if exists test_half_join_nullable_build_side_r; ";
|
||||
sql " drop table if exists test_half_join_nullable_build_side_r2; ";
|
||||
sql """
|
||||
create table test_half_join_nullable_build_side_l (
|
||||
k1 int,
|
||||
v1 string not null,
|
||||
v2 int not null
|
||||
) distributed by hash(k1) buckets 1
|
||||
properties("replication_num" = "1");
|
||||
"""
|
||||
sql """
|
||||
create table test_half_join_nullable_build_side_l2 (
|
||||
k1 int,
|
||||
v1 string null,
|
||||
v2 int null
|
||||
) distributed by hash(k1) buckets 1
|
||||
properties("replication_num" = "1");
|
||||
"""
|
||||
sql """
|
||||
create table test_half_join_nullable_build_side_r (
|
||||
k1 int,
|
||||
v1 string null,
|
||||
v2 string null
|
||||
) distributed by hash(k1) buckets 1
|
||||
properties("replication_num" = "1");
|
||||
"""
|
||||
sql """
|
||||
create table test_half_join_nullable_build_side_r2 (
|
||||
k1 int,
|
||||
v1 string not null,
|
||||
v2 string not null
|
||||
) distributed by hash(k1) buckets 1
|
||||
properties("replication_num" = "1");
|
||||
"""
|
||||
|
||||
sql """ insert into test_half_join_nullable_build_side_l values (1, 11, "11"), (2, 111, "111"), (3, 1111, "1111"), (4, 111, "111") """
|
||||
sql """ insert into test_half_join_nullable_build_side_l2 values (1, 11, "11"), (2, 111, "111"), (3, 1111, "1111"), (4, null, null), (5, 1111, "1111") """
|
||||
sql """ insert into test_half_join_nullable_build_side_r values (1, null, null), (2, 111, "111"), (3, 1111, "1111"), (4, null, null) """
|
||||
sql """ insert into test_half_join_nullable_build_side_r2 values (2, 111, "111"), (3, 1111, "1111") """
|
||||
|
||||
qt_sql1 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left join test_half_join_nullable_build_side_r r on l.v1 = r.v1
|
||||
order by 1, 2, 3, 4, 5, 6;
|
||||
"""
|
||||
|
||||
qt_sql2 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left join test_half_join_nullable_build_side_r r on l.v2 = r.v2
|
||||
order by 1, 2, 3, 4, 5, 6;
|
||||
"""
|
||||
|
||||
qt_sql3 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left join test_half_join_nullable_build_side_r r on l.v1 = r.v1 and l.v2 = r.v2
|
||||
order by 1, 2, 3, 4, 5, 6;
|
||||
"""
|
||||
|
||||
qt_anti_sql4 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left anti join test_half_join_nullable_build_side_r r on l.v1 = r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql5 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left semi join test_half_join_nullable_build_side_r r on l.v1 = r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql6 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left anti join test_half_join_nullable_build_side_r r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql7 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left semi join test_half_join_nullable_build_side_r r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql8 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left anti join test_half_join_nullable_build_side_r r on l.v1 = r.v1 and l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql9 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left semi join test_half_join_nullable_build_side_r r on l.v1 = r.v1 and l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql10 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left anti join test_half_join_nullable_build_side_r r on l.v1 <=> r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql11 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left semi join test_half_join_nullable_build_side_r r on l.v1 <=> r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql12 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left anti join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql13 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l left semi join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
|
||||
|
||||
qt_anti_sql14 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right anti join test_half_join_nullable_build_side_r r on l.v1 = r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql15 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right semi join test_half_join_nullable_build_side_r r on l.v1 = r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql16 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right anti join test_half_join_nullable_build_side_r r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql17 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right semi join test_half_join_nullable_build_side_r r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql18 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right anti join test_half_join_nullable_build_side_r r on l.v1 = r.v1 and l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql19 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right semi join test_half_join_nullable_build_side_r r on l.v1 = r.v1 and l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql20 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right anti join test_half_join_nullable_build_side_r r on l.v1 <=> r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql21 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right semi join test_half_join_nullable_build_side_r r on l.v1 <=> r.v1
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql22 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right anti join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql23 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right semi join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql24 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l2 l left anti join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql25 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l2 l left semi join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql26 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l2 l right anti join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql27 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l2 l right semi join test_half_join_nullable_build_side_r r on l.v2 <=> r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql28 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right anti join test_half_join_nullable_build_side_r2 r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql29 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l l right semi join test_half_join_nullable_build_side_r2 r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_anti_sql28 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l2 l right anti join test_half_join_nullable_build_side_r2 r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
|
||||
qt_sql29 """
|
||||
select *
|
||||
from
|
||||
test_half_join_nullable_build_side_l2 l right semi join test_half_join_nullable_build_side_r2 r on l.v2 = r.v2
|
||||
order by 1, 2, 3;
|
||||
"""
|
||||
}
|
||||
Reference in New Issue
Block a user