You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Ryan Skraba (Jira)" <ji...@apache.org> on 2021/12/21 17:23:00 UTC

[jira] [Resolved] (AVRO-3229) Python Avro doesn't validate the default value of an enum field

     [ https://issues.apache.org/jira/browse/AVRO-3229?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ryan Skraba resolved AVRO-3229.
-------------------------------
    Fix Version/s: 1.11.1
       Resolution: Fixed

Cherry-picked to [branch-1.11|https://github.com/apache/avro/commit/ffc04f434f6be74ef6edd7c87eaa03fe2a3331e6].  Thanks!

> Python Avro doesn't validate the default value of an enum field
> ---------------------------------------------------------------
>
>                 Key: AVRO-3229
>                 URL: https://issues.apache.org/jira/browse/AVRO-3229
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: python
>    Affects Versions: 1.10.2
>         Environment: python --version
> Python 3.9.5
> pip freeze | grep avro
> avro==1.10.2
>            Reporter: Augusto Hack
>            Assignee: Michael A. Smith
>            Priority: Trivial
>              Labels: pull-request-available
>             Fix For: 1.11.1
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> The following schema is invalid for Java (it fails to compile), because the default value is not a valid symbol:
>  
> {code:java}
> {
>   "type": "record",
>   "name": "test_schema",
>   "fields": [
>     {
>       "name": "test_enum",
>       "type": {
>         "name": "test_enum_type",
>         "type": "enum",
>         "symbols": [
>           "NONE"
>         ],
>         "default": "UNKNOWN"
>       }
>     }
>   ]
> }
> {code}
> This matches the behavior documented in the spec:
>  
> {quote}default: A default value for this enumeration, used during resolution when the reader encounters a symbol from the writer that isn't defined in the reader's schema (optional). The value provided here must be a JSON *string that's a member of the symbols array*. See documentation on schema resolution for how this gets used.
> {quote}
> But the same schema is silently accepted by the python library (although the writer doesn't allow the invalid value to be produced):
> {code:java}
> import avro.schema
> from avro.datafile import DataFileReader, DataFileWriter
> from avro.io import DatumReader, DatumWriter
> with open("test.avsc", "rb") as handler:
>     schema = avro.schema.parse(handler.read())
> DATA_FILE = "test.avro"
> with open(DATA_FILE, "wb") as handler:
>     writer = DataFileWriter(handler, DatumWriter(), schema)
>     writer.append({"test_enum": "NONE"})
>     # writer.append({"test_enum": "UNKNOWN"})
>     # writer.append({})
>     writer.close()
> with open(DATA_FILE, "rb") as handler:
>     for user in DataFileReader(handler, DatumReader()):
>         print(user)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)