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]