[
https://issues.apache.org/jira/browse/THRIFT-5806?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jens Geyer updated THRIFT-5806:
-------------------------------
Component/s: Go - Library
> Inconsistent Handling of Unset Union Fields in Structs Across Languages
> -----------------------------------------------------------------------
>
> Key: THRIFT-5806
> URL: https://issues.apache.org/jira/browse/THRIFT-5806
> Project: Thrift
> Issue Type: Bug
> Components: Go - Library
> Reporter: Team_RPCtester
> Priority: Major
>
> Hi,
> We discover an inconsistent behavior regarding unset values in unions within
> structs. Specifically, when a union field in a struct is not explicitly set,
> Go will report an error. In contrast, other languages pass a null value,
> allowing for smooth transmission. This inconsistency can be illustrated with
> the following example:
> Thrift Definition:
>
> {code:java}
> namespace go commonResource
> union Union_1 {
> 1: bool uitem_1;
> 2: i16 uitem_2=1;
> }
> struct StructClass_0 {
> 1: required bool f_1=1,
> 2: Union_1 f_2
> }
> service DataService {
> StructClass_0 Method_1(1: StructClass_0 agr_method_1)
> }
> {code}
> The Go client side, when it passes the agr_method_1_0 to method_1, it will
> prompt “panic: runtime error: invalid memory address or nil pointer
> dereference”.
> {code:java}
> agr_method_1_0 := commonResource.NewStructClass_0()
> fmt.Println("Method_1 sends ", agr_method_1_0, " end")
> method_1_re_agr_method_1_0, err :=
> dataserviceclient.Method_1(context.Background(),agr_method_1_0)
> {code}
>
> The Node.js client does not check whether the union field is set or not and
> successfully passes the arg_Method_1 to the server.
>
> {code:java}
> const arg_Method_1 = new StructClass_0();
> console.log("Method_1 sends ", arg_Method_1, " end");
> // arg_Method_1 {"f_1":true,"f_2":null}
> try {
> const res_Method_1 = await client.Method_1(arg_Method_1);
> console.log("Method_1 receives ", JSON.stringify(res_Method_1, replacer), "
> back");
> } catch (error) {
> console.log("Method_1 receives error ", error, " back");
> }
> {code}
>
> The Python client behaves similarly to the Node.js client, not checking
> whether the union field is set and successfully passing the arg_Method_1 to
> the server.
>
> {code:java}
> agr_method_1 = StructClass_0()
> print("Method_1 sends ",agr_method_1, " end")
> try:
> method_1_re_agr_method_1 = client.Method_1(agr_method_1)
> print("Method_1 receives ",method_1_re_agr_method_1," back")
> except Exception as ex:
> print(f"Method_1 receives error {ex} back")
> {code}
>
> Can you help check this issue? Thank you.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)