[ 
https://issues.apache.org/jira/browse/THRIFT-3703?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tom Deering updated THRIFT-3703:
--------------------------------
    Description: 
Go code for unions generated by Thrift 0.9.3 fails to consider map/set/list 
fields of a union when enforcing that the number of fields set is 1. For 
example:

{code}
union Foo{
        1: map<bool, bool> u1,
        2: bool u2,
}
{code}

Produces Go code:

{code}
type Foo struct {
        U1 map[bool]bool `thrift:"u1,1" json:"u1,omitempty"`
        U2 *bool         `thrift:"u2,2" json:"u2,omitempty"`
}
func (p *Foo) CountSetFieldsFoo() int {
        count := 0
        if p.IsSetU2() {
                count++
        }
        return count
}
...
func (p *Foo) Write(oprot thrift.TProtocol) error {
        if c := p.CountSetFieldsFoo(); c != 1 {
                return fmt.Errorf("%T write union: exactly one field must be 
set (%d set).", p, c)
        }
...
{code}

Due to this bug, Thrift will complain that a union with only field u1 set has 
no fields set.

  was:
Go code for unions generated by Thrift 0.9.3 fails to consider map fields of a 
union when enforcing that the number of fields set is 1. For example:

{code}
union Foo{
        1: map<bool, bool> u1,
        2: bool u2,
}
{code}

Produces Go code:

{code}
type Foo struct {
        U1 map[bool]bool `thrift:"u1,1" json:"u1,omitempty"`
        U2 *bool         `thrift:"u2,2" json:"u2,omitempty"`
}
func (p *Foo) CountSetFieldsFoo() int {
        count := 0
        if p.IsSetU2() {
                count++
        }
        return count
}
...
func (p *Foo) Write(oprot thrift.TProtocol) error {
        if c := p.CountSetFieldsFoo(); c != 1 {
                return fmt.Errorf("%T write union: exactly one field must be 
set (%d set).", p, c)
        }
...
{code}

Due to this bug, Thrift will complain that a union with only field u1 set has 
no fields set.


> Unions Field Count Does Not Consider Map/Set/List Fields
> --------------------------------------------------------
>
>                 Key: THRIFT-3703
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3703
>             Project: Thrift
>          Issue Type: Bug
>          Components: Go - Compiler
>    Affects Versions: 0.9.3
>         Environment: Ubuntu 15.10
>            Reporter: Tom Deering
>              Labels: golang, thrift, union
>
> Go code for unions generated by Thrift 0.9.3 fails to consider map/set/list 
> fields of a union when enforcing that the number of fields set is 1. For 
> example:
> {code}
> union Foo{
>       1: map<bool, bool> u1,
>       2: bool u2,
> }
> {code}
> Produces Go code:
> {code}
> type Foo struct {
>       U1 map[bool]bool `thrift:"u1,1" json:"u1,omitempty"`
>       U2 *bool         `thrift:"u2,2" json:"u2,omitempty"`
> }
> func (p *Foo) CountSetFieldsFoo() int {
>       count := 0
>       if p.IsSetU2() {
>               count++
>       }
>       return count
> }
> ...
> func (p *Foo) Write(oprot thrift.TProtocol) error {
>       if c := p.CountSetFieldsFoo(); c != 1 {
>               return fmt.Errorf("%T write union: exactly one field must be 
> set (%d set).", p, c)
>       }
> ...
> {code}
> Due to this bug, Thrift will complain that a union with only field u1 set has 
> no fields set.



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

Reply via email to