Skip site navigation (1) Skip section navigation (2)

Problem with high OIDs because of changed atol behaviour

From: "Jan-Peter Seifert" <Jan-Peter(dot)Seifert(at)gmx(dot)de>
To: pgsql-odbc(at)postgresql(dot)org
Subject: Problem with high OIDs because of changed atol behaviour
Date: 2011-01-14 15:00:49
Message-ID: 20110114150049.266580@gmx.net (view raw or flat)
Thread:
Lists: pgsql-odbc
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?

Thank you very much,

Peter
-- 
Neu: GMX De-Mail - Einfach wie E-Mail, sicher wie ein Brief!  
Jetzt De-Mail-Adresse reservieren: http://portal.gmx.net/de/go/demail

Responses

pgsql-odbc by date

Next:From: Hiroshi InoueDate: 2011-01-16 10:18:19
Subject: Re: Problem with high OIDs because of changed atol behaviour
Previous:From: Christopher HotchkissDate: 2011-01-12 13:06:03
Subject: Using bytea as an argument.

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group