Re: Problem with high OIDs because of changed atol behaviour
От | Hiroshi Inoue |
---|---|
Тема | Re: Problem with high OIDs because of changed atol behaviour |
Дата | |
Msg-id | 4D32C5EB.1060401@tpf.co.jp обсуждение исходный текст |
Ответ на | Problem with high OIDs because of changed atol behaviour ("Jan-Peter Seifert" <Jan-Peter.Seifert@gmx.de>) |
Ответы |
Re: Problem with high OIDs because of changed atol behaviour
|
Список | pgsql-odbc |
Hi, (2011/01/15 0:00), Jan-Peter Seifert wrote: > Hello, > > we ran into a problem because a Windows 32 bit application is looking for rows within the tables of pg_catalog via OID- using psqlODBC (32 bit). > As OIDs are unsigned they can be of higher value than INT_MAX. However, OIDs greater than INT_MAX seem to be getting clampedto INT_MAX: > http://archives.postgresql.org/pgsql-admin/2011-01/msg00003.php > > The problem still persists in psqlodbc 09.00.0200. > > We had a look at the sources of v08.04.0200 to get a clue: > > convert.c: > > /* > * Macros for unsigned long handling. > */ > #ifdef WIN32 > #define ATOI32U atol > #elif defined(HAVE_STRTOUL) > #define ATOI32U(val) strtoul(val, NULL, 10) > #else /* HAVE_STRTOUL */ > #define ATOI32U atol > #endif /* WIN32 */ > > > /* > * Macros for BIGINT handling. > */ > #ifdef ODBCINT64 > #ifdef WIN32 > #define ATOI64 _atoi64 > #define ATOI64U _atoi64 > #define FORMATI64 "%I64d" > #define FORMATI64U "%I64u" > #elif (SIZEOF_LONG == 8) > … > > It seems that as of Microsoft Visual C++ 2005 values exceeding the positive integer limit let atol return LONG_MAX andvalues exceeding the negative integer limit let atol return LONG_MIN. > In case of these overflows errno is set to ERANGE. If the parameter that has been passed is NULL, the invalid parameterhandler is being invoked - as described in parameter validation. > If resuming of execution is allowed these functions set errno to EINVAL and return 0. > > In Microsoft Visual C++ 2003 (and earlier versions) there was no such error handling of these overflows. > > We suggest some changes within convert.c that might solve this problem: > > /* > * Macros for unsigned long handling. > */ > #ifdef WIN32 > #define ATOI32U(val) strtoul(val, NULL, 10) > #elif defined(HAVE_STRTOUL) > #define ATOI32U(val) strtoul(val, NULL, 10) > #else /* HAVE_STRTOUL */ > #define ATOI32U atol > #endif /* WIN32 */ > > > /* > * Macros for BIGINT handling. > */ > #ifdef ODBCINT64 > #ifdef WIN32 > #define ATOI64(val) _strtoi64(val, NULL, 10) > #define ATOI64U(val) _strtoui64(val, NULL, 10) > #define FORMATI64 "%I64d" > #define FORMATI64U "%I64u" > #elif (SIZEOF_LONG == 8) > … > > Could look into this, please? Thanks for your investigation. I would take of it. regards, Hiroshi Inoue
В списке pgsql-odbc по дате отправления: