Hey John,

Would you be interested in fixing this? Feel free to open up a pull request
on Github including some tests to capture this behavior.

Kind regards,
Fokko

Op di 30 jul 2024 om 17:44 schreef John Dickson <jmdick...@gmail.com>:

> AVRO-3601 fixed the install issue, but any schema with non-string custom
> attributes now fails to compile with an exception.
> For example the following IDL generates a schema that cannot be used in C++
> 1.11.2, while it worked in earlier versions:
>
> protocol A {
> record Test {
>   string @extra({"custom1":"value", "custom2": true}) f1;
> }
> }
>
> schema:
> {
>   "type": "record",
>   "name": "Test",
>   "fields": [ {
>     "name": "f1",
>     "type": "string",
>     "extra": {
>       "custom1": "value",
>       "custom2": true
>     }
>   } ]
> }
>
> The following patch allows the schema to compile while maintaining the
> current behavior for string attributes, but leaves it ambiguous if the
> content of the string is also a valid JSON value.
>
>
> ~/projects/libraries/avro$ git diff lang/c++/impl/Compiler.cc
> lang/c++/test/SchemaTests.cc
> diff --git a/lang/c++/impl/Compiler.cc b/lang/c++/impl/Compiler.cc
> index 383798c4d..e5990e6e2 100644
> --- a/lang/c++/impl/Compiler.cc
> +++ b/lang/c++/impl/Compiler.cc
> @@ -275,7 +275,11 @@ static void getCustomAttributes(const Object& m,
> CustomAttributes &customAttribu
>    const std::unordered_set<std::string>& kKnownFields = getKnownFields();
>    for (const auto &entry : m) {
>      if (kKnownFields.find(entry.first) == kKnownFields.end()) {
> -      customAttributes.addAttribute(entry.first,
> entry.second.stringValue());
> +      if (entry.second.type() == json::EntityType::String) {
> +        customAttributes.addAttribute(entry.first,
> entry.second.stringValue());
> +      } else {
> +        customAttributes.addAttribute(entry.first,
> entry.second.toString());
> +      }
>      }
>    }
>  }
> diff --git a/lang/c++/test/SchemaTests.cc b/lang/c++/test/SchemaTests.cc
> index d73b759cf..ee1014510 100755
> --- a/lang/c++/test/SchemaTests.cc
> +++ b/lang/c++/test/SchemaTests.cc
> @@ -112,6 +112,8 @@ const char *basicSchemas[] = {
>      "{\"type\": \"record\",\"name\": \"Test\",\"fields\": "
>          "[{\"name\": \"f1\",\"type\": \"long\","
>          "\"extra field1\": \"1\",\"extra field2\": \"2\"}]}"
> +    ,R"({"type": "record","name": "Test","fields":
> +        [{"name": "f1","type": "string", "extra": {"custom1":
> "value","custom2": true }}]})"
>  };
>
>  const char *basicSchemaErrors[] = {
>
>
> To get rid of the ambiguity at the cost of altering the existing behavior,
> you could just change Compiler.cc line 278 from:
> customAttributes.addAttribute(entry.first, entry.second.stringValue());
> to:
> customAttributes.addAttribute(entry.first, entry.second.toString());
>
> Thanks,
> John
>

Reply via email to