#include #include exec sql include ../regression; exec sql include sqlda.h; exec sql whenever sqlerror stop; sqlda_t *sqlda1, *sqlda2, *sqlda3; int main (void) { exec sql begin declare section; char *stmt1 = "SELECT id, t FROM descr_t2"; char *stmt2 = "SELECT id, t FROM descr_t2 WHERE id = -1"; int i, count1, count2; char field_name1[30] = "not set"; char field_name2[30] = "not set"; exec sql end declare section; char msg[128]; ECPGdebug(1, stderr); strcpy(msg, "connect"); exec sql connect to REGRESSDB1; strcpy(msg, "set"); exec sql set datestyle to iso; strcpy(msg, "create"); exec sql create table descr_t2(id serial primary key, t text); strcpy(msg, "insert"); exec sql insert into descr_t2(id, t) values (default, 'a'); exec sql insert into descr_t2(id, t) values (default, 'b'); exec sql insert into descr_t2(id, t) values (default, 'c'); exec sql insert into descr_t2(id, t) values (default, 'd'); strcpy(msg, "commit"); exec sql commit; /* * Test DESCRIBE with a query producing tuples. * DESCRIPTOR and SQL DESCRIPTOR are NOT the same in * Informix-compat mode. */ strcpy(msg, "allocate"); exec sql allocate descriptor desc1; exec sql allocate descriptor desc2; strcpy(msg, "prepare"); exec sql prepare st_id1 FROM :stmt1; sqlda1 = sqlda2 = sqlda3 = NULL; strcpy(msg, "describe"); exec sql describe st_id1 into sql descriptor desc1; exec sql describe st_id1 using sql descriptor desc2; exec sql describe st_id1 into descriptor sqlda1; exec sql describe st_id1 using descriptor sqlda2; exec sql describe st_id1 into sqlda3; if (sqlda1 == NULL) { printf("sqlda1 NULL\n"); exit(1); } if (sqlda2 == NULL) { printf("sqlda2 NULL\n"); exit(1); } if (sqlda3 == NULL) { printf("sqlda3 NULL\n"); exit(1); } strcpy(msg, "get descriptor"); exec sql get descriptor desc1 :count1 = count; exec sql get descriptor desc1 :count2 = count; if (count1 != count2) { printf("count1 (%d) != count2 (%d)\n", count1, count2); exit(1); } if (count1 != sqlda1->sqld) { printf("count1 (%d) != sqlda1->sqld (%d)\n", count1, sqlda1->sqld); exit(1); } if (count1 != sqlda2->sqld) { printf("count1 (%d) != sqlda2->sqld (%d)\n", count1, sqlda2->sqld); exit(1); } if (count1 != sqlda3->sqld) { printf("count1 (%d) != sqlda3->sqld (%d)\n", count1, sqlda3->sqld); exit(1); } for (i = 1; i <= count1; i++) { exec sql get descriptor desc1 value :i :field_name1 = name; exec sql get descriptor desc2 value :i :field_name2 = name; printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t" "sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n", i, field_name1, field_name2, sqlda1->sqlvar[i-1].sqlname.data, sqlda2->sqlvar[i-1].sqlname.data, sqlda3->sqlvar[i-1].sqlname.data); } strcpy(msg, "deallocate"); exec sql deallocate descriptor desc1; exec sql deallocate descriptor desc2; free(sqlda1); free(sqlda2); free(sqlda3); exec sql deallocate prepare st_id1; /* Test DESCRIBE with a query not producing tuples */ strcpy(msg, "allocate"); exec sql allocate descriptor desc1; exec sql allocate descriptor desc2; strcpy(msg, "prepare"); exec sql prepare st_id2 FROM :stmt2; sqlda1 = sqlda2 = sqlda3 = NULL; strcpy(msg, "describe"); exec sql describe st_id2 into sql descriptor desc1; exec sql describe st_id2 using sql descriptor desc2; exec sql describe st_id2 into descriptor sqlda1; exec sql describe st_id2 using descriptor sqlda2; exec sql describe st_id2 into sqlda3; if (sqlda1 == NULL || sqlda2 == NULL || sqlda3 == NULL) exit(1); strcpy(msg, "get descriptor"); exec sql get descriptor desc1 :count1 = count; exec sql get descriptor desc1 :count2 = count; if (!( count1 == count2 && count1 == sqlda1->sqld && count1 == sqlda2->sqld && count1 == sqlda3->sqld)) exit(1); for (i = 1; i <= count1; i++) { exec sql get descriptor desc1 value :i :field_name1 = name; exec sql get descriptor desc2 value :i :field_name2 = name; printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t" "sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n", i, field_name1, field_name2, sqlda1->sqlvar[i-1].sqlname.data, sqlda2->sqlvar[i-1].sqlname.data, sqlda3->sqlvar[i-1].sqlname.data); } strcpy(msg, "deallocate"); exec sql deallocate descriptor desc1; exec sql deallocate descriptor desc2; free(sqlda1); free(sqlda2); free(sqlda3); exec sql deallocate prepare st_id2; /* End test */ strcpy(msg, "drop"); exec sql drop table descr_t2; strcpy(msg, "commit"); exec sql commit; strcpy(msg, "disconnect"); exec sql disconnect; return 0; }