[ 
https://issues.apache.org/jira/browse/FLINK-31312?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17698278#comment-17698278
 ] 

Jiang Xin commented on FLINK-31312:
-----------------------------------

[~kevin.cyj] Thanks for the reply. Sure, I believe it can be solved by 
constructing the Row with `positionByName`, but this constructor is not public, 
furthermore, we can not tell users that they can only use this constructor even 
if it is public. The main problem is that users are able to access a positioned 
row by name with object-reuse enabled, while are not able to access it with 
object-reuse disabled. I want to know is it a bug or feature?

> EnableObjectReuse cause different behaviors
> -------------------------------------------
>
>                 Key: FLINK-31312
>                 URL: https://issues.apache.org/jira/browse/FLINK-31312
>             Project: Flink
>          Issue Type: Bug
>          Components: API / DataStream
>            Reporter: Jiang Xin
>            Priority: Major
>
> I have the following test code which fails with the exception `Accessing a 
> field by name is not supported in position-based field mode`, however, if I 
> remove the `enableObjectReuse`, it works. 
> The `SourceFunction` generates rows without field names, but the return type 
> info is assigned by `env.addSource(rowGenerator, typeInfo)`.
> With object-reuse enabled, rows would be passed to the MapFunction directly, 
> so the exception raises. While if the object-reuse is disabled,  rows would 
> be reconstructed and given field names when passing to the next operator and 
> the test works well.
> {code:java}
> public static void main(String[] args) throws Exception {
>     StreamExecutionEnvironment env = 
> StreamExecutionEnvironment.getExecutionEnvironment();
>     env.setParallelism(1);
>     // The test fails with enableObjectReuse
>     env.getConfig().enableObjectReuse();
>     final SourceFunction<Row> rowGenerator =
>             new SourceFunction<Row>() {
>                 @Override
>                 public final void run(SourceContext<Row> ctx) throws 
> Exception {
>                     Row row = new Row(1);
>                     row.setField(0, "a");
>                     ctx.collect(row);
>                 }
>                 @Override
>                 public void cancel() {}
>             };
>     final RowTypeInfo typeInfo =
>             new RowTypeInfo(new TypeInformation[] {Types.STRING}, new 
> String[] {"col1"});
>     DataStream<Row> dataStream = env.addSource(rowGenerator, typeInfo);
>     DataStream<Row> transformedDataStream =
>             dataStream.map(
>                     (MapFunction<Row, Row>) value -> 
> Row.of(value.getField("col1")), typeInfo);
>     transformedDataStream.addSink(new PrintSinkFunction<>());
>     env.execute("Mini Test");
> } {code}



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

Reply via email to