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 >