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