[
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)