Tom Lane wrote: > "Dave Page" <dpage@vale-housing.co.uk> writes: > > However.... In all but one place in libpq, we don't use errno anyway > > (actually 2, but one is a bug anyway) because we use GetLastError() > > instead (which tested thread safe as well FWIW). The only place it's > > used is PQoidValue(): > > > result = strtoul(res->cmdStatus + 7, &endptr, 10); > > > if (!endptr || (*endptr != ' ' && *endptr != '\0') || errno == > > ERANGE) > > return InvalidOid; > > else > > return (Oid) result; > > > We don't believe strtoul() works with GetLastError() unfortunately. One > > (hackish) solution would be to check that it doesn't return 0 or > > ULONG_MAX. > > I'm not sure why we bother with an overflow check there at all. It'd be > worth checking that there is a digit at cmdStatus + 7, but as long as > there is one, it's difficult to see why an overflow check is needed. > > The only justification that comes to mind is that if someday there are > versions of Postgres that have 64-bit OIDs, you could get an overflow > here if you had a 32-bit-OID libpq talking to a 64-bit server. However, > I don't see a particularly good reason to return InvalidOid instead of > an overflowed value anyway in that situation. For PQoidValue, > InvalidOid is supposed to mean "there is no OID in this command status" > not "there is an OID but I cannot represent it".
I disabled the check on Win32, and added a comment explaining why. We could disable it just when we use thread-safety, but changing the behavior for threading didn't seems wise. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/fe-exec.c =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v retrieving revision 1.170 diff -c -c -r1.170 fe-exec.c *** src/interfaces/libpq/fe-exec.c 2 Jul 2005 17:01:54 -0000 1.170 --- src/interfaces/libpq/fe-exec.c 12 Aug 2005 23:58:16 -0000 *************** *** 2166,2172 **** #endif result = strtoul(res->cmdStatus + 7, &endptr, 10); ! if (!endptr || (*endptr != ' ' && *endptr != '\0') || errno == ERANGE) return InvalidOid; else return (Oid) result; --- 2166,2180 ---- #endif result = strtoul(res->cmdStatus + 7, &endptr, 10); ! if (!endptr || (*endptr != ' ' && *endptr != '\0') ! #ifndef WIN32 ! /* ! * On WIN32, errno is not thread-safe and GetLastError() isn't set by ! * strtoul(), so we can't check on this platform. ! */ ! || errno == ERANGE ! #endif ! ) return InvalidOid; else return (Oid) result;
---------------------------(end of broadcast)--------------------------- TIP 3: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq