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

Michael A. Smith commented on AVRO-3229:
----------------------------------------

To be sure, the record schema is a bit of a distraction. Record fields can have 
a default, too, but what's at issue here is the enum schema's default. So for 
the test, I just used
{code:java}
{"type": "enum", "name": "bad_default", "symbols": ["A"], "default": "B"} {code}
[Hammer left a 
TODO|https://github.com/apache/avro/blob/57e0bbf961d0bffafe6dceddadc65f0defd84d80/lang/py/avro/schema.py#L348]
 in the code to check to ensure that record defaults are valid, but I did not 
fix that for this issue. I'll open a separate ticket for that.

> 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
>          Time Spent: 10m
>  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)

Reply via email to