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

Zoltan Farkas commented on AVRO-2278:
-------------------------------------

There is basically one behavior that we are changing here significantly: 
GenericData.Record.get(String) will throw an exception  instead of returning 
null when querying record for an invalid field. The other changes are 
cleanup... (we are throwing AvroRuntimeException instead of NPE).

So if we decide to protect this via a feature flag, we should only do this for 
GenericData.Record.get(String) 

we should also not forget that currently the 2 implementations of 
GenericRecord.get(String):

GenericData.Record.get(String)
SpecificRecordBase.get(String)

are inconsistent in behavior... one returns null for non-existent field, the 
other throws a NPE... so you can't rely on current behavior for 
GenericRecord.get...

But since we are talking here about 1.10 and not 1.8.x and 1.9.x, where users 
will not expect API compatibility, I think in this specific scenario, a feature 
flag will add more complexity for not much benefit...

how can we get more people to chime in? 

> GenericData.Record field getter not correct
> -------------------------------------------
>
>                 Key: AVRO-2278
>                 URL: https://issues.apache.org/jira/browse/AVRO-2278
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.8.2, 1.9.2
>            Reporter: Zoltan Farkas
>            Assignee: Zoltan Farkas
>            Priority: Major
>
> Currently the get field implementation is not correct in GenericData.Record:
> at: 
> https://github.com/apache/avro/blob/master/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java#L209
> {code}
>    @Override public Object get(String key) {
>       Field field = schema.getField(key);
>       if (field == null) return null;
>       return values[field.pos()];
>     }
> {code}
> The method returns null when a field is not present, making it impossible to 
> distinguish between:
> field value = null
> and
> field does not exist.
> A more "correct" implementation would be:
> {code}
>     @Override public Object get(String key) {
>       Field field = schema.getField(key);
>       if (field == null) {
>         throw new IllegalArgumentException("Invalid field " + key);
>       }
>       return values[field.pos()];
>     }
> {code}
> this will make the behavior consistent with put which will throw a exception 
> when setting a non existent field.
> when I make this change in my fork, some bugs in unit tests showed up....



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to