You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "ASF subversion and git services (Jira)" <ji...@apache.org> on 2021/08/26 16:29:00 UTC
[jira] [Commented] (AVRO-2648) Incorrect validation of numeric
default values
[ https://issues.apache.org/jira/browse/AVRO-2648?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17405347#comment-17405347 ]
ASF subversion and git services commented on AVRO-2648:
-------------------------------------------------------
Commit 411b6b9cbe4046abdc9cc4293ebd9f2548f37b64 in avro's branch refs/heads/master from Jeffrey Mullins
[ https://gitbox.apache.org/repos/asf?p=avro.git;h=411b6b9 ]
AVRO-2648: Incorrect validation of numeric default values (#739)
* AVRO-2648: Incorrect validation of numeric default values
Validation of numeric default values in Java is incorrect and results
in API inconsistencies. Consider the following examples:
Double values as int field default values:
public void testDoubleAsIntDefaultValue() {
Schema.Field field = new Schema.Field("myField",
Schema.create(Schema.Type.INT), "doc", 1.1);
field.hasDefaultValue(); // true
field.defaultValue(); // internal DoubleNode (1.1)
field.defaultVal(); // null
GenericData.get().getDefaultValue(field); // Integer (1)
field = new Schema.Field("myField",
Schema.create(Schema.Type.INT), "doc", 1.0);
field.hasDefaultValue(); // true
field.defaultValue(); // internal DoubleNode (1.0)
field.defaultVal(); // null
GenericData.get().getDefaultValue(field); // Integer (1)
}
Invalid long value as int field default value:
public void testInvalidLongAsIntDefault() {
Schema.Field field = new Schema.Field("myField",
Schema.create(Schema.Type.INT), "doc", Integer.MAX_VALUE + 1L);
field.hasDefaultValue(); // true
field.defaultValue(); // internal LongNode (2147483648)
field.defaultVal(); // Long (2147483648)
GenericData.get().getDefaultValue(field); // Integer (-2147483648)
}
This PR makes changes to invalidate incorrect default values for INT and
LONG schemas, including all floating point values, e.g. 1.0.
Additionally it contains changes to try and return the appropriate
Object type given the schema type.
This change is necessary for correctness and consitency but also
because users cannot disable default value validation and handle
these cases on their own since the underlying Field.defaultValue()
is no longer public. Users only have access to default values
mutated by Field.defaultVal() and GenericData.getDefaultValue().
Notes on JacksonUtils.toObject():
- This method is used to convert the underlying JsonNode default value
to an Object when Field.defaultVal() is called. This method is
invoked regardless of whether default value validation is true or
false.
- For LongNode values we continue to return Long values for INT
schemas in the case we cannot safely convert to an Integer.
This behavior, while maintained, is inconsistent with that
of FloatNode / DoubleNode where null is returned for INT
and LONG schemas. Additional changes may be needed for
further consistency.
* AVRO-2648: Fix testLongDefaultValue()
Co-authored-by: Jeffrey Mullins <jm...@bloomberg.net>
Co-authored-by: Fokko Driesprong <fo...@apache.org>
> Incorrect validation of numeric default values
> ----------------------------------------------
>
> Key: AVRO-2648
> URL: https://issues.apache.org/jira/browse/AVRO-2648
> Project: Apache Avro
> Issue Type: Bug
> Components: java
> Reporter: Jeffrey Mullins
> Assignee: Jeffrey Mullins
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.10.0
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> Validation of numeric default values is incorrect and results in API inconsistencies. Below are a few examples.
> Double value as int default value:
> {code:java}
> public void testDoubleAsIntDefaultValue() {
> Schema.Field field = new Schema.Field("myField", Schema.create(Schema.Type.INT), "doc", 1.1);
> field.hasDefaultValue(); // true
> field.defaultValue(); // internal DoubleNode (1.1)
> field.defaultVal(); // null
> GenericData.get().getDefaultValue(field); // Integer (1)
>
> field = new Schema.Field("myField", Schema.create(Schema.Type.INT), "doc", 1.0);
> field.hasDefaultValue(); // true
> field.defaultValue(); // internal DoubleNode (1.0)
> field.defaultVal(); // null
> GenericData.get().getDefaultValue(field); // Integer (1)
> }{code}
>
> {color:#172b4d}Invalid long as int default value:{color}
> {code:java}
> public void testInvalidLongAsIntDefault() {
> Schema.Field field = new Schema.Field("myField", Schema.create(Schema.Type.INT), "doc", Integer.MAX_VALUE + 1L);
> field.hasDefaultValue(); // true
> field.defaultValue(); // internal LongNode (2147483648)
> field.defaultVal(); // Long (2147483648)
> GenericData.get().getDefaultValue(field); // Integer (-2147483648)
> }{code}
> Additionally, since the underlying Schema.FIeld.defaultValue() is no longer public it's not possible for users to disable default value validation and reliably validate schemas independently.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)