Andrew Peter Marlow created AVRO-3693:
-----------------------------------------

             Summary: avrogencpp Invalid type for union exception does not 
identify which union
                 Key: AVRO-3693
                 URL: https://issues.apache.org/jira/browse/AVRO-3693
             Project: Apache Avro
          Issue Type: Improvement
          Components: c++
    Affects Versions: 1.11.0
            Reporter: Andrew Peter Marlow


This is a small enhancement request for the avrogencpp code generator, to help 
identify a deserialisation issue better. When a structure sent by avro contains 
unions and a union part of a message is de-serialized without checking first 
that it is present, invalid type for union is thrown. However it does not 
identify which union. It could include the structName in the exception, then it 
would be possible to tie down the exception to the precise union that got the 
error.

If the file below, Empdetails.avsc is given to avrogencpp, it will show a 
get_int function for a union where the exception text does not identify the 
union.
{code:java}
{ 
   "type" : "record", 
   "namespace" : "tutorialspoint", 
   "name" : "Empdetails", 
   "fields" : 
   [ 
      { "name" : "experience", "type": ["int", "null"] }, { "name" : "age", 
"type": "int" } 
   ] 
} {code}
In this particular case there is only one union so there is no problem but when 
there are multiple unions they all get the same exception text so it is hard to 
tell from where the throw came.

I have the change waiting in the wings for a PR. The change includes the 
structName in the exception. With this change the avrogencpp generate code 
looks as follows:
{code:java}
inline
int32_t Empdetails_avsc_Union__0__::get_int() const {
    if (idx_ != 0) {
        throw avro::Exception("Invalid type for union 
Empdetails_avsc_Union__0__");
    }
    return std::any_cast<int32_t >(value_);
} {code}
With this done for every union in a structure it will be clear which throw has 
executed when the exception is reported.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to