[freetds] tds_get_size_by_type for SYBMSDATE

LacaK lacak at zoznam.sk
Thu Apr 10 03:48:49 EDT 2014


>
> 24 ?? On my 64 bit machine is 16 and should be 16.
I did some testing and googling and it seems, that inter - padding in 
structures can vary compiler to compiler.
(as C++ standard does not strictly defines binary layout)
It seems, that Microsoft uses his "own padding and sizing" with bit-fields.

I did small change in TDS_DATETIMEALL, which gives me now 16 bytes size 
(as in your case):
typedef struct
{
    TDS_UINT8    time;    /* time, 7 digit precision */
    TDS_INT      date;    /* date, 0 = 1900-01-01 */
    TDS_SMALLINT offset;    /* time offset */
// HERE "unsigned short" instead of "unsigned":
    unsigned short time_prec:4;
    unsigned short has_time:1;
    unsigned short has_date:1;
    unsigned short has_offset:1;
} TDS_DATETIMEALL;

So now we have: 8 bytes + 4 bytes + 2 bytes + 2 bytes = 16 bytes (seems, 
that no padding occurs at end because 16 mod 8 = 0)
Can you change please "unsigned" to "unsigned short" in definition of 
TDS_DATETIMEALL ?
-Laco.


More information about the FreeTDS mailing list