[
https://issues.apache.org/jira/browse/NIFI-14958?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18020697#comment-18020697
]
ASF subversion and git services commented on NIFI-14958:
--------------------------------------------------------
Commit b0f29ef94e95be8160ec2cd5fbdfbef373451f90 in nifi's branch
refs/heads/main from Pierre Villard
[ https://gitbox.apache.org/repos/asf?p=nifi.git;h=b0f29ef94e ]
NIFI-14958 Support Array of Strings for Avro Schema derived from JDBC Results
(#10295)
Signed-off-by: David Handermann <[email protected]>
> JdbcCommon should not default arrays to arrays of bytes
> -------------------------------------------------------
>
> Key: NIFI-14958
> URL: https://issues.apache.org/jira/browse/NIFI-14958
> Project: Apache NiFi
> Issue Type: Bug
> Reporter: Pierre Villard
> Assignee: Pierre Villard
> Priority: Major
> Time Spent: 40m
> Remaining Estimate: 0h
>
> *JdbcCommon* is used in *RecordSqlWriter* which is used by *ExecuteSQLRecord*
> and *QueryDatabaseTableRecord* processors.
> We construct the schema based on the result set metadata retrieved via the
> JDBC access when executing the SQL query.
> If a column type is currently set as ARRAY type by the driver (value = 2003),
> we would then create a field using
>
> {code:java}
> builder.name(columnName).type().unionOf().nullBuilder().endNull().and().bytesType().endUnion().noDefault();
> {code}
> This should not be the case. If we retrieve an array of string for example,
> we would cause an error like:
> {code:java}
> 2025-09-11 17:18:44,940 ERROR [Timer-Driven Process Thread-1]
> o.a.n.p.standard.ExecuteSQLRecord
> ExecuteSQLRecord[id=3832c36d-0199-1000-3439-4bd0a61bef96] Unable to execute
> SQL select query [SELECT ['test'] as test;]. No FlowFile to route to failure
> org.apache.nifi.processor.exception.ProcessException: java.io.IOException:
> java.lang.NumberFormatException: For input string: "test"
> at
> org.apache.nifi.processors.standard.AbstractExecuteSQL.lambda$onTrigger$4(AbstractExecuteSQL.java:359)
> at
> org.apache.nifi.controller.repository.StandardProcessSession.write(StandardProcessSession.java:3107)
> at
> org.apache.nifi.processors.standard.AbstractExecuteSQL.onTrigger(AbstractExecuteSQL.java:355)
> at
> org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
> at
> org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1274)
> at
> org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:220)
> at
> org.apache.nifi.controller.scheduling.AbstractTimeBasedSchedulingAgent.lambda$doScheduleOnce$0(AbstractTimeBasedSchedulingAgent.java:59)
> at org.apache.nifi.engine.FlowEngine.lambda$wrap$1(FlowEngine.java:105)
> at
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
> at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
> at
> java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
> at
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
> at
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
> at java.base/java.lang.Thread.run(Thread.java:1583)
> Caused by: java.io.IOException: java.lang.NumberFormatException: For input
> string: "test"
> at
> org.apache.nifi.processors.standard.sql.RecordSqlWriter.writeResultSet(RecordSqlWriter.java:88)
> at
> org.apache.nifi.processors.standard.AbstractExecuteSQL.lambda$onTrigger$4(AbstractExecuteSQL.java:357)
> ... 13 common frames omitted
> Caused by: java.lang.NumberFormatException: For input string: "test"
> at
> java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
> at java.base/java.lang.Integer.parseInt(Integer.java:662)
> at java.base/java.lang.Byte.parseByte(Byte.java:195)
> at java.base/java.lang.Byte.parseByte(Byte.java:221)
> at
> org.apache.nifi.serialization.record.util.DataTypeUtils.toByte(DataTypeUtils.java:1514)
> at
> org.apache.nifi.serialization.record.util.DataTypeUtils.convertType(DataTypeUtils.java:197)
> at
> org.apache.nifi.serialization.record.util.DataTypeUtils.convertType(DataTypeUtils.java:174)
> at
> org.apache.nifi.json.WriteJsonResult.writeValue(WriteJsonResult.java:349)
> at
> org.apache.nifi.json.WriteJsonResult.writeArray(WriteJsonResult.java:470)
> at
> org.apache.nifi.json.WriteJsonResult.writeValue(WriteJsonResult.java:459)
> at
> org.apache.nifi.json.WriteJsonResult.writeRecord(WriteJsonResult.java:233)
> at
> org.apache.nifi.json.WriteJsonResult.writeRecord(WriteJsonResult.java:157)
> at
> org.apache.nifi.serialization.AbstractRecordSetWriter.write(AbstractRecordSetWriter.java:59)
> at
> org.apache.nifi.serialization.AbstractRecordSetWriter.write(AbstractRecordSetWriter.java:52)
> at
> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
> at java.base/java.lang.reflect.Method.invoke(Method.java:580)
> at
> org.apache.nifi.controller.service.StandardControllerServiceInvocationHandler.invoke(StandardControllerServiceInvocationHandler.java:251)
> at
> org.apache.nifi.controller.service.StandardControllerServiceInvocationHandler$ProxiedReturnObjectInvocationHandler.invoke(StandardControllerServiceInvocationHandler.java:237)
> at jdk.proxy26/jdk.proxy26.$Proxy192.write(Unknown Source)
> at
> org.apache.nifi.processors.standard.sql.RecordSqlWriter.writeResultSet(RecordSqlWriter.java:82)
> ... 14 common frames omitted {code}
> We should try to use the result set to infer the type of the elements of the
> array and, if not possible, default to string.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)