Re: ECPG patchset - Mailing list pgsql-hackers
From | Boszormenyi Zoltan |
---|---|
Subject | Re: ECPG patchset |
Date | |
Msg-id | 4AB33398.6030109@cybertec.at Whole thread Raw |
In response to | Re: ECPG patchset (Boszormenyi Zoltan <zb@cybertec.at>) |
Responses |
Re: ECPG patchset
Re: ECPG patchset |
List | pgsql-hackers |
New version of the DESCRIBE patch Changes: - free(sqlda->sqlvar) as well if it's not in the same allocation area as teh main sqlda - allow variable name for the prepared stmt in DESCRIBE -- Bible has answers for everything. Proof: "But let your communication be, Yea, yea; Nay, nay: for whatsoever is more than these cometh of evil." (Matthew 5:37) - basics of digital technology. "May your kingdom come" - superficial description of plate tectonics ---------------------------------- Zoltán Böszörményi Cybertec Schönig & Schönig GmbH http://www.postgresql.at/ diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/ecpglib/descriptor.c pgsql.describe/src/interfaces/ecpg/ecpglib/descriptor.c *** pgsql.sqlda/src/interfaces/ecpg/ecpglib/descriptor.c 2009-08-07 13:06:28.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/ecpglib/descriptor.c 2009-09-15 12:08:29.000000000 +0200 *************** *** 13,18 **** --- 13,19 ---- #include "ecpgerrno.h" #include "extern.h" #include "sqlca.h" + #include "sqlda.h" #include "sql3types.h" static void descriptor_free(struct descriptor * desc); *************** get_char_item(int lineno, void *var, enu *** 226,231 **** --- 227,238 ---- return (true); } + #define RETURN_IF_NO_DATA if (ntuples < 1) \ + { \ + ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); \ + return (false); \ + } + bool ECPGget_desc(int lineno, const char *desc_name, int index,...) { *************** ECPGget_desc(int lineno, const char *des *** 244,254 **** return (false); ntuples = PQntuples(ECPGresult); - if (ntuples < 1) - { - ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); - return (false); - } if (index < 1 || index > PQnfields(ECPGresult)) { --- 251,256 ---- *************** ECPGget_desc(int lineno, const char *des *** 283,288 **** --- 285,291 ---- switch (type) { case (ECPGd_indicator): + RETURN_IF_NO_DATA; data_var.ind_type = vartype; data_var.ind_pointer = var; data_var.ind_varcharsize = varcharsize; *************** ECPGget_desc(int lineno, const char *des *** 295,300 **** --- 298,304 ---- break; case ECPGd_data: + RETURN_IF_NO_DATA; data_var.type = vartype; data_var.pointer = var; data_var.varcharsize = varcharsize; *************** ECPGget_desc(int lineno, const char *des *** 377,382 **** --- 381,387 ---- case ECPGd_ret_length: case ECPGd_ret_octet: + RETURN_IF_NO_DATA; /* * this is like ECPGstore_result */ *************** ECPGget_desc(int lineno, const char *des *** 480,485 **** --- 485,491 ---- sqlca->sqlerrd[2] = ntuples; return (true); } + #undef RETURN_IF_NO_DATA bool ECPGset_desc_header(int lineno, const char *desc_name, int count) *************** ecpg_find_desc(int line, const char *nam *** 722,730 **** return NULL; /* not found */ } bool ! ECPGdescribe(int line, bool input, const char *statement,...) { ! ecpg_log("ECPGdescribe called on line %d for %s: %s\n", line, input ? "input" : "output", statement); ! return false; } --- 728,839 ---- return NULL; /* not found */ } + static pg_sqlda_t* + build_sqlda(int lineno, bool input, const char *connection_name, const char *stmt_name) + { + struct connection *con; + PGresult *res; + pg_sqlda_t *sqlda = NULL; + + con = ecpg_get_connection(connection_name); + res = PQdescribePrepared(con->connection, stmt_name); + if (!ecpg_check_PQresult(res, lineno, con->connection, ECPG_COMPAT_INFORMIX)) + return NULL; + + sqlda = ecpg_build_sqlda_for_PGresult(lineno, res, -1); + + PQclear(res); + return sqlda; + } + bool ! ECPGdescribe(int line, bool input, const char *connection_name, const char *stmt_name, ...) { ! bool ret = false; ! va_list args; ! ! /* DESCRIBE INPUT is not yet supported */ ! if (input) ! return false; ! ! va_start(args, stmt_name); ! ! for (;;) ! { ! enum ECPGttype type, dummy_type; ! void *ptr, *dummy_ptr; ! long dummy; ! ! /* variable type */ ! type = va_arg(args, enum ECPGttype); ! ! if (type == ECPGt_EORT) ! break; ! ! /* rest of variable parameters*/ ! ptr = va_arg(args, void *); ! dummy = va_arg(args, long); ! dummy = va_arg(args, long); ! dummy = va_arg(args, long); ! ! /* variable indicator */ ! dummy_type = va_arg(args, enum ECPGttype); ! dummy_ptr = va_arg(args, void *); ! dummy = va_arg(args, long); ! dummy = va_arg(args, long); ! dummy = va_arg(args, long); ! ! switch (type) ! { ! case ECPGt_descriptor: ! { ! char *name = ptr; ! struct connection *con = ecpg_get_connection(connection_name); ! struct descriptor *desc = ecpg_find_desc(line, name); ! PGresult *res; ! ExecStatusType ret; ! ! if (con == NULL) ! break; ! if (desc == NULL) ! break; ! ! res = PQdescribePrepared(con->connection, stmt_name); ! ret = PQresultStatus(res); ! if (ecpg_check_PQresult(res, line, con->connection, ECPG_COMPAT_PGSQL)) ! { ! if (desc->result != NULL) ! PQclear(desc->result); ! desc->result = res; ! ret = true; ! } ! break; ! } ! case ECPGt_sqlda: ! { ! pg_sqlda_t **_sqlda = ptr; ! pg_sqlda_t *sqlda; ! ! sqlda = build_sqlda(line, input, connection_name, stmt_name); ! if (sqlda) ! { ! pg_sqlda_t *sqlda_old = *_sqlda; ! if (sqlda_old) ! { ! if (sqlda->sqlvar != (pg_sqlvar_t *)(sqlda + 1)) ! free(sqlda->sqlvar); ! free(sqlda_old); ! } ! *_sqlda = sqlda; ! ret = true; ! } ! break; ! } ! default: ! /* nothing else may come */ ! ; ! } ! } ! ! return ret; } diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/include/ecpglib.h pgsql.describe/src/interfaces/ecpg/include/ecpglib.h *** pgsql.sqlda/src/interfaces/ecpg/include/ecpglib.h 2009-06-13 18:25:05.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/include/ecpglib.h 2009-09-15 12:07:39.000000000 +0200 *************** bool ECPGset_desc(int, const char *, in *** 83,89 **** void ECPGset_noind_null(enum ECPGttype, void *); bool ECPGis_noind_null(enum ECPGttype, void *); ! bool ECPGdescribe(int, bool, const char *,...); /* dynamic result allocation */ void ECPGfree_auto_mem(void); --- 83,89 ---- void ECPGset_noind_null(enum ECPGttype, void *); bool ECPGis_noind_null(enum ECPGttype, void *); ! bool ECPGdescribe(int, bool, const char *, const char *, ...); /* dynamic result allocation */ void ECPGfree_auto_mem(void); diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.trailer pgsql.describe/src/interfaces/ecpg/preproc/ecpg.trailer *** pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.trailer 2009-09-03 12:56:36.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/preproc/ecpg.trailer 2009-09-18 05:11:18.000000000 +0200 *************** into_descriptor: INTO opt_sql SQL_DESCRI *** 1057,1062 **** --- 1057,1069 ---- } ; + into_sqlda: INTO name + { + add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator); + $$ = EMPTY; + } + ; + opt_sql: /*EMPTY*/ { $$ = EMPTY; } | SQL_SQL { $$ = make_str("sql"); } ; *************** UsingConst: Iconst { $$ = $1; } *** 1088,1113 **** /* * We accept descibe but do nothing with it so far. */ ! ECPGDescribe: SQL_DESCRIBE INPUT_P name using_descriptor { const char *con = connection ? connection : "NULL"; mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); ! $$ = (char *) mm_alloc(sizeof("1, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3)); ! sprintf($$, "1, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3); } ! | SQL_DESCRIBE opt_output name using_descriptor { const char *con = connection ? connection : "NULL"; ! mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); ! $$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3)); ! sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3); } ! | SQL_DESCRIBE opt_output name into_descriptor { const char *con = connection ? connection : "NULL"; mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); ! $$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3)); ! sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3); } ; --- 1095,1141 ---- /* * We accept descibe but do nothing with it so far. */ ! ECPGDescribe: SQL_DESCRIBE INPUT_P prepared_name using_descriptor { const char *con = connection ? connection : "NULL"; mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); ! $$ = (char *) mm_alloc(sizeof("1, , \"\"") + strlen(con) + strlen($3)); ! sprintf($$, "1, %s, \"%s\"", con, $3); } ! | SQL_DESCRIBE opt_output prepared_name using_descriptor { const char *con = connection ? connection : "NULL"; ! struct variable *var; ! ! var = argsinsert->variable; ! remove_variable_from_list(&argsinsert, var); ! add_variable_to_head(&argsresult, var, &no_indicator); ! ! $$ = (char *) mm_alloc(sizeof("0, , \"\"") + strlen(con) + strlen($3)); ! sprintf($$, "0, %s, \"%s\"", con, $3); } ! | SQL_DESCRIBE opt_output prepared_name into_descriptor ! { ! const char *con = connection ? connection : "NULL"; ! $$ = (char *) mm_alloc(sizeof("0, , \"\"") + strlen(con) + strlen($3)); ! sprintf($$, "0, %s, \"%s\"", con, $3); ! } ! | SQL_DESCRIBE INPUT_P prepared_name into_sqlda { const char *con = connection ? connection : "NULL"; mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); ! if (!INFORMIX_MODE) ! mmerror(PARSE_ERROR, ET_ERROR, "Not in Informix compatibility mode"); ! $$ = (char *) mm_alloc(sizeof("1, , \"\"") + strlen(con) + strlen($3)); ! sprintf($$, "1, %s, \"%s\"", con, $3); ! } ! | SQL_DESCRIBE opt_output prepared_name into_sqlda ! { ! const char *con = connection ? connection : "NULL"; ! if (!INFORMIX_MODE) ! mmerror(PARSE_ERROR, ET_ERROR, "Not in Informix compatibility mode"); ! $$ = (char *) mm_alloc(sizeof("0, , \"\"") + strlen(con) + strlen($3)); ! sprintf($$, "0, %s, \"%s\"", con, $3); } ; diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.type pgsql.describe/src/interfaces/ecpg/preproc/ecpg.type *** pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.type 2009-09-03 12:56:36.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/preproc/ecpg.type 2009-09-15 12:07:39.000000000 +0200 *************** *** 73,78 **** --- 73,79 ---- %type <str> execute_rest %type <str> indicator %type <str> into_descriptor + %type <str> into_sqlda %type <str> Iresult %type <str> on_off %type <str> opt_bit_field *************** *** 88,94 **** %type <str> opt_reference %type <str> opt_scale %type <str> opt_server ! %type <str> opt_sql %type <str> opt_user %type <str> opt_opt_value %type <str> ora_user --- 89,95 ---- %type <str> opt_reference %type <str> opt_scale %type <str> opt_server ! %type <str> opt_sql %type <str> opt_user %type <str> opt_opt_value %type <str> ora_user diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/describe.pgc pgsql.describe/src/interfaces/ecpg/test/compat_informix/describe.pgc *** pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/describe.pgc 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/compat_informix/describe.pgc 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,166 ---- + #include <stdlib.h> + #include <string.h> + + exec sql include ../regression; + exec sql include sqlda.h; + + exec sql whenever sqlerror stop; + + pg_sqlda_t *sqlda1, *sqlda2, *sqlda3; + + int + main (void) + { + exec sql begin declare section; + char *stmt1 = "SELECT id, t FROM t1"; + char *stmt2 = "SELECT id, t FROM t1 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 t1(id serial primary key, t text); + + strcpy(msg, "insert"); + exec sql insert into t1(id, t) values (default, 'a'); + exec sql insert into t1(id, t) values (default, 'b'); + exec sql insert into t1(id, t) values (default, 'c'); + exec sql insert into t1(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 || sqlda1 == NULL || sqlda2 == 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, + sqlda2->sqlvar[i-1].sqlname, + sqlda3->sqlvar[i-1].sqlname); + } + + 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 || sqlda1 == NULL || sqlda2 == 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, + sqlda2->sqlvar[i-1].sqlname, + sqlda3->sqlvar[i-1].sqlname); + } + + 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 t1; + + strcpy(msg, "commit"); + exec sql commit; + + strcpy(msg, "disconnect"); + exec sql disconnect; + + return (0); + } diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/Makefile pgsql.describe/src/interfaces/ecpg/test/compat_informix/Makefile *** pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/Makefile 2009-09-03 12:56:36.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/test/compat_informix/Makefile 2009-09-15 12:07:39.000000000 +0200 *************** override LIBS := -lecpg_compat $(LIBS) *** 13,18 **** --- 13,19 ---- TESTS = test_informix test_informix.c \ test_informix2 test_informix2.c \ cursor cursor.c \ + describe describe.c \ dec_test dec_test.c \ rfmtdate rfmtdate.c \ rfmtlong rfmtlong.c \ *************** test_informix2.c: test_informix2.pgc ../ *** 31,36 **** --- 32,40 ---- cursor.c: cursor.pgc ../regression.h $(ECPG) -o $@ -I$(srcdir) $< + describe.c: describe.pgc ../regression.h + $(ECPG) -o $@ -I$(srcdir) $< + sqlda.c: sqlda.pgc ../regression.h $(ECPG) -o $@ -I$(srcdir) $< diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule *** pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule 2009-09-03 12:56:36.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule 2009-09-15 12:07:39.000000000 +0200 *************** test: compat_informix/rfmtlong *** 5,10 **** --- 5,11 ---- test: compat_informix/rnull test: compat_informix/cursor test: compat_informix/sqlda + test: compat_informix/describe test: compat_informix/test_informix test: compat_informix/test_informix2 test: connect/test2 *************** test: preproc/array_of_struct *** 19,24 **** --- 20,26 ---- test: preproc/autoprep test: preproc/comment test: preproc/cursor + test: preproc/describe test: preproc/define test: preproc/init test: preproc/strings diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule_tcp pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule_tcp *** pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule_tcp 2009-09-03 12:56:36.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule_tcp 2009-09-15 12:07:39.000000000 +0200 *************** test: compat_informix/rfmtlong *** 5,10 **** --- 5,11 ---- test: compat_informix/rnull test: compat_informix/cursor test: compat_informix/sqlda + test: compat_informix/describe test: compat_informix/test_informix test: compat_informix/test_informix2 test: connect/test2 *************** test: preproc/array_of_struct *** 19,24 **** --- 20,26 ---- test: preproc/autoprep test: preproc/comment test: preproc/cursor + test: preproc/describe test: preproc/define test: preproc/init test: preproc/strings diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.c pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.c *** pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.c 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.c 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,490 ---- + /* Processed by ecpg (regression mode) */ + /* These include files are added by the preprocessor */ + #include <ecpglib.h> + #include <ecpgerrno.h> + #include <sqlca.h> + /* Needed for informix compatibility */ + #include <ecpg_informix.h> + /* End of automatic include section */ + #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + + #line 1 "describe.pgc" + #include <stdlib.h> + #include <string.h> + + + #line 1 "regression.h" + + + + + + + #line 4 "describe.pgc" + + + #line 1 "sqlda.h" + /* + * $PostgreSQL: pgsql/src/interfaces/ecpg/include/sqlda.h,v 1.4 2009/06/11 14:49:13 momjian Exp $ + */ + + #ifndef POSTGRES_SQLDA_H + #define POSTGRES_SQLDA_H + + /* Define Informix "standard" types */ + #ifndef C_H + typedef int int4; + typedef short int2; + #endif + typedef char int1; + + typedef int mint; + typedef long mlong; + + typedef short MSHORT; + typedef char MCHAR; + + typedef unsigned int uint4; + typedef unsigned short uint2; + typedef unsigned char uint1; + + typedef unsigned int muint; + typedef unsigned long mulong; + + typedef unsigned short MUSHORT; + typedef unsigned char MUCHAR; + + #define MI_INT_SIZE (sizeof(int) * 8) + #define MI_LONG_SIZE (sizeof(long) * 8) + #define MI_PTR_SIZE (sizeof(char *) * 8) + + typedef struct sqlvar_struct + { + int2 sqltype; /* variable type */ + int4 sqllen; /* length in bytes */ + char *sqldata; /* pointer to data */ + int2 *sqlind; /* pointer to indicator */ + char *sqlname; /* variable name */ + char *sqlformat; /* reserved for future use */ + int2 sqlitype; /* ind variable type */ + int2 sqlilen; /* ind length in bytes */ + char *sqlidata; /* ind data pointer */ + int4 sqlxid; /* extended id type */ + char *sqltypename; /* extended type name */ + int2 sqltypelen; /* length of extended type name */ + int2 sqlownerlen; /* length of owner name */ + int2 sqlsourcetype; /* source type for distinct of built-ins */ + char *sqlownername; /* owner name */ + int4 sqlsourceid; /* extended id of source type */ + + /* + * sqlilongdata is new. It supports data that exceeds the 32k + * limit. sqlilen and sqlidata are for backward compatibility + * and they have maximum value of <32K. + */ + char *sqlilongdata; /* for data field beyond 32K */ + int4 sqlflags; /* for internal use only */ + void *sqlreserved; /* reserved for future use */ + } pg_sqlvar_t; + + typedef struct sqlda + { + int2 sqld; + pg_sqlvar_t *sqlvar; + char desc_name[19]; /* descriptor name */ + int2 desc_occ; /* size of sqlda structure */ + struct sqlda *desc_next; /* pointer to next sqlda struct */ + void *reserved; /* reserved for future use */ + } pg_sqlda_t; + + #endif /* POSTGRES_SQLDA_H */ + + #line 5 "describe.pgc" + + + /* exec sql whenever sqlerror stop ; */ + #line 7 "describe.pgc" + + + pg_sqlda_t *sqlda1, *sqlda2, *sqlda3; + + int + main (void) + { + /* exec sql begin declare section */ + + + + + + + #line 15 "describe.pgc" + char * stmt1 = "SELECT id, t FROM t1" ; + + #line 16 "describe.pgc" + char * stmt2 = "SELECT id, t FROM t1 WHERE id = -1" ; + + #line 17 "describe.pgc" + int i , count1 , count2 ; + + #line 18 "describe.pgc" + char field_name1 [ 30 ] = "not set" ; + + #line 19 "describe.pgc" + char field_name2 [ 30 ] = "not set" ; + /* exec sql end declare section */ + #line 20 "describe.pgc" + + + char msg[128]; + + ECPGdebug(1, stderr); + + strcpy(msg, "connect"); + { ECPGconnect(__LINE__, 1, "regress1" , NULL, NULL , NULL, 0); + #line 27 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 27 "describe.pgc" + + + strcpy(msg, "set"); + { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT); + #line 30 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 30 "describe.pgc" + + + strcpy(msg, "create"); + { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "create table t1 ( id serial primary key , t text )", ECPGt_EOIT,ECPGt_EORT); + #line 33 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 33 "describe.pgc" + + + strcpy(msg, "insert"); + { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'a' )", ECPGt_EOIT,ECPGt_EORT); + #line 36 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 36 "describe.pgc" + + { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'b' )", ECPGt_EOIT,ECPGt_EORT); + #line 37 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 37 "describe.pgc" + + { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'c' )", ECPGt_EOIT,ECPGt_EORT); + #line 38 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 38 "describe.pgc" + + { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'd' )", ECPGt_EOIT,ECPGt_EORT); + #line 39 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 39 "describe.pgc" + + + strcpy(msg, "commit"); + { ECPGtrans(__LINE__, NULL, "commit"); + #line 42 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 42 "describe.pgc" + + + /* + * Test DESCRIBE with a query producing tuples. + * DESCRIPTOR and SQL DESCRIPTOR are NOT the same in + * Informix-compat mode. + */ + + strcpy(msg, "allocate"); + ECPGallocate_desc(__LINE__, "desc1"); + #line 51 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 51 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc2"); + #line 52 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 52 "describe.pgc" + + + strcpy(msg, "prepare"); + { ECPGprepare(__LINE__, NULL, 0, "st_id1", stmt1); + #line 55 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 55 "describe.pgc" + + + sqlda1 = sqlda2 = sqlda3 = NULL; + + strcpy(msg, "describe"); + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_descriptor, "desc1", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 60 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_descriptor, "desc2", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 61 "describe.pgc" + + + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_sqlda, & sqlda1 , 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 63 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_sqlda, & sqlda2 , 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 64 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_sqlda, &sqlda3, 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 65 "describe.pgc" + + + if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL) + exit(1); + + strcpy(msg, "get descriptor"); + { ECPGget_desc_header(__LINE__, "desc1", &(count1)); + + #line 71 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 71 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc1", &(count2)); + + #line 72 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 72 "describe.pgc" + + + if (!( count1 == count2 && + count1 == sqlda1->sqld && + count1 == sqlda2->sqld && + count1 == sqlda3->sqld)) + exit(1); + + for (i = 1; i <= count1; i++) + { + { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name, + ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 82 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 82 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name, + ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 83 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 83 "describe.pgc" + + 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, + sqlda2->sqlvar[i-1].sqlname, + sqlda3->sqlvar[i-1].sqlname); + } + + strcpy(msg, "deallocate"); + ECPGdeallocate_desc(__LINE__, "desc1"); + #line 93 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 93 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc2"); + #line 94 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 94 "describe.pgc" + + free(sqlda1); + free(sqlda2); + free(sqlda3); + + { ECPGdeallocate(__LINE__, 1, NULL, "st_id1"); + #line 99 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 99 "describe.pgc" + + + /* Test DESCRIBE with a query not producing tuples */ + + strcpy(msg, "allocate"); + ECPGallocate_desc(__LINE__, "desc1"); + #line 104 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 104 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc2"); + #line 105 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 105 "describe.pgc" + + + strcpy(msg, "prepare"); + { ECPGprepare(__LINE__, NULL, 0, "st_id2", stmt2); + #line 108 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 108 "describe.pgc" + + + sqlda1 = sqlda2 = sqlda3 = NULL; + + strcpy(msg, "describe"); + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_descriptor, "desc1", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 113 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_descriptor, "desc2", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 114 "describe.pgc" + + + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_sqlda, & sqlda1 , 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 116 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_sqlda, & sqlda2 , 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 117 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_sqlda, &sqlda3, 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 118 "describe.pgc" + + + if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL) + exit(1); + + strcpy(msg, "get descriptor"); + { ECPGget_desc_header(__LINE__, "desc1", &(count1)); + + #line 124 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 124 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc1", &(count2)); + + #line 125 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 125 "describe.pgc" + + + if (!( count1 == count2 && + count1 == sqlda1->sqld && + count1 == sqlda2->sqld && + count1 == sqlda3->sqld)) + exit(1); + + for (i = 1; i <= count1; i++) + { + { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name, + ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 135 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 135 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name, + ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 136 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 136 "describe.pgc" + + 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, + sqlda2->sqlvar[i-1].sqlname, + sqlda3->sqlvar[i-1].sqlname); + } + + strcpy(msg, "deallocate"); + ECPGdeallocate_desc(__LINE__, "desc1"); + #line 146 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 146 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc2"); + #line 147 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 147 "describe.pgc" + + free(sqlda1); + free(sqlda2); + free(sqlda3); + + { ECPGdeallocate(__LINE__, 1, NULL, "st_id2"); + #line 152 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 152 "describe.pgc" + + + /* End test */ + + strcpy(msg, "drop"); + { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "drop table t1", ECPGt_EOIT, ECPGt_EORT); + #line 157 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 157 "describe.pgc" + + + strcpy(msg, "commit"); + { ECPGtrans(__LINE__, NULL, "commit"); + #line 160 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 160 "describe.pgc" + + + strcpy(msg, "disconnect"); + { ECPGdisconnect(__LINE__, "CURRENT"); + #line 163 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 163 "describe.pgc" + + + return (0); + } diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr *** pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,100 ---- + [NO_PID]: ECPGdebug: set to 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT> + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 30: query: set datestyle to iso; with 0 parameter(s) on connection regress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 30: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 30: OK: SET + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 33: query: create table t1 ( id serial primary key , t text ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 33: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 33: OK: CREATE TABLE + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 36: query: insert into t1 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 36: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 36: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 37: query: insert into t1 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 37: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 37: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 38: query: insert into t1 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 38: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 38: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 39: query: insert into t1 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 39: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 39: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGtrans on line 42: action "commit"; connection "regress1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGprepare on line 55: name st_id1; query: "SELECT id, t FROM t1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGdeallocate on line 99: name st_id1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGprepare on line 108: name st_id2; query: "SELECT id, t FROM t1 WHERE id = -1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGdeallocate on line 152: name st_id2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 157: query: drop table t1; with 0 parameter(s) on connection regress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 157: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 157: OK: DROP TABLE + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGtrans on line 160: action "commit"; connection "regress1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_finish: connection regress1 closed + [NO_PID]: sqlca: code: 0, state: 00000 diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout *** pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,24 ---- + 1 + field_name1 'id' + field_name2 'id' + sqlda1 'id' + sqlda2 'id' + sqlda3 'id' + 2 + field_name1 't' + field_name2 't' + sqlda1 't' + sqlda2 't' + sqlda3 't' + 1 + field_name1 'id' + field_name2 'id' + sqlda1 'id' + sqlda2 'id' + sqlda3 'id' + 2 + field_name1 't' + field_name2 't' + sqlda1 't' + sqlda2 't' + sqlda3 't' diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.c pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.c *** pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.c 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.c 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,481 ---- + /* Processed by ecpg (regression mode) */ + /* These include files are added by the preprocessor */ + #include <ecpglib.h> + #include <ecpgerrno.h> + #include <sqlca.h> + /* End of automatic include section */ + #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + + #line 1 "describe.pgc" + #include <stdlib.h> + #include <string.h> + + + #line 1 "regression.h" + + + + + + + #line 4 "describe.pgc" + + + /* exec sql whenever sqlerror stop ; */ + #line 6 "describe.pgc" + + + int + main (void) + { + /* exec sql begin declare section */ + + + + + + + + + #line 12 "describe.pgc" + char * stmt1 = "SELECT id, t FROM t1" ; + + #line 13 "describe.pgc" + char * stmt2 = "SELECT id, t FROM t1 WHERE id = -1" ; + + #line 14 "describe.pgc" + int i , count1 , count2 , count3 , count4 ; + + #line 15 "describe.pgc" + char field_name1 [ 30 ] = "not set" ; + + #line 16 "describe.pgc" + char field_name2 [ 30 ] = "not set" ; + + #line 17 "describe.pgc" + char field_name3 [ 30 ] = "not set" ; + + #line 18 "describe.pgc" + char field_name4 [ 30 ] = "not set" ; + /* exec sql end declare section */ + #line 19 "describe.pgc" + + + char msg[128]; + + ECPGdebug(1, stderr); + + strcpy(msg, "connect"); + { ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , NULL, 0); + #line 26 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 26 "describe.pgc" + + + strcpy(msg, "set"); + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT); + #line 29 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 29 "describe.pgc" + + + strcpy(msg, "create"); + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table t1 ( id serial primary key , t text )", ECPGt_EOIT,ECPGt_EORT); + #line 32 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 32 "describe.pgc" + + + strcpy(msg, "insert"); + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'a' )", ECPGt_EOIT,ECPGt_EORT); + #line 35 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 35 "describe.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'b' )", ECPGt_EOIT,ECPGt_EORT); + #line 36 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 36 "describe.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'c' )", ECPGt_EOIT,ECPGt_EORT); + #line 37 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 37 "describe.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'd' )", ECPGt_EOIT,ECPGt_EORT); + #line 38 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 38 "describe.pgc" + + + strcpy(msg, "commit"); + { ECPGtrans(__LINE__, NULL, "commit"); + #line 41 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 41 "describe.pgc" + + + /* + * Test DESCRIBE with a query producing tuples. + * DESCRIPTOR and SQL DESCRIPTOR are the same in native mode. + */ + + strcpy(msg, "allocate"); + ECPGallocate_desc(__LINE__, "desc1"); + #line 49 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 49 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc2"); + #line 50 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 50 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc3"); + #line 51 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 51 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc4"); + #line 52 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 52 "describe.pgc" + + + strcpy(msg, "prepare"); + { ECPGprepare(__LINE__, NULL, 0, "st_id1", stmt1); + #line 55 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 55 "describe.pgc" + + + strcpy(msg, "describe"); + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_descriptor, "desc1", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 58 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_descriptor, "desc2", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 59 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_descriptor, "desc3", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 60 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id1", + ECPGt_descriptor, "desc4", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 61 "describe.pgc" + + + strcpy(msg, "get descriptor"); + { ECPGget_desc_header(__LINE__, "desc1", &(count1)); + + #line 64 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 64 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc2", &(count2)); + + #line 65 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 65 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc3", &(count3)); + + #line 66 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 66 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc4", &(count4)); + + #line 67 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 67 "describe.pgc" + + + if (!(count1 == count2 && count1 == count3 && count1 == count4)) + exit(1); + + for (i = 1; i <= count1; i++) + { + { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name, + ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 74 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 74 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name, + ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 75 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 75 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc3", i,ECPGd_name, + ECPGt_char,(field_name3),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 76 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 76 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc4", i,ECPGd_name, + ECPGt_char,(field_name4),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 77 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 77 "describe.pgc" + + printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n", + field_name1, field_name2, field_name3, field_name4); + } + + strcpy(msg, "deallocate"); + ECPGdeallocate_desc(__LINE__, "desc1"); + #line 83 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 83 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc2"); + #line 84 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 84 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc3"); + #line 85 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 85 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc4"); + #line 86 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 86 "describe.pgc" + + + { ECPGdeallocate(__LINE__, 0, NULL, "st_id1"); + #line 88 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 88 "describe.pgc" + + + /* Test DESCRIBE with a query not producing tuples */ + + strcpy(msg, "allocate"); + ECPGallocate_desc(__LINE__, "desc1"); + #line 93 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 93 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc2"); + #line 94 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 94 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc3"); + #line 95 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 95 "describe.pgc" + + ECPGallocate_desc(__LINE__, "desc4"); + #line 96 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 96 "describe.pgc" + + + strcpy(msg, "prepare"); + { ECPGprepare(__LINE__, NULL, 0, "st_id2", stmt2); + #line 99 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 99 "describe.pgc" + + + strcpy(msg, "describe"); + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_descriptor, "desc1", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 102 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_descriptor, "desc2", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 103 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_descriptor, "desc3", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 104 "describe.pgc" + + { ECPGdescribe(__LINE__, 0, NULL, "st_id2", + ECPGt_descriptor, "desc4", 0L, 0L, 0L, + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} + #line 105 "describe.pgc" + + + strcpy(msg, "get descriptor"); + { ECPGget_desc_header(__LINE__, "desc1", &(count1)); + + #line 108 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 108 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc2", &(count2)); + + #line 109 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 109 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc3", &(count3)); + + #line 110 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 110 "describe.pgc" + + { ECPGget_desc_header(__LINE__, "desc4", &(count4)); + + #line 111 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 111 "describe.pgc" + + + if (!(count1 == count2 && count1 == count3 && count1 == count4)) + exit(1); + + for (i = 1; i <= count1; i++) + { + { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name, + ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 118 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 118 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name, + ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 119 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 119 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc3", i,ECPGd_name, + ECPGt_char,(field_name3),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 120 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 120 "describe.pgc" + + { ECPGget_desc(__LINE__, "desc4", i,ECPGd_name, + ECPGt_char,(field_name4),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT); + + #line 121 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 121 "describe.pgc" + + printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n", + field_name1, field_name2, field_name3, field_name4); + } + + strcpy(msg, "deallocate"); + ECPGdeallocate_desc(__LINE__, "desc1"); + #line 127 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 127 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc2"); + #line 128 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 128 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc3"); + #line 129 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 129 "describe.pgc" + + ECPGdeallocate_desc(__LINE__, "desc4"); + #line 130 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1); + #line 130 "describe.pgc" + + + { ECPGdeallocate(__LINE__, 0, NULL, "st_id2"); + #line 132 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 132 "describe.pgc" + + + + /* End test */ + + strcpy(msg, "drop"); + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table t1", ECPGt_EOIT, ECPGt_EORT); + #line 138 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 138 "describe.pgc" + + + strcpy(msg, "commit"); + { ECPGtrans(__LINE__, NULL, "commit"); + #line 141 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 141 "describe.pgc" + + + strcpy(msg, "disconnect"); + { ECPGdisconnect(__LINE__, "CURRENT"); + #line 144 "describe.pgc" + + if (sqlca.sqlcode < 0) exit (1);} + #line 144 "describe.pgc" + + + return (0); + } diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stderr pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stderr *** pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stderr 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stderr 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,140 ---- + [NO_PID]: ECPGdebug: set to 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT> + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 29: query: set datestyle to iso; with 0 parameter(s) on connection regress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 29: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 29: OK: SET + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 32: query: create table t1 ( id serial primary key , t text ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 32: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 32: OK: CREATE TABLE + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 35: query: insert into t1 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 35: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 35: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 36: query: insert into t1 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 36: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 36: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 37: query: insert into t1 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 37: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 37: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 38: query: insert into t1 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on connectionregress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 38: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 38: OK: INSERT 0 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGtrans on line 41: action "commit"; connection "regress1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGprepare on line 55: name st_id1; query: "SELECT id, t FROM t1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGdeallocate on line 88: name st_id1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGprepare on line 99: name st_id2; query: "SELECT id, t FROM t1 WHERE id = -1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc_header: found 2 attributes + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = id + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: reading items for tuple 2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGget_desc: NAME = t + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGdeallocate on line 132: name st_id2 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 138: query: drop table t1; with 0 parameter(s) on connection regress1 + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 138: using PQexec + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_execute on line 138: OK: DROP TABLE + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ECPGtrans on line 141: action "commit"; connection "regress1" + [NO_PID]: sqlca: code: 0, state: 00000 + [NO_PID]: ecpg_finish: connection regress1 closed + [NO_PID]: sqlca: code: 0, state: 00000 diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stdout pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stdout *** pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stdout 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stdout 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,4 ---- + field_name 1 'id' 2 'id' 3 'id' 4 'id' + field_name 1 't' 2 't' 3 't' 4 't' + field_name 1 'id' 2 'id' 3 'id' 4 'id' + field_name 1 't' 2 't' 3 't' 4 't' diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/preproc/describe.pgc pgsql.describe/src/interfaces/ecpg/test/preproc/describe.pgc *** pgsql.sqlda/src/interfaces/ecpg/test/preproc/describe.pgc 1970-01-01 01:00:00.000000000 +0100 --- pgsql.describe/src/interfaces/ecpg/test/preproc/describe.pgc 2009-09-15 12:07:39.000000000 +0200 *************** *** 0 **** --- 1,147 ---- + #include <stdlib.h> + #include <string.h> + + exec sql include ../regression; + + exec sql whenever sqlerror stop; + + int + main (void) + { + exec sql begin declare section; + char *stmt1 = "SELECT id, t FROM t1"; + char *stmt2 = "SELECT id, t FROM t1 WHERE id = -1"; + int i, count1, count2, count3, count4; + char field_name1[30] = "not set"; + char field_name2[30] = "not set"; + char field_name3[30] = "not set"; + char field_name4[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 t1(id serial primary key, t text); + + strcpy(msg, "insert"); + exec sql insert into t1(id, t) values (default, 'a'); + exec sql insert into t1(id, t) values (default, 'b'); + exec sql insert into t1(id, t) values (default, 'c'); + exec sql insert into t1(id, t) values (default, 'd'); + + strcpy(msg, "commit"); + exec sql commit; + + /* + * Test DESCRIBE with a query producing tuples. + * DESCRIPTOR and SQL DESCRIPTOR are the same in native mode. + */ + + strcpy(msg, "allocate"); + exec sql allocate descriptor desc1; + exec sql allocate descriptor desc2; + exec sql allocate descriptor desc3; + exec sql allocate descriptor desc4; + + strcpy(msg, "prepare"); + exec sql prepare st_id1 FROM :stmt1; + + strcpy(msg, "describe"); + exec sql describe st_id1 into descriptor desc1; + exec sql describe st_id1 into sql descriptor desc2; + exec sql describe st_id1 using descriptor desc3; + exec sql describe st_id1 using sql descriptor desc4; + + strcpy(msg, "get descriptor"); + exec sql get descriptor desc1 :count1 = count; + exec sql get descriptor desc2 :count2 = count; + exec sql get descriptor desc3 :count3 = count; + exec sql get descriptor desc4 :count4 = count; + + if (!(count1 == count2 && count1 == count3 && count1 == count4)) + 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; + exec sql get descriptor desc3 value :i :field_name3 = name; + exec sql get descriptor desc4 value :i :field_name4 = name; + printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n", + field_name1, field_name2, field_name3, field_name4); + } + + strcpy(msg, "deallocate"); + exec sql deallocate descriptor desc1; + exec sql deallocate descriptor desc2; + exec sql deallocate descriptor desc3; + exec sql deallocate descriptor desc4; + + 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; + exec sql allocate descriptor desc3; + exec sql allocate descriptor desc4; + + strcpy(msg, "prepare"); + exec sql prepare st_id2 FROM :stmt2; + + strcpy(msg, "describe"); + exec sql describe st_id2 into descriptor desc1; + exec sql describe st_id2 into sql descriptor desc2; + exec sql describe st_id2 using descriptor desc3; + exec sql describe st_id2 using sql descriptor desc4; + + strcpy(msg, "get descriptor"); + exec sql get descriptor desc1 :count1 = count; + exec sql get descriptor desc2 :count2 = count; + exec sql get descriptor desc3 :count3 = count; + exec sql get descriptor desc4 :count4 = count; + + if (!(count1 == count2 && count1 == count3 && count1 == count4)) + 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; + exec sql get descriptor desc3 value :i :field_name3 = name; + exec sql get descriptor desc4 value :i :field_name4 = name; + printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n", + field_name1, field_name2, field_name3, field_name4); + } + + strcpy(msg, "deallocate"); + exec sql deallocate descriptor desc1; + exec sql deallocate descriptor desc2; + exec sql deallocate descriptor desc3; + exec sql deallocate descriptor desc4; + + exec sql deallocate prepare st_id2; + + + /* End test */ + + strcpy(msg, "drop"); + exec sql drop table t1; + + strcpy(msg, "commit"); + exec sql commit; + + strcpy(msg, "disconnect"); + exec sql disconnect; + + return (0); + } diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/preproc/Makefile pgsql.describe/src/interfaces/ecpg/test/preproc/Makefile *** pgsql.sqlda/src/interfaces/ecpg/test/preproc/Makefile 2009-09-03 12:28:03.000000000 +0200 --- pgsql.describe/src/interfaces/ecpg/test/preproc/Makefile 2009-09-15 12:07:39.000000000 +0200 *************** TESTS = array_of_struct array_of_struct. *** 8,13 **** --- 8,14 ---- autoprep autoprep.c \ comment comment.c \ cursor cursor.c \ + describe describe.c \ define define.c \ init init.c \ strings strings.c \
pgsql-hackers by date: