1#include <stdio.h> 2#include <stdlib.h> 3#include <float.h> 4#include <math.h> 5#include <pgtypes_numeric.h> 6#include <decimal.h> 7 8exec sql include ../regression; 9 10#ifdef WIN32 11#if (_MSC_VER < 1800) 12#define isinf(x) ((_fpclass(x) == _FPCLASS_PINF) || (_fpclass(x) == _FPCLASS_NINF)) 13#define isnan(x) _isnan(x) 14#endif 15#endif /* WIN32 */ 16 17int 18main(void) 19{ 20 exec sql begin declare section; 21 int id, loopcount; 22 double d; 23 numeric *num; 24 char val[16]; 25 exec sql end declare section; 26 27 ECPGdebug(1, stderr); 28 exec sql whenever sqlerror do sqlprint(); 29 30 exec sql connect to REGRESSDB1; 31 32 exec sql create table nantest1 (id int4, d float8); 33 exec sql insert into nantest1 (id, d) values (1, 'nan'::float8), (2, 'infinity'::float8), (3, '-infinity'::float8); 34 35 exec sql declare cur cursor for select id, d, d from nantest1; 36 exec sql open cur; 37 for (loopcount = 0; loopcount < 100; loopcount++) 38 { 39 exec sql fetch from cur into :id, :d, :val; 40 if (sqlca.sqlcode) 41 break; 42 if (isnan(d)) 43 printf("%d NaN '%s'\n", id, val); 44 else if (isinf(d)) 45 printf("%d %sInf '%s'\n", id, (d < 0 ? "-" : "+"), val); 46 47 exec sql insert into nantest1 (id, d) values (:id + 3, :d); 48 exec sql insert into nantest1 (id, d) values (:id + 6, :val); 49 } 50 exec sql close cur; 51 52 exec sql open cur; 53 for (loopcount = 0; loopcount < 100; loopcount++) 54 { 55 exec sql fetch from cur into :id, :d, :val; 56 if (sqlca.sqlcode) 57 break; 58 if (isinf(d)) 59 printf("%d %sInf '%s'\n", id, (d < 0 ? "-" : "+"), val); 60 if (isnan(d)) 61 printf("%d NaN '%s'\n", id, val); 62 } 63 exec sql close cur; 64 65 num = PGTYPESnumeric_new(); 66 67 exec sql create table nantest2 (id int4, d numeric); 68 exec sql insert into nantest2 (id, d) values (4, 'nan'::numeric); 69 70 exec sql select id, d, d into :id, :num, :val from nantest2 where id = 4; 71 72 printf("%d %s '%s'\n", id, (num->sign == NUMERIC_NAN ? "NaN" : "not NaN"), val); 73 74 exec sql insert into nantest2 (id, d) values (5, :num); 75 exec sql insert into nantest2 (id, d) values (6, :val); 76 77 exec sql declare cur1 cursor for select id, d, d from nantest2; 78 exec sql open cur1; 79 for (loopcount = 0; loopcount < 100; loopcount++) 80 { 81 exec sql fetch from cur1 into :id, :num, :val; 82 if (sqlca.sqlcode) 83 break; 84 printf("%d %s '%s'\n", id, (num->sign == NUMERIC_NAN ? "NaN" : "not NaN"), val); 85 } 86 exec sql close cur1; 87 88 PGTYPESnumeric_free(num); 89 90 exec sql rollback; 91 exec sql disconnect; 92 93 return 0; 94} 95