Skip to content

Commit fca7aff

Browse files
authored
[fix](olap) A crash caused by an incorrect storage type in the IN predicate (#56309)
### What problem does this PR solve? ``` *** SIGSEGV address not mapped to object (@0x0) received by PID 612357 (TID 618949 OR 0x7bf276d17700) from PID 0; stack trace: *** 0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, siginfo_t*, void*) at /root/doris/be/src/common/signal_handler.h:420 1# 0x00007FFA591F7D10 in /lib64/libpthread.so.0 2# doris::vectorized::PredicateColumnType<(doris::PrimitiveType)15>::get_data() const at /root/doris/be/src/vec/columns/predicate_column.h:395 3# void doris::InListPredicateBase<(doris::PrimitiveType)15, (doris::PredicateType)7, doris::StringSet<doris::FixedContainer<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 2ul> > >::_base_evaluate_bit<true, true, false>(doris::vectorized::IColumn const*, doris::vectorized::PODArray<unsigned char, 4096ul, doris::Allocator<false, false, false, doris::DefaultMemoryAllocator, false>, 16ul, 15ul> const*, unsigned short const*, unsigned short, bool*) const at /root/doris/be/src/olap/in_list_predicate.h:526 4# void doris::InListPredicateBase<(doris::PrimitiveType)15, (doris::PredicateType)7, doris::StringSet<doris::FixedContainer<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 2ul> > >::_evaluate_bit<false>(doris::vectorized::IColumn const&, unsigned short const*, unsigned short, bool*) const at /root/doris/be/src/olap/in_list_predicate.h:249 5# doris::InListPredicateBase<(doris::PrimitiveType)15, (doris::PredicateType)7, doris::StringSet<doris::FixedContainer<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 2ul> > >::evaluate_or(doris::vectorized::IColumn const&, unsigned short const*, unsigned short, bool*) const at /root/doris/be/src/olap/in_list_predicate.h:272 6# doris::SingleColumnBlockPredicate::evaluate_or(std::vector<doris::COW<doris::vectorized::IColumn>::mutable_ptr<doris::vectorized::IColumn>, std::allocator<doris::COW<doris::vectorized::IColumn>::mutable_ptr<doris::vectorized::IColumn> > >&, unsigned short*, unsigned short, bool*) const at /root/doris/be/src/olap/block_column_predicate.cpp:65 7# doris::OrBlockColumnPredicate::evaluate(std::vector<doris::COW<doris::vectorized::IColumn>::mutable_ptr<doris::vectorized::IColumn>, std::allocator<doris::COW<doris::vectorized::IColumn>::mutable_ptr<doris::vectorized::IColumn> > >&, unsigned short*, unsigned short) const at /root/doris/be/src/olap/block_column_predicate.cpp:92 8# doris::AndBlockColumnPredicate::evaluate(std::vector<doris::COW<doris::vectorized::IColumn>::mutable_ptr<doris::vectorized::IColumn>, std::allocator<doris::COW<doris::vectorized::IColumn>::mutable_ptr<doris::vectorized::IColumn> > >&, unsigned short*, unsigned short) const at /root/doris/be/src/olap/block_column_predicate.cpp:133 9# doris::segment_v2::SegmentIterator::_evaluate_short_circuit_predicate(unsigned short*, unsigned short) at /root/doris/be/src/olap/rowset/segment_v2/segment_iterator.cpp:2196 10# doris::segment_v2::SegmentIterator::_next_batch_internal(doris::vectorized::Block*) at /root/doris/be/src/olap/rowset/segment_v2/segment_iterator.cpp:2491 11# doris::segment_v2::SegmentIterator::next_batch(doris::vectorized::Block*)::$_0::operator()() const at /root/doris/be/src/olap/rowset/segment_v2/segment_iterator.cpp:2252 12# doris::segment_v2::SegmentIterator::next_batch(doris::vectorized::Block*) at /root/doris/be/src/olap/rowset/segment_v2/segment_iterator.cpp:2251 13# doris::segment_v2::LazyInitSegmentIterator::next_batch(doris::vectorized::Block*) in /root/doris/be/output/lib/doris_be 14# doris::BetaRowsetReader::next_block(doris::vectorized::Block*) at /root/doris/be/src/olap/rowset/beta_rowset_reader.cpp:348 15# doris::vectorized::VCollectIterator::Level0Iterator::_refresh() in /root/doris/be/output/lib/doris_be 16# doris::vectorized::VCollectIterator::Level0Iterator::refresh_current_row() at /root/doris/be/src/vec/olap/vcollect_iterator.cpp:515 17# doris::vectorized::VCollectIterator::Level0Iterator::ensure_first_row_ref() at /root/doris/be/src/vec/olap/vcollect_iterator.cpp:486 18# doris::vectorized::VCollectIterator::Level1Iterator::ensure_first_row_ref() at /root/doris/be/src/vec/olap/vcollect_iterator.cpp:701 19# doris::vectorized::VCollectIterator::build_heap(std::vector<std::shared_ptr<doris::RowsetReader>, std::allocator<std::shared_ptr<doris::RowsetReader> > >&) at /root/doris/be/src/vec/olap/vcollect_iterator.cpp:189 20# doris::vectorized::BlockReader::_init_collect_iter(doris::TabletReader::ReaderParams const&) at /root/doris/be/src/vec/olap/block_reader.cpp:152 21# doris::vectorized::BlockReader::init(doris::TabletReader::ReaderParams const&) at /root/doris/be/src/vec/olap/block_reader.cpp:226 22# doris::vectorized::OlapScanner::open(doris::RuntimeState*) at /root/doris/be/src/vec/exec/scan/olap_scanner.cpp:271 23# doris::vectorized::ScannerScheduler::_scanner_scan(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>) at /root/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:182 24# doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}::operator()() const::{lambda()#1}::operator()() const at /root/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:96 25# doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}::operator()() const at /root/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:95 26# bool std::__invoke_impl<bool, doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}&>(std::__invoke_other, doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:63 27# std::enable_if<is_invocable_r_v<bool, doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}&>, bool>::type std::__invoke_r<bool, doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}&>(doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:116 28# std::_Function_handler<bool (), doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>, std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const::{lambda()#1}>::_M_invoke(std::_Any_data const&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:292 29# std::function<bool ()>::operator()() const at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:593 30# doris::vectorized::ScannerSplitRunner::process_for(std::chrono::duration<long, std::ratio<1l, 1000000000l> >) at /root/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:410 31# doris::vectorized::PrioritizedSplitRunner::process() at /root/doris/be/src/vec/exec/executor/time_sharing/prioritized_split_runner.cpp:103 32# doris::vectorized::TimeSharingTaskExecutor::_dispatch_thread() at /root/doris/be/src/vec/exec/executor/time_sharing/time_sharing_task_executor.cpp:570 33# void std::__invoke_impl<void, void (doris::vectorized::TimeSharingTaskExecutor::*&)(), doris::vectorized::TimeSharingTaskExecutor*&>(std::__invoke_memfun_deref, void (doris::vectorized::TimeSharingTaskExecutor::*&)(), doris::vectorized::TimeSharingTaskExecutor*&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:76 34# std::__invoke_result<void (doris::vectorized::TimeSharingTaskExecutor::*&)(), doris::vectorized::TimeSharingTaskExecutor*&>::type std::__invoke<void (doris::vectorized::TimeSharingTaskExecutor::*&)(), doris::vectorized::TimeSharingTaskExecutor*&>(void (doris::vectorized::TimeSharingTaskExecutor::*&)(), doris::vectorized::TimeSharingTaskExecutor*&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:98 35# void std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/functional:515 36# void std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()>::operator()<, void>() at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/functional:600 37# void std::__invoke_impl<void, std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()>&>(std::__invoke_other, std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()>&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:63 38# std::enable_if<is_invocable_r_v<void, std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()>&>, void>::type std::__invoke_r<void, std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()>&>(std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()>&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:119 39# std::_Function_handler<void (), std::_Bind<void (doris::vectorized::TimeSharingTaskExecutor::*(doris::vectorized::TimeSharingTaskExecutor*))()> >::_M_invoke(std::_Any_data const&) at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:292 40# std::function<void ()>::operator()() const at /root/ldb_toolchain_taipan/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:593 41# doris::Thread::supervise_thread(void*) at /root/doris/be/src/util/thread.cpp:460 42# asan_thread_start(void*) in /root/doris/be/output/lib/doris_be 43# start_thread in /lib64/libpthread.so.0 44# __GI___clone in /lib64/libc.so.6 ``` Related PR: #xxx Problem Summary: ### Release note None ### Check List (For Author) - Test <!-- At least one of them must be included. --> - [ ] Regression test - [ ] Unit Test - [ ] Manual test (add detailed scripts or steps below) - [ ] No need to test or manual test. Explain why: - [ ] This is a refactor/code format and no logic has been changed. - [ ] Previous test can cover this change. - [ ] No code files have been changed. - [ ] Other reason <!-- Add your reason? --> - Behavior changed: - [ ] No. - [ ] Yes. <!-- Explain the behavior change --> - Does this need documentation? - [ ] No. - [ ] Yes. <!-- Add document PR link here. eg: apache/doris-website#1214 --> ### Check List (For Reviewer who merge this PR) - [ ] Confirm the release note - [ ] Confirm test cases - [ ] Confirm document - [ ] Add branch pick label <!-- Add branch pick label that this PR should merge into -->
1 parent a793b19 commit fca7aff

File tree

6 files changed

+96
-5
lines changed

6 files changed

+96
-5
lines changed

be/src/common/config.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ DEFINE_mInt32(data_page_cache_stale_sweep_time_sec, "300");
423423
DEFINE_mInt32(index_page_cache_stale_sweep_time_sec, "600");
424424
DEFINE_mInt32(pk_index_page_cache_stale_sweep_time_sec, "600");
425425

426-
DEFINE_Bool(enable_low_cardinality_optimize, "true");
426+
DEFINE_mBool(enable_low_cardinality_optimize, "true");
427427
DEFINE_Bool(enable_low_cardinality_cache_code, "true");
428428

429429
// be policy

be/src/common/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ DECLARE_mInt32(index_page_cache_stale_sweep_time_sec);
457457
// great impact on the performance of MOW, so it can be longer.
458458
DECLARE_mInt32(pk_index_page_cache_stale_sweep_time_sec);
459459

460-
DECLARE_Bool(enable_low_cardinality_optimize);
460+
DECLARE_mBool(enable_low_cardinality_optimize);
461461
DECLARE_Bool(enable_low_cardinality_cache_code);
462462

463463
// be policy

be/src/olap/in_list_predicate.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <cstdint>
2121
#include <roaring/roaring.hh>
2222

23+
#include "common/exception.h"
2324
#include "decimal12.h"
2425
#include "exprs/hybrid_set.h"
2526
#include "olap/column_predicate.h"
@@ -526,6 +527,11 @@ class InListPredicateBase : public ColumnPredicate {
526527
} else {
527528
auto* nested_col_ptr = vectorized::check_and_get_column<
528529
vectorized::PredicateColumnType<PredicateEvaluateType<Type>>>(column);
530+
if (nested_col_ptr == nullptr) {
531+
throw Exception(ErrorCode::INTERNAL_ERROR,
532+
"InListPredicateBase: _base_evaluate_bit get invalid column type");
533+
}
534+
529535
auto& data_array = nested_col_ptr->get_data();
530536

531537
for (uint16_t i = 0; i < size; i++) {

be/src/olap/rowset/segment_v2/segment_iterator.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,9 +1890,10 @@ void SegmentIterator::_vec_init_char_column_id(vectorized::Block* block) {
18901890
if (_has_char_type(*column_desc)) {
18911891
_char_type_idx.emplace_back(i);
18921892
}
1893-
if (column_desc->type() == FieldType::OLAP_FIELD_TYPE_CHAR) {
1894-
_is_char_type[cid] = true;
1895-
}
1893+
}
1894+
1895+
if (column_desc->type() == FieldType::OLAP_FIELD_TYPE_CHAR) {
1896+
_is_char_type[cid] = true;
18961897
}
18971898
}
18981899
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-- This file is automatically generated. You should know what you did if you want to edit this
2+
-- !select --
3+
5
4+
5+
-- !select1 --
6+
3
7+
8+
-- !select2 --
9+
a
10+
c
11+
i
12+
13+
-- !select3 --
14+
a
15+
c
16+
i
17+
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
suite("test_in_no_concurrent", "nonConcurrent") {
19+
20+
sql "DROP TABLE IF EXISTS `test_in_no_concurrent_tbl`"
21+
sql """
22+
CREATE TABLE `test_in_no_concurrent_tbl` (
23+
`id` int NULL,
24+
`c1` char(10) NULL,
25+
`c2` char(20) NULL
26+
) ENGINE=OLAP
27+
DUPLICATE KEY(`id`, `c1`, `c2`)
28+
DISTRIBUTED BY RANDOM BUCKETS AUTO
29+
PROPERTIES (
30+
"replication_allocation" = "tag.location.default: 1",
31+
"disable_auto_compaction" = "true"
32+
);
33+
"""
34+
35+
sql """
36+
insert into `test_in_no_concurrent_tbl` values
37+
(1, 'a', 'b'),
38+
(2, 'c', 'd'),
39+
(3, 'e', 'f'),
40+
(4, 'g', 'h'),
41+
(5, 'i', 'j');
42+
"""
43+
44+
qt_select """
45+
select count(*) from `test_in_no_concurrent_tbl`;
46+
"""
47+
48+
sql """
49+
delete from `test_in_no_concurrent_tbl` where id > 1 and c2 in ('h', 'f');
50+
"""
51+
52+
set_be_param("enable_low_cardinality_optimize", "false");
53+
54+
qt_select1 """
55+
select count(*) from `test_in_no_concurrent_tbl`;
56+
"""
57+
58+
qt_select2 """
59+
select c1 from `test_in_no_concurrent_tbl` order by 1;
60+
"""
61+
62+
set_be_param("enable_low_cardinality_optimize", "true");
63+
64+
qt_select3 """
65+
select c1 from `test_in_no_concurrent_tbl` order by 1;
66+
"""
67+
}

0 commit comments

Comments
 (0)