Mryange opened a new pull request, #50851:
URL: https://github.com/apache/doris/pull/50851

   ### What problem does this PR solve?
   
   ```
   select cast('{"a":1,"b":"1","c":"1","d":"1"}' as struct<a:int, b:int>);
   
   ==3393513==ERROR: AddressSanitizer: heap-buffer-overflow on address 
0x506001118e20 at pc 0x55808f91364a bp 0x7f9ec8816af0 sp 0x7f9ec8816ae8
   READ of size 8 at 0x506001118e20 thread T1298 (brpc_light)
       #0 0x55808f913649 in std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char>>::_M_data() const 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/basic_string.h:223:28
       #1 0x55808f9386f6 in std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char>>::data() const 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/basic_string.h:2597:16
       #2 0x55808fc4e57a in 
doris::Slice::Slice(std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char>> const&) 
/mnt/disk12/yanxuecheng/doris/be/src/util/slice.h:72:40
       #3 0x5580bebb7ed9 in 
doris::vectorized::DataTypeStructSerDe::deserialize_one_cell_from_json(doris::vectorized::IColumn&,
 doris::Slice&, doris::vectorized::DataTypeSerDe::FormatOptions const&) const 
/mnt/disk12/yanxuecheng/doris/be/src/vec/data_types/serde/data_type_struct_serde.cpp:141:17
       #4 0x5580c90cf235 in 
doris::vectorized::ConvertImplGenericFromString::execute(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long) 
/mnt/disk12/yanxuecheng/doris/be/src/vec/functions/function_cast.h:513:36
       #5 0x5580c89607e6 in doris::Status std::__invoke_impl<doris::Status, 
doris::Status (*&)(doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long), doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned long, 
unsigned long>(std::__invoke_other, doris::Status (*&)(doris::FunctionContext*, 
doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long), doris::FunctionContext*&&, 
doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned long&&, unsigned long&&) 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:61:14
       #6 0x5580c89605ca in std::enable_if<is_invocable_r_v<doris::Status, 
doris::Status (*&)(doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long), doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned long, 
unsigned long>, doris::Status>::type std::__invoke_r<doris::Status, 
doris::Status (*&)(doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long), doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned long, 
unsigned long>(doris::Status (*&)(doris::FunctionContext*, 
doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long), doris::FunctionContext*&&, 
doris::vectorized::Block&, std::vector<unsigned int, std
 ::allocator<unsigned int>> const&, unsigned long&&, unsigned long&&) 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:114:9
       #7 0x5580c8960201 in std::_Function_handler<doris::Status 
(doris::FunctionContext*, doris::vectorized::Block&, std::vector<unsigned int, 
std::allocator<unsigned int>> const&, unsigned long, unsigned long), 
doris::Status (*)(doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long)>::_M_invoke(std::_Any_data const&, doris::FunctionContext*&&, 
doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned long&&, unsigned long&&) 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_function.h:290:9
       #8 0x5580c827ff5c in std::function<doris::Status 
(doris::FunctionContext*, doris::vectorized::Block&, std::vector<unsigned int, 
std::allocator<unsigned int>> const&, unsigned long, unsigned 
long)>::operator()(doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned long, 
unsigned long) const 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_function.h:591:9
       #9 0x5580c88fb7a7 in 
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 int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long)::operator()(doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long) const 
/mnt/disk12/yanxuecheng/doris/be/src/vec/functions/function_cast.h:2148:17
       #10 0x5580c88fae32 in doris::Status std::__invoke_impl<doris::Status, 
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 int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long)&, doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned long, 
unsigned long>(std::__invoke_other, 
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 int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long)&, doris::Funct
 ionContext*&&, doris::vectorized::Block&, std::vector<unsigned int, 
std::allocator<unsigned int>> const&, unsigned long&&, unsigned long&&) 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:61:14
       #11 0x5580c88fac0a in std::enable_if<is_invocable_r_v<doris::Status, 
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 int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long)&, doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned long, 
unsigned long>, doris::Status>::type std::__invoke_r<doris::Status, 
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 int, std::allocator<unsigned int>> const&, unsigned int
 , unsigned long)&, doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> 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 int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long)&, doris::FunctionContext*&&, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned 
long&&, unsigned long&&) 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:114:9
       #12 0x5580c88fa641 in std::_Function_handler<doris::Status 
(doris::FunctionContext*, doris::vectorized::Block&, std::vector<unsigned int, 
std::allocator<unsigned int>> 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 int, std::allocator<unsigned int>> const&, unsigned int, 
unsigned long)>::_M_invoke(std::_Any_data const&, doris::FunctionContext*&&, 
doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned long&&, unsigned long&&) 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_function.h:290:9
       #13 0x5580c827ff5c in std::function<doris::Status 
(doris::FunctionContext*, doris::vectorized::Block&, std::vector<unsigned int, 
std::allocator<unsigned int>> const&, unsigned long, unsigned 
long)>::operator()(doris::FunctionContext*, doris::vectorized::Block&, 
std::vector<unsigned int, std::allocator<unsigned int>> const&, unsigned long, 
unsigned long) const 
/mnt/disk6/common/ldb_toolchain_robin/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_function.h:591:9
      
   ```
   
   now
   ```
   mysql> select cast('{"a":1,"b":"1","c":"1","d":"1"}' as struct<a:int, 
b:int>);
   +-----------------------------------------------------------------+
   | cast('{"a":1,"b":"1","c":"1","d":"1"}' as struct<a:int, b:int>) |
   +-----------------------------------------------------------------+
   | NULL                                                            |
   +-----------------------------------------------------------------+
   
   ```
   ### 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: 
https://github.com/apache/doris-website/pull/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 -->
   
   


-- 
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]

Reply via email to