[
https://issues.apache.org/jira/browse/FLINK-39273?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated FLINK-39273:
-----------------------------------
Labels: pull-request-available (was: )
> UDF throws "Argument name conflict" when eval method contains lambda
> expression
> -------------------------------------------------------------------------------
>
> Key: FLINK-39273
> URL: https://issues.apache.org/jira/browse/FLINK-39273
> Project: Flink
> Issue Type: Bug
> Components: Table SQL / Planner
> Reporter: dylanhz
> Priority: Major
> Labels: pull-request-available
>
> h3. Summary
> When a UDF's method (e.g. {{eval}}, {{accumulate}}) contains a lambda
> expression that captures its own parameters, type inference extraction throws:
> {code}
> ValidationException: Argument name conflict, there are at least two argument
> names that are the same.
> {code}
> h3. Minimal Reproduction
> {code:java}
> public class MyFunction extends ScalarFunction {
> public String eval(Long id, String field) {
> Supplier<String> supplier = () -> String.valueOf(id) + field;
> return supplier.get();
> }
> }
> {code}
> h3. Root Cause
> The ASM-based {{ParameterExtractor}} in {{ExtractionUtils}} extracts
> parameter names from the {{LocalVariableTable}} of a class file. It matches
> target methods *only by descriptor* (parameter/return types), ignoring the
> method name.
> When a lambda inside {{eval(Long, String)}} captures both parameters {{id}}
> and {{field}}, the Java compiler generates a synthetic static method
> {{lambda$eval$0(Long, String) -> String}} with the *same descriptor* as the
> enclosing {{eval}}.
> The {{ParameterExtractor}} visits both methods, and because the lambda is
> {{static}} (local variable slots start at 0) while {{eval}} is an instance
> method (slot 0 = {{this}}), the lambda's variable names overwrite the eval's
> entries in the {{TreeMap<Integer, String>}}, producing duplicate names
> {{[field, field]}} instead of {{[id, field]}}.
> h3. Fix
> Add a {{methodName}} field to {{ParameterExtractor}} and match on both name
> *and* descriptor in {{visitMethod}}.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)