You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "dylanhz (Jira)" <ji...@apache.org> on 2026/03/20 02:41:00 UTC

[jira] [Created] (FLINK-39273) ScalarFunction throws "Argument name conflict" when eval method contains lambda expression

dylanhz created FLINK-39273:
-------------------------------

             Summary: ScalarFunction 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


h3. Summary

When a {{ScalarFunction}}'s {{eval}} method body 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)