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