[ 
https://issues.apache.org/jira/browse/AVRO-1750?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15244945#comment-15244945
 ] 

Ryan Blue commented on AVRO-1750:
---------------------------------

[~braden], could you take a look at the new patch?

> GenericDatum API behavior breaking change
> -----------------------------------------
>
>                 Key: AVRO-1750
>                 URL: https://issues.apache.org/jira/browse/AVRO-1750
>             Project: Avro
>          Issue Type: Bug
>          Components: c++
>    Affects Versions: 1.7.7
>            Reporter: Braden McDaniel
>            Assignee: Thiruvalluvan M. G.
>             Fix For: 1.9.0
>
>         Attachments: AVRO-1750.patch
>
>
> It appears that a change was introduced to the {{avro::GenericDatum}} 
> implementation between 1.7.6 and 1.7.7 that causes unions to be handled 
> differently.
> The 1.7.6 implementation does this:
> {noformat}
> inline Type AVRO_DECL GenericDatum::type() const {
>     return (type_ == AVRO_UNION) ?
>         boost::any_cast<GenericUnion>(&value_)->type() : type_;
> }
> template<typename T>
> const T& GenericDatum::value() const {
>     return (type_ == AVRO_UNION) ?
>         boost::any_cast<GenericUnion>(&value_)->value<T>() :
>         *boost::any_cast<T>(&value_);
> }
> template<typename T>
> T& GenericDatum::value() {
>     return (type_ == AVRO_UNION) ?
>         boost::any_cast<GenericUnion>(&value_)->value<T>() :
>         *boost::any_cast<T>(&value_);
> }
> {noformat}
> …whereas the 1.7.7 implementation does this:
> {noformat}
> /**
>  * The avro data type this datum holds.
>  */
> Type type() const {
>     return type_;
> }
> /**
>  * Returns the value held by this datum.
>  * T The type for the value. This must correspond to the
>  * avro type returned by type().
>  */
> template<typename T> const T& value() const {
>     return *boost::any_cast<T>(&value_);
> }
> /**
>  * Returns the reference to the value held by this datum, which
>  * can be used to change the contents. Please note that only
>  * value can be changed, the data type of the value held cannot
>  * be changed.
>  *
>  * T The type for the value. This must correspond to the
>  * avro type returned by type().
>  */
> template<typename T> T& value() {
>     return *boost::any_cast<T>(&value_);
> }
> {noformat}
> The result of this is that, if the underlying value is an {{AVRO_UNION}}, 
> calls to {{GenericDatum::type}} and {{GenericDatum::value<>}} that previously 
> resolved to the union member type no longer do so (and user code relying on 
> that behavior has been broken).
> This change apparently was made as part of the changes for AVRO-1474; 
> however, looking at the comments in that issue, it's not clear to me why it 
> was required for that fix.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to