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

lihaopeng pushed a commit to branch vectorized
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git

commit 5f52c04d62be933c6b1f377db862989a19574778
Author: HappenLee <happen...@hotmail.com>
AuthorDate: Tue Jan 4 06:45:32 2022 -0600

    [Bug] Fix bug of concat function and fold const expr (#7608)
    
    Co-authored-by: lihaopeng <lihaop...@baidu.com>
---
 be/src/exec/exec_node.cpp                 |  2 +-
 be/src/runtime/fold_constant_executor.cpp | 10 +++++++---
 be/src/runtime/fold_constant_executor.h   |  2 +-
 be/src/vec/exec/join/vhash_join_node.cpp  |  9 ++++-----
 be/src/vec/exec/vcross_join_node.cpp      |  1 -
 be/src/vec/functions/function_string.h    | 20 ++++----------------
 6 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/be/src/exec/exec_node.cpp b/be/src/exec/exec_node.cpp
index b18160e..4582f89 100644
--- a/be/src/exec/exec_node.cpp
+++ b/be/src/exec/exec_node.cpp
@@ -756,7 +756,7 @@ void ExecNode::reached_limit(vectorized::Block* block, 
bool* eos) {
     }
 
     _num_rows_returned += block->rows();
-    if (*eos) COUNTER_SET(_rows_returned_counter, _num_rows_returned);
+    COUNTER_SET(_rows_returned_counter, _num_rows_returned);
 }
 
 /*
diff --git a/be/src/runtime/fold_constant_executor.cpp 
b/be/src/runtime/fold_constant_executor.cpp
index cd6d5ff..9781c2f 100644
--- a/be/src/runtime/fold_constant_executor.cpp
+++ b/be/src/runtime/fold_constant_executor.cpp
@@ -82,7 +82,7 @@ Status FoldConstantExecutor::fold_constant_expr(
                 expr_result.set_success(false);
             } else {
                 expr_result.set_success(true);
-                result = _get_result(src, ctx->root()->type().type);
+                result = _get_result(src, 0, ctx->root()->type().type);
             }
 
             expr_result.set_content(std::move(result));
@@ -143,7 +143,8 @@ Status FoldConstantExecutor::fold_constant_vexpr(
                 expr_result.set_success(false);
             } else {
                 expr_result.set_success(true);
-                result = _get_result<true>((void *) 
column_ptr->get_data_at(0).data, ctx->root()->type().type);
+                auto string_ref = column_ptr->get_data_at(0);
+                result = _get_result<true>((void*)string_ref.data, 
string_ref.size, ctx->root()->type().type);
             }
 
             expr_result.set_content(std::move(result));
@@ -198,7 +199,7 @@ Status FoldConstantExecutor::_prepare_and_open(Context* 
ctx) {
 }
 
 template <bool is_vec>
-string FoldConstantExecutor::_get_result(void* src, PrimitiveType slot_type){
+string FoldConstantExecutor::_get_result(void* src, size_t size, PrimitiveType 
slot_type){
     switch (slot_type) {
     case TYPE_BOOLEAN: {
         bool val = *reinterpret_cast<const bool*>(src);
@@ -237,6 +238,9 @@ string FoldConstantExecutor::_get_result(void* src, 
PrimitiveType slot_type){
     case TYPE_STRING:
     case TYPE_HLL:
     case TYPE_OBJECT: {
+        if constexpr (is_vec) {
+            return std::string((char*)src, size);
+        }
         return (reinterpret_cast<StringValue*>(src))->to_string();
     }
     case TYPE_DATE:
diff --git a/be/src/runtime/fold_constant_executor.h 
b/be/src/runtime/fold_constant_executor.h
index c7c5a38..84c52f7 100644
--- a/be/src/runtime/fold_constant_executor.h
+++ b/be/src/runtime/fold_constant_executor.h
@@ -47,7 +47,7 @@ private:
     Status _prepare_and_open(Context* ctx);
 
     template <bool is_vec = false>
-    std::string _get_result(void* src, PrimitiveType slot_type);
+    std::string _get_result(void* src, size_t size, PrimitiveType slot_type);
 
     std::unique_ptr<RuntimeState> _runtime_state;
     std::shared_ptr<MemTracker> _mem_tracker;
diff --git a/be/src/vec/exec/join/vhash_join_node.cpp 
b/be/src/vec/exec/join/vhash_join_node.cpp
index 62dfffa..7606783 100644
--- a/be/src/vec/exec/join/vhash_join_node.cpp
+++ b/be/src/vec/exec/join/vhash_join_node.cpp
@@ -124,7 +124,7 @@ struct ProcessRuntimeFilterBuild {
     ProcessRuntimeFilterBuild(HashJoinNode* join_node) : _join_node(join_node) 
{}
 
     Status operator()(RuntimeState* state, HashTableContext& hash_table_ctx) {
-        if (_join_node->_runtime_filter_descs.empty() || 
_join_node->_inserted_rows.empty()) {
+        if (_join_node->_runtime_filter_descs.empty()) {
             return Status::OK();
         }
         VRuntimeFilterSlots* runtime_filter_slots =
@@ -162,7 +162,6 @@ struct ProcessHashTableProbe {
               _probe_block(join_node->_probe_block),
               _probe_index(join_node->_probe_index),
               _probe_raw_ptrs(join_node->_probe_columns),
-              _arena(join_node->_arena),
               _rows_returned_counter(join_node->_rows_returned_counter) {}
 
     // Only process the join with no other join conjunt, because of no other 
join conjunt
@@ -198,7 +197,7 @@ struct ProcessHashTableProbe {
                                                            _arena)) {nullptr, 
false}
                             : key_getter.find_key(hash_table_ctx.hash_table, 
_probe_index, _arena);
 
-            if (_probe_index + 4 < _probe_rows)
+            if (_probe_index + 2 < _probe_rows)
                 key_getter.prefetch(hash_table_ctx.hash_table, _probe_index + 
2, _arena);
 
             if (find_result.is_found()) {
@@ -218,7 +217,7 @@ struct ProcessHashTableProbe {
                         if (!_join_node->_is_right_semi_anti) {
                             ++current_offset;
                             for (size_t j = 0; j < right_col_len; ++j) {
-                                auto &column = 
*mapped.block->get_by_position(j).column;
+                                auto& column = 
*mapped.block->get_by_position(j).column;
                                 mcol[j + right_col_idx]->insert_from(column, 
mapped.row_num);
                             }
                         }
@@ -515,7 +514,7 @@ private:
     const Block& _probe_block;
     int& _probe_index;
     ColumnRawPtrs& _probe_raw_ptrs;
-    Arena& _arena;
+    Arena _arena;
 
     ProfileCounter* _rows_returned_counter;
 };
diff --git a/be/src/vec/exec/vcross_join_node.cpp 
b/be/src/vec/exec/vcross_join_node.cpp
index 7a5086e..6d48527 100644
--- a/be/src/vec/exec/vcross_join_node.cpp
+++ b/be/src/vec/exec/vcross_join_node.cpp
@@ -135,7 +135,6 @@ Status VCrossJoinNode::get_next(RuntimeState* state, Block* 
block, bool* eos) {
         }
     }
     dst_columns.clear();
-
     RETURN_IF_ERROR(VExprContext::filter_block(_vconjunct_ctx_ptr, block, 
block->columns()));
 
     reached_limit(block, eos);
diff --git a/be/src/vec/functions/function_string.h 
b/be/src/vec/functions/function_string.h
index 2893fe1..efeef41 100644
--- a/be/src/vec/functions/function_string.h
+++ b/be/src/vec/functions/function_string.h
@@ -326,9 +326,9 @@ public:
     bool is_variadic() const override { return true; }
 
     DataTypePtr get_return_type_impl(const DataTypes& arguments) const 
override {
-        return make_nullable(std::make_shared<DataTypeString>());
+        return std::make_shared<DataTypeString>();
     }
-    bool use_default_implementation_for_nulls() const override { return false; 
}
+    bool use_default_implementation_for_nulls() const override { return true; }
     bool use_default_implementation_for_constants() const override { return 
true; }
 
     Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
@@ -336,16 +336,10 @@ public:
         DCHECK_GE(arguments.size(), 1);
 
         if (arguments.size() == 1) {
-            if (block.get_by_position(arguments[0]).column->is_nullable()) {
-                block.get_by_position(result).column = 
block.get_by_position(arguments[0]).column;
-            } else {
-                block.get_by_position(result).column =
-                        
make_nullable(block.get_by_position(arguments[0]).column);
-            }
+            block.get_by_position(result).column = 
block.get_by_position(arguments[0]).column;
             return Status::OK();
         }
 
-        auto null_map = ColumnUInt8::create(input_rows_count, 0);
         int argument_size = arguments.size();
         ColumnPtr argument_columns[argument_size];
 
@@ -355,11 +349,6 @@ public:
         for (int i = 0; i < argument_size; ++i) {
             argument_columns[i] =
                     
block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
-            if (auto* nullable = check_and_get_column<const 
ColumnNullable>(*argument_columns[i])) {
-                argument_columns[i] = nullable->get_nested_column_ptr();
-                VectorizedUtils::update_null_map(null_map->get_data(),
-                                                 
nullable->get_null_map_data());
-            }
             auto col_str = assert_cast<const 
ColumnString*>(argument_columns[i].get());
             offsets_list[i] = &col_str->get_offsets();
             chars_list[i] = &col_str->get_chars();
@@ -401,8 +390,7 @@ public:
             res_offset[i] = res_offset[i - 1] + current_length;
         }
 
-        block.get_by_position(result).column =
-                ColumnNullable::create(std::move(res), std::move(null_map));
+        block.get_by_position(result).column = std::move(res);
         return Status::OK();
     }
 };

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to