[ https://issues.apache.org/jira/browse/AVRO-3576?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17583396#comment-17583396 ]
Kalle Niemitalo commented on AVRO-3576: --------------------------------------- I cannot reproduce this bug with version 1.11.0 or 1.11.1 of Apache.Avro.Tools. I copied the Avro schema from the description of this issue to a file "AVRO-3576.avsc" and executed on .NET SDK 6.0.303: {code:none} DOTNET_ROLL_FORWARD=Major dotnet avrogen -s AVRO-3576.avsc . {code} In the generated de/test/TestEvent.cs file, the Put method was as follows: {code:C#} public virtual void Put(int fieldPos, object fieldValue) { switch (fieldPos) { case 0: this.data_op = (de.test.Operation)fieldValue; break; default: throw new AvroRuntimeException("Bad index " + fieldPos + " in Put()"); }; } {code} i.e. it stores the value of the {{fieldValue}} parameter, rather than a constant. bq. The code line causing this issue is possibly the following one: [https://github.com/apache/avro/blob/6ef5709e6c53629b41890f9df3047554663d3727/lang/csharp/src/apache/main/CodeGen/CodeGen.cs#L812] No, that line affects the field definition rather than the Put method, i.e. it would add a default value here: {code:C#} private de.test.Operation _data_op; {code} But not even that happened now, because no default value was defined in the schema. [~DigitalFlow], can you show how to reproduce the bug? > [C#] Apache.Avro.Tools / CodeGen Enum Bug > ----------------------------------------- > > Key: AVRO-3576 > URL: https://issues.apache.org/jira/browse/AVRO-3576 > Project: Apache Avro > Issue Type: Bug > Components: csharp > Affects Versions: 1.11.0 > Reporter: Florian Krönert > Priority: Major > > We used Apache.Avro.Tools for generating our schema from a message. > Let's suppose our message only contains an enum "data_op" with the values "C" > / "U" / "D" / "S". > The schema generated looks like this: > > {code:java} > { > "type": "record", > "name": "TestEvent", > "namespace": "de.test", > "fields": [ > { > "name": "data_op", > "type": { > "type": "enum", > "name": "Operation", > "namespace": "de.test", > "symbols": [ > "C", > "U", > "D", > "S" > ] > } > } > ] > } {code} > > > The issue now is with the Put method. > It will be generated like this: > > {code:java} > public virtual void Put(int fieldPos, object fieldValue) > { > switch (fieldPos) > { > case 0: this.data_op = de.test.Operation.C; break; > default: throw new AvroRuntimeException("Bad index " + fieldPos + " in > Put()"); > }; > } {code} > As you can see, the generated Put method always uses the first value, which > was not even defined as default. > It seems that the Put method is also called when parsing the object. > This leads to our deserialized objects always having "C" as operation, > although the message contained a different value. > This seems to be a severe bug, as the parsed data is incorrect. > The code line causing this issue is possibly the following one: > [https://github.com/apache/avro/blob/6ef5709e6c53629b41890f9df3047554663d3727/lang/csharp/src/apache/main/CodeGen/CodeGen.cs#L812] > > In my opinion the default value should not be applied at all, as it is not > defined as default. > In addition to that, even with it being the default value this would be a > bug, as it should only be used if no value was passed. Right now it is always > the default value. > > I changed the generated code to > {code:java} > public virtual void Put(int fieldPos, object fieldValue) > { > switch (fieldPos) > { > case 0: this.data_op = (de.test.Operation) fieldValue; break; > default: throw new AvroRuntimeException("Bad index " + fieldPos + " in > Put()"); > }; > } {code} > And it started to work as expected -- This message was sent by Atlassian Jira (v8.20.10#820010)