Adding John to CC because he is not subscribed. On Tue, Jul 30, 2024 at 8:32 PM Driesprong, Fokko <fo...@driesprong.frl> wrote:
> 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 > > >