PDGGK opened a new issue, #39749:
URL: https://github.com/apache/beam/issues/39749

   ### What happened?
   
   `Row#toString` throws for an `ITERABLE` field whose value is a plain 
`Iterable`:
   
   ```java
   Schema schema =
       Schema.builder().addStringField("k").addIterableField("vals", 
FieldType.STRING).build();
   Iterable<String> bare = () -> Arrays.asList("p", "q").iterator();
   Row.withSchema(schema).attachValues("k1", bare).toString();
   ```
   
   ```
   java.lang.IllegalArgumentException: value type is 'class ...' for field type 
'ITERABLE'
        at 
org.apache.beam.sdk.schemas.SchemaUtils.toPrettyFieldValueString(SchemaUtils.java:273)
   ```
   
   `toPrettyFieldValueString` requires a `List` before iterating:
   
   ```java
   if (!(value instanceof List)) {
     throw new IllegalArgumentException(...);
   }
   ```
   
   An `ITERABLE` field declares an `Iterable`, so the guard is stricter than 
the type it is guarding. The branch below it only iterates and counts — both 
available from an `Iterable` once materialised.
   
   `Row#toString` is `SchemaUtils.toPrettyString(this)`, so one unusual field 
takes out logging and debugger output for **every** field beside it, which is a 
poor trade for a stricter check in a renderer.
   
   ### Note on where the fix belongs
   
   There is a reasonable position that a materialised `Row` should always hold 
a `List` for `ARRAY`/`ITERABLE`, and that a non-`List` arriving here means a 
producer is at fault. That may well be true and worth fixing separately — but 
the reproducer above uses only `Schema.builder`, 
`Row.withSchema(...).attachValues(...)` and `toString()`, so a value that is 
merely `Iterable` does reach the renderer through the public API, and a 
`toString()` that throws is hard to defend regardless of who produced the value.
   
   ### Issue Priority
   
   Priority: 3 (minor)
   
   ### Issue Components
   
   - [x] Component: Java SDK
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to