Commit bf69b535 authored by Michael Meskes's avatar Michael Meskes

Applied patch by Boszormenyi Zoltan <zb@cybertec.at> to add DESCRIBE [OUTPUT] statement to ecpg.

parent 40f908bd
/* dynamic SQL support routines /* dynamic SQL support routines
* *
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.33 2009/08/07 10:51:20 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.34 2010/01/15 10:44:34 meskes Exp $
*/ */
#define POSTGRES_ECPG_INTERNAL #define POSTGRES_ECPG_INTERNAL
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "ecpgerrno.h" #include "ecpgerrno.h"
#include "extern.h" #include "extern.h"
#include "sqlca.h" #include "sqlca.h"
#include "sqlda.h"
#include "sql3types.h" #include "sql3types.h"
static void descriptor_free(struct descriptor * desc); static void descriptor_free(struct descriptor * desc);
...@@ -226,6 +227,12 @@ get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int va ...@@ -226,6 +227,12 @@ get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int va
return (true); return (true);
} }
#define RETURN_IF_NO_DATA if (ntuples < 1) \
{ \
ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); \
return (false); \
}
bool bool
ECPGget_desc(int lineno, const char *desc_name, int index,...) ECPGget_desc(int lineno, const char *desc_name, int index,...)
{ {
...@@ -244,11 +251,6 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...) ...@@ -244,11 +251,6 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
return (false); return (false);
ntuples = PQntuples(ECPGresult); 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)) if (index < 1 || index > PQnfields(ECPGresult))
{ {
...@@ -283,6 +285,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...) ...@@ -283,6 +285,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
switch (type) switch (type)
{ {
case (ECPGd_indicator): case (ECPGd_indicator):
RETURN_IF_NO_DATA;
data_var.ind_type = vartype; data_var.ind_type = vartype;
data_var.ind_pointer = var; data_var.ind_pointer = var;
data_var.ind_varcharsize = varcharsize; data_var.ind_varcharsize = varcharsize;
...@@ -295,6 +298,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...) ...@@ -295,6 +298,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
break; break;
case ECPGd_data: case ECPGd_data:
RETURN_IF_NO_DATA;
data_var.type = vartype; data_var.type = vartype;
data_var.pointer = var; data_var.pointer = var;
data_var.varcharsize = varcharsize; data_var.varcharsize = varcharsize;
...@@ -377,6 +381,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...) ...@@ -377,6 +381,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
case ECPGd_ret_length: case ECPGd_ret_length:
case ECPGd_ret_octet: case ECPGd_ret_octet:
RETURN_IF_NO_DATA;
/* /*
* this is like ECPGstore_result * this is like ECPGstore_result
*/ */
...@@ -480,6 +485,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...) ...@@ -480,6 +485,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
sqlca->sqlerrd[2] = ntuples; sqlca->sqlerrd[2] = ntuples;
return (true); return (true);
} }
#undef RETURN_IF_NO_DATA
bool bool
ECPGset_desc_header(int lineno, const char *desc_name, int count) ECPGset_desc_header(int lineno, const char *desc_name, int count)
...@@ -723,8 +729,140 @@ ecpg_find_desc(int line, const char *name) ...@@ -723,8 +729,140 @@ ecpg_find_desc(int line, const char *name)
} }
bool bool
ECPGdescribe(int line, bool input, const char *statement,...) ECPGdescribe(int line, int compat, bool input, const char *connection_name, const char *stmt_name, ...)
{ {
ecpg_log("ECPGdescribe called on line %d for %s: %s\n", line, input ? "input" : "output", statement); bool ret = false;
return false; struct connection *con;
struct prepared_statement *prep;
PGresult *res;
va_list args;
/* DESCRIBE INPUT is not yet supported */
if (input)
return ret;
con = ecpg_get_connection(connection_name);
if (!con)
return false;
prep = ecpg_find_prepared_statement(stmt_name, con, NULL);
if (!prep)
return ret;
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 descriptor *desc = ecpg_find_desc(line, name);
if (desc == NULL)
break;
res = PQdescribePrepared(con->connection, stmt_name);
if (!ecpg_check_PQresult(res, line, con->connection, compat))
break;
if (desc->result != NULL)
PQclear(desc->result);
desc->result = res;
ret = true;
break;
}
case ECPGt_sqlda:
{
if (INFORMIX_MODE(compat))
{
struct sqlda_compat **_sqlda = ptr;
struct sqlda_compat *sqlda;
res = PQdescribePrepared(con->connection, stmt_name);
if (!ecpg_check_PQresult(res, line, con->connection, compat))
break;
sqlda = ecpg_build_compat_sqlda(line, res, -1, compat);
if (sqlda)
{
struct sqlda_compat *sqlda_old = *_sqlda;
struct sqlda_compat *sqlda_old1;
while (sqlda_old)
{
sqlda_old1 = sqlda_old->desc_next;
free(sqlda_old);
sqlda_old = sqlda_old1;
}
*_sqlda = sqlda;
ret = true;
}
PQclear(res);
}
else
{
struct sqlda_struct **_sqlda = ptr;
struct sqlda_struct *sqlda;
res = PQdescribePrepared(con->connection, stmt_name);
if (!ecpg_check_PQresult(res, line, con->connection, compat))
break;
sqlda = ecpg_build_native_sqlda(line, res, -1, compat);
if (sqlda)
{
struct sqlda_struct *sqlda_old = *_sqlda;
struct sqlda_struct *sqlda_old1;
while (sqlda_old)
{
sqlda_old1 = sqlda_old->desc_next;
free(sqlda_old);
sqlda_old = sqlda_old1;
}
*_sqlda = sqlda;
ret = true;
}
PQclear(res);
}
break;
}
default:
/* nothing else may come */
;
}
}
va_end(args);
return ret;
} }
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/extern.h,v 1.36 2010/01/05 16:38:23 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/extern.h,v 1.37 2010/01/15 10:44:34 meskes Exp $ */
#ifndef _ECPG_LIB_EXTERN_H #ifndef _ECPG_LIB_EXTERN_H
#define _ECPG_LIB_EXTERN_H #define _ECPG_LIB_EXTERN_H
...@@ -60,6 +60,15 @@ struct statement ...@@ -60,6 +60,15 @@ struct statement
struct variable *outlist; struct variable *outlist;
}; };
/* structure to store prepared statements for a connection */
struct prepared_statement
{
char *name;
bool prepared;
struct statement *stmt;
struct prepared_statement *next;
};
/* structure to store connections */ /* structure to store connections */
struct connection struct connection
{ {
...@@ -139,6 +148,9 @@ struct descriptor *ecpggetdescp(int, char *); ...@@ -139,6 +148,9 @@ struct descriptor *ecpggetdescp(int, char *);
struct descriptor *ecpg_find_desc(int line, const char *name); struct descriptor *ecpg_find_desc(int line, const char *name);
struct prepared_statement *ecpg_find_prepared_statement(const char *,
struct connection *, struct prepared_statement **);
bool ecpg_store_result(const PGresult *results, int act_field, bool ecpg_store_result(const PGresult *results, int act_field,
const struct statement * stmt, struct variable * var); const struct statement * stmt, struct variable * var);
bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool); bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.33 2009/10/15 10:20:15 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.34 2010/01/15 10:44:34 meskes Exp $ */
#define POSTGRES_ECPG_INTERNAL #define POSTGRES_ECPG_INTERNAL
#include "postgres_fe.h" #include "postgres_fe.h"
...@@ -11,14 +11,6 @@ ...@@ -11,14 +11,6 @@
#include "extern.h" #include "extern.h"
#include "sqlca.h" #include "sqlca.h"
struct prepared_statement
{
char *name;
bool prepared;
struct statement *stmt;
struct prepared_statement *next;
};
#define STMTID_SIZE 32 #define STMTID_SIZE 32
typedef struct typedef struct
...@@ -35,8 +27,6 @@ static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */ ...@@ -35,8 +27,6 @@ static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */ static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */
static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}}; static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}};
static struct prepared_statement *find_prepared_statement(const char *name,
struct connection * con, struct prepared_statement ** prev);
static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con, static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con,
struct prepared_statement * prev, struct prepared_statement * this); struct prepared_statement * prev, struct prepared_statement * this);
...@@ -126,7 +116,7 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c ...@@ -126,7 +116,7 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
return false; return false;
/* check if we already have prepared this statement */ /* check if we already have prepared this statement */
this = find_prepared_statement(name, con, &prev); this = ecpg_find_prepared_statement(name, con, &prev);
if (this && !deallocate_one(lineno, ECPG_COMPAT_PGSQL, con, prev, this)) if (this && !deallocate_one(lineno, ECPG_COMPAT_PGSQL, con, prev, this))
return false; return false;
...@@ -179,8 +169,8 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c ...@@ -179,8 +169,8 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
return true; return true;
} }
static struct prepared_statement * struct prepared_statement *
find_prepared_statement(const char *name, ecpg_find_prepared_statement(const char *name,
struct connection * con, struct prepared_statement ** prev_) struct connection * con, struct prepared_statement ** prev_)
{ {
struct prepared_statement *this, struct prepared_statement *this,
...@@ -262,7 +252,7 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name) ...@@ -262,7 +252,7 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
if (!ecpg_init(con, connection_name, lineno)) if (!ecpg_init(con, connection_name, lineno))
return false; return false;
this = find_prepared_statement(name, con, &prev); this = ecpg_find_prepared_statement(name, con, &prev);
if (this) if (this)
return deallocate_one(lineno, c, con, prev, this); return deallocate_one(lineno, c, con, prev, this);
...@@ -297,7 +287,7 @@ ecpg_prepared(const char *name, struct connection * con) ...@@ -297,7 +287,7 @@ ecpg_prepared(const char *name, struct connection * con)
{ {
struct prepared_statement *this; struct prepared_statement *this;
this = find_prepared_statement(name, con, NULL); this = ecpg_find_prepared_statement(name, con, NULL);
return this ? this->stmt->command : NULL; return this ? this->stmt->command : NULL;
} }
...@@ -394,7 +384,7 @@ ecpg_freeStmtCacheEntry(int lineno, int compat, int entNo) /* entry # to free * ...@@ -394,7 +384,7 @@ ecpg_freeStmtCacheEntry(int lineno, int compat, int entNo) /* entry # to free *
con = ecpg_get_connection(entry->connection); con = ecpg_get_connection(entry->connection);
/* free the 'prepared_statement' list entry */ /* free the 'prepared_statement' list entry */
this = find_prepared_statement(entry->stmtID, con, &prev); this = ecpg_find_prepared_statement(entry->stmtID, con, &prev);
if (this && !deallocate_one(lineno, compat, con, prev, this)) if (this && !deallocate_one(lineno, compat, con, prev, this))
return (-1); return (-1);
......
/* /*
* this is a small part of c.h since we don't want to leak all postgres * this is a small part of c.h since we don't want to leak all postgres
* definitions into ecpg programs * definitions into ecpg programs
* $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpglib.h,v 1.80 2009/09/18 13:13:32 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpglib.h,v 1.81 2010/01/15 10:44:36 meskes Exp $
*/ */
#ifndef _ECPGLIB_H #ifndef _ECPGLIB_H
...@@ -83,7 +83,7 @@ bool ECPGset_desc(int, const char *, int,...); ...@@ -83,7 +83,7 @@ bool ECPGset_desc(int, const char *, int,...);
void ECPGset_noind_null(enum ECPGttype, void *); void ECPGset_noind_null(enum ECPGttype, void *);
bool ECPGis_noind_null(enum ECPGttype, void *); bool ECPGis_noind_null(enum ECPGttype, void *);
bool ECPGdescribe(int, bool, const char *,...); bool ECPGdescribe(int, int, bool, const char *, const char *, ...);
/* dynamic result allocation */ /* dynamic result allocation */
void ECPGfree_auto_mem(void); void ECPGfree_auto_mem(void);
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.13 2010/01/05 16:38:23 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.14 2010/01/15 10:44:37 meskes Exp $ */
ECPG: stmtClosePortalStmt block ECPG: stmtClosePortalStmt block
{ {
if (INFORMIX_MODE) if (INFORMIX_MODE)
...@@ -84,7 +84,7 @@ ECPG: stmtViewStmt rule ...@@ -84,7 +84,7 @@ ECPG: stmtViewStmt rule
} }
| ECPGDescribe | ECPGDescribe
{ {
fprintf(yyout, "{ ECPGdescribe(__LINE__, %s,", $1); fprintf(yyout, "{ ECPGdescribe(__LINE__, %d, %s,", compat, $1);
dump_variables(argsresult, 1); dump_variables(argsresult, 1);
fputs("ECPGt_EORT);", yyout); fputs("ECPGt_EORT);", yyout);
fprintf(yyout, "}"); fprintf(yyout, "}");
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.17 2010/01/05 16:38:23 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.18 2010/01/15 10:44:37 meskes Exp $ */
statements: /*EMPTY*/ statements: /*EMPTY*/
| statements statement | statements statement
...@@ -994,6 +994,13 @@ into_descriptor: INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar ...@@ -994,6 +994,13 @@ into_descriptor: INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar
} }
; ;
into_sqlda: INTO name
{
add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator);
$$ = EMPTY;
}
;
using_list: UsingValue | UsingValue ',' using_list; using_list: UsingValue | UsingValue ',' using_list;
UsingValue: UsingConst UsingValue: UsingConst
...@@ -1019,28 +1026,45 @@ UsingConst: Iconst { $$ = $1; } ...@@ -1019,28 +1026,45 @@ UsingConst: Iconst { $$ = $1; }
; ;
/* /*
* We accept descibe but do nothing with it so far. * We accept DESCRIBE [OUTPUT] but do nothing with DESCRIBE INPUT so far.
*/ */
ECPGDescribe: SQL_DESCRIBE INPUT_P name using_descriptor ECPGDescribe: SQL_DESCRIBE INPUT_P prepared_name using_descriptor
{ {
const char *con = connection ? connection : "NULL"; const char *con = connection ? connection : "NULL";
mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
$$ = (char *) mm_alloc(sizeof("1, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3)); $$ = (char *) mm_alloc(sizeof("1, , ") + strlen(con) + strlen($3));
sprintf($$, "1, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3); sprintf($$, "1, %s, %s", con, $3);
} }
| SQL_DESCRIBE opt_output name using_descriptor | SQL_DESCRIBE opt_output prepared_name using_descriptor
{ {
const char *con = connection ? connection : "NULL"; const char *con = connection ? connection : "NULL";
mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); struct variable *var;
$$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3));
sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3); 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 name into_descriptor | 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"; const char *con = connection ? connection : "NULL";
mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement"); mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
$$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3)); $$ = (char *) mm_alloc(sizeof("1, , ") + strlen(con) + strlen($3));
sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3); sprintf($$, "1, %s, %s", con, $3);
}
| SQL_DESCRIBE opt_output prepared_name into_sqlda
{
const char *con = connection ? connection : "NULL";
$$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
sprintf($$, "0, %s, %s", con, $3);
} }
; ;
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.type,v 1.5 2010/01/05 16:38:23 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.type,v 1.6 2010/01/15 10:44:37 meskes Exp $ */
%type <str> ECPGAllocateDescr %type <str> ECPGAllocateDescr
%type <str> ECPGCKeywords %type <str> ECPGCKeywords
%type <str> ECPGColId %type <str> ECPGColId
...@@ -72,6 +72,7 @@ ...@@ -72,6 +72,7 @@
%type <str> execute_rest %type <str> execute_rest
%type <str> indicator %type <str> indicator
%type <str> into_descriptor %type <str> into_descriptor
%type <str> into_sqlda
%type <str> Iresult %type <str> Iresult
%type <str> on_off %type <str> on_off
%type <str> opt_bit_field %type <str> opt_bit_field
......
...@@ -17,6 +17,7 @@ TESTS = test_informix test_informix.c \ ...@@ -17,6 +17,7 @@ TESTS = test_informix test_informix.c \
rfmtlong rfmtlong.c \ rfmtlong rfmtlong.c \
rnull rnull.c \ rnull rnull.c \
sqlda sqlda.c \ sqlda sqlda.c \
describe describe.c \
charfuncs charfuncs.c charfuncs charfuncs.c
all: $(TESTS) all: $(TESTS)
......
#include <stdlib.h>
#include <string.h>
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_t1";
char *stmt2 = "SELECT id, t FROM descr_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 descr_t1(id serial primary key, t text);
strcpy(msg, "insert");
exec sql insert into descr_t1(id, t) values (default, 'a');
exec sql insert into descr_t1(id, t) values (default, 'b');
exec sql insert into descr_t1(id, t) values (default, 'c');
exec sql insert into descr_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)
{
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,
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 descr_t1;
strcpy(msg, "commit");
exec sql commit;
strcpy(msg, "disconnect");
exec sql disconnect;
return (0);
}
...@@ -4,6 +4,7 @@ test: compat_informix/rfmtdate ...@@ -4,6 +4,7 @@ test: compat_informix/rfmtdate
test: compat_informix/rfmtlong test: compat_informix/rfmtlong
test: compat_informix/rnull test: compat_informix/rnull
test: compat_informix/sqlda test: compat_informix/sqlda
test: compat_informix/describe
test: compat_informix/test_informix test: compat_informix/test_informix
test: compat_informix/test_informix2 test: compat_informix/test_informix2
test: connect/test2 test: connect/test2
...@@ -31,6 +32,7 @@ test: sql/copystdout ...@@ -31,6 +32,7 @@ test: sql/copystdout
test: sql/define test: sql/define
test: sql/desc test: sql/desc
test: sql/sqlda test: sql/sqlda
test: sql/describe
test: sql/dynalloc test: sql/dynalloc
test: sql/dynalloc2 test: sql/dynalloc2
test: sql/dyntest test: sql/dyntest
......
...@@ -4,6 +4,7 @@ test: compat_informix/rfmtdate ...@@ -4,6 +4,7 @@ test: compat_informix/rfmtdate
test: compat_informix/rfmtlong test: compat_informix/rfmtlong
test: compat_informix/rnull test: compat_informix/rnull
test: compat_informix/sqlda test: compat_informix/sqlda
test: compat_informix/describe
test: compat_informix/test_informix test: compat_informix/test_informix
test: compat_informix/test_informix2 test: compat_informix/test_informix2
test: connect/test2 test: connect/test2
...@@ -31,6 +32,7 @@ test: sql/copystdout ...@@ -31,6 +32,7 @@ test: sql/copystdout
test: sql/define test: sql/define
test: sql/desc test: sql/desc
test: sql/sqlda test: sql/sqlda
test: sql/describe
test: sql/dynalloc test: sql/dynalloc
test: sql/dynalloc2 test: sql/dynalloc2
test: sql/dyntest test: sql/dyntest
......
This diff is collapsed.
[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 descr_t1 ( id serial primary key , t text ); with 0 parameter(s) on connection regress1
[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 descr_t1 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on connection regress1
[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 descr_t1 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on connection regress1
[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 descr_t1 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on connection regress1
[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 descr_t1 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on connection regress1
[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 descr_t1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 63 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 64 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 65 sqld = 2
[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 132: name st_id1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 141: name st_id2; query: "SELECT id, t FROM descr_t1 WHERE id = -1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 149 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 150 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 151 sqld = 2
[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 185: name st_id2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: query: drop table descr_t1; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: OK: DROP TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 193: 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
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'
This diff is collapsed.
[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 connection regress1
[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 connection regress1
[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 connection regress1
[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 connection regress1
[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 connection regress1
[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
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'
This diff is collapsed.
[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 descr_t2 ( id serial primary key , t text ); with 0 parameter(s) on connection regress1
[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 descr_t2 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on connection regress1
[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 descr_t2 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on connection regress1
[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 descr_t2 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on connection regress1
[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 descr_t2 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on connection regress1
[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 descr_t2"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 63 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 64 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 65 sqld = 2
[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 132: name st_id1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 141: name st_id2; query: "SELECT id, t FROM descr_t2 WHERE id = -1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 149 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 150 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 151 sqld = 2
[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 185: name st_id2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: query: drop table descr_t2; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: OK: DROP TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 193: 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
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'
...@@ -9,6 +9,8 @@ TESTS = array array.c \ ...@@ -9,6 +9,8 @@ TESTS = array array.c \
copystdout copystdout.c \ copystdout copystdout.c \
define define.c \ define define.c \
desc desc.c \ desc desc.c \
sqlda sqlda.c \
describe describe.c \
dyntest dyntest.c \ dyntest dyntest.c \
dynalloc dynalloc.c \ dynalloc dynalloc.c \
dynalloc2 dynalloc2.c \ dynalloc2 dynalloc2.c \
...@@ -20,7 +22,6 @@ TESTS = array array.c \ ...@@ -20,7 +22,6 @@ TESTS = array array.c \
parser parser.c \ parser parser.c \
quote quote.c \ quote quote.c \
show show.c \ show show.c \
sqlda sqlda.c \
insupd insupd.c insupd insupd.c
all: $(TESTS) all: $(TESTS)
......
#include <stdlib.h>
#include <string.h>
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 || 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.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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment