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


##########
be/src/exprs/lambda_function/varray_map_function.cpp:
##########
@@ -309,70 +345,124 @@ class ArrayMapFunction : public LambdaFunction {
                 result_column = ColumnNullable::create(
                         
ColumnArray::create(ColumnNullable::create(std::move(result_col),
                                                                    
std::move(nested_null_map)),
-                                            array_column_offset),
+                                            std::move(array_column_offset)),
                         std::move(outside_null_map));
             }
         } else {
             if (res_type->is_nullable()) {
-                result_column = ColumnArray::create(std::move(result_col), 
array_column_offset);
+                result_column =
+                        ColumnArray::create(std::move(result_col), 
std::move(array_column_offset));
             } else {
                 auto nested_null_map = ColumnUInt8::create(result_col->size(), 
0);
 
                 result_column = ColumnArray::create(
                         ColumnNullable::create(std::move(result_col), 
std::move(nested_null_map)),
-                        array_column_offset);
+                        std::move(array_column_offset));
             }
         }
         return Status::OK();
     }
 
 private:
-    bool _contains_column_id(const std::vector<int>& output_slot_ref_indexs, 
int id) const {
-        const auto it = std::find(output_slot_ref_indexs.begin(), 
output_slot_ref_indexs.end(), id);
-        return it != output_slot_ref_indexs.end();
+    struct LambdaArgumentBinding {
+        bool bind_by_name = true;
+        size_t argument_size = 0;
+        std::vector<std::string> names;
+    };
+
+    Status _prepare_lambda_argument_binding(const VExprSPtr& expr, size_t 
expected_argument_size,
+                                            LambdaArgumentBinding& 
argument_binding) const {
+        DORIS_CHECK_EQ(expr->node_type(), TExprNodeType::LAMBDA_FUNCTION_EXPR);
+        const auto* lambda_expr = assert_cast<const 
VLambdaFunctionExpr*>(expr.get());
+
+        argument_binding.argument_size = 0;
+        argument_binding.names.clear();
+        argument_binding.bind_by_name = lambda_expr->has_argument_names();
+
+        if (!argument_binding.bind_by_name) {
+            if (_contains_nested_lambda_call(expr->get_child(0))) {
+                return Status::InternalError(
+                        "Cannot resolve nested lambda argument without lambda 
metadata");
+            }
+            argument_binding.argument_size = expected_argument_size;
+            argument_binding.names.resize(expected_argument_size);
+            return Status::OK();
+        }
+
+        argument_binding.names = lambda_expr->argument_names();
+        if (argument_binding.names.size() > expected_argument_size) {
+            return Status::InternalError(
+                    "lambda argument metadata size exceeds parameter size, 
maximum={}, actual={}",
+                    expected_argument_size, argument_binding.names.size());
+        }
+        argument_binding.argument_size = argument_binding.names.size();
+        if (std::ranges::any_of(argument_binding.names,
+                                [](const auto& argument_name) { return 
argument_name.empty(); })) {
+            return Status::InternalError("lambda argument metadata contains 
empty name");
+        }
+        return Status::OK();
     }
 
-    void _set_column_ref_column_id(VExprSPtr expr, int gap) const {
-        for (const auto& child : expr->children()) {
-            if (child->is_column_ref()) {
-                auto* ref = static_cast<VColumnRef*>(child.get());
-                ref->set_gap(gap);
-            } else {
-                _set_column_ref_column_id(child, gap);
+    Status _set_legacy_lambda_argument_gap(const VExprSPtr& expr, int 
lambda_argument_base,
+                                           size_t argument_size) const {
+        if (expr->is_column_ref()) {
+            auto* ref = static_cast<VColumnRef*>(expr.get());
+            if (ref->column_id() >= 0 && static_cast<size_t>(ref->column_id()) 
< argument_size) {
+                const int argument_index = ref->column_id();
+                ref->set_gap(lambda_argument_base + argument_index - 
ref->column_id());
             }
+            return Status::OK();
         }

Review Comment:
   else,to remove 414 return



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