Re: ECPG patchset - Mailing list pgsql-hackers

From Boszormenyi Zoltan
Subject Re: ECPG patchset
Date
Msg-id 4AB33CF1.7020300@cybertec.at
Whole thread Raw
In response to Re: ECPG patchset  (Boszormenyi Zoltan <zb@cybertec.at>)
List pgsql-hackers
Disregard the previous one, correct one is attached.

Boszormenyi Zoltan írta:
> New version of the DESCRIBE patch
> Changes:
> - free(sqlda->sqlvar) as well if it's not in the same
>   allocation area as teh main sqlda
> - allow variable name for the prepared stmt in DESCRIBE
>
>
> ------------------------------------------------------------------------
>
>


--
Bible has answers for everything. Proof:
"But let your communication be, Yea, yea; Nay, nay: for whatsoever is more
than these cometh of evil." (Matthew 5:37) - basics of digital technology.
"May your kingdom come" - superficial description of plate tectonics

----------------------------------
Zoltán Böszörményi
Cybertec Schönig & Schönig GmbH
http://www.postgresql.at/

diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/ecpglib/descriptor.c
pgsql.describe/src/interfaces/ecpg/ecpglib/descriptor.c
*** pgsql.sqlda/src/interfaces/ecpg/ecpglib/descriptor.c    2009-08-07 13:06:28.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/ecpglib/descriptor.c    2009-09-18 08:32:33.000000000 +0200
***************
*** 13,18 ****
--- 13,19 ----
  #include "ecpgerrno.h"
  #include "extern.h"
  #include "sqlca.h"
+ #include "sqlda.h"
  #include "sql3types.h"

  static void descriptor_free(struct descriptor * desc);
*************** get_char_item(int lineno, void *var, enu
*** 226,231 ****
--- 227,238 ----
      return (true);
  }

