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

Santiago Fraire Willemoes updated AVRO-4055:
--------------------------------------------
    Description: 
*Current state*
Rust parses the following schema correctly, without raising any errors:

{code}
{
  "type": "record",
  "name": "SampleSchema",
  "fields": [
    {
      "name": "order",
      "type": "record",
      "fields": [
        {
          "name": "order_number",
          "type": ["null", "string"],
          "default": null
        },
        { "name": "order_date", "type": "string" }
      ]
    }
  ]
}
{code}

*Desired state*
Rust returns an error with the previous schema

*What would a correct schema look like?*

Notice in this schema, the record has a "type", which itself has a record with 
"type" and "fields".
{code}
{
  "type": "record",
  "name": "SampleSchema",
  "fields": [
    {
      "name": "order",
      "type": {
        "type": "record",
        "name": "Order",
        "fields": [
          {
            "name": "order_number",
            "type": ["null", "string"],
            "default": null
          },
          { "name": "order_date", "type": "string" }
        ]
      }
    }
  ]
}
{code}


*Sample code*

{code}
use apache_avro::Schema;

let raw_schema = r#"
{
  "type": "record",
  "name": "SampleSchema",
  "fields": [
    {
      "name": "order",
      "type": "record",
      "fields": [
        {
          "name": "order_number",
          "type": ["null", "string"],
          "default": null
        },
        { "name": "order_date", "type": "string" }
      ]
    }
  ]
}
"#;

// if the schema is not valid, this function will return an error
let schema = Schema::parse_str(raw_schema).unwrap();

// schemas can be printed for debugging
println!("{:?}", schema);
{code}

Why is this important? Other tools like in Java are not able to parse this 
schema, making compatibility between different languages harder.

We've had issues using `avro-tools` to build the jars. We get the following 
error:

{code}
Exception in thread "main" org.apache.avro.SchemaParseException: "record" is 
not a defined name. The type of the "order" field must be a defined name or a 
{"type": ...} expression.
at org.apache.avro.Schema.parse(Schema.java:1734)
at org.apache.avro.Schema$Parser.parse(Schema.java:1471)
at org.apache.avro.Schema$Parser.parse(Schema.java:1433)
at org.apache.avro.tool.SpecificCompilerTool.run(SpecificCompilerTool.java:154)
at org.apache.avro.tool.Main.run(Main.java:67)
at org.apache.avro.tool.Main.main(Main.java:56)
{code}

I can try to fix it, let me know if you want me to send a PR.

Regards


  was:
*Current state*
Rust parses the following schema correctly, without raising any errors:

{code}
{
  "type": "record",
  "name": "SampleSchema",
  "fields": [
    {
      "name": "order",
      "type": "record",
      "fields": [
        {
          "name": "order_number",
          "type": ["null", "string"],
          "default": null
        },
        { "name": "order_date", "type": "string" }
      ]
    }
  ]
}
{code}

*Desired state*
Rust returns an error with the previous schema

*What would a correct schema look like?*

Notice in this schema, the record has a "type", which itself has a record with 
"type" and "fields".
{code}
{
  "type": "record",
  "name": "SampleSchema",
  "fields": [
    {
      "name": "order",
      "type": {
        "type": "record",
        "name": "Order",
        "fields": [
          {
            "name": "order_number",
            "type": ["null", "string"],
            "default": null
          },
          { "name": "order_date", "type": "string" }
        ]
      }
    }
  ]
}
{code}


*Sample code*

{code}
use apache_avro::Schema;

let raw_schema = r#"
{
  "type": "record",
  "name": "SampleSchema",
  "fields": [
    {
      "name": "order",
      "type": "record",
      "fields": [
        {
          "name": "order_number",
          "type": ["null", "string"],
          "default": null
        },
        { "name": "order_date", "type": "string" }
      ]
    }
  ]
}
"#;

// if the schema is not valid, this function will return an error
let schema = Schema::parse_str(raw_schema).unwrap();

// schemas can be printed for debugging
println!("{:?}", schema);
{code}

Why is this important? Other tools like in Java are not able to parse this 
schema, making compatibility between different languages harder.

We've had issues using `avro-tools` to build the jars. We get the following 
error:


I can try to fix it, let me know if you want me to send a PR.

Regards



> [rust] schema parsing invalid with nested records
> -------------------------------------------------
>
>                 Key: AVRO-4055
>                 URL: https://issues.apache.org/jira/browse/AVRO-4055
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: rust
>            Reporter: Santiago Fraire Willemoes
>            Priority: Major
>              Labels: rust
>
> *Current state*
> Rust parses the following schema correctly, without raising any errors:
> {code}
> {
>   "type": "record",
>   "name": "SampleSchema",
>   "fields": [
>     {
>       "name": "order",
>       "type": "record",
>       "fields": [
>         {
>           "name": "order_number",
>           "type": ["null", "string"],
>           "default": null
>         },
>         { "name": "order_date", "type": "string" }
>       ]
>     }
>   ]
> }
> {code}
> *Desired state*
> Rust returns an error with the previous schema
> *What would a correct schema look like?*
> Notice in this schema, the record has a "type", which itself has a record 
> with "type" and "fields".
> {code}
> {
>   "type": "record",
>   "name": "SampleSchema",
>   "fields": [
>     {
>       "name": "order",
>       "type": {
>         "type": "record",
>         "name": "Order",
>         "fields": [
>           {
>             "name": "order_number",
>             "type": ["null", "string"],
>             "default": null
>           },
>           { "name": "order_date", "type": "string" }
>         ]
>       }
>     }
>   ]
> }
> {code}
> *Sample code*
> {code}
> use apache_avro::Schema;
> let raw_schema = r#"
> {
>   "type": "record",
>   "name": "SampleSchema",
>   "fields": [
>     {
>       "name": "order",
>       "type": "record",
>       "fields": [
>         {
>           "name": "order_number",
>           "type": ["null", "string"],
>           "default": null
>         },
>         { "name": "order_date", "type": "string" }
>       ]
>     }
>   ]
> }
> "#;
> // if the schema is not valid, this function will return an error
> let schema = Schema::parse_str(raw_schema).unwrap();
> // schemas can be printed for debugging
> println!("{:?}", schema);
> {code}
> Why is this important? Other tools like in Java are not able to parse this 
> schema, making compatibility between different languages harder.
> We've had issues using `avro-tools` to build the jars. We get the following 
> error:
> {code}
> Exception in thread "main" org.apache.avro.SchemaParseException: "record" is 
> not a defined name. The type of the "order" field must be a defined name or a 
> {"type": ...} expression.
> at org.apache.avro.Schema.parse(Schema.java:1734)
> at org.apache.avro.Schema$Parser.parse(Schema.java:1471)
> at org.apache.avro.Schema$Parser.parse(Schema.java:1433)
> at 
> org.apache.avro.tool.SpecificCompilerTool.run(SpecificCompilerTool.java:154)
> at org.apache.avro.tool.Main.run(Main.java:67)
> at org.apache.avro.tool.Main.main(Main.java:56)
> {code}
> I can try to fix it, let me know if you want me to send a PR.
> Regards



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

Reply via email to