1#include <stdlib.h>
2#include <string.h>
3
4exec sql include ../regression;
5exec sql include sqlda.h;
6
7exec sql whenever sqlerror stop;
8
9sqlda_t	*sqlda1, *sqlda2, *sqlda3;
10
11int
12main (void)
13{
14exec sql begin declare section;
15	char	*stmt1 = "SELECT id, t FROM descr_t1";
16	char	*stmt2 = "SELECT id, t FROM descr_t1 WHERE id = -1";
17	int	i, count1, count2;
18	char	field_name1[30] = "not set";
19	char	field_name2[30] = "not set";
20exec sql end declare section;
21
22	char msg[128];
23
24	ECPGdebug(1, stderr);
25
26	strcpy(msg, "connect");
27	exec sql connect to REGRESSDB1;
28
29	strcpy(msg, "set");
30	exec sql set datestyle to iso;
31
32	strcpy(msg, "create");
33	exec sql create table descr_t1(id serial primary key, t text);
34
35	strcpy(msg, "insert");
36	exec sql insert into descr_t1(id, t) values (default, 'a');
37	exec sql insert into descr_t1(id, t) values (default, 'b');
38	exec sql insert into descr_t1(id, t) values (default, 'c');
39	exec sql insert into descr_t1(id, t) values (default, 'd');
40
41	strcpy(msg, "commit");
42	exec sql commit;
43
44	/*
45	 * Test DESCRIBE with a query producing tuples.
46	 * DESCRIPTOR and SQL DESCRIPTOR are NOT the same in
47	 * Informix-compat mode.
48	 */
49
50	strcpy(msg, "allocate");
51	exec sql allocate descriptor desc1;
52	exec sql allocate descriptor desc2;
53
54	strcpy(msg, "prepare");
55	exec sql prepare st_id1 FROM :stmt1;
56
57	sqlda1 = sqlda2 = sqlda3 = NULL;
58
59	strcpy(msg, "describe");
60	exec sql describe st_id1 into sql descriptor desc1;
61	exec sql describe st_id1 using sql descriptor desc2;
62
63	exec sql describe st_id1 into descriptor sqlda1;
64	exec sql describe st_id1 using descriptor sqlda2;
65	exec sql describe st_id1 into sqlda3;
66
67	if (sqlda1 == NULL)
68	{
69		printf("sqlda1 NULL\n");
70		exit(1);
71	}
72
73	if (sqlda2 == NULL)
74	{
75		printf("sqlda2 NULL\n");
76		exit(1);
77	}
78
79	if (sqlda3 == NULL)
80	{
81		printf("sqlda3 NULL\n");
82		exit(1);
83	}
84
85	strcpy(msg, "get descriptor");
86	exec sql get descriptor desc1 :count1 = count;
87	exec sql get descriptor desc1 :count2 = count;
88
89	if (count1 != count2)
90	{
91		printf("count1 (%d) != count2 (%d)\n", count1, count2);
92		exit(1);
93	}
94
95	if (count1 != sqlda1->sqld)
96	{
97		printf("count1 (%d) != sqlda1->sqld (%d)\n", count1, sqlda1->sqld);
98		exit(1);
99	}
100
101	if (count1 != sqlda2->sqld)
102	{
103		printf("count1 (%d) != sqlda2->sqld (%d)\n", count1, sqlda2->sqld);
104		exit(1);
105	}
106
107	if (count1 != sqlda3->sqld)
108	{
109		printf("count1 (%d) != sqlda3->sqld (%d)\n", count1, sqlda3->sqld);
110		exit(1);
111	}
112
113	for (i = 1; i <= count1; i++)
114	{
115		exec sql get descriptor desc1 value :i :field_name1 = name;
116		exec sql get descriptor desc2 value :i :field_name2 = name;
117		printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
118			"sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
119			i, field_name1, field_name2,
120			sqlda1->sqlvar[i-1].sqlname,
121			sqlda2->sqlvar[i-1].sqlname,
122			sqlda3->sqlvar[i-1].sqlname);
123	}
124
125	strcpy(msg, "deallocate");
126	exec sql deallocate descriptor desc1;
127	exec sql deallocate descriptor desc2;
128	free(sqlda1);
129	free(sqlda2);
130	free(sqlda3);
131
132	exec sql deallocate prepare st_id1;
133
134	/* Test DESCRIBE with a query not producing tuples */
135
136	strcpy(msg, "allocate");
137	exec sql allocate descriptor desc1;
138	exec sql allocate descriptor desc2;
139
140	strcpy(msg, "prepare");
141	exec sql prepare st_id2 FROM :stmt2;
142
143	sqlda1 = sqlda2 = sqlda3 = NULL;
144
145	strcpy(msg, "describe");
146	exec sql describe st_id2 into sql descriptor desc1;
147	exec sql describe st_id2 using sql descriptor desc2;
148
149	exec sql describe st_id2 into descriptor sqlda1;
150	exec sql describe st_id2 using descriptor sqlda2;
151	exec sql describe st_id2 into sqlda3;
152
153	if (sqlda1 == NULL || sqlda2 == NULL || sqlda3 == NULL)
154		exit(1);
155
156	strcpy(msg, "get descriptor");
157	exec sql get descriptor desc1 :count1 = count;
158	exec sql get descriptor desc1 :count2 = count;
159
160	if (!(	count1 == count2 &&
161		count1 == sqlda1->sqld &&
162		count1 == sqlda2->sqld &&
163		count1 == sqlda3->sqld))
164		exit(1);
165
166	for (i = 1; i <= count1; i++)
167	{
168		exec sql get descriptor desc1 value :i :field_name1 = name;
169		exec sql get descriptor desc2 value :i :field_name2 = name;
170		printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
171			"sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
172			i, field_name1, field_name2,
173			sqlda1->sqlvar[i-1].sqlname,
174			sqlda2->sqlvar[i-1].sqlname,
175			sqlda3->sqlvar[i-1].sqlname);
176	}
177
178	strcpy(msg, "deallocate");
179	exec sql deallocate descriptor desc1;
180	exec sql deallocate descriptor desc2;
181	free(sqlda1);
182	free(sqlda2);
183	free(sqlda3);
184
185	exec sql deallocate prepare st_id2;
186
187	/* End test */
188
189	strcpy(msg, "drop");
190	exec sql drop table descr_t1;
191
192	strcpy(msg, "commit");
193	exec sql commit;
194
195	strcpy(msg, "disconnect");
196	exec sql disconnect;
197
198	return (0);
199}
200