Thread: Conversion problem with unsigned long in psqlodbc-7.3.2

Conversion problem with unsigned long in psqlodbc-7.3.2

From
"Ruud Overeem"
Date:
Hi,

We just installed version 7.3.2 of the postgres ODBC driver on a RedHat
9.0 system. When testing the limits all the variable-types it appeared
that unsigned long values are stored correct in the database but we they
are read back we hit the LONG_MAX range.

E.g. assign the value 2345678901 to an unsigned long, write that to the
database and read it back. The database contains 2345678901 but the
unsigned long variable is set to LONG_MAX (2147483647).

Digging into the sources I think I found the problem. In convert.c at
line 1184 the code says:
case SQL_C_ULONG:
    len = 4;
    if (bind_size > 0)
        *((UDWORD *) rgbValueBindRow) = atol(neut_str);
    else
        *((UDWORD *) rgbValue + bind_row) = atol(neut_str);
    break;

The function atol only works for signed long integers. When you replace
'atol(neut_str)' with 'strtoul(neut_str, 0 , 10)' it works fine.


With kind Regards,


Ruud Overeem
Astron

Re: Conversion problem with unsigned long in psqlodbc-7.3.2

From
"Hiroshi Inoue"
Date:
> -----Original Message-----
> From: Ruud Overeem
>
> Hi,
>
> We just installed version 7.3.2 of the postgres ODBC driver
> on a RedHat
> 9.0 system. When testing the limits all the variable-types it appeared
> that unsigned long values are stored correct in the database
> but we they
> are read back we hit the LONG_MAX range.
>
> E.g. assign the value 2345678901 to an unsigned long, write
> that to the
> database and read it back. The database contains 2345678901 but the
> unsigned long variable is set to LONG_MAX (2147483647).
>
> Digging into the sources I think I found the problem. In convert.c at
> line 1184 the code says:
> case SQL_C_ULONG:
>     len = 4;
>     if (bind_size > 0)
>         *((UDWORD *) rgbValueBindRow) = atol(neut_str);
>     else
>         *((UDWORD *) rgbValue + bind_row) = atol(neut_str);
>     break;
>
> The function atol only works for signed long integers. When
> you replace
> 'atol(neut_str)' with 'strtoul(neut_str, 0 , 10)' it works fine.

I would take care of it.
Thanks.

Hiroshi Inoue