+ #define RETURN_IF_NO_DATA    if (ntuples < 1) \
+                 { \
+                     ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); \
+                     return (false); \
+                 }
+
  bool
  ECPGget_desc(int lineno, const char *desc_name, int index,...)
  {
*************** ECPGget_desc(int lineno, const char *des
*** 244,254 ****
          return (false);

      ntuples = PQntuples(ECPGresult);
-     if (ntuples < 1)
-     {
-         ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL);
-         return (false);
-     }

      if (index < 1 || index > PQnfields(ECPGresult))
      {
--- 251,256 ----
*************** ECPGget_desc(int lineno, const char *des
*** 283,288 ****
--- 285,291 ----
          switch (type)
          {
              case (ECPGd_indicator):
+                 RETURN_IF_NO_DATA;
                  data_var.ind_type = vartype;
                  data_var.ind_pointer = var;
                  data_var.ind_varcharsize = varcharsize;
*************** ECPGget_desc(int lineno, const char *des
*** 295,300 ****
--- 298,304 ----
                  break;

              case ECPGd_data:
+                 RETURN_IF_NO_DATA;
                  data_var.type = vartype;
                  data_var.pointer = var;
                  data_var.varcharsize = varcharsize;
*************** ECPGget_desc(int lineno, const char *des
*** 377,382 ****
--- 381,387 ----
              case ECPGd_ret_length:
              case ECPGd_ret_octet:

+                 RETURN_IF_NO_DATA;
                  /*
                   * this is like ECPGstore_result
                   */
*************** ECPGget_desc(int lineno, const char *des
*** 480,485 ****
--- 485,491 ----
      sqlca->sqlerrd[2] = ntuples;
      return (true);
  }
+ #undef RETURN_IF_NO_DATA

  bool
  ECPGset_desc_header(int lineno, const char *desc_name, int count)
*************** ecpg_find_desc(int line, const char *nam
*** 722,730 ****
      return NULL;                /* not found */
  }

  bool
! ECPGdescribe(int line, bool input, const char *statement,...)
  {
!     ecpg_log("ECPGdescribe called on line %d for %s: %s\n", line, input ? "input" : "output", statement);
!     return false;
  }
--- 728,839 ----
      return NULL;                /* not found */
  }

+ static pg_sqlda_t*
+ build_sqlda(int lineno, bool input, const char *connection_name, const char *stmt_name)
+ {
+     struct connection *con;
+     PGresult    *res;
+     pg_sqlda_t    *sqlda = NULL;
+
+     con = ecpg_get_connection(connection_name);
+     res = PQdescribePrepared(con->connection, stmt_name);
+     if (!ecpg_check_PQresult(res, lineno, con->connection, ECPG_COMPAT_INFORMIX))
+         return NULL;
+
+     sqlda = ecpg_build_sqlda_for_PGresult(lineno, res, -1);
+
+     PQclear(res);
+     return sqlda;
+ }
+
  bool
! ECPGdescribe(int line, bool input, const char *connection_name, const char *stmt_name, ...)
  {
!     bool        ret = false;
!     va_list        args;
!
!     /* DESCRIBE INPUT is not yet supported */
!     if (input)
!         return false;
!
!     va_start(args, stmt_name);
!
!     for (;;)
!     {
!         enum ECPGttype    type, dummy_type;
!         void        *ptr, *dummy_ptr;
!         long        dummy;
!
!         /* variable type */
!         type = va_arg(args, enum ECPGttype);
!
!         if (type == ECPGt_EORT)
!             break;
!
!         /* rest of variable parameters*/
!         ptr = va_arg(args, void *);
!         dummy = va_arg(args, long);
!         dummy = va_arg(args, long);
!         dummy = va_arg(args, long);
!
!         /* variable indicator */
!         dummy_type = va_arg(args, enum ECPGttype);
!         dummy_ptr = va_arg(args, void *);
!         dummy = va_arg(args, long);
!         dummy = va_arg(args, long);
!         dummy = va_arg(args, long);
!
!         switch (type)
!         {
!             case ECPGt_descriptor:
!             {
!                 char    *name = ptr;
!                 struct connection *con = ecpg_get_connection(connection_name);
!                 struct descriptor *desc = ecpg_find_desc(line, name);
!                 PGresult    *res;
!                 ExecStatusType  ret;
!
!                 if (con == NULL)
!                     break;
!                 if (desc == NULL)
!                     break;
!
!                 res = PQdescribePrepared(con->connection, stmt_name);
!                 ret = PQresultStatus(res);
!                 if (ecpg_check_PQresult(res, line, con->connection, ECPG_COMPAT_PGSQL))
!                 {
!                     if (desc->result != NULL)
!                         PQclear(desc->result);
!                     desc->result = res;
!                     ret = true;
!                 }
!                 break;
!             }
!             case ECPGt_sqlda:
!             {
!                 pg_sqlda_t **_sqlda = ptr;
!                 pg_sqlda_t *sqlda;
!
!                 sqlda = build_sqlda(line, input, connection_name, stmt_name);
!                 if (sqlda)
!                 {
!                     pg_sqlda_t *sqlda_old = *_sqlda;
!                     if (sqlda_old)
!                     {
!                         if (sqlda->sqlvar != (pg_sqlvar_t *)(sqlda + 1))
!                             free(sqlda->sqlvar);
!                         free(sqlda_old);
!                     }
!                     *_sqlda = sqlda;
!                     ret = true;
!                 }
!                 break;
!             }
!             default:
!                 /* nothing else may come */
!                 ;
!         }
!     }
!
!     return ret;
  }
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/include/ecpglib.h pgsql.describe/src/interfaces/ecpg/include/ecpglib.h
*** pgsql.sqlda/src/interfaces/ecpg/include/ecpglib.h    2009-06-13 18:25:05.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/include/ecpglib.h    2009-09-18 08:32:33.000000000 +0200
*************** bool        ECPGset_desc(int, const char *, in
*** 83,89 ****

  void        ECPGset_noind_null(enum ECPGttype, void *);
  bool        ECPGis_noind_null(enum ECPGttype, void *);
! bool        ECPGdescribe(int, bool, const char *,...);

  /* dynamic result allocation */
  void        ECPGfree_auto_mem(void);
--- 83,89 ----

  void        ECPGset_noind_null(enum ECPGttype, void *);
  bool        ECPGis_noind_null(enum ECPGttype, void *);
! bool        ECPGdescribe(int, bool, const char *, const char *, ...);

  /* dynamic result allocation */
  void        ECPGfree_auto_mem(void);
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.trailer
pgsql.describe/src/interfaces/ecpg/preproc/ecpg.trailer
*** pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.trailer    2009-09-18 08:31:59.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/preproc/ecpg.trailer    2009-09-18 09:36:27.000000000 +0200
*************** into_descriptor: INTO opt_sql SQL_DESCRI
*** 1057,1062 ****
--- 1057,1069 ----
          }
          ;

+ into_sqlda: INTO name
+         {
+             add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator);
+             $$ = EMPTY;
+         }
+         ;
+
  opt_sql: /*EMPTY*/        { $$ = EMPTY; }
          | SQL_SQL    { $$ = make_str("sql"); }
          ;
*************** UsingConst: Iconst            { $$ = $1; }
*** 1088,1113 ****
  /*
   * We accept descibe but do nothing with it so far.
   */
! ECPGDescribe: SQL_DESCRIBE INPUT_P name using_descriptor
      {
          const char *con = connection ? connection : "NULL";
          mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
!         $$ = (char *) mm_alloc(sizeof("1, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3));
!         sprintf($$, "1, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3);
      }
!     | SQL_DESCRIBE opt_output name using_descriptor
      {
          const char *con = connection ? connection : "NULL";
!         mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
!         $$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3));
!         sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3);
      }
!     | SQL_DESCRIBE opt_output name into_descriptor
      {
          const char *con = connection ? connection : "NULL";
          mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
!         $$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3));
!         sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3);
      }
      ;

--- 1095,1141 ----
  /*
   * We accept descibe but do nothing with it so far.
   */
! ECPGDescribe: SQL_DESCRIBE INPUT_P prepared_name using_descriptor
      {
          const char *con = connection ? connection : "NULL";
          mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
!         $$ = (char *) mm_alloc(sizeof("1, , ") + strlen(con) + strlen($3));
!         sprintf($$, "1, %s, %s", con, $3);
      }
!     | SQL_DESCRIBE opt_output prepared_name using_descriptor
      {
          const char *con = connection ? connection : "NULL";
!         struct variable *var;
!
!         var = argsinsert->variable;
!         remove_variable_from_list(&argsinsert, var);
!         add_variable_to_head(&argsresult, var, &no_indicator);
!
!         $$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
!         sprintf($$, "0, %s, %s", con, $3);
      }
!     | SQL_DESCRIBE opt_output prepared_name into_descriptor
!     {
!         const char *con = connection ? connection : "NULL";
!         $$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
!         sprintf($$, "0, %s, %s", con, $3);
!     }
!     | SQL_DESCRIBE INPUT_P prepared_name into_sqlda
      {
          const char *con = connection ? connection : "NULL";
          mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
!         if (!INFORMIX_MODE)
!             mmerror(PARSE_ERROR, ET_ERROR, "Not in Informix compatibility mode");
!         $$ = (char *) mm_alloc(sizeof("1, , ") + strlen(con) + strlen($3));
!         sprintf($$, "1, %s, %s", con, $3);
!     }
!     | SQL_DESCRIBE opt_output prepared_name into_sqlda
!     {
!         const char *con = connection ? connection : "NULL";
!         if (!INFORMIX_MODE)
!             mmerror(PARSE_ERROR, ET_ERROR, "Not in Informix compatibility mode");
!         $$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
!         sprintf($$, "0, %s, %s", con, $3);
      }
      ;

diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.type pgsql.describe/src/interfaces/ecpg/preproc/ecpg.type
*** pgsql.sqlda/src/interfaces/ecpg/preproc/ecpg.type    2009-09-18 08:31:59.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/preproc/ecpg.type    2009-09-18 08:32:33.000000000 +0200
***************
*** 73,78 ****
--- 73,79 ----
  %type <str> execute_rest
  %type <str> indicator
  %type <str> into_descriptor
+ %type <str> into_sqlda
  %type <str> Iresult
  %type <str> on_off
  %type <str> opt_bit_field
***************
*** 88,94 ****
  %type <str> opt_reference
  %type <str> opt_scale
  %type <str> opt_server
! %type <str> opt_sql
  %type <str> opt_user
  %type <str> opt_opt_value
  %type <str> ora_user
--- 89,95 ----
  %type <str> opt_reference
  %type <str> opt_scale
  %type <str> opt_server
! %type <str> opt_sql
  %type <str> opt_user
  %type <str> opt_opt_value
  %type <str> ora_user
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/describe.pgc
pgsql.describe/src/interfaces/ecpg/test/compat_informix/describe.pgc
*** pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/describe.pgc    1970-01-01 01:00:00.000000000 +0100
--- pgsql.describe/src/interfaces/ecpg/test/compat_informix/describe.pgc    2009-09-18 08:32:33.000000000 +0200
***************
*** 0 ****
--- 1,166 ----
+ #include <stdlib.h>
+ #include <string.h>
+
+ exec sql include ../regression;
+ exec sql include sqlda.h;
+
+ exec sql whenever sqlerror stop;
+
+ pg_sqlda_t    *sqlda1, *sqlda2, *sqlda3;
+
+ int
+ main (void)
+ {
+ exec sql begin declare section;
+     char    *stmt1 = "SELECT id, t FROM t1";
+     char    *stmt2 = "SELECT id, t FROM t1 WHERE id = -1";
+     int    i, count1, count2;
+     char    field_name1[30] = "not set";
+     char    field_name2[30] = "not set";
+ exec sql end declare section;
+
+     char msg[128];
+
+     ECPGdebug(1, stderr);
+
+     strcpy(msg, "connect");
+     exec sql connect to REGRESSDB1;
+
+     strcpy(msg, "set");
+     exec sql set datestyle to iso;
+
+     strcpy(msg, "create");
+     exec sql create table t1(id serial primary key, t text);
+
+     strcpy(msg, "insert");
+     exec sql insert into t1(id, t) values (default, 'a');
+     exec sql insert into t1(id, t) values (default, 'b');
+     exec sql insert into t1(id, t) values (default, 'c');
+     exec sql insert into t1(id, t) values (default, 'd');
+
+     strcpy(msg, "commit");
+     exec sql commit;
+
+     /*
+      * Test DESCRIBE with a query producing tuples.
+      * DESCRIPTOR and SQL DESCRIPTOR are NOT the same in
+      * Informix-compat mode.
+      */
+
+     strcpy(msg, "allocate");
+     exec sql allocate descriptor desc1;
+     exec sql allocate descriptor desc2;
+
+     strcpy(msg, "prepare");
+     exec sql prepare st_id1 FROM :stmt1;
+
+     sqlda1 = sqlda2 = sqlda3 = NULL;
+
+     strcpy(msg, "describe");
+     exec sql describe st_id1 into sql descriptor desc1;
+     exec sql describe st_id1 using sql descriptor desc2;
+
+     exec sql describe st_id1 into descriptor sqlda1;
+     exec sql describe st_id1 using descriptor sqlda2;
+     exec sql describe st_id1 into sqlda3;
+
+     if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
+         exit(1);
+
+     strcpy(msg, "get descriptor");
+     exec sql get descriptor desc1 :count1 = count;
+     exec sql get descriptor desc1 :count2 = count;
+
+     if (!(    count1 == count2 &&
+         count1 == sqlda1->sqld &&
+         count1 == sqlda2->sqld &&
+         count1 == sqlda3->sqld))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         exec sql get descriptor desc1 value :i :field_name1 = name;
+         exec sql get descriptor desc2 value :i :field_name2 = name;
+         printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
+             "sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
+             i, field_name1, field_name2,
+             sqlda1->sqlvar[i-1].sqlname,
+             sqlda2->sqlvar[i-1].sqlname,
+             sqlda3->sqlvar[i-1].sqlname);
+     }
+
+     strcpy(msg, "deallocate");
+     exec sql deallocate descriptor desc1;
+     exec sql deallocate descriptor desc2;
+     free(sqlda1);
+     free(sqlda2);
+     free(sqlda3);
+
+     exec sql deallocate prepare st_id1;
+
+     /* Test DESCRIBE with a query not producing tuples */
+
+     strcpy(msg, "allocate");
+     exec sql allocate descriptor desc1;
+     exec sql allocate descriptor desc2;
+
+     strcpy(msg, "prepare");
+     exec sql prepare st_id2 FROM :stmt2;
+
+     sqlda1 = sqlda2 = sqlda3 = NULL;
+
+     strcpy(msg, "describe");
+     exec sql describe st_id2 into sql descriptor desc1;
+     exec sql describe st_id2 using sql descriptor desc2;
+
+     exec sql describe st_id2 into descriptor sqlda1;
+     exec sql describe st_id2 using descriptor sqlda2;
+     exec sql describe st_id2 into sqlda3;
+
+     if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
+         exit(1);
+
+     strcpy(msg, "get descriptor");
+     exec sql get descriptor desc1 :count1 = count;
+     exec sql get descriptor desc1 :count2 = count;
+
+     if (!(    count1 == count2 &&
+         count1 == sqlda1->sqld &&
+         count1 == sqlda2->sqld &&
+         count1 == sqlda3->sqld))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         exec sql get descriptor desc1 value :i :field_name1 = name;
+         exec sql get descriptor desc2 value :i :field_name2 = name;
+         printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
+             "sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
+             i, field_name1, field_name2,
+             sqlda1->sqlvar[i-1].sqlname,
+             sqlda2->sqlvar[i-1].sqlname,
+             sqlda3->sqlvar[i-1].sqlname);
+     }
+
+     strcpy(msg, "deallocate");
+     exec sql deallocate descriptor desc1;
+     exec sql deallocate descriptor desc2;
+     free(sqlda1);
+     free(sqlda2);
+     free(sqlda3);
+
+     exec sql deallocate prepare st_id2;
+
+     /* End test */
+
+     strcpy(msg, "drop");
+     exec sql drop table t1;
+
+     strcpy(msg, "commit");
+     exec sql commit;
+
+     strcpy(msg, "disconnect");
+     exec sql disconnect;
+
+     return (0);
+ }
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/Makefile
pgsql.describe/src/interfaces/ecpg/test/compat_informix/Makefile
*** pgsql.sqlda/src/interfaces/ecpg/test/compat_informix/Makefile    2009-09-18 08:31:59.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/test/compat_informix/Makefile    2009-09-18 08:32:33.000000000 +0200
*************** override LIBS := -lecpg_compat $(LIBS)
*** 13,18 ****
--- 13,19 ----
  TESTS = test_informix test_informix.c \
          test_informix2 test_informix2.c \
          cursor cursor.c \
+         describe describe.c \
          dec_test dec_test.c \
          rfmtdate rfmtdate.c \
          rfmtlong rfmtlong.c \
*************** test_informix2.c: test_informix2.pgc ../
*** 31,36 ****
--- 32,40 ----
  cursor.c: cursor.pgc ../regression.h
      $(ECPG) -o $@ -I$(srcdir) $<

+ describe.c: describe.pgc ../regression.h
+     $(ECPG) -o $@ -I$(srcdir) $<
+
  sqlda.c: sqlda.pgc ../regression.h
      $(ECPG) -o $@ -I$(srcdir) $<

diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule
*** pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule    2009-09-18 08:31:59.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule    2009-09-18 08:32:33.000000000 +0200
*************** test: compat_informix/rfmtlong
*** 5,10 ****
--- 5,11 ----
  test: compat_informix/rnull
  test: compat_informix/cursor
  test: compat_informix/sqlda
+ test: compat_informix/describe
  test: compat_informix/test_informix
  test: compat_informix/test_informix2
  test: connect/test2
*************** test: preproc/array_of_struct
*** 19,24 ****
--- 20,26 ----
  test: preproc/autoprep
  test: preproc/comment
  test: preproc/cursor
+ test: preproc/describe
  test: preproc/define
  test: preproc/init
  test: preproc/strings
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule_tcp
pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule_tcp
*** pgsql.sqlda/src/interfaces/ecpg/test/ecpg_schedule_tcp    2009-09-18 08:31:59.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/test/ecpg_schedule_tcp    2009-09-18 08:32:33.000000000 +0200
*************** test: compat_informix/rfmtlong
*** 5,10 ****
--- 5,11 ----
  test: compat_informix/rnull
  test: compat_informix/cursor
  test: compat_informix/sqlda
