HappenLee commented on code in PR #64010:
URL: https://github.com/apache/doris/pull/64010#discussion_r3377696344


##########
be/src/storage/segment/segment_iterator.cpp:
##########
@@ -3576,44 +3479,48 @@ void SegmentIterator::_init_virtual_columns(Block* 
block) {
 Status SegmentIterator::_materialization_of_virtual_column(Block* block) {
     // Some expr can not process empty block, such as function `element_at`.
     // So materialize virtual column in advance to avoid errors.
-    if (block->rows() == 0) {
+    if (_selected_size == 0) {
         for (const auto& pair : _vir_cid_to_idx_in_block) {
             auto& col_with_type_and_name = block->get_by_position(pair.second);
             col_with_type_and_name.column = 
_opts.vir_col_idx_to_type[pair.second]->create_column();
             col_with_type_and_name.type = 
_opts.vir_col_idx_to_type[pair.second];
         }
         return Status::OK();
     }
+    if (_virtual_column_exprs.empty()) {
+        return Status::OK();
+    }
 
+    Block project_block;
+    Block* materialize_block = _build_project_block(block, &project_block);
+    const bool materialize_on_project_block = _project_schema != _schema;
     for (const auto& cid_and_expr : _virtual_column_exprs) {
         auto cid = cid_and_expr.first;
         auto column_expr = cid_and_expr.second;
-        size_t idx_in_block = _vir_cid_to_idx_in_block[cid];
-        if (block->columns() <= idx_in_block) {
-            return Status::InternalError(
-                    "Virtual column index {} is out of range, block columns 
{}, "
-                    "virtual columns size {}, virtual column expr {}",
-                    idx_in_block, block->columns(), 
_vir_cid_to_idx_in_block.size(),
-                    column_expr->root()->debug_string());
-        } else if (block->get_by_position(idx_in_block).column.get() == 
nullptr) {
-            return Status::InternalError(
-                    "Virtual column index {} is null, block columns {}, 
virtual columns size {}, "
-                    "virtual column expr {}",
-                    idx_in_block, block->columns(), 
_vir_cid_to_idx_in_block.size(),
-                    column_expr->root()->debug_string());
-        }
-        if (check_and_get_column<const ColumnNothing>(
-                    block->get_by_position(idx_in_block).column.get())) {
+        auto materialized_pos = materialize_on_project_block ? 
_vir_cid_to_idx_in_block.at(cid)
+                                                             : 
_schema_block_id_map[cid];
+        auto& column = 
materialize_block->get_by_position(materialized_pos).column;
+        if (check_and_get_column<const ColumnNothing>(column.get())) {
             VLOG_DEBUG << fmt::format("Virtual column is doing 
materialization, cid {}, col idx {}",
-                                      cid, idx_in_block);
+                                      cid, materialized_pos);
             ColumnPtr result_column;
-            RETURN_IF_ERROR(column_expr->execute(block, result_column));
+            Status st;
+            RETURN_IF_CATCH_EXCEPTION({
+                st = column_expr->root()->execute_column(column_expr.get(), 
materialize_block,
+                                                         nullptr, 
_selected_size, result_column);
+            });
+            RETURN_IF_ERROR(st);
 
-            block->replace_by_position(idx_in_block, std::move(result_column));
-            if (block->get_by_position(idx_in_block).column->size() == 0) {
-                LOG_WARNING("Result of expr column {} is empty. cid {}, 
idx_in_block {}",
-                            column_expr->root()->debug_string(), cid, 
idx_in_block);
-            }
+            materialize_block->replace_by_position(materialized_pos, 
std::move(result_column));
+        }
+    }
+    if (materialize_block != block) {

Review Comment:
   你这不是直接用materialize_on_project_block 不就行了吗?囧



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