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