[
https://issues.apache.org/jira/browse/AVRO-3674?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17634387#comment-17634387
]
Rik Heijdens commented on AVRO-3674:
------------------------------------
See this branch which reproduces the issue:
https://github.com/apache/avro/compare/master...privacy-com:avro:avro-3674?expand=1
`test_avro_3674_validate_no_namespace_resolution` demonstrates that when a
namespace is not utilized in the schema, the Value validates.
`test_avro_3674_validate_namespace_resolution` demonstrates that when a
namespace is utilized in the schema, the Value does not validate (revert commit
f2d778d8469b337b14ceee9066016da842d39aaa to check this)
> 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
> Priority: Major
>
> 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)