Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
0.9.2
-
None
-
Windows 8, Hive1.1.0, HiveServer2
Description
I'm currently using HiveServer2 with thrift.dll library. If I try to make a tuple from a thrift object, I expect that fields that were not set in the object, are marked null in tuple. However instead default values are put into the tuple. E.g.
HqlConnection con = new HqlConnection("localhost", 10001, HiveServer.HiveServer2); con.Open(); HqlCommand createCommand1 = new HqlCommand("select id,name,age,DOB,marks from engineer_list", con); createCommand1.ExecuteNonQuery(); HqlDataReader reader = createCommand1.ExecuteReader();
expected output should be
{(1,'John',24,2010-01-01 10:22:47,45.6), (2,null,null,null,null)}but actual result was:
{(1,'John',24,2010-01-01 10:22:47,45.6), (2,,,0,0)}When we send request to call numeric column which contain NULL value for a type (int, double, long, float..) means ‘thrift.dll’ itself return as zero instead of 'null' or 'DBNull.value'.
For string, timestamp type mean 'thrift.dll' itself return as empty string instead of 'null' or 'DBNull.value'.
By analyzing the source of thrift.dll, we trigger out the method for reading the column by following
Class: Thrift.Protocol.TBinaryProtocol
Method: ReadAll(buffer, offset, length) by default it return as zero.
Description: This will get stream of data from thriftServer port
For Int value following method are call this will return as '0' if data contain 'null'
private byte[] i32in = new byte[4]; public override int ReadI32() { ReadAll(i32in, 0, 4); return (int)(((i32in[0] & 0xff) << 24) | ((i32in[1] & 0xff) << 16) | ((i32in[2] & 0xff) << 8) | ((i32in[3] & 0xff))); }