This is an automated email from the ASF dual-hosted git repository.
fhueske pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/master by this push:
new ce4cec57bc6 [FLINK-40012][table] Correctly inject Context into
scalar-only PTFs in ProcessTableFunctionTestHarness (#28579)
ce4cec57bc6 is described below
commit ce4cec57bc654433a8a23f116ca6fc7f0bf0ec15
Author: Mika Naylor <[email protected]>
AuthorDate: Tue Jun 30 19:01:26 2026 +0200
[FLINK-40012][table] Correctly inject Context into scalar-only PTFs in
ProcessTableFunctionTestHarness (#28579)
---
.../table/runtime/functions/InvocationContext.java | 4 +++
.../functions/ProcessTableFunctionTestHarness.java | 5 +++-
.../ProcessTableFunctionTestHarnessTest.java | 33 ++++++++++++++++++++++
3 files changed, 41 insertions(+), 1 deletion(-)
diff --git
a/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/InvocationContext.java
b/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/InvocationContext.java
index 0ff59b00d87..4c1acd3a5b9 100644
---
a/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/InvocationContext.java
+++
b/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/InvocationContext.java
@@ -51,6 +51,10 @@ class InvocationContext {
return new InvocationContext(timer.partitionKey, null, null, timer);
}
+ static InvocationContext forScalarOnlyEval() {
+ return new InvocationContext(Row.of(), null, null, null);
+ }
+
boolean isTimerInvocation() {
return firingTimer != null;
}
diff --git
a/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarness.java
b/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarness.java
index c5baddc1fcd..fa0297bd488 100644
---
a/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarness.java
+++
b/flink-table/flink-table-test-utils/src/main/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarness.java
@@ -287,10 +287,13 @@ public class ProcessTableFunctionTestHarness<OUT>
implements AutoCloseable {
Object[] args = arguments.stream().map(arg -> ((ScalarArgumentInfo)
arg).value).toArray();
try {
- eval.method.invoke(function, args);
+ currentInvocation = InvocationContext.forScalarOnlyEval();
+ eval.invoke(function, new TestContext(new HashMap<>()), args);
} catch (InvocationTargetException e) {
handleEvalInvocationException(
"Exception occurred during scalar-only PTF eval()
invocation.\n", args, e);
+ } finally {
+ currentInvocation = null;
}
}
diff --git
a/flink-table/flink-table-test-utils/src/test/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarnessTest.java
b/flink-table/flink-table-test-utils/src/test/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarnessTest.java
index b2ab499ca2c..f774a8fc422 100644
---
a/flink-table/flink-table-test-utils/src/test/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarnessTest.java
+++
b/flink-table/flink-table-test-utils/src/test/java/org/apache/flink/table/runtime/functions/ProcessTableFunctionTestHarnessTest.java
@@ -328,6 +328,21 @@ class ProcessTableFunctionTestHarnessTest {
}
}
+ /**
+ * Scalar-only PTF whose eval() takes a {@link
ProcessTableFunction.Context}. With no table
+ * arguments, we expect there to be no time/watermark, so both resolve to
null.
+ */
+ @DataTypeHint("ROW<ts INT, watermark INT, value INT>")
+ public static class ScalarOnlyContextPTF extends ProcessTableFunction<Row>
{
+ public void eval(
+ Context ctx,
+ @ArgumentHint(ArgumentTrait.SCALAR) Integer a,
+ @ArgumentHint(ArgumentTrait.SCALAR) Integer b) {
+ final TimeContext<Long> timeCtx = ctx.timeContext(Long.class);
+ collect(Row.of(timeCtx.time(), timeCtx.currentWatermark(), a + b));
+ }
+ }
+
/** PTF with simple value state - counts rows per partition. */
@DataTypeHint("ROW<count BIGINT>")
public static class PTFWithValueState extends ProcessTableFunction<Row> {
@@ -565,6 +580,24 @@ class ProcessTableFunctionTestHarnessTest {
}
}
+ @Test
+ void testScalarOnlyPTFInjectsContext() throws Exception {
+ try (ProcessTableFunctionTestHarness<Row> harness =
+
ProcessTableFunctionTestHarness.ofClass(ScalarOnlyContextPTF.class)
+ .withScalarArgument("a", 10)
+ .withScalarArgument("b", 20)
+ .build()) {
+
+ harness.process();
+
+ List<Row> output = harness.getOutput();
+ assertThat(output).hasSize(1);
+ assertThat(output.get(0).getField("ts")).isNull();
+ assertThat(output.get(0).getField("watermark")).isNull();
+ assertThat(output.get(0).getField("value")).isEqualTo(30);
+ }
+ }
+
@Test
void testScalarOnlyPTFWithWrongArgumentTypes() {
Exception exception =