Re: Problem with high OIDs because of changed atol behaviour

From: Hiroshi Inoue <inoue(at)tpf(dot)co(dot)jp>
To: Jan-Peter Seifert <Jan-Peter(dot)Seifert(at)gmx(dot)de>
Cc: pgsql-odbc(at)postgresql(dot)org
Subject: Re: Problem with high OIDs because of changed atol behaviour
Date: 2011-01-16 10:18:19
Message-ID: 4D32C5EB.1060401@tpf.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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 clamped to 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 and values 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 parameter handler 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

In response to

Responses

Browse pgsql-odbc by date

  From Date Subject
Next Message Kim Mortensen 2011-01-21 14:29:07 problem connecting via ODBC when unicode (now in correct forum.).
Previous Message Jan-Peter Seifert 2011-01-14 15:00:49 Problem with high OIDs because of changed atol behaviour