+ test: compat_informix/describe
  test: compat_informix/test_informix
  test: compat_informix/test_informix2
  test: connect/test2
*************** test: preproc/array_of_struct
*** 19,24 ****
--- 20,26 ----
  test: preproc/autoprep
  test: preproc/comment
  test: preproc/cursor
+ test: preproc/describe
  test: preproc/define
  test: preproc/init
  test: preproc/strings
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.c
pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.c
*** pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.c    1970-01-01 01:00:00.000000000 +0100
--- pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.c    2009-09-18 08:32:33.000000000 +0200
***************
*** 0 ****
--- 1,490 ----
+ /* Processed by ecpg (regression mode) */
+ /* These include files are added by the preprocessor */
+ #include <ecpglib.h>
+ #include <ecpgerrno.h>
+ #include <sqlca.h>
+ /* Needed for informix compatibility */
+ #include <ecpg_informix.h>
+ /* End of automatic include section */
+ #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+ #line 1 "describe.pgc"
+ #include <stdlib.h>
+ #include <string.h>
+
+
+ #line 1 "regression.h"
+
+
+
+
+
+
+ #line 4 "describe.pgc"
+
+
+ #line 1 "sqlda.h"
+ /*
+  * $PostgreSQL: pgsql/src/interfaces/ecpg/include/sqlda.h,v 1.4 2009/06/11 14:49:13 momjian Exp $
+  */
+
+ #ifndef POSTGRES_SQLDA_H
+ #define POSTGRES_SQLDA_H
+
+ /* Define Informix "standard" types */
+ #ifndef C_H
+ typedef int        int4;
+ typedef    short        int2;
+ #endif
+ typedef    char        int1;
+
+ typedef    int        mint;
+ typedef    long        mlong;
+
+ typedef    short        MSHORT;
+ typedef    char        MCHAR;
+
+ typedef    unsigned int    uint4;
+ typedef    unsigned short    uint2;
+ typedef    unsigned char    uint1;
+
+ typedef    unsigned int    muint;
+ typedef    unsigned long    mulong;
+
+ typedef    unsigned short    MUSHORT;
+ typedef    unsigned char    MUCHAR;
+
+ #define MI_INT_SIZE     (sizeof(int)    * 8)
+ #define MI_LONG_SIZE    (sizeof(long)   * 8)
+ #define MI_PTR_SIZE     (sizeof(char *) * 8)
+
+ typedef struct sqlvar_struct
+ {
+     int2    sqltype;        /* variable type                */
+     int4    sqllen;            /* length in bytes              */
+     char       *sqldata;        /* pointer to data              */
+     int2       *sqlind;        /* pointer to indicator         */
+     char       *sqlname;        /* variable name                */
+     char       *sqlformat;        /* reserved for future use      */
+     int2    sqlitype;        /* ind variable type            */
+     int2    sqlilen;        /* ind length in bytes          */
+     char       *sqlidata;        /* ind data pointer             */
+     int4    sqlxid;            /* extended id type             */
+     char       *sqltypename;    /* extended type name           */
+     int2    sqltypelen;        /* length of extended type name */
+     int2    sqlownerlen;        /* length of owner name         */
+     int2    sqlsourcetype;        /* source type for distinct of built-ins */
+     char       *sqlownername;    /* owner name                   */
+     int4    sqlsourceid;        /* extended id of source type   */
+
+     /*
+      * sqlilongdata is new.  It supports data that exceeds the 32k
+      * limit.  sqlilen and sqlidata are for backward compatibility
+      * and they have maximum value of <32K.
+      */
+     char       *sqlilongdata;    /* for data field beyond 32K    */
+     int4    sqlflags;        /* for internal use only        */
+     void       *sqlreserved;    /* reserved for future use      */
+ } pg_sqlvar_t;
+
+ typedef struct sqlda
+ {
+     int2        sqld;
+     pg_sqlvar_t       *sqlvar;
+     char        desc_name[19];    /* descriptor name              */
+     int2        desc_occ;    /* size of sqlda structure      */
+     struct sqlda       *desc_next;    /* pointer to next sqlda struct */
+     void           *reserved;    /* reserved for future use */
+ } pg_sqlda_t;
+
+ #endif /* POSTGRES_SQLDA_H */
+
+ #line 5 "describe.pgc"
+
+
+ /* exec sql whenever sqlerror  stop ; */
+ #line 7 "describe.pgc"
+
+
+ pg_sqlda_t    *sqlda1, *sqlda2, *sqlda3;
+
+ int
+ main (void)
+ {
+ /* exec sql begin declare section */
+
+
+
+
+
+
+ #line 15 "describe.pgc"
+  char * stmt1 = "SELECT id, t FROM t1" ;
+
+ #line 16 "describe.pgc"
+  char * stmt2 = "SELECT id, t FROM t1 WHERE id = -1" ;
+
+ #line 17 "describe.pgc"
+  int i , count1 , count2 ;
+
+ #line 18 "describe.pgc"
+  char field_name1 [ 30 ] = "not set" ;
+
+ #line 19 "describe.pgc"
+  char field_name2 [ 30 ] = "not set" ;
+ /* exec sql end declare section */
+ #line 20 "describe.pgc"
+
+
+     char msg[128];
+
+     ECPGdebug(1, stderr);
+
+     strcpy(msg, "connect");
+     { ECPGconnect(__LINE__, 1, "regress1" , NULL, NULL , NULL, 0);
+ #line 27 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 27 "describe.pgc"
+
+
+     strcpy(msg, "set");
+     { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT);
+ #line 30 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 30 "describe.pgc"
+
+
+     strcpy(msg, "create");
+     { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "create table t1 ( id serial primary key , t text )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 33 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 33 "describe.pgc"
+
+
+     strcpy(msg, "insert");
+     { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'a' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 36 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 36 "describe.pgc"
+
+     { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'b' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 37 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 37 "describe.pgc"
+
+     { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'c' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 38 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 38 "describe.pgc"
+
+     { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'd' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 39 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 39 "describe.pgc"
+
+
+     strcpy(msg, "commit");
+     { ECPGtrans(__LINE__, NULL, "commit");
+ #line 42 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 42 "describe.pgc"
+
+
+     /*
+      * Test DESCRIBE with a query producing tuples.
+      * DESCRIPTOR and SQL DESCRIPTOR are NOT the same in
+      * Informix-compat mode.
+      */
+
+     strcpy(msg, "allocate");
+     ECPGallocate_desc(__LINE__, "desc1");
+ #line 51 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 51 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc2");
+ #line 52 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 52 "describe.pgc"
+
+
+     strcpy(msg, "prepare");
+     { ECPGprepare(__LINE__, NULL, 0, "st_id1", stmt1);
+ #line 55 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 55 "describe.pgc"
+
+
+     sqlda1 = sqlda2 = sqlda3 = NULL;
+
+     strcpy(msg, "describe");
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_descriptor, "desc1", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 60 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_descriptor, "desc2", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 61 "describe.pgc"
+
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_sqlda, & sqlda1 , 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 63 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_sqlda, & sqlda2 , 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 64 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_sqlda, &sqlda3, 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 65 "describe.pgc"
+
+
+     if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
+         exit(1);
+
+     strcpy(msg, "get descriptor");
+     { ECPGget_desc_header(__LINE__, "desc1", &(count1));
+
+ #line 71 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 71 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc1", &(count2));
+
+ #line 72 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 72 "describe.pgc"
+
+
+     if (!(    count1 == count2 &&
+         count1 == sqlda1->sqld &&
+         count1 == sqlda2->sqld &&
+         count1 == sqlda3->sqld))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name,
+     ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 82 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 82 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+     ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 83 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 83 "describe.pgc"
+
+         printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
+             "sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
+             i, field_name1, field_name2,
+             sqlda1->sqlvar[i-1].sqlname,
+             sqlda2->sqlvar[i-1].sqlname,
+             sqlda3->sqlvar[i-1].sqlname);
+     }
+
+     strcpy(msg, "deallocate");
+     ECPGdeallocate_desc(__LINE__, "desc1");
+ #line 93 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 93 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 94 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 94 "describe.pgc"
+
+     free(sqlda1);
+     free(sqlda2);
+     free(sqlda3);
+
+     { ECPGdeallocate(__LINE__, 1, NULL, "st_id1");
+ #line 99 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 99 "describe.pgc"
+
+
+     /* Test DESCRIBE with a query not producing tuples */
+
+     strcpy(msg, "allocate");
+     ECPGallocate_desc(__LINE__, "desc1");
+ #line 104 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 104 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc2");
+ #line 105 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 105 "describe.pgc"
+
+
+     strcpy(msg, "prepare");
+     { ECPGprepare(__LINE__, NULL, 0, "st_id2", stmt2);
+ #line 108 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 108 "describe.pgc"
+
+
+     sqlda1 = sqlda2 = sqlda3 = NULL;
+
+     strcpy(msg, "describe");
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_descriptor, "desc1", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 113 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_descriptor, "desc2", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 114 "describe.pgc"
+
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_sqlda, & sqlda1 , 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 116 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_sqlda, & sqlda2 , 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 117 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_sqlda, &sqlda3, 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 118 "describe.pgc"
+
+
+     if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
+         exit(1);
+
+     strcpy(msg, "get descriptor");
+     { ECPGget_desc_header(__LINE__, "desc1", &(count1));
+
+ #line 124 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 124 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc1", &(count2));
+
+ #line 125 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 125 "describe.pgc"
+
+
+     if (!(    count1 == count2 &&
+         count1 == sqlda1->sqld &&
+         count1 == sqlda2->sqld &&
+         count1 == sqlda3->sqld))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name,
+     ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 135 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 135 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+     ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 136 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 136 "describe.pgc"
+
+         printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
+             "sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
+             i, field_name1, field_name2,
+             sqlda1->sqlvar[i-1].sqlname,
+             sqlda2->sqlvar[i-1].sqlname,
+             sqlda3->sqlvar[i-1].sqlname);
+     }
+
+     strcpy(msg, "deallocate");
+     ECPGdeallocate_desc(__LINE__, "desc1");
+ #line 146 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 146 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 147 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 147 "describe.pgc"
+
+     free(sqlda1);
+     free(sqlda2);
+     free(sqlda3);
+
+     { ECPGdeallocate(__LINE__, 1, NULL, "st_id2");
+ #line 152 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 152 "describe.pgc"
+
+
+     /* End test */
+
+     strcpy(msg, "drop");
+     { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "drop table t1", ECPGt_EOIT, ECPGt_EORT);
+ #line 157 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 157 "describe.pgc"
+
+
+     strcpy(msg, "commit");
+     { ECPGtrans(__LINE__, NULL, "commit");
+ #line 160 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 160 "describe.pgc"
+
+
+     strcpy(msg, "disconnect");
+     { ECPGdisconnect(__LINE__, "CURRENT");
+ #line 163 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 163 "describe.pgc"
+
+
+     return (0);
+ }
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr
pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr
*** pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr    1970-01-01 01:00:00.000000000
+0100
--- pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stderr    2009-09-18 08:32:33.000000000
+0200
***************
*** 0 ****
--- 1,100 ----
+ [NO_PID]: ECPGdebug: set to 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 30: query: set datestyle to iso; with 0 parameter(s) on connection regress1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 30: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 30: OK: SET
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 33: query: create table t1 ( id serial primary key , t text ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 33: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 33: OK: CREATE TABLE
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 36: query: insert into t1 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 36: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 36: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 37: query: insert into t1 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 37: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 37: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 38: query: insert into t1 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 38: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 38: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 39: query: insert into t1 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 39: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 39: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGtrans on line 42: action "commit"; connection "regress1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGprepare on line 55: name st_id1; query: "SELECT id, t FROM t1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGdeallocate on line 99: name st_id1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGprepare on line 108: name st_id2; query: "SELECT id, t FROM t1 WHERE id = -1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGdeallocate on line 152: name st_id2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 157: query: drop table t1; with 0 parameter(s) on connection regress1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 157: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 157: OK: DROP TABLE
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGtrans on line 160: action "commit"; connection "regress1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_finish: connection regress1 closed
+ [NO_PID]: sqlca: code: 0, state: 00000
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout
pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout
*** pgsql.sqlda/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout    1970-01-01 01:00:00.000000000
+0100
--- pgsql.describe/src/interfaces/ecpg/test/expected/compat_informix-describe.stdout    2009-09-18 08:32:33.000000000
+0200
***************
*** 0 ****
--- 1,24 ----
+ 1
+     field_name1 'id'
+     field_name2 'id'
+     sqlda1 'id'
+     sqlda2 'id'
+     sqlda3 'id'
+ 2
+     field_name1 't'
+     field_name2 't'
+     sqlda1 't'
+     sqlda2 't'
+     sqlda3 't'
+ 1
+     field_name1 'id'
+     field_name2 'id'
+     sqlda1 'id'
+     sqlda2 'id'
+     sqlda3 'id'
+ 2
+     field_name1 't'
+     field_name2 't'
+     sqlda1 't'
+     sqlda2 't'
+     sqlda3 't'
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.c
pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.c
*** pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.c    1970-01-01 01:00:00.000000000 +0100
--- pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.c    2009-09-18 08:32:33.000000000 +0200
***************
*** 0 ****
--- 1,481 ----
+ /* Processed by ecpg (regression mode) */
+ /* These include files are added by the preprocessor */
+ #include <ecpglib.h>
+ #include <ecpgerrno.h>
+ #include <sqlca.h>
+ /* End of automatic include section */
+ #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+ #line 1 "describe.pgc"
+ #include <stdlib.h>
+ #include <string.h>
+
+
+ #line 1 "regression.h"
+
+
+
+
+
+
+ #line 4 "describe.pgc"
+
+
+ /* exec sql whenever sqlerror  stop ; */
+ #line 6 "describe.pgc"
+
+
+ int
+ main (void)
+ {
+ /* exec sql begin declare section */
+
+
+
+
+
+
+
+
+ #line 12 "describe.pgc"
+  char * stmt1 = "SELECT id, t FROM t1" ;
+
+ #line 13 "describe.pgc"
+  char * stmt2 = "SELECT id, t FROM t1 WHERE id = -1" ;
+
+ #line 14 "describe.pgc"
+  int i , count1 , count2 , count3 , count4 ;
+
+ #line 15 "describe.pgc"
+  char field_name1 [ 30 ] = "not set" ;
+
+ #line 16 "describe.pgc"
+  char field_name2 [ 30 ] = "not set" ;
+
+ #line 17 "describe.pgc"
+  char field_name3 [ 30 ] = "not set" ;
+
+ #line 18 "describe.pgc"
+  char field_name4 [ 30 ] = "not set" ;
+ /* exec sql end declare section */
+ #line 19 "describe.pgc"
+
+
+     char msg[128];
+
+     ECPGdebug(1, stderr);
+
+     strcpy(msg, "connect");
+     { ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , NULL, 0);
+ #line 26 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 26 "describe.pgc"
+
+
+     strcpy(msg, "set");
+     { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT);
+ #line 29 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 29 "describe.pgc"
+
+
+     strcpy(msg, "create");
+     { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table t1 ( id serial primary key , t text )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 32 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 32 "describe.pgc"
+
+
+     strcpy(msg, "insert");
+     { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'a' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 35 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 35 "describe.pgc"
+
+     { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'b' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 36 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 36 "describe.pgc"
+
+     { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'c' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 37 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 37 "describe.pgc"
+
+     { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 ( id , t ) values ( default , 'd' )",
ECPGt_EOIT,ECPGt_EORT); 
+ #line 38 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 38 "describe.pgc"
+
+
+     strcpy(msg, "commit");
+     { ECPGtrans(__LINE__, NULL, "commit");
+ #line 41 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 41 "describe.pgc"
+
+
+     /*
+      * Test DESCRIBE with a query producing tuples.
+      * DESCRIPTOR and SQL DESCRIPTOR are the same in native mode.
+      */
+
+     strcpy(msg, "allocate");
+     ECPGallocate_desc(__LINE__, "desc1");
+ #line 49 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 49 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc2");
+ #line 50 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 50 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc3");
+ #line 51 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 51 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc4");
+ #line 52 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 52 "describe.pgc"
+
+
+     strcpy(msg, "prepare");
+     { ECPGprepare(__LINE__, NULL, 0, "st_id1", stmt1);
+ #line 55 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 55 "describe.pgc"
+
+
+     strcpy(msg, "describe");
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_descriptor, "desc1", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 58 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_descriptor, "desc2", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 59 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_descriptor, "desc3", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 60 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id1",
+     ECPGt_descriptor, "desc4", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 61 "describe.pgc"
+
+
+     strcpy(msg, "get descriptor");
+     { ECPGget_desc_header(__LINE__, "desc1", &(count1));
+
+ #line 64 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 64 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc2", &(count2));
+
+ #line 65 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 65 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc3", &(count3));
+
+ #line 66 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 66 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc4", &(count4));
+
+ #line 67 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 67 "describe.pgc"
+
+
+     if (!(count1 == count2 && count1 == count3 && count1 == count4))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name,
+     ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 74 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 74 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+     ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 75 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 75 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc3", i,ECPGd_name,
+     ECPGt_char,(field_name3),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 76 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 76 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc4", i,ECPGd_name,
+     ECPGt_char,(field_name4),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 77 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 77 "describe.pgc"
+
+         printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n",
+             field_name1, field_name2, field_name3, field_name4);
+     }
+
+     strcpy(msg, "deallocate");
+     ECPGdeallocate_desc(__LINE__, "desc1");
+ #line 83 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 83 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 84 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 84 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc3");
+ #line 85 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 85 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc4");
+ #line 86 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 86 "describe.pgc"
+
+
+     { ECPGdeallocate(__LINE__, 0, NULL, "st_id1");
+ #line 88 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 88 "describe.pgc"
+
+
+     /* Test DESCRIBE with a query not producing tuples */
+
+     strcpy(msg, "allocate");
+     ECPGallocate_desc(__LINE__, "desc1");
+ #line 93 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 93 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc2");
+ #line 94 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 94 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc3");
+ #line 95 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 95 "describe.pgc"
+
+     ECPGallocate_desc(__LINE__, "desc4");
+ #line 96 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 96 "describe.pgc"
+
+
+     strcpy(msg, "prepare");
+     { ECPGprepare(__LINE__, NULL, 0, "st_id2", stmt2);
+ #line 99 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 99 "describe.pgc"
+
+
+     strcpy(msg, "describe");
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_descriptor, "desc1", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 102 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_descriptor, "desc2", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 103 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_descriptor, "desc3", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 104 "describe.pgc"
+
+     { ECPGdescribe(__LINE__, 0, NULL, "st_id2",
+     ECPGt_descriptor, "desc4", 0L, 0L, 0L,
+     ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+ #line 105 "describe.pgc"
+
+
+     strcpy(msg, "get descriptor");
+     { ECPGget_desc_header(__LINE__, "desc1", &(count1));
+
+ #line 108 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 108 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc2", &(count2));
+
+ #line 109 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 109 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc3", &(count3));
+
+ #line 110 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 110 "describe.pgc"
+
+     { ECPGget_desc_header(__LINE__, "desc4", &(count4));
+
+ #line 111 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 111 "describe.pgc"
+
+
+     if (!(count1 == count2 && count1 == count3 && count1 == count4))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         { ECPGget_desc(__LINE__, "desc1", i,ECPGd_name,
+     ECPGt_char,(field_name1),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 118 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 118 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc2", i,ECPGd_name,
+     ECPGt_char,(field_name2),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 119 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 119 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc3", i,ECPGd_name,
+     ECPGt_char,(field_name3),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 120 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 120 "describe.pgc"
+
+         { ECPGget_desc(__LINE__, "desc4", i,ECPGd_name,
+     ECPGt_char,(field_name4),(long)30,(long)1,(30)*sizeof(char), ECPGd_EODT);
+
+ #line 121 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 121 "describe.pgc"
+
+         printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n",
+             field_name1, field_name2, field_name3, field_name4);
+     }
+
+     strcpy(msg, "deallocate");
+     ECPGdeallocate_desc(__LINE__, "desc1");
+ #line 127 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 127 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc2");
+ #line 128 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 128 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc3");
+ #line 129 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 129 "describe.pgc"
+
+     ECPGdeallocate_desc(__LINE__, "desc4");
+ #line 130 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);
+ #line 130 "describe.pgc"
+
+
+     { ECPGdeallocate(__LINE__, 0, NULL, "st_id2");
+ #line 132 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 132 "describe.pgc"
+
+
+
+     /* End test */
+
+     strcpy(msg, "drop");
+     { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table t1", ECPGt_EOIT, ECPGt_EORT);
+ #line 138 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 138 "describe.pgc"
+
+
+     strcpy(msg, "commit");
+     { ECPGtrans(__LINE__, NULL, "commit");
+ #line 141 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 141 "describe.pgc"
+
+
+     strcpy(msg, "disconnect");
+     { ECPGdisconnect(__LINE__, "CURRENT");
+ #line 144 "describe.pgc"
+
+ if (sqlca.sqlcode < 0) exit (1);}
+ #line 144 "describe.pgc"
+
+
+     return (0);
+ }
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stderr
pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stderr
*** pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stderr    1970-01-01 01:00:00.000000000 +0100
--- pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stderr    2009-09-18 08:32:33.000000000 +0200
***************
*** 0 ****
--- 1,140 ----
+ [NO_PID]: ECPGdebug: set to 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 29: query: set datestyle to iso; with 0 parameter(s) on connection regress1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 29: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 29: OK: SET
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 32: query: create table t1 ( id serial primary key , t text ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 32: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 32: OK: CREATE TABLE
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 35: query: insert into t1 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 35: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 35: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 36: query: insert into t1 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 36: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 36: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 37: query: insert into t1 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 37: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 37: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 38: query: insert into t1 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on
connectionregress1 
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 38: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 38: OK: INSERT 0 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGtrans on line 41: action "commit"; connection "regress1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGprepare on line 55: name st_id1; query: "SELECT id, t FROM t1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGdeallocate on line 88: name st_id1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGprepare on line 99: name st_id2; query: "SELECT id, t FROM t1 WHERE id = -1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc_header: found 2 attributes
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = id
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: reading items for tuple 2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGget_desc: NAME = t
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGdeallocate on line 132: name st_id2
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 138: query: drop table t1; with 0 parameter(s) on connection regress1
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 138: using PQexec
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_execute on line 138: OK: DROP TABLE
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ECPGtrans on line 141: action "commit"; connection "regress1"
+ [NO_PID]: sqlca: code: 0, state: 00000
+ [NO_PID]: ecpg_finish: connection regress1 closed
+ [NO_PID]: sqlca: code: 0, state: 00000
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stdout
pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stdout
*** pgsql.sqlda/src/interfaces/ecpg/test/expected/preproc-describe.stdout    1970-01-01 01:00:00.000000000 +0100
--- pgsql.describe/src/interfaces/ecpg/test/expected/preproc-describe.stdout    2009-09-18 08:32:33.000000000 +0200
***************
*** 0 ****
--- 1,4 ----
+ field_name 1 'id' 2 'id' 3 'id' 4 'id'
+ field_name 1 't' 2 't' 3 't' 4 't'
+ field_name 1 'id' 2 'id' 3 'id' 4 'id'
+ field_name 1 't' 2 't' 3 't' 4 't'
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/preproc/describe.pgc
pgsql.describe/src/interfaces/ecpg/test/preproc/describe.pgc
*** pgsql.sqlda/src/interfaces/ecpg/test/preproc/describe.pgc    1970-01-01 01:00:00.000000000 +0100
--- pgsql.describe/src/interfaces/ecpg/test/preproc/describe.pgc    2009-09-18 08:32:33.000000000 +0200
***************
*** 0 ****
--- 1,147 ----
+ #include <stdlib.h>
+ #include <string.h>
+
+ exec sql include ../regression;
+
+ exec sql whenever sqlerror stop;
+
+ int
+ main (void)
+ {
+ exec sql begin declare section;
+     char    *stmt1 = "SELECT id, t FROM t1";
+     char    *stmt2 = "SELECT id, t FROM t1 WHERE id = -1";
+     int    i, count1, count2, count3, count4;
+     char    field_name1[30] = "not set";
+     char    field_name2[30] = "not set";
+     char    field_name3[30] = "not set";
+     char    field_name4[30] = "not set";
+ exec sql end declare section;
+
+     char msg[128];
+
+     ECPGdebug(1, stderr);
+
+     strcpy(msg, "connect");
+     exec sql connect to REGRESSDB1;
+
+     strcpy(msg, "set");
+     exec sql set datestyle to iso;
+
+     strcpy(msg, "create");
+     exec sql create table t1(id serial primary key, t text);
+
+     strcpy(msg, "insert");
+     exec sql insert into t1(id, t) values (default, 'a');
+     exec sql insert into t1(id, t) values (default, 'b');
+     exec sql insert into t1(id, t) values (default, 'c');
+     exec sql insert into t1(id, t) values (default, 'd');
+
+     strcpy(msg, "commit");
+     exec sql commit;
+
+     /*
+      * Test DESCRIBE with a query producing tuples.
+      * DESCRIPTOR and SQL DESCRIPTOR are the same in native mode.
+      */
+
+     strcpy(msg, "allocate");
+     exec sql allocate descriptor desc1;
+     exec sql allocate descriptor desc2;
+     exec sql allocate descriptor desc3;
+     exec sql allocate descriptor desc4;
+
+     strcpy(msg, "prepare");
+     exec sql prepare st_id1 FROM :stmt1;
+
+     strcpy(msg, "describe");
+     exec sql describe st_id1 into descriptor desc1;
+     exec sql describe st_id1 into sql descriptor desc2;
+     exec sql describe st_id1 using descriptor desc3;
+     exec sql describe st_id1 using sql descriptor desc4;
+
+     strcpy(msg, "get descriptor");
+     exec sql get descriptor desc1 :count1 = count;
+     exec sql get descriptor desc2 :count2 = count;
+     exec sql get descriptor desc3 :count3 = count;
+     exec sql get descriptor desc4 :count4 = count;
+
+     if (!(count1 == count2 && count1 == count3 && count1 == count4))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         exec sql get descriptor desc1 value :i :field_name1 = name;
+         exec sql get descriptor desc2 value :i :field_name2 = name;
+         exec sql get descriptor desc3 value :i :field_name3 = name;
+         exec sql get descriptor desc4 value :i :field_name4 = name;
+         printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n",
+             field_name1, field_name2, field_name3, field_name4);
+     }
+
+     strcpy(msg, "deallocate");
+     exec sql deallocate descriptor desc1;
+     exec sql deallocate descriptor desc2;
+     exec sql deallocate descriptor desc3;
+     exec sql deallocate descriptor desc4;
+
+     exec sql deallocate prepare st_id1;
+
+     /* Test DESCRIBE with a query not producing tuples */
+
+     strcpy(msg, "allocate");
+     exec sql allocate descriptor desc1;
+     exec sql allocate descriptor desc2;
+     exec sql allocate descriptor desc3;
+     exec sql allocate descriptor desc4;
+
+     strcpy(msg, "prepare");
+     exec sql prepare st_id2 FROM :stmt2;
+
+     strcpy(msg, "describe");
+     exec sql describe st_id2 into descriptor desc1;
+     exec sql describe st_id2 into sql descriptor desc2;
+     exec sql describe st_id2 using descriptor desc3;
+     exec sql describe st_id2 using sql descriptor desc4;
+
+     strcpy(msg, "get descriptor");
+     exec sql get descriptor desc1 :count1 = count;
+     exec sql get descriptor desc2 :count2 = count;
+     exec sql get descriptor desc3 :count3 = count;
+     exec sql get descriptor desc4 :count4 = count;
+
+     if (!(count1 == count2 && count1 == count3 && count1 == count4))
+         exit(1);
+
+     for (i = 1; i <= count1; i++)
+     {
+         exec sql get descriptor desc1 value :i :field_name1 = name;
+         exec sql get descriptor desc2 value :i :field_name2 = name;
+         exec sql get descriptor desc3 value :i :field_name3 = name;
+         exec sql get descriptor desc4 value :i :field_name4 = name;
+         printf("field_name 1 '%s' 2 '%s' 3 '%s' 4 '%s'\n",
+             field_name1, field_name2, field_name3, field_name4);
+     }
+
+     strcpy(msg, "deallocate");
+     exec sql deallocate descriptor desc1;
+     exec sql deallocate descriptor desc2;
+     exec sql deallocate descriptor desc3;
+     exec sql deallocate descriptor desc4;
+
+     exec sql deallocate prepare st_id2;
+
+
+     /* End test */
+
+     strcpy(msg, "drop");
+     exec sql drop table t1;
+
+     strcpy(msg, "commit");
+     exec sql commit;
+
+     strcpy(msg, "disconnect");
+     exec sql disconnect;
+
+     return (0);
+ }
diff -dcrpN pgsql.sqlda/src/interfaces/ecpg/test/preproc/Makefile
pgsql.describe/src/interfaces/ecpg/test/preproc/Makefile
*** pgsql.sqlda/src/interfaces/ecpg/test/preproc/Makefile    2009-09-18 08:30:51.000000000 +0200
--- pgsql.describe/src/interfaces/ecpg/test/preproc/Makefile    2009-09-18 08:32:33.000000000 +0200
*************** TESTS = array_of_struct array_of_struct.
*** 8,13 ****
--- 8,14 ----
      autoprep autoprep.c \
      comment comment.c \
      cursor cursor.c \
+     describe describe.c \
      define define.c \
      init init.c \
      strings strings.c \

pgsql-hackers by date:

Previous
From: Simon Riggs
Date:
Subject: Re: Feedback on getting rid of VACUUM FULL
Next
From: marcin mank
Date:
Subject: Re: Feedback on getting rid of VACUUM FULL