Ryan Skraba created AVRO-3370:
---------------------------------

             Summary: [Spec] Inconsistent behaviour on types as invalid names.
                 Key: AVRO-3370
                 URL: https://issues.apache.org/jira/browse/AVRO-3370
             Project: Apache Avro
          Issue Type: Bug
            Reporter: Ryan Skraba


We've run across this in some code that interoperates between Java and Python.

The spec [currently 
forbids|https://avro.apache.org/docs/current/spec.html#names] using a primitive 
type name as a keyword: _*Primitive type names have no namespace and their 
names may not be defined in any namespace.*_
{code:java}
{"type":"record","name":"long","fields":[{"name":"a1","type":"long"}]} {code}
That fails in Java with {{"org.apache.avro.AvroTypeException: Schemas may not 
be named after primitives: long"}}

What do we expect to happen when a named schema uses a complex type?
{code:java}
{"type":"record","name":"record","fields":[{"name":"a1","type":"long"}]} {code}
This currently *succeeds* in Java and the schema can be used to serialize and 
deserialize data.

This currently *fails* in Python with: {{avro.schema.SchemaParseException: 
record is a reserved type name}}

Which one is the correct behaviour?

This gets a bit more complicated when we consider using the name as a reference.

The following two schemas both work in Java:
{code:java}
{"type":"record","name":"LinkedList",
"fields":[
  {"name":"value","type":"int},
  {"name":"next","type":["null","LinkedList"]}]}"  {code}
{code:java}
{"type":"record","name":"LinkedList",
"fields":[
  {"name":"value","type":"int},
  {"name":"next","type":["null",{"type":"LinkedList"}]}]}"  
{code}
If we rename {{LinkedList}} to {{record}} the former succeeds in Java and the 
latter fails with {{org.apache.avro.SchemaParseException: No name in schema: 
\{"type":"record"}}}

{{}}



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

Reply via email to