This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 6289f7e6059efcbdac3542ee9c103927c51e1957
Author: Qi Chen <[email protected]>
AuthorDate: Sat Feb 3 20:17:24 2024 +0800

    [Fix](multi-catalog) Fix truncate_char_or_varchar_column crash. (#30731)
---
 be/src/vec/exec/scan/vfile_scanner.cpp | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/be/src/vec/exec/scan/vfile_scanner.cpp 
b/be/src/vec/exec/scan/vfile_scanner.cpp
index 2dbef651bf3..76d7bc12ce6 100644
--- a/be/src/vec/exec/scan/vfile_scanner.cpp
+++ b/be/src/vec/exec/scan/vfile_scanner.cpp
@@ -698,6 +698,11 @@ Status 
VFileScanner::_truncate_char_or_varchar_columns(Block* block) {
 void VFileScanner::_truncate_char_or_varchar_column(Block* block, int idx, int 
len) {
     auto int_type = std::make_shared<DataTypeInt32>();
     size_t num_columns_without_result = block->columns();
+    const ColumnNullable* col_nullable =
+            assert_cast<const 
ColumnNullable*>(block->get_by_position(idx).column.get());
+    const ColumnPtr& string_column_ptr = col_nullable->get_nested_column_ptr();
+    ColumnPtr null_map_column_ptr = col_nullable->get_null_map_column_ptr();
+    block->replace_by_position(idx, std::move(string_column_ptr));
     block->insert({int_type->create_column_const(block->rows(), to_field(1)), 
int_type,
                    "const 1"}); // pos is 1
     block->insert({int_type->create_column_const(block->rows(), 
to_field(len)), int_type,
@@ -708,8 +713,11 @@ void VFileScanner::_truncate_char_or_varchar_column(Block* 
block, int idx, int l
     temp_arguments[1] = num_columns_without_result;     // pos
     temp_arguments[2] = num_columns_without_result + 1; // len
     size_t result_column_id = num_columns_without_result + 2;
+
     SubstringUtil::substring_execute(*block, temp_arguments, result_column_id, 
block->rows());
-    block->replace_by_position(idx, 
block->get_by_position(result_column_id).column);
+    auto res = 
ColumnNullable::create(block->get_by_position(result_column_id).column,
+                                      null_map_column_ptr);
+    block->replace_by_position(idx, std::move(res));
     Block::erase_useless_column(block, num_columns_without_result);
 }
 
@@ -1149,4 +1157,4 @@ void VFileScanner::try_stop() {
     }
 }
 
-} // namespace doris::vectorized
\ No newline at end of file
+} // namespace doris::vectorized


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to