Team_RPCtester created THRIFT-5806: -------------------------------------- Summary: 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 Reporter: Team_RPCtester
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)