Thread: PgSQL 7.4.2 - NaN on Tru64 UNIX
Hi guys. I have just had some problems resolved while building PostgreSQL 7.4.2 on Tru64 UNIX 5.1B. File "./src/backend/utils/adt/float.c" uses "NAN" on two spots. It ahs a fall-back definition of NAN as: #define NAN 0.0/0.0 This compiles on Tru64 4.0D (the compiler swallows it), but fails on Tru64 UNIX 5.1B. Both basic CC and DTK Compaq CC break on that file complaining on that constant evaluation. The best way to solve it is to use system definition of "Infinity Constants". This definition is best placed in src/include/port/osf1.h This will work on both 5.1B and 4.0D. This is the patch: Papa-Legba:/home/r/root/5.1/postgresql-7.4.2# diff -c src/include/port/osf.h_ORIG src/include/port/osf.h *** src/include/port/osf.h_ORIG Sun May 16 14:14:22 2004 --- src/include/port/osf.h Sun May 16 14:17:57 2004 *************** *** 5,7 **** --- 5,17 ---- /*typedef msemaphore slock_t;*/ #include <alpha/builtins.h> typedef volatile long slock_t; + + /* + * This is for NaN (Not a Number) definition. + * Note that general definition in PostgreSQL is not type specific, IOW, + * PgSQL's definition can be used in all floating point contexts. The + * definition given here is for "double NaN", since all sources using it + * are using it in "double float" context. + */ + #include <nan.h> + #define NAN DBL_INFINITY The compilation has went smoothly, I'll try to run regression tests. Will let you know if something fails. Nix.
Nikola Milutinovic wrote: > + #define NAN DBL_INFINITY > > The compilation has went smoothly, I'll try to run regression tests. > Will let you know if something fails. Hate to reply to myself, but here goes. With NAN defined as "DBL_INFINITY" I get 3 failed regression test, most notably "float8" test. With NAN defined as "DBL_QNAN" (double float Quiet NaN) I get just one, "float8". With NAN defined as "DBL_SNAN" (double float Signalling NaN) I get one error, "float8". The "problem" is the same in all three cases, an expression that is supposed to cause overflow, does so, but the output error text is slightly different. Here is the DIFF file: *** ./expected/float8.out Thu Sep 25 08:58:06 2003 --- ./results/float8.out Mon May 17 08:37:51 2004 *************** *** 247,253 **** SET f1 = FLOAT8_TBL.f1 * '-1' WHERE FLOAT8_TBL.f1 > '0.0'; SELECT '' AS bad, f.f1 * '1e200' from FLOAT8_TBL f; ! ERROR: type "double precision" value out of range: overflow SELECT '' AS bad, f.f1 ^ '1e200' from FLOAT8_TBL f; ERROR: result is out of range SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ; --- 247,254 ---- SET f1 = FLOAT8_TBL.f1 * '-1' WHERE FLOAT8_TBL.f1 > '0.0'; SELECT '' AS bad, f.f1 * '1e200' from FLOAT8_TBL f; ! ERROR: floating-point exception ! DETAIL: An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, suc h as division by zero. SELECT '' AS bad, f.f1 ^ '1e200' from FLOAT8_TBL f; ERROR: result is out of range SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ; *************** *** 270,276 **** -- test for over- and underflow INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400'); ! ERROR: "10e400" is out of range for type double precision INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400'); ERROR: "-10e400" is out of range for type double precision INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400'); --- 271,277 ---- -- test for over- and underflow INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400'); ! ERROR: invalid input syntax for type double precision: "10e400" INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400'); ERROR: "-10e400" is out of range for type double precision INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400'); ====================================================================== Any comments? Nix.
Both patches withdrawn by author. --------------------------------------------------------------------------- Nikola Milutinovic wrote: > Hi guys. > > I have just had some problems resolved while building PostgreSQL 7.4.2 > on Tru64 UNIX 5.1B. > > File "./src/backend/utils/adt/float.c" uses "NAN" on two spots. It ahs a > fall-back definition of NAN as: > > #define NAN 0.0/0.0 > > This compiles on Tru64 4.0D (the compiler swallows it), but fails on > Tru64 UNIX 5.1B. Both basic CC and DTK Compaq CC break on that file > complaining on that constant evaluation. The best way to solve it is to > use system definition of "Infinity Constants". This definition is best > placed in src/include/port/osf1.h This will work on both 5.1B and 4.0D. > > This is the patch: > > Papa-Legba:/home/r/root/5.1/postgresql-7.4.2# diff -c > src/include/port/osf.h_ORIG src/include/port/osf.h > *** src/include/port/osf.h_ORIG Sun May 16 14:14:22 2004 > --- src/include/port/osf.h Sun May 16 14:17:57 2004 > *************** > *** 5,7 **** > --- 5,17 ---- > /*typedef msemaphore slock_t;*/ > #include <alpha/builtins.h> > typedef volatile long slock_t; > + > + /* > + * This is for NaN (Not a Number) definition. > + * Note that general definition in PostgreSQL is not type specific, IOW, > + * PgSQL's definition can be used in all floating point contexts. The > + * definition given here is for "double NaN", since all sources using it > + * are using it in "double float" context. > + */ > + #include <nan.h> > + #define NAN DBL_INFINITY > > The compilation has went smoothly, I'll try to run regression tests. > Will let you know if something fails. > > Nix. > > ---------------------------(end of broadcast)--------------------------- > TIP 4: Don't 'kill -9' the postmaster > -- 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