You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@avro.apache.org by "Ryan Skraba (Jira)" <ji...@apache.org> on 2023/06/16 07:29:00 UTC

[jira] [Resolved] (AVRO-3761) UUID validation breaks nullable field

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

Ryan Skraba resolved AVRO-3761.
-------------------------------
    Resolution: Fixed

> UUID validation breaks nullable field
> -------------------------------------
>
>                 Key: AVRO-3761
>                 URL: https://issues.apache.org/jira/browse/AVRO-3761
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: python
>    Affects Versions: 1.11.1
>         Environment: {code:perl}
> $ pip freeze | grep avro
> avro==1.11.1
> $ python --version
> Python 3.8.16
> {code}
>            Reporter: Anton Agestam
>            Assignee: Anton Agestam
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.11.2
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Using logical type UUID for a nullable field breaks when writing `None`.
> {code:python}
> import io
> import uuid
> from avro.io import DatumWriter, BinaryEncoder
> import avro.schema
> schema = avro.schema.parse("""
> {
>   "name": "Metadata",
>   "type": "record",
>   "fields": [
>     {
>       "name": "topic_id",
>       "type": [
>         {
>           "logicalType": "uuid",
>           "type": "string"
>         },
>         "null"
>       ]
>     }
>   ]
> }
> """)
> with io.BytesIO() as buffer:
>     writer = DatumWriter(schema)
>     encoder = BinaryEncoder(buffer)
>     # This works.
>     writer.write({"topic_id": uuid.uuid4().hex}, encoder)
>     # This breaks.
>     writer.write({"topic_id": None}, encoder)
> {code}
> Results in:
> {code:perl}
> Traceback (most recent call last):
>   File "reproduce-avro-uuid.py", line 32, in <module>
>     writer.write({"topic_id": None}, encoder)
>   File "/Users/anton/.pyenv/versions/karapace/lib/python3.8/site-packages/avro/io.py", line 1013, in write
>     validate(self.writers_schema, datum, raise_on_error=True)
>   File "/Users/anton/.pyenv/versions/karapace/lib/python3.8/site-packages/avro/io.py", line 142, in validate
>     validated_schema = current_node.schema.validate(current_node.datum)
>   File "/Users/anton/.pyenv/versions/karapace/lib/python3.8/site-packages/avro/schema.py", line 801, in validate
>     if branch.validate(datum) is not None:
>   File "/Users/anton/.pyenv/versions/karapace/lib/python3.8/site-packages/avro/schema.py", line 1048, in validate
>     val = uuid.UUID(datum)
>   File "/Users/anton/.pyenv/versions/3.8.16/lib/python3.8/uuid.py", line 165, in __init__
>     raise TypeError('one of the hex, bytes, bytes_le, fields, '
> TypeError: one of the hex, bytes, bytes_le, fields, or int arguments must be given
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)