jacktengg opened a new pull request, #26822: URL: https://github.com/apache/doris/pull/26822
## 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 [d...@doris.apache.org](mailto:d...@doris.apache.org) 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: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org