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