This is an automated email from the ASF dual-hosted git repository. snuyanzin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/flink.git
commit 9e2d2b8ed0d90d1c6277d5eb630b47f9a4d5fc54 Author: Sergey Nuyanzin <[email protected]> AuthorDate: Mon Jan 19 09:49:23 2026 +0100 [FLINK-38938][table] Do not put empty operand list into compiled plan This closes #27439. --- .../table/planner/functions/sql/FlinkSqlOperatorTable.java | 1 + .../plan/nodes/exec/serde/RexNodeJsonDeserializer.java | 11 ++++++++--- .../planner/plan/nodes/exec/serde/RexNodeJsonSerializer.java | 12 +++++++----- .../testEventTimeHopWindow.out | 1 - .../testEventTimeSessionWindow.out | 1 - .../testEventTimeTumbleWindow.out | 1 - .../testProcTimeHopWindow.out | 2 -- .../testProcTimeSessionWindow.out | 2 -- .../testProcTimeTumbleWindow.out | 2 -- .../testProcTimeBoundedNonPartitionedRangeOver.out | 2 -- .../testProcTimeBoundedPartitionedRangeOver.out | 2 -- ...ProcTimeBoundedPartitionedRowsOverWithBuiltinProctime.out | 2 -- .../testProcTimeUnboundedPartitionedRangeOver.out | 2 -- .../testRowTimeBoundedPartitionedRowsOver.out | 1 - 14 files changed, 16 insertions(+), 26 deletions(-) diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java index 53dcf68c5ea..817284846d1 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java @@ -116,6 +116,7 @@ public class FlinkSqlOperatorTable extends ReflectiveSqlOperatorTable { SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE, isBatchMode, 3) { + @Override public SqlSyntax getSyntax() { return SqlSyntax.FUNCTION; diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonDeserializer.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonDeserializer.java index f06d2bfcfd4..109358c9d30 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonDeserializer.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonDeserializer.java @@ -345,9 +345,14 @@ final class RexNodeJsonDeserializer extends StdDeserializer<RexNode> { throws IOException { final SqlOperator operator = deserializeSqlOperator(jsonNode, serdeContext); final ArrayNode operandNodes = (ArrayNode) jsonNode.get(FIELD_NAME_OPERANDS); - final List<RexNode> rexOperands = new ArrayList<>(); - for (JsonNode node : operandNodes) { - rexOperands.add(deserialize(node, serdeContext)); + final List<RexNode> rexOperands; + if (operandNodes == null) { + rexOperands = List.of(); + } else { + rexOperands = new ArrayList<>(); + for (JsonNode node : operandNodes) { + rexOperands.add(deserialize(node, serdeContext)); + } } final RelDataType callType; if (jsonNode.has(FIELD_NAME_TYPE)) { diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonSerializer.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonSerializer.java index 23b11bd531f..aa4fad24f86 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonSerializer.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/RexNodeJsonSerializer.java @@ -359,12 +359,14 @@ final class RexNodeJsonSerializer extends StdSerializer<RexNode> { gen, serializerProvider, compilationStrategy == CatalogPlanCompilation.ALL); - gen.writeFieldName(FIELD_NAME_OPERANDS); - gen.writeStartArray(); - for (RexNode operand : call.getOperands()) { - serializerProvider.defaultSerializeValue(operand, gen); + if (!call.getOperands().isEmpty()) { + gen.writeFieldName(FIELD_NAME_OPERANDS); + gen.writeStartArray(); + for (RexNode operand : call.getOperands()) { + serializerProvider.defaultSerializeValue(operand, gen); + } + gen.writeEndArray(); } - gen.writeEndArray(); serializerProvider.defaultSerializeField(FIELD_NAME_TYPE, call.getType(), gen); gen.writeEndObject(); } diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeHopWindow.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeHopWindow.out index 711d77a9810..bc5c9365b82 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeHopWindow.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeHopWindow.out @@ -40,7 +40,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeSessionWindow.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeSessionWindow.out index 80528083d31..80201370927 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeSessionWindow.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeSessionWindow.out @@ -40,7 +40,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeTumbleWindow.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeTumbleWindow.out index 625404e3afc..fdb06305cb3 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeTumbleWindow.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testEventTimeTumbleWindow.out @@ -40,7 +40,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeHopWindow.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeHopWindow.out index e9092e8a395..e0334458a78 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeHopWindow.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeHopWindow.out @@ -40,7 +40,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, @@ -108,7 +107,6 @@ }, { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeSessionWindow.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeSessionWindow.out index ca4a4cbd1a8..cd2e2b67f30 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeSessionWindow.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeSessionWindow.out @@ -40,7 +40,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, @@ -108,7 +107,6 @@ }, { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeTumbleWindow.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeTumbleWindow.out index 1be4cb3d7a4..32b9614edc9 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeTumbleWindow.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonGroupWindowAggregateJsonPlanTest_jsonplan/testProcTimeTumbleWindow.out @@ -40,7 +40,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, @@ -108,7 +107,6 @@ }, { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedNonPartitionedRangeOver.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedNonPartitionedRangeOver.out index 44dae4c0af9..670a374ed8d 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedNonPartitionedRangeOver.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedNonPartitionedRangeOver.out @@ -31,7 +31,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, @@ -82,7 +81,6 @@ }, { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRangeOver.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRangeOver.out index eba924fca5e..6cd81cf7c4b 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRangeOver.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRangeOver.out @@ -31,7 +31,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, @@ -86,7 +85,6 @@ }, { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRowsOverWithBuiltinProctime.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRowsOverWithBuiltinProctime.out index 1d7a1d15ce9..87db9c2ee91 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRowsOverWithBuiltinProctime.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeBoundedPartitionedRowsOverWithBuiltinProctime.out @@ -31,7 +31,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, @@ -130,7 +129,6 @@ }, { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeUnboundedPartitionedRangeOver.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeUnboundedPartitionedRangeOver.out index 3252699022c..52a537df698 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeUnboundedPartitionedRangeOver.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testProcTimeUnboundedPartitionedRangeOver.out @@ -31,7 +31,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, @@ -86,7 +85,6 @@ }, { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false, diff --git a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testRowTimeBoundedPartitionedRowsOver.out b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testRowTimeBoundedPartitionedRowsOver.out index d44f5a0aac4..b38d92f5b80 100644 --- a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testRowTimeBoundedPartitionedRowsOver.out +++ b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/nodes/exec/stream/PythonOverAggregateJsonPlanTest_jsonplan/testRowTimeBoundedPartitionedRowsOver.out @@ -31,7 +31,6 @@ "rexNode" : { "kind" : "CALL", "internalName" : "$PROCTIME$1", - "operands" : [ ], "type" : { "type" : "TIMESTAMP_WITH_LOCAL_TIME_ZONE", "nullable" : false,
