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/02/14 07:49:00 UTC

[jira] [Created] (FLINK-39094) Avoid creating duplicate function instances in code generation

dylanhz created FLINK-39094:
-------------------------------

             Summary: Avoid creating duplicate function instances in code generation
                 Key: FLINK-39094
                 URL: https://issues.apache.org/jira/browse/FLINK-39094
             Project: Flink
          Issue Type: Improvement
          Components: Table SQL / Planner
            Reporter: dylanhz


When a function is called multiple times with the same context, multiple function instances will be created while only the last one is actually used. 
We can remove the duplicate ones to make the generated code cleaner and avoid redundant object ser/de overhead.

Here is a query example and the generated code.
{code:sql}
select split('a,b,c', ','), split('x,y', ',')
{code}

In the generated code below, the function field is assigned twice in the constructor (from references[0] and references[1]), but only the last assignment (references[1]) is effective.
{code:java}
public class BatchExecCalc$7 extends org.apache.flink.table.runtime.operators.TableStreamOperator
        implements org.apache.flink.streaming.api.operators.OneInputStreamOperator {

    private final Object[] references;

    private final org.apache.flink.table.data.binary.BinaryStringData str$0 =
            org.apache.flink.table.data.binary.BinaryStringData.fromString("a,b,c");

    private final org.apache.flink.table.data.binary.BinaryStringData str$1 =
            org.apache.flink.table.data.binary.BinaryStringData.fromString(",");

    private transient org.apache.flink.table.runtime.functions.scalar.SplitFunction
            function_org$apache$flink$table$runtime$functions$scalar$SplitFunction$3bfba7b1caccc3b7427da3dc1be41425;

    private final org.apache.flink.table.data.binary.BinaryStringData str$4 =
            org.apache.flink.table.data.binary.BinaryStringData.fromString("x,y");

    org.apache.flink.table.data.BoxedWrapperRowData out =
            new org.apache.flink.table.data.BoxedWrapperRowData(2);
    private final org.apache.flink.streaming.runtime.streamrecord.StreamRecord outElement =
            new org.apache.flink.streaming.runtime.streamrecord.StreamRecord(null);

    public BatchExecCalc$7(
            Object[] references,
            org.apache.flink.streaming.runtime.tasks.StreamTask task,
            org.apache.flink.streaming.api.graph.StreamConfig config,
            org.apache.flink.streaming.api.operators.Output output,
            org.apache.flink.streaming.runtime.tasks.ProcessingTimeService processingTimeService)
            throws Exception {
        this.references = references;
        function_org$apache$flink$table$runtime$functions$scalar$SplitFunction$3bfba7b1caccc3b7427da3dc1be41425 =
                (((org.apache.flink.table.runtime.functions.scalar.SplitFunction) references[0]));
        function_org$apache$flink$table$runtime$functions$scalar$SplitFunction$3bfba7b1caccc3b7427da3dc1be41425 =
                (((org.apache.flink.table.runtime.functions.scalar.SplitFunction) references[1]));
        this.setup(task, config, output);
        if (this instanceof org.apache.flink.streaming.api.operators.AbstractStreamOperator) {
            ((org.apache.flink.streaming.api.operators.AbstractStreamOperator) this)
                    .setProcessingTimeService(processingTimeService);
        }
    }

    @Override
    public void open() throws Exception {
        super.open();

        function_org$apache$flink$table$runtime$functions$scalar$SplitFunction$3bfba7b1caccc3b7427da3dc1be41425
                .open(new org.apache.flink.table.functions.FunctionContext(getRuntimeContext()));
    }

    @Override
    public void processElement(org.apache.flink.streaming.runtime.streamrecord.StreamRecord element)
            throws Exception {
        org.apache.flink.table.data.RowData in1 =
                (org.apache.flink.table.data.RowData) element.getValue();

        org.apache.flink.table.data.ArrayData externalResult$2;
        org.apache.flink.table.data.ArrayData result$3;
        boolean isNull$3;
        org.apache.flink.table.data.ArrayData externalResult$5;
        org.apache.flink.table.data.ArrayData result$6;
        boolean isNull$6;

        externalResult$2 =
                (org.apache.flink.table.data.ArrayData)
                        function_org$apache$flink$table$runtime$functions$scalar$SplitFunction$3bfba7b1caccc3b7427da3dc1be41425
                                .eval(
                                        false
                                                ? null
                                                : ((org.apache.flink.table.data.binary
                                                                .BinaryStringData)
                                                        ((org.apache.flink.table.data.binary
                                                                        .BinaryStringData)
                                                                str$0)),
                                        false
                                                ? null
                                                : ((org.apache.flink.table.data.binary
                                                                .BinaryStringData)
                                                        ((org.apache.flink.table.data.binary
                                                                        .BinaryStringData)
                                                                str$1)));

        isNull$3 = externalResult$2 == null;
        result$3 = null;
        if (!isNull$3) {
            result$3 = externalResult$2;
        }

        out.setNonPrimitiveValue(0, result$3);

        externalResult$5 =
                (org.apache.flink.table.data.ArrayData)
                        function_org$apache$flink$table$runtime$functions$scalar$SplitFunction$3bfba7b1caccc3b7427da3dc1be41425
                                .eval(
                                        false
                                                ? null
                                                : ((org.apache.flink.table.data.binary
                                                                .BinaryStringData)
                                                        ((org.apache.flink.table.data.binary
                                                                        .BinaryStringData)
                                                                str$4)),
                                        false
                                                ? null
                                                : ((org.apache.flink.table.data.binary
                                                                .BinaryStringData)
                                                        ((org.apache.flink.table.data.binary
                                                                        .BinaryStringData)
                                                                str$1)));

        isNull$6 = externalResult$5 == null;
        result$6 = null;
        if (!isNull$6) {
            result$6 = externalResult$5;
        }

        out.setNonPrimitiveValue(1, result$6);

        output.collect(outElement.replace(out));
    }

    @Override
    public void finish() throws Exception {

        super.finish();
    }

    @Override
    public void close() throws Exception {
        super.close();
        function_org$apache$flink$table$runtime$functions$scalar$SplitFunction$3bfba7b1caccc3b7427da3dc1be41425
                .close();
    }
}

{code}




--
This message was sent by Atlassian Jira
(v8.20.10#820010)