You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Rik Heijdens (Jira)" <ji...@apache.org> on 2022/11/15 14:34:00 UTC

[jira] [Created] (AVRO-3674) Value::Record containing enums fail to validate when using namespaces in Schema

Rik Heijdens created AVRO-3674:
----------------------------------

             Summary: Value::Record containing enums fail to validate when using namespaces in Schema
                 Key: AVRO-3674
                 URL: https://issues.apache.org/jira/browse/AVRO-3674
             Project: Apache Avro
          Issue Type: Bug
          Components: rust
            Reporter: Rik Heijdens


Consider the following schema:

{noformat}
{
    "type": "record",
    "name": "NamespacedMessage",
    "namespace": "com.domain",
    "fields": [
        {
            "type": "record",
            "name": "field_a",
            "fields": [
                {
                    "name": "enum_a",
                    "type": {
                        "type": "enum",
                        "name": "EnumType",
                        "symbols": [
                            "SYMBOL_1",
                            "SYMBOL_2"
                        ],
                        "default": "SYMBOL_1"
                    }
                },
                {
                    "name": "enum_b",
                    "type": "EnumType"
                }
            ]
        }
    ]
}{noformat}

I might represent this in Rust using the following structs:

{noformat}
#[derive(Serialize)]
enum EnumType {
    #[serde(rename = "SYMBOL_1")]
    Symbol1,
    #[serde(rename = "SYMBOL_2")]
    Symbol2,
}

#[derive(Serialize)]
struct FieldA {
    enum_a: EnumType,
    enum_b: EnumType,
}

#[derive(Serialize)]
struct NamespacedMessage {
    field_a: FieldA,
}

let msg = NamespacedMessage {
    field_a: FieldA {
        enum_a: EnumType::Symbol2,
        enum_b: EnumType::Symbol1,
    },
};
{noformat}

and then serialize this into a `Value` using the following logic:


{noformat}
let mut ser = Serializer::default();
let test_value: Value = msg.serialize(&mut ser).unwrap();
{noformat}

After serializing into `test_value` I would expect that `test_value.validate(&schema)` yields True. However this is not the case.

I can work around it by removing the `namespace` definition from my schema which allows the validation to proceed.

I believe the cause of schema validation failure is [this lookup failing](https://github.com/apache/avro/blob/release-1.11.1-rc1/lang/rust/avro/src/types.rs#L370) when schemas are utilized as the `Value` will not have a namespace associated with it.

I believe this could be fixed by altering `validate_internal` to accept an optional namespace that is derived from the provided schema to `validate`. However, I'm not sure if this is an appropriate fix.




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