jacktengg opened a new pull request, #26792:
URL: https://github.com/apache/doris/pull/26792
## Proposed changes
Issue Number: close #xxx
For sql `select cast('0.00164999999999998' as decimalv3(9,0)); ` be will
coredump:
```
INFO: java_cmd /mnt/disk2/tengjianping/local/jdk1.8.0_131/bin/java
INFO: jdk_version 8
*** Query id: 1140fbeb086a499c-85d388ee84060c3f ***
*** tablet id: 0 ***
*** Aborted at 1699611007 (unix time) try "date -d @1699611007" if you are
using GNU date ***
*** Current BE git commitID: ad4bb1671b ***
*** SIGFPE integer divide by zero (@0x55d7f737ee73) received by PID 88254
(TID 88575 OR 0x7e9440102700) from PID 18446744073562222195; stack trace: ***
0# doris::signal::(anonymous namespace)::FailureSignalHandler(int,
siginfo_t*, void*) at
/mnt/disk2/tengjianping/doris-38/be/src/common/signal_handler.h:417
1# 0x00007FC6FB405400 in /lib64/libc.so.6
2# int doris::StringParser::string_to_decimal<(doris::PrimitiveType)28,
int>(char const*, int, int, int, doris::StringParser::ParseResult*) at
/mnt/disk2/tengjianping/doris-38/be/src/util/string_parser.hpp:807
3# doris::Status
doris::vectorized::ConvertThroughParsing<doris::vectorized::DataTypeString,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> >,
doris::vectorized::NameCast>::execute<doris::vectorized::PrecisionScaleArg>(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long, bool,
doris::vectorized::PrecisionScaleArg) at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function_cast.h:1396
4# bool
doris::vectorized::FunctionCast::create_decimal_wrapper<doris::vectorized::Decimal<int>
>(std::shared_ptr<doris::vectorized::IDataType const> const&,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> > const*)
const::{lambda(doris::FunctionContext*, doris::vectorized::Block&,
std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned
long, unsigned long)#1}::operator()(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long) const::{lambda(auto:1
const&)#1}::operator()<doris::vectorized::TypePair<doris::vectorized::DataTypeString,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> > >
>(doris::vectorized::TypePair<doris::vectorized::DataTypeString,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> > > const&)
const at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function_cast.h:1639
5# bool
doris::vectorized::call_on_index_and_data_type<doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int>
>,
doris::vectorized::FunctionCast::create_decimal_wrapper<doris::vectorized::Decimal<int>
>(std::shared_ptr<doris::vectorized::IDataType const> const&,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> > const*)
const::{lambda(doris::FunctionContext*, doris::vectorized::Block&,
std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned
long, unsigned long)#1}::operator()(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long) const::{lambda(auto:1
const&)#1}>(doris::vectorized::TypeIndex,
doris::vectorized::FunctionCast::create_decimal_wrapper<doris::vectorized::Decimal<int>
>(std::shared_ptr<doris::vectorized::IDataType const> const&,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> > const*)
const::{lambda(doris::F
unctionContext*, doris::vectorized::Block&, std::vector<unsigned long,
std::allocator<unsigned long> > const&, unsigned long, unsigned
long)#1}::operator()(doris::FunctionContext*, doris::vectorized::Block&,
std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned
long, unsigned long) const::{lambda(auto:1 const&)#1}&&) in
/mnt/disk2/tengjianping/doris-38/output/be/lib/doris_be
6#
doris::vectorized::FunctionCast::create_decimal_wrapper<doris::vectorized::Decimal<int>
>(std::shared_ptr<doris::vectorized::IDataType const> const&,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> > const*)
const::{lambda(doris::FunctionContext*, doris::vectorized::Block&,
std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned
long, unsigned long)#1}::operator()(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long) const at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function_cast.h:1650
7# std::_Function_handler<doris::Status (doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long),
doris::vectorized::FunctionCast::create_decimal_wrapper<doris::vectorized::Decimal<int>
>(std::shared_ptr<doris::vectorized::IDataType const> const&,
doris::vectorized::DataTypeDecimal<doris::vectorized::Decimal<int> > const*)
const::{lambda(doris::FunctionContext*, doris::vectorized::Block&,
std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned
long, unsigned long)#1}>::_M_invoke(std::_Any_data const&,
doris::FunctionContext*&&, doris::vectorized::Block&, std::vector<unsigned
long, std::allocator<unsigned long> > const&, unsigned long&&, unsigned long&&)
at
/mnt/disk2/tengjianping/local/ldb_toolchain/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291
8#
doris::vectorized::FunctionCast::prepare_remove_nullable(doris::FunctionContext*,
std::shared_ptr<doris::vectorized::IDataType const> const&,
std::shared_ptr<doris::vectorized::IDataType const> const&, bool)
const::{lambda(doris::FunctionContext*, doris::vectorized::Block&,
std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned
long, unsigned long)#1}::operator()(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long) const at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function_cast.h:2051
9# std::_Function_handler<doris::Status (doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long),
doris::vectorized::FunctionCast::prepare_remove_nullable(doris::FunctionContext*,
std::shared_ptr<doris::vectorized::IDataType const> const&,
std::shared_ptr<doris::vectorized::IDataType const> const&, bool)
const::{lambda(doris::FunctionContext*, doris::vectorized::Block&,
std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned
long, unsigned long)#1}>::_M_invoke(std::_Any_data const&,
doris::FunctionContext*&&, doris::vectorized::Block&, std::vector<unsigned
long, std::allocator<unsigned long> > const&, unsigned long&&, unsigned long&&)
at
/mnt/disk2/tengjianping/local/ldb_toolchain/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291
10#
doris::vectorized::PreparedFunctionCast::execute_impl(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long) at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function_cast.h:1315
11#
doris::vectorized::PreparedFunctionImpl::default_implementation_for_constant_arguments(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long, bool, bool*) at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function.cpp:201
12#
doris::vectorized::PreparedFunctionImpl::execute_without_low_cardinality_columns(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long, bool) in
/mnt/disk2/tengjianping/doris-38/output/be/lib/doris_be
13#
doris::vectorized::PreparedFunctionImpl::execute(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long, bool) at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function.cpp:268
14# doris::vectorized::IFunctionBase::execute(doris::FunctionContext*,
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned
long> > const&, unsigned long, unsigned long, bool) at
/mnt/disk2/tengjianping/doris-38/be/src/vec/functions/function.h:177
15# doris::vectorized::VCastExpr::execute(doris::vectorized::VExprContext*,
doris::vectorized::Block*, int*) at
/mnt/disk2/tengjianping/doris-38/be/src/vec/exprs/vcast_expr.cpp:110
16# doris::vectorized::VExprContext::execute(doris::vectorized::Block*,
int*) at /mnt/disk2/tengjianping/doris-38/be/src/vec/exprs/vexpr_context.cpp:60
17# doris::vectorized::VUnionNode::get_next_const(doris::RuntimeState*,
doris::vectorized::Block*) at
/mnt/disk2/tengjianping/doris-38/be/src/vec/exec/vunion_node.cpp:226
18# doris::vectorized::VUnionNode::get_next(doris::RuntimeState*,
doris::vectorized::Block*, bool*) in
/mnt/disk2/tengjianping/doris-38/output/be/lib/doris_be
19# doris::ExecNode::pull(doris::RuntimeState*, doris::vectorized::Block*,
bool*) at /mnt/disk2/tengjianping/doris-38/be/src/exec/exec_node.h:127
20# std::_Function_handler<doris::Status (doris::RuntimeState*,
doris::vectorized::Block*, bool*), std::_Bind<doris::Status
(doris::ExecNode::*(doris::vectorized::VUnionNode*, std::_Placeholder<1>,
std::_Placeholder<2>, std::_Placeholder<3>))(doris::RuntimeState*,
doris::vectorized::Block*, bool*)> >::_M_invoke(std::_Any_data const&,
doris::RuntimeState*&&, doris::vectorized::Block*&&, bool*&&) at
/mnt/disk2/tengjianping/local/ldb_toolchain/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291
21# doris::ExecNode::get_next_after_projects(doris::RuntimeState*,
doris::vectorized::Block*, bool*, std::function<doris::Status
(doris::RuntimeState*, doris::vectorized::Block*, bool*)> const&, bool) at
/mnt/disk2/tengjianping/doris-38/be/src/exec/exec_node.cpp:596
22#
doris::pipeline::SourceOperator<doris::pipeline::ConstValueOperatorBuilder>::get_block(doris::RuntimeState*,
doris::vectorized::Block*, doris::pipeline::SourceState&) at
/mnt/disk2/tengjianping/doris-38/be/src/pipeline/exec/operator.h:413
23# doris::pipeline::PipelineTask::execute(bool*) at
/mnt/disk2/tengjianping/doris-38/be/src/pipeline/pipeline_task.cpp:259
24# doris::pipeline::TaskScheduler::_do_work(unsigned long) at
/mnt/disk2/tengjianping/doris-38/be/src/pipeline/task_scheduler.cpp:266
```
The reason is that function `common::exp10_i32` called by
`get_scale_multiplier<int>(11)` will read out-of-range of the `exp_table`
array, which result in Undefined Behaviour, and the `if (LIKELY(divisor > 0))`
statement if false positive.
## Further comments
If this is a relatively large or complex change, kick off the discussion at
[[email protected]](mailto:[email protected]) by explaining why you
chose the solution you did and what alternatives you considered, etc...
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]