diff -dcrpN pgsql.2.1/src/interfaces/ecpg/ecpglib/descriptor.c pgsql.3/src/interfaces/ecpg/ecpglib/descriptor.c
*** pgsql.2.1/src/interfaces/ecpg/ecpglib/descriptor.c	2009-08-07 13:06:28.000000000 +0200
--- pgsql.3/src/interfaces/ecpg/ecpglib/descriptor.c	2010-01-04 17:04:33.000000000 +0100
***************
*** 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
*** 723,730 ****
  }
  
  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;
  }
--- 729,868 ----
  }
  
  bool
! ECPGdescribe(int line, int compat, bool input, const char *connection_name, const char *stmt_name, ...)
  {
! 	bool		ret = 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;
  }
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/ecpglib/extern.h pgsql.3/src/interfaces/ecpg/ecpglib/extern.h
*** pgsql.2.1/src/interfaces/ecpg/ecpglib/extern.h	2010-01-01 16:25:58.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/ecpglib/extern.h	2010-01-04 14:57:13.000000000 +0100
*************** struct statement
*** 60,65 ****
--- 60,74 ----
  	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 */
  struct connection
  {
*************** struct descriptor *ecpggetdescp(int, cha
*** 139,144 ****
--- 148,156 ----
  
  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,
  				  const struct statement * stmt, struct variable * var);
  bool		ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/ecpglib/prepare.c pgsql.3/src/interfaces/ecpg/ecpglib/prepare.c
*** pgsql.2.1/src/interfaces/ecpg/ecpglib/prepare.c	2009-10-15 13:26:30.000000000 +0200
--- pgsql.3/src/interfaces/ecpg/ecpglib/prepare.c	2010-01-04 14:57:13.000000000 +0100
***************
*** 11,24 ****
  #include "extern.h"
  #include "sqlca.h"
  
- struct prepared_statement
- {
- 	char	   *name;
- 	bool		prepared;
- 	struct statement *stmt;
- 	struct prepared_statement *next;
- };
- 
  #define STMTID_SIZE 32
  
  typedef struct
--- 11,16 ----
*************** static const int stmtCacheNBuckets = 203
*** 35,42 ****
  static const int stmtCacheEntPerBucket = 8;		/* # entries/bucket		*/
  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,
  		 struct prepared_statement * prev, struct prepared_statement * this);
  
--- 27,32 ----
*************** ECPGprepare(int lineno, const char *conn
*** 126,132 ****
  		return false;
  
  	/* check if we already have prepared this statement */
! 	this = find_prepared_statement(name, con, &prev);
  	if (this && !deallocate_one(lineno, ECPG_COMPAT_PGSQL, con, prev, this))
  		return false;
  
--- 116,122 ----
  		return false;
  
  	/* check if we already have prepared this statement */
! 	this = ecpg_find_prepared_statement(name, con, &prev);
  	if (this && !deallocate_one(lineno, ECPG_COMPAT_PGSQL, con, prev, this))
  		return false;
  
*************** ECPGprepare(int lineno, const char *conn
*** 179,186 ****
  	return true;
  }
  
! static struct prepared_statement *
! find_prepared_statement(const char *name,
  				 struct connection * con, struct prepared_statement ** prev_)
  {
  	struct prepared_statement *this,
--- 169,176 ----
  	return true;
  }
  
! struct prepared_statement *
! ecpg_find_prepared_statement(const char *name,
  				 struct connection * con, struct prepared_statement ** prev_)
  {
  	struct prepared_statement *this,
*************** ECPGdeallocate(int lineno, int c, const 
*** 262,268 ****
  	if (!ecpg_init(con, connection_name, lineno))
  		return false;
  
! 	this = find_prepared_statement(name, con, &prev);
  	if (this)
  		return deallocate_one(lineno, c, con, prev, this);
  
--- 252,258 ----
  	if (!ecpg_init(con, connection_name, lineno))
  		return false;
  
! 	this = ecpg_find_prepared_statement(name, con, &prev);
  	if (this)
  		return deallocate_one(lineno, c, con, prev, this);
  
*************** ecpg_prepared(const char *name, struct c
*** 297,303 ****
  {
  	struct prepared_statement *this;
  
! 	this = find_prepared_statement(name, con, NULL);
  	return this ? this->stmt->command : NULL;
  }
  
--- 287,293 ----
  {
  	struct prepared_statement *this;
  
! 	this = ecpg_find_prepared_statement(name, con, NULL);
  	return this ? this->stmt->command : NULL;
  }
  
*************** ecpg_freeStmtCacheEntry(int lineno, int 
*** 394,400 ****
  	con = ecpg_get_connection(entry->connection);
  
  	/* free the 'prepared_statement' list entry		  */
! 	this = find_prepared_statement(entry->stmtID, con, &prev);
  	if (this && !deallocate_one(lineno, compat, con, prev, this))
  		return (-1);
  
--- 384,390 ----
  	con = ecpg_get_connection(entry->connection);
  
  	/* free the 'prepared_statement' list entry		  */
! 	this = ecpg_find_prepared_statement(entry->stmtID, con, &prev);
  	if (this && !deallocate_one(lineno, compat, con, prev, this))
  		return (-1);
  
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/ecpglib/sqlda.c~ pgsql.3/src/interfaces/ecpg/ecpglib/sqlda.c~
*** pgsql.2.1/src/interfaces/ecpg/ecpglib/sqlda.c~	2010-01-04 17:48:14.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/ecpglib/sqlda.c~	1970-01-01 01:00:00.000000000 +0100
***************
*** 1,616 ****
- /*
-  * SQLDA support routines
-  *
-  * The allocated memory area pointed by an sqlda pointer
-  * contains both the metadata and the data, so freeing up
-  * is a simple free(sqlda) as expected by the ESQL/C examples.
-  */
- 
- #define POSTGRES_ECPG_INTERNAL
- #include "postgres_fe.h"
- #include "pg_type.h"
- 
- #include <inttypes.h>
- #include <dlfcn.h>
- 
- #include "ecpg-pthread-win32.h"
- #include "decimal.h"
- #include "ecpgtype.h"
- #include "ecpglib.h"
- #include "ecpgerrno.h"
- #include "extern.h"
- #include "sqlca.h"
- #include "sqlda-native.h"
- #include "sqlda-compat.h"
- 
- /*
-  * Compute the next variable's offset with
-  * the current variable's size and alignment.
-  * 
-  *
-  * Returns:
-  * - the current variable's offset in *current
-  * - the next variable's offset in *next
-  */
- static void
- ecpg_sqlda_align_add_size(long offset, int alignment, int size, long *current, long *next)
- {
- 	if (offset % alignment)
- 		offset += alignment - (offset % alignment);
- 	if (current)
- 		*current = offset;
- 	offset += size;
- 	if (next)
- 		*next = offset;
- }
- 
- static long
- sqlda_compat_empty_size(const PGresult *res)
- {
- 	long	offset;
- 	int	i;
- 	int	sqld = PQnfields(res);
- 
- 	/* Initial size to store main structure and field structures */
- 	offset = sizeof(struct sqlda_compat) + sqld * sizeof(struct sqlvar_compat);
- 
- 	/* Add space for field names */
- 	for (i = 0; i < sqld; i++)
- 		offset += strlen(PQfname(res, i)) + 1;
- 
- 	/* Add padding to the first field value */
- 	ecpg_sqlda_align_add_size(offset, sizeof(int), 0, &offset, NULL);
- 
- 	return offset;
- }
- 
- static long
- sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, long offset)
- {
- 	int	sqld = PQnfields(res);
- 	int	i;
- 	long	next_offset;
- 
- 	/* Add space for the field values */
- 	for (i = 0; i < sqld; i++)
- 	{
- 		enum ECPGttype type = sqlda_dynamic_type(PQftype(res, i), compat);
- 		switch (type)
- 		{
- 			case ECPGt_short:
- 			case ECPGt_unsigned_short:
- 				ecpg_sqlda_align_add_size(offset, sizeof(short), sizeof(short), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_int:
- 			case ECPGt_unsigned_int:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(int), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_long:
- 			case ECPGt_unsigned_long:
- 				ecpg_sqlda_align_add_size(offset, sizeof(long), sizeof(long), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_long_long:
- 			case ECPGt_unsigned_long_long:
- 				ecpg_sqlda_align_add_size(offset, sizeof(long long), sizeof(long long), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_bool:
- 				ecpg_sqlda_align_add_size(offset, sizeof(bool), sizeof(bool), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_float:
- 				ecpg_sqlda_align_add_size(offset, sizeof(float), sizeof(float), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_double:
- 				ecpg_sqlda_align_add_size(offset, sizeof(double), sizeof(double), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_decimal:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(decimal), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_numeric:
- 				/*
- 				 * Let's align both the numeric struct and the digits array to int
- 				 * Unfortunately we need to do double work here to compute the size
- 				 * of the space needed for the numeric structure.
- 				 */
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(numeric), &offset, &next_offset);
- 				ecpg_log("%s type %s offset1 %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				if (!PQgetisnull(res, row, i))
- 				{
- 					char	   *val = PQgetvalue(res, row, i);
- 					numeric	   *num;
- 
- 					num = PGTYPESnumeric_from_asc(val, NULL);
- 					if (!num)
- 						break;
- 					ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
- 					ecpg_log("%s type %s offset2 %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 					PGTYPESnumeric_free(num);
- 				}
- 				break;
- 			case ECPGt_date:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(date), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_timestamp:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(timestamp), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_interval:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(interval), &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			case ECPGt_char:
- 			case ECPGt_unsigned_char:
- 			case ECPGt_string:
- 			default:
- 			{
- 				long	datalen = strlen(PQgetvalue(res, row, i)) + 1;
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), datalen, &offset, &next_offset);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(type), offset);
- 				break;
- 			}
- 		}
- 		offset = next_offset;
- 	}
- 	return offset;
- }
- 
- 
- static long
- sqlda_compat_total_size(const PGresult *res, int row, enum COMPAT_MODE compat)
- {
- 	long	offset;
- 
- 	offset = sqlda_compat_empty_size(res);
- 
- 	if (row < 0)
- 		return offset;
- 
- 	offset = sqlda_common_total_size(res, row, compat, offset);
- 	return offset;
- }
- 
- static long
- sqlda_native_empty_size(const PGresult *res)
- {
- 	long	offset;
- 	int	sqld = PQnfields(res);
- 
- 	/* Initial size to store main structure and field structures */
- 	offset = sizeof(struct sqlda_struct) + (sqld - 1) * sizeof(struct sqlvar_struct);
- 
- 	/* Add padding to the first field value */
- 	ecpg_sqlda_align_add_size(offset, sizeof(int), 0, &offset, NULL);
- 
- 	return offset;
- }
- 
- static long
- sqlda_native_total_size(const PGresult *res, int row, enum COMPAT_MODE compat)
- {
- 	long	offset;
- 
- 	offset = sqlda_native_empty_size(res);
- 
- 	if (row < 0)
- 		return offset;
- 
- 	offset = sqlda_common_total_size(res, row, compat, offset);
- 	return offset;
- }
- 
- /*
-  * Build "struct sqlda_compat" (metadata only) from PGresult
-  * leaving enough space for the field values in
-  * the given row number
-  */
- struct sqlda_compat *
- ecpg_build_compat_sqlda(int line, PGresult *res, int row, enum COMPAT_MODE compat)
- {
- 	struct sqlda_compat *sqlda;
- 	struct sqlvar_compat *sqlvar;
- 	char	   *fname;
- 	long		size;
- 	int		sqld;
- 	int		i;
- 
- 	size = sqlda_compat_total_size(res, row, compat);
- 	sqlda = (struct sqlda_compat *)ecpg_alloc(size, line);
- 	if (!sqlda)
- 		return NULL;
- 
- 	memset(sqlda, 0, size);
- 	sqlvar = (struct sqlvar_compat *)(sqlda + 1);
- 	sqld = PQnfields(res);
- 	fname = (char *)(sqlvar + sqld);
- 
- 	sqlda->sqld = sqld;
- 	sqlda->desc_occ = size; /* cheat here, keep the full allocated size */
- 	sqlda->sqlvar = sqlvar;
- 
- 	for (i = 0; i < sqlda->sqld; i++)
- 	{
- 		sqlda->sqlvar[i].sqltype = sqlda_dynamic_type(PQftype(res, i), compat);
- 		strcpy(fname, PQfname(res, i));
- 		sqlda->sqlvar[i].sqlname = fname;
- 		fname += strlen(sqlda->sqlvar[i].sqlname) + 1;
- 		sqlda->sqlvar[i].sqlformat = (char *)(long)PQfformat(res, i);
- 		sqlda->sqlvar[i].sqlxid = PQftype(res, i);
- 		sqlda->sqlvar[i].sqltypelen = PQfsize(res, i);
- 	}
- 
- 	return sqlda;
- }
- 
- /*
-  * Sets values from PGresult.
-  */
- static int2	value_is_null = -1;
- static int2	value_is_not_null = 0;
- 
- void
- ecpg_set_compat_sqlda(int lineno, struct sqlda_compat **_sqlda, const PGresult *res, int row, enum COMPAT_MODE compat)
- {
- 	struct sqlda_compat *sqlda = (*_sqlda);
- 	int		i;
- 	long		offset, next_offset;
- 
- 	if (row < 0)
- 		return;
- 
- 	/* Offset for the first field value */
- 	offset = sqlda_compat_empty_size(res);
- 
- 	/*
- 	 * Set sqlvar[i]->sqldata pointers and convert values to correct format
- 	 */
- 	for (i = 0; i < sqlda->sqld; i++)
- 	{
- 		int	isnull;
- 		int	datalen;
- 		bool	set_data = true;
- 
- 		switch (sqlda->sqlvar[i].sqltype)
- 		{
- 			case ECPGt_short:
- 			case ECPGt_unsigned_short:
- 				ecpg_sqlda_align_add_size(offset, sizeof(short), sizeof(short), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(short);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_int:
- 			case ECPGt_unsigned_int:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(int), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(int);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_long:
- 			case ECPGt_unsigned_long:
- 				ecpg_sqlda_align_add_size(offset, sizeof(long), sizeof(long), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(long);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_long_long:
- 			case ECPGt_unsigned_long_long:
- 				ecpg_sqlda_align_add_size(offset, sizeof(long long), sizeof(long long), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(long long);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_bool:
- 				ecpg_sqlda_align_add_size(offset, sizeof(bool), sizeof(bool), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(bool);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_float:
- 				ecpg_sqlda_align_add_size(offset, sizeof(float), sizeof(float), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(float);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_double:
- 				ecpg_sqlda_align_add_size(offset, sizeof(double), sizeof(double), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(double);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_decimal:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(decimal), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(decimal);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_numeric:
- 			{
- 				numeric	   *num;
- 				char	   *val;
- 
- 				set_data = false;
- 
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(numeric), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(numeric);
- 				ecpg_log("%s type %s offset1 %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 
- 				if (PQgetisnull(res, row, i))
- 				{
- 					ECPGset_noind_null(ECPGt_numeric, sqlda->sqlvar[i].sqldata);
- 					break;
- 				}
- 
- 				val = PQgetvalue(res, row, i);
- 				num = PGTYPESnumeric_from_asc(val, NULL);
- 				if (!num)
- 				{
- 					ECPGset_noind_null(ECPGt_numeric, sqlda->sqlvar[i].sqldata);
- 					break;
- 				}
- 
- 				memcpy(sqlda->sqlvar[i].sqldata, num, sizeof(numeric));
- 
- 				ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
- 				memcpy((char *)sqlda + offset, num->buf, num->ndigits + 1);
- 				ecpg_log("%s type %s offset2 %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 
- 				((numeric *)sqlda->sqlvar[i].sqldata)->buf = (NumericDigit *)sqlda + offset;
- 				((numeric *)sqlda->sqlvar[i].sqldata)->digits = (NumericDigit *)sqlda + offset + (num->digits - num->buf);
- 
- 				PGTYPESnumeric_free(num);
- 
- 				break;
- 			}
- 			case ECPGt_date:
- 				ecpg_sqlda_align_add_size(offset, sizeof(date), sizeof(date), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(date);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_timestamp:
- 				ecpg_sqlda_align_add_size(offset, sizeof(timestamp), sizeof(timestamp), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(timestamp);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_interval:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int64_t), sizeof(interval), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(interval);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_char:
- 			case ECPGt_unsigned_char:
- 			case ECPGt_string:
- 			default:
- 				datalen = strlen(PQgetvalue(res, row, i)) + 1;
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), datalen, &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = datalen;
- 				if (datalen > 32768)
- 					sqlda->sqlvar[i].sqlilongdata = sqlda->sqlvar[i].sqldata;
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 		}
- 
- 		isnull = PQgetisnull(res, row, i);
- 		ecpg_log("%s row %d col %d %s\n", __FUNCTION__, row, i, isnull ? "IS NULL" : "IS NOT NULL");
- 		sqlda->sqlvar[i].sqlind = isnull ? &value_is_null : &value_is_not_null;
- 		sqlda->sqlvar[i].sqlitype = ECPGt_short;
- 		sqlda->sqlvar[i].sqlilen = sizeof(short);
- 		if (!isnull)
- 		{
- 			if (set_data)
- 				ecpg_get_data(res, row, i, lineno,
- 						sqlda->sqlvar[i].sqltype, ECPGt_NO_INDICATOR,
- 						sqlda->sqlvar[i].sqldata, NULL, 0, 0, 0,
- 						ECPG_ARRAY_NONE, compat, false);
- 		}
- 		else
- 			ECPGset_noind_null(sqlda->sqlvar[i].sqltype, sqlda->sqlvar[i].sqldata);
- 
- 		offset = next_offset;
- 	}
- }
- 
- struct sqlda_struct *
- ecpg_build_native_sqlda(int line, PGresult *res, int row, enum COMPAT_MODE compat)
- {
- 	struct sqlda_struct *sqlda;
- 	long		size;
- 	int		sqld;
- 	int		i;
- 
- 	size = sqlda_native_total_size(res, row, compat);
- 	sqlda = (struct sqlda_struct *)ecpg_alloc(size, line);
- 	if (!sqlda)
- 		return NULL;
- 
- 	memset(sqlda, 0, size);
- 	sqld = PQnfields(res);
- 
- 	sprintf(sqlda->sqldaid, "SQLDA  ");
- 	sqlda->sqld = sqlda->sqln = sqld;
- 
- 	for (i = 0; i < sqlda->sqld; i++)
- 	{
- 		char	   *fname;
- 
- 		sqlda->sqlvar[i].sqltype = sqlda_dynamic_type(PQftype(res, i), compat);
- 		fname = PQfname(res, i);
- 		sqlda->sqlvar[i].sqlname.length = strlen(fname);
- 		strcpy(sqlda->sqlvar[i].sqlname.data, fname);
- 	}
- 
- 	return sqlda;
- }
- 
- void
- ecpg_set_native_sqlda(int lineno, struct sqlda_struct **_sqlda, const PGresult *res, int row, enum COMPAT_MODE compat)
- {
- 	struct sqlda_struct *sqlda = (*_sqlda);
- 	int		i;
- 	long		offset, next_offset;
- 
- 	if (row < 0)
- 		return;
- 
- 	/* Offset for the first field value */
- 	offset = sqlda_native_empty_size(res);
- 
- 	/*
- 	 * Set sqlvar[i]->sqldata pointers and convert values to correct format
- 	 */
- 	for (i = 0; i < sqlda->sqld; i++)
- 	{
- 		int	isnull;
- 		int	datalen;
- 		bool	set_data = true;
- 
- 		switch (sqlda->sqlvar[i].sqltype)
- 		{
- 			case ECPGt_short:
- 			case ECPGt_unsigned_short:
- 				ecpg_sqlda_align_add_size(offset, sizeof(short), sizeof(short), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(short);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_int:
- 			case ECPGt_unsigned_int:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(int), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(int);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_long:
- 			case ECPGt_unsigned_long:
- 				ecpg_sqlda_align_add_size(offset, sizeof(long), sizeof(long), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(long);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_long_long:
- 			case ECPGt_unsigned_long_long:
- 				ecpg_sqlda_align_add_size(offset, sizeof(long long), sizeof(long long), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(long long);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_bool:
- 				ecpg_sqlda_align_add_size(offset, sizeof(bool), sizeof(bool), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(bool);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_float:
- 				ecpg_sqlda_align_add_size(offset, sizeof(float), sizeof(float), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(float);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_double:
- 				ecpg_sqlda_align_add_size(offset, sizeof(double), sizeof(double), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(double);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_decimal:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(decimal), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(decimal);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_numeric:
- 			{
- 				numeric	   *num;
- 				char	   *val;
- 
- 				set_data = false;
- 
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(numeric), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(numeric);
- 				ecpg_log("%s type %s offset1 %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 
- 				if (PQgetisnull(res, row, i))
- 				{
- 					ECPGset_noind_null(ECPGt_numeric, sqlda->sqlvar[i].sqldata);
- 					break;
- 				}
- 
- 				val = PQgetvalue(res, row, i);
- 				num = PGTYPESnumeric_from_asc(val, NULL);
- 				if (!num)
- 				{
- 					ECPGset_noind_null(ECPGt_numeric, sqlda->sqlvar[i].sqldata);
- 					break;
- 				}
- 
- 				memcpy(sqlda->sqlvar[i].sqldata, num, sizeof(numeric));
- 
- 				ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
- 				memcpy((char *)sqlda + offset, num->buf, num->ndigits + 1);
- 				ecpg_log("%s type %s offset2 %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 
- 				((numeric *)sqlda->sqlvar[i].sqldata)->buf = (NumericDigit *)sqlda + offset;
- 				((numeric *)sqlda->sqlvar[i].sqldata)->digits = (NumericDigit *)sqlda + offset + (num->digits - num->buf);
- 
- 				PGTYPESnumeric_free(num);
- 
- 				break;
- 			}
- 			case ECPGt_date:
- 				ecpg_sqlda_align_add_size(offset, sizeof(date), sizeof(date), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(date);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_timestamp:
- 				ecpg_sqlda_align_add_size(offset, sizeof(timestamp), sizeof(timestamp), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(timestamp);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_interval:
- 				ecpg_sqlda_align_add_size(offset, sizeof(int64_t), sizeof(interval), &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = sizeof(interval);
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 			case ECPGt_char:
- 			case ECPGt_unsigned_char:
- 			case ECPGt_string:
- 			default:
- 				datalen = strlen(PQgetvalue(res, row, i)) + 1;
- 				ecpg_sqlda_align_add_size(offset, sizeof(int), datalen, &offset, &next_offset);
- 				sqlda->sqlvar[i].sqldata = (char *)sqlda + offset;
- 				sqlda->sqlvar[i].sqllen = datalen;
- 				ecpg_log("%s type %s offset %d\n", __FUNCTION__, ecpg_type_name(sqlda->sqlvar[i].sqltype), offset);
- 				break;
- 		}
- 
- 		isnull = PQgetisnull(res, row, i);
- 		ecpg_log("%s row %d col %d %s\n", __FUNCTION__, row, i, isnull ? "IS NULL" : "IS NOT NULL");
- 		sqlda->sqlvar[i].sqlind = isnull ? &value_is_null : &value_is_not_null;
- 		if (!isnull)
- 		{
- 			if (set_data)
- 				ecpg_get_data(res, row, i, lineno,
- 						sqlda->sqlvar[i].sqltype, ECPGt_NO_INDICATOR,
- 						sqlda->sqlvar[i].sqldata, NULL, 0, 0, 0,
- 						ECPG_ARRAY_NONE, compat, false);
- 		}
- 
- 		offset = next_offset;
- 	}
- }
--- 0 ----
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/include/ecpglib.h pgsql.3/src/interfaces/ecpg/include/ecpglib.h
*** pgsql.2.1/src/interfaces/ecpg/include/ecpglib.h	2009-09-21 15:19:11.000000000 +0200
--- pgsql.3/src/interfaces/ecpg/include/ecpglib.h	2010-01-04 17:02:52.000000000 +0100
*************** 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, int, bool, const char *, const char *, ...);
  
  /* dynamic result allocation */
  void		ECPGfree_auto_mem(void);
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/preproc/ecpg.addons pgsql.3/src/interfaces/ecpg/preproc/ecpg.addons
*** pgsql.2.1/src/interfaces/ecpg/preproc/ecpg.addons	2010-01-01 14:35:36.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/preproc/ecpg.addons	2010-01-04 17:10:40.000000000 +0100
*************** ECPG: stmtViewStmt rule
*** 84,90 ****
  	}
  	| ECPGDescribe
  	{
! 		fprintf(yyout, "{ ECPGdescribe(__LINE__, %s,", $1);
  		dump_variables(argsresult, 1);
  		fputs("ECPGt_EORT);", yyout);
  		fprintf(yyout, "}");
--- 84,90 ----
  	}
  	| ECPGDescribe
  	{
! 		fprintf(yyout, "{ ECPGdescribe(__LINE__, %d, %s,", compat, $1);
  		dump_variables(argsresult, 1);
  		fputs("ECPGt_EORT);", yyout);
  		fprintf(yyout, "}");
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/preproc/ecpg.trailer pgsql.3/src/interfaces/ecpg/preproc/ecpg.trailer
*** pgsql.2.1/src/interfaces/ecpg/preproc/ecpg.trailer	2010-01-01 16:28:15.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/preproc/ecpg.trailer	2010-01-04 15:10:00.000000000 +0100
*************** into_descriptor: INTO SQL_SQL SQL_DESCRI
*** 994,999 ****
--- 994,1006 ----
  		}
  		;
  
+ into_sqlda: INTO name
+ 		{
+ 			add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator);
+ 			$$ = EMPTY;
+ 		}
+ 		;
+ 
  using_list: UsingValue | UsingValue ',' using_list;
  
  UsingValue: UsingConst
*************** UsingConst: Iconst			{ $$ = $1; }
*** 1019,1046 ****
  		;
  
  /*
!  * 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);
  	}
  	;
  
--- 1026,1070 ----
  		;
  
  /*
!  * We accept DESCRIBE [OUTPUT] but do nothing with DESCRIBE INPUT 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");
! 		$$ = (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";
! 		$$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
! 		sprintf($$, "0, %s, %s", con, $3);
  	}
  	;
  
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/preproc/ecpg.type pgsql.3/src/interfaces/ecpg/preproc/ecpg.type
*** pgsql.2.1/src/interfaces/ecpg/preproc/ecpg.type	2010-01-01 14:35:36.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/preproc/ecpg.type	2010-01-04 14:57:13.000000000 +0100
***************
*** 72,77 ****
--- 72,78 ----
  %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
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/compat_informix/describe.pgc pgsql.3/src/interfaces/ecpg/test/compat_informix/describe.pgc
*** pgsql.2.1/src/interfaces/ecpg/test/compat_informix/describe.pgc	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/compat_informix/describe.pgc	2010-01-04 15:34:27.000000000 +0100
***************
*** 0 ****
--- 1,199 ----
+ #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);
+ }
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/compat_informix/Makefile pgsql.3/src/interfaces/ecpg/test/compat_informix/Makefile
*** pgsql.2.1/src/interfaces/ecpg/test/compat_informix/Makefile	2010-01-01 14:35:36.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/compat_informix/Makefile	2010-01-04 14:57:13.000000000 +0100
*************** TESTS = test_informix test_informix.c \
*** 17,22 ****
--- 17,23 ----
          rfmtlong rfmtlong.c \
          rnull rnull.c \
          sqlda sqlda.c \
+         describe describe.c \
          charfuncs charfuncs.c
  
  all: $(TESTS)
Binary files pgsql.2.1/src/interfaces/ecpg/test/core.25004 and pgsql.3/src/interfaces/ecpg/test/core.25004 differ
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/ecpg_schedule pgsql.3/src/interfaces/ecpg/test/ecpg_schedule
*** pgsql.2.1/src/interfaces/ecpg/test/ecpg_schedule	2010-01-01 14:35:36.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/ecpg_schedule	2010-01-04 14:57:13.000000000 +0100
*************** test: compat_informix/rfmtdate
*** 4,9 ****
--- 4,10 ----
  test: compat_informix/rfmtlong
  test: compat_informix/rnull
  test: compat_informix/sqlda
+ test: compat_informix/describe
  test: compat_informix/test_informix
  test: compat_informix/test_informix2
  test: connect/test2
*************** test: sql/copystdout
*** 31,36 ****
--- 32,38 ----
  test: sql/define
  test: sql/desc
  test: sql/sqlda
+ test: sql/describe
  test: sql/dynalloc
  test: sql/dynalloc2
  test: sql/dyntest
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/ecpg_schedule_tcp pgsql.3/src/interfaces/ecpg/test/ecpg_schedule_tcp
*** pgsql.2.1/src/interfaces/ecpg/test/ecpg_schedule_tcp	2010-01-01 14:35:36.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/ecpg_schedule_tcp	2010-01-04 14:57:13.000000000 +0100
*************** test: compat_informix/rfmtdate
*** 4,9 ****
--- 4,10 ----
  test: compat_informix/rfmtlong
  test: compat_informix/rnull
  test: compat_informix/sqlda
+ test: compat_informix/describe
  test: compat_informix/test_informix
  test: compat_informix/test_informix2
  test: connect/test2
*************** test: sql/copystdout
*** 31,36 ****
--- 32,38 ----
  test: sql/define
  test: sql/desc
  test: sql/sqlda
+ test: sql/describe
  test: sql/dynalloc
  test: sql/dynalloc2
  test: sql/dyntest
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/expected/compat_informix-describe.c pgsql.3/src/interfaces/ecpg/test/expected/compat_informix-describe.c
*** pgsql.2.1/src/interfaces/ecpg/test/expected/compat_informix-describe.c	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/compat_informix-describe.c	2010-01-04 17:12:47.000000000 +0100
***************
*** 0 ****
--- 1,472 ----
+ /* 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 ECPG_INFORMIX_COMPAT 1
+ #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 ECPG_SQLDA_H
+ #define ECPG_SQLDA_H
+ 
+ #ifdef ECPG_INFORMIX_COMPAT
+ 
+ #include "sqlda-compat.h"
+ typedef struct sqlvar_compat	sqlvar_t;
+ typedef struct sqlda_compat	sqlda_t;
+ 
+ #else
+ 
+ #include "sqlda-native.h"
+ typedef struct sqlvar_struct	sqlvar_t;
+ typedef struct sqlda_struct	sqlda_t;
+ 
+ #endif
+ 
+ #endif /* ECPG_SQLDA_H */
+ 
+ #line 5 "describe.pgc"
+ 
+ 
+ /* exec sql whenever sqlerror  stop ; */
+ #line 7 "describe.pgc"
+ 
+ 
+ sqlda_t	*sqlda1, *sqlda2, *sqlda3;
+ 
+ int
+ main (void)
+ {
+ /* exec sql begin declare section */
+ 		  
+ 		  
+ 		  
+ 		  
+ 		  
+ 
+ #line 15 "describe.pgc"
+  char * stmt1 = "SELECT id, t FROM descr_t1" ;
+  
+ #line 16 "describe.pgc"
+  char * stmt2 = "SELECT id, t FROM descr_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 descr_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 descr_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 descr_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 descr_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 descr_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__, 1, 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__, 1, 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__, 1, 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__, 1, 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__, 1, 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)
+ 	{
+ 		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");
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count1));
+ 
+ #line 86 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 86 "describe.pgc"
+ 
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count2));
+ 
+ #line 87 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 87 "describe.pgc"
+ 
+ 
+ 	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++)
+ 	{
+ 		{ ECPGget_desc(__LINE__, "desc1", i,ECPGd_name,
+ 	ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+ 
+ #line 115 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 115 "describe.pgc"
+ 
+ 		{ ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+ 	ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+ 
+ #line 116 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 116 "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 126 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 126 "describe.pgc"
+ 
+ 	ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 127 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 127 "describe.pgc"
+ 
+ 	free(sqlda1);
+ 	free(sqlda2);
+ 	free(sqlda3);
+ 
+ 	{ ECPGdeallocate(__LINE__, 1, NULL, "st_id1");
+ #line 132 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 132 "describe.pgc"
+ 
+ 
+ 	/* Test DESCRIBE with a query not producing tuples */
+ 
+ 	strcpy(msg, "allocate");
+ 	ECPGallocate_desc(__LINE__, "desc1");
+ #line 137 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 137 "describe.pgc"
+ 
+ 	ECPGallocate_desc(__LINE__, "desc2");
+ #line 138 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 138 "describe.pgc"
+ 
+ 
+ 	strcpy(msg, "prepare");
+ 	{ ECPGprepare(__LINE__, NULL, 0, "st_id2", stmt2);
+ #line 141 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 141 "describe.pgc"
+ 
+ 
+ 	sqlda1 = sqlda2 = sqlda3 = NULL;
+ 
+ 	strcpy(msg, "describe");
+ 	{ ECPGdescribe(__LINE__, 1, 0, NULL, "st_id2",
+ 	ECPGt_descriptor, "desc1", 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 146 "describe.pgc"
+ 
+ 	{ ECPGdescribe(__LINE__, 1, 0, NULL, "st_id2",
+ 	ECPGt_descriptor, "desc2", 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 147 "describe.pgc"
+ 
+ 
+ 	{ ECPGdescribe(__LINE__, 1, 0, NULL, "st_id2",
+ 	ECPGt_sqlda, &sqlda1, 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 149 "describe.pgc"
+ 
+ 	{ ECPGdescribe(__LINE__, 1, 0, NULL, "st_id2",
+ 	ECPGt_sqlda, &sqlda2, 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 150 "describe.pgc"
+ 
+ 	{ ECPGdescribe(__LINE__, 1, 0, NULL, "st_id2",
+ 	ECPGt_sqlda, &sqlda3, 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 151 "describe.pgc"
+ 
+ 
+ 	if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
+ 		exit(1);
+ 
+ 	strcpy(msg, "get descriptor");
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count1));
+ 
+ #line 157 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 157 "describe.pgc"
+ 
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count2));
+ 
+ #line 158 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 158 "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 168 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 168 "describe.pgc"
+ 
+ 		{ ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+ 	ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+ 
+ #line 169 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 169 "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 179 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 179 "describe.pgc"
+ 
+ 	ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 180 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 180 "describe.pgc"
+ 
+ 	free(sqlda1);
+ 	free(sqlda2);
+ 	free(sqlda3);
+ 
+ 	{ ECPGdeallocate(__LINE__, 1, NULL, "st_id2");
+ #line 185 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 185 "describe.pgc"
+ 
+ 
+ 	/* End test */
+ 
+ 	strcpy(msg, "drop");
+ 	{ ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "drop table descr_t1", ECPGt_EOIT, ECPGt_EORT);
+ #line 190 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 190 "describe.pgc"
+ 
+ 
+ 	strcpy(msg, "commit");
+ 	{ ECPGtrans(__LINE__, NULL, "commit");
+ #line 193 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 193 "describe.pgc"
+ 
+ 
+ 	strcpy(msg, "disconnect"); 
+ 	{ ECPGdisconnect(__LINE__, "CURRENT");
+ #line 196 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 196 "describe.pgc"
+ 
+ 
+ 	return (0);
+ }
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr pgsql.3/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr
*** pgsql.2.1/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr	2010-01-04 17:12:46.000000000 +0100
***************
*** 0 ****
--- 1,112 ----
+ [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 sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_compat_sqlda sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_compat_sqlda 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 sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_compat_sqlda sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_compat_sqlda 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
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout pgsql.3/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout
*** pgsql.2.1/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout	2010-01-04 14:57:13.000000000 +0100
***************
*** 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.2.1/src/interfaces/ecpg/test/expected/preproc-describe.c pgsql.3/src/interfaces/ecpg/test/expected/preproc-describe.c
*** pgsql.2.1/src/interfaces/ecpg/test/expected/preproc-describe.c	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/preproc-describe.c	2010-01-04 14:57:13.000000000 +0100
***************
*** 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.2.1/src/interfaces/ecpg/test/expected/preproc-describe.stderr pgsql.3/src/interfaces/ecpg/test/expected/preproc-describe.stderr
*** pgsql.2.1/src/interfaces/ecpg/test/expected/preproc-describe.stderr	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/preproc-describe.stderr	2010-01-04 14:57:13.000000000 +0100
***************
*** 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 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
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/expected/preproc-describe.stdout pgsql.3/src/interfaces/ecpg/test/expected/preproc-describe.stdout
*** pgsql.2.1/src/interfaces/ecpg/test/expected/preproc-describe.stdout	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/preproc-describe.stdout	2010-01-04 14:57:13.000000000 +0100
***************
*** 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.2.1/src/interfaces/ecpg/test/expected/sql-describe.c pgsql.3/src/interfaces/ecpg/test/expected/sql-describe.c
*** pgsql.2.1/src/interfaces/ecpg/test/expected/sql-describe.c	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/sql-describe.c	2010-01-04 17:12:28.000000000 +0100
***************
*** 0 ****
--- 1,469 ----
+ /* 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"
+ 
+ 
+ #line 1 "sqlda.h"
+ /*
+  * $PostgreSQL: pgsql/src/interfaces/ecpg/include/sqlda.h,v 1.4 2009/06/11 14:49:13 momjian Exp $
+  */
+ 
+ #ifndef ECPG_SQLDA_H
+ #define ECPG_SQLDA_H
+ 
+ #ifdef ECPG_INFORMIX_COMPAT
+ 
+ #include "sqlda-compat.h"
+ typedef struct sqlvar_compat	sqlvar_t;
+ typedef struct sqlda_compat	sqlda_t;
+ 
+ #else
+ 
+ #include "sqlda-native.h"
+ typedef struct sqlvar_struct	sqlvar_t;
+ typedef struct sqlda_struct	sqlda_t;
+ 
+ #endif
+ 
+ #endif /* ECPG_SQLDA_H */
+ 
+ #line 5 "describe.pgc"
+ 
+ 
+ /* exec sql whenever sqlerror  stop ; */
+ #line 7 "describe.pgc"
+ 
+ 
+ sqlda_t	*sqlda1, *sqlda2, *sqlda3;
+ 
+ int
+ main (void)
+ {
+ /* exec sql begin declare section */
+ 		  
+ 		  
+ 		  
+ 		  
+ 		  
+ 
+ #line 15 "describe.pgc"
+  char * stmt1 = "SELECT id, t FROM descr_t2" ;
+  
+ #line 16 "describe.pgc"
+  char * stmt2 = "SELECT id, t FROM descr_t2 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__, 0, "regress1" , NULL, NULL , NULL, 0); 
+ #line 27 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 27 "describe.pgc"
+ 
+ 
+ 	strcpy(msg, "set");
+ 	{ ECPGdo(__LINE__, 0, 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__, 0, 1, NULL, 0, ECPGst_normal, "create table descr_t2 ( 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__, 0, 1, NULL, 0, ECPGst_normal, "insert into descr_t2 ( 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__, 0, 1, NULL, 0, ECPGst_normal, "insert into descr_t2 ( 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__, 0, 1, NULL, 0, ECPGst_normal, "insert into descr_t2 ( 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__, 0, 1, NULL, 0, ECPGst_normal, "insert into descr_t2 ( 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, 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, 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, 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, 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, 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)
+ 	{
+ 		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");
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count1));
+ 
+ #line 86 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 86 "describe.pgc"
+ 
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count2));
+ 
+ #line 87 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 87 "describe.pgc"
+ 
+ 
+ 	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++)
+ 	{
+ 		{ ECPGget_desc(__LINE__, "desc1", i,ECPGd_name,
+ 	ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+ 
+ #line 115 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 115 "describe.pgc"
+ 
+ 		{ ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+ 	ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+ 
+ #line 116 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 116 "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.data,
+ 			sqlda2->sqlvar[i-1].sqlname.data,
+ 			sqlda3->sqlvar[i-1].sqlname.data);
+ 	}
+ 
+ 	strcpy(msg, "deallocate");
+ 	ECPGdeallocate_desc(__LINE__, "desc1");
+ #line 126 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 126 "describe.pgc"
+ 
+ 	ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 127 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 127 "describe.pgc"
+ 
+ 	free(sqlda1);
+ 	free(sqlda2);
+ 	free(sqlda3);
+ 
+ 	{ ECPGdeallocate(__LINE__, 0, NULL, "st_id1");
+ #line 132 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 132 "describe.pgc"
+ 
+ 
+ 	/* Test DESCRIBE with a query not producing tuples */
+ 
+ 	strcpy(msg, "allocate");
+ 	ECPGallocate_desc(__LINE__, "desc1");
+ #line 137 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 137 "describe.pgc"
+ 
+ 	ECPGallocate_desc(__LINE__, "desc2");
+ #line 138 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 138 "describe.pgc"
+ 
+ 
+ 	strcpy(msg, "prepare");
+ 	{ ECPGprepare(__LINE__, NULL, 0, "st_id2", stmt2);
+ #line 141 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 141 "describe.pgc"
+ 
+ 
+ 	sqlda1 = sqlda2 = sqlda3 = NULL;
+ 
+ 	strcpy(msg, "describe");
+ 	{ ECPGdescribe(__LINE__, 0, 0, NULL, "st_id2",
+ 	ECPGt_descriptor, "desc1", 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 146 "describe.pgc"
+ 
+ 	{ ECPGdescribe(__LINE__, 0, 0, NULL, "st_id2",
+ 	ECPGt_descriptor, "desc2", 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 147 "describe.pgc"
+ 
+ 
+ 	{ ECPGdescribe(__LINE__, 0, 0, NULL, "st_id2",
+ 	ECPGt_sqlda, &sqlda1, 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 149 "describe.pgc"
+ 
+ 	{ ECPGdescribe(__LINE__, 0, 0, NULL, "st_id2",
+ 	ECPGt_sqlda, &sqlda2, 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 150 "describe.pgc"
+ 
+ 	{ ECPGdescribe(__LINE__, 0, 0, NULL, "st_id2",
+ 	ECPGt_sqlda, &sqlda3, 0L, 0L, 0L, 
+ 	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 151 "describe.pgc"
+ 
+ 
+ 	if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
+ 		exit(1);
+ 
+ 	strcpy(msg, "get descriptor");
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count1));
+ 
+ #line 157 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 157 "describe.pgc"
+ 
+ 	{ ECPGget_desc_header(__LINE__, "desc1", &(count2));
+ 
+ #line 158 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 158 "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 168 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 168 "describe.pgc"
+ 
+ 		{ ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+ 	ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+ 
+ #line 169 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 169 "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.data,
+ 			sqlda2->sqlvar[i-1].sqlname.data,
+ 			sqlda3->sqlvar[i-1].sqlname.data);
+ 	}
+ 
+ 	strcpy(msg, "deallocate");
+ 	ECPGdeallocate_desc(__LINE__, "desc1");
+ #line 179 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 179 "describe.pgc"
+ 
+ 	ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 180 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 180 "describe.pgc"
+ 
+ 	free(sqlda1);
+ 	free(sqlda2);
+ 	free(sqlda3);
+ 
+ 	{ ECPGdeallocate(__LINE__, 0, NULL, "st_id2");
+ #line 185 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 185 "describe.pgc"
+ 
+ 
+ 	/* End test */
+ 
+ 	strcpy(msg, "drop");
+ 	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table descr_t2", ECPGt_EOIT, ECPGt_EORT);
+ #line 190 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 190 "describe.pgc"
+ 
+ 
+ 	strcpy(msg, "commit");
+ 	{ ECPGtrans(__LINE__, NULL, "commit");
+ #line 193 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 193 "describe.pgc"
+ 
+ 
+ 	strcpy(msg, "disconnect"); 
+ 	{ ECPGdisconnect(__LINE__, "CURRENT");
+ #line 196 "describe.pgc"
+ 
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 196 "describe.pgc"
+ 
+ 
+ 	return (0);
+ }
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/expected/sql-describe.stderr pgsql.3/src/interfaces/ecpg/test/expected/sql-describe.stderr
*** pgsql.2.1/src/interfaces/ecpg/test/expected/sql-describe.stderr	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/sql-describe.stderr	2010-01-04 15:50:53.000000000 +0100
***************
*** 0 ****
--- 1,112 ----
+ [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 sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_native_sqlda sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_native_sqlda 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 sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_native_sqlda sqld = 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_build_native_sqlda 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
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/expected/sql-describe.stdout pgsql.3/src/interfaces/ecpg/test/expected/sql-describe.stdout
*** pgsql.2.1/src/interfaces/ecpg/test/expected/sql-describe.stdout	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/expected/sql-describe.stdout	2010-01-04 15:42:39.000000000 +0100
***************
*** 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.2.1/src/interfaces/ecpg/test/sql/describe.pgc pgsql.3/src/interfaces/ecpg/test/sql/describe.pgc
*** pgsql.2.1/src/interfaces/ecpg/test/sql/describe.pgc	1970-01-01 01:00:00.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/sql/describe.pgc	2010-01-04 15:40:35.000000000 +0100
***************
*** 0 ****
--- 1,199 ----
+ #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);
+ }
diff -dcrpN pgsql.2.1/src/interfaces/ecpg/test/sql/Makefile pgsql.3/src/interfaces/ecpg/test/sql/Makefile
*** pgsql.2.1/src/interfaces/ecpg/test/sql/Makefile	2010-01-01 14:35:36.000000000 +0100
--- pgsql.3/src/interfaces/ecpg/test/sql/Makefile	2010-01-04 14:57:13.000000000 +0100
*************** TESTS = array array.c \
*** 9,14 ****
--- 9,16 ----
          copystdout copystdout.c \
  	define define.c \
          desc desc.c \
+         sqlda sqlda.c \
+         describe describe.c \
          dyntest dyntest.c \
          dynalloc dynalloc.c \
          dynalloc2 dynalloc2.c \
*************** TESTS = array array.c \
*** 20,26 ****
          parser parser.c \
          quote quote.c \
          show show.c \
-         sqlda sqlda.c \
          insupd insupd.c 
  
  all: $(TESTS)
--- 22,27 ----
