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
The following commit(s) were added to refs/heads/master by this push:
new de793af8458 [FLINK-40373][table] `JSON_VALUE` might fail on code gen
for null input
de793af8458 is described below
commit de793af84589d32fe712ba598502533fdd84f4cd
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Wed Aug 12 14:54:58 2026 +0200
[FLINK-40373][table] `JSON_VALUE` might fail on code gen for null input
---
.../table/planner/codegen/calls/JsonParseReuse.scala | 2 +-
.../table/planner/functions/JsonFunctionsITCase.java | 16 +++++++++++++---
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git
a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/JsonParseReuse.scala
b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/JsonParseReuse.scala
index 7a340dee049..9da1cabcfbf 100644
---
a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/JsonParseReuse.scala
+++
b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/JsonParseReuse.scala
@@ -57,7 +57,7 @@ object JsonParseReuse {
val lastInputName = CodeGenUtils.newName(ctx, "jsonParsedInput")
val methodName = CodeGenUtils.newName(ctx, "parseJson")
val typeName = classOf[SqlJsonUtils.JsonValueContext].getName
- val inputType = CodeGenUtils.BINARY_STRING
+ val inputType = CodeGenUtils.boxedTypeTermForType(input.resultType)
ctx.addReusableMember(s"$typeName $varName;")
ctx.addReusableMember(s"$inputType $lastInputName;")
diff --git
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/JsonFunctionsITCase.java
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/JsonFunctionsITCase.java
index b1fc7ee891a..9f3b1e377c3 100644
---
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/JsonFunctionsITCase.java
+++
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/JsonFunctionsITCase.java
@@ -41,6 +41,7 @@ import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -50,6 +51,7 @@ import java.util.stream.Stream;
import static org.apache.flink.table.api.DataTypes.ARRAY;
import static org.apache.flink.table.api.DataTypes.BINARY;
import static org.apache.flink.table.api.DataTypes.BOOLEAN;
+import static org.apache.flink.table.api.DataTypes.BYTES;
import static org.apache.flink.table.api.DataTypes.DECIMAL;
import static org.apache.flink.table.api.DataTypes.DOUBLE;
import static org.apache.flink.table.api.DataTypes.FIELD;
@@ -407,8 +409,9 @@ class JsonFunctionsITCase extends BuiltInFunctionTestBase {
private static TestSetSpec jsonValueSpec() {
final String jsonValue = getJsonFromResource("/json/json-value.json");
return TestSetSpec.forFunction(BuiltInFunctionDefinitions.JSON_VALUE)
- .onFieldsWithData(jsonValue)
- .andDataTypes(STRING())
+ .onFieldsWithData(
+ jsonValue, jsonValue.getBytes(StandardCharsets.UTF_8),
Row.of(jsonValue))
+ .andDataTypes(STRING(), BYTES(), ROW(FIELD("json", STRING())))
// NULL and invalid types
.testResult(
@@ -525,7 +528,14 @@ class JsonFunctionsITCase extends BuiltInFunctionTestBase {
.testSqlResult(
"JSON_VALUE(f0, '$.type'), JSON_VALUE(f0, '$.age')",
List.of("account", "42"),
- List.of(STRING(), STRING()));
+ List.of(STRING(), STRING()))
+ .testSqlResult(
+ "JSON_VALUE(f1, '$.type'), "
+ + "JSON_VALUE(f2, '$.type'), "
+ + "JSON_VALUE(CAST(NULL AS INT), '$.type'), "
+ + "JSON_VALUE(CAST(NULL AS DATE), '$.type')",
+ Arrays.asList(null, null, null, null),
+ List.of(STRING(), STRING(), STRING(), STRING()));
}
private static List<TestSetSpec> isJsonSpec() {