Thread

  1. ecpg precompiler

    Fabienne Leclere <fabienne@bira-iasb.oma.be> — 2000-04-13T09:41:01Z

    ============================================================================
    
                            POSTGRESQL BUG REPORT TEMPLATE
    ============================================================================
    
    
    
    Your name               :  Fabienne Leclere
    Your email address      : fabienne@oma.be
    
    
    System Configuration
    ---------------------
      Architecture (example: Intel Pentium)         : HP 9000 serie E
    
      Operating System (example: Linux 2.0.26 ELF)  : HPUX 11.0
    
      PostgreSQL version (example: PostgreSQL-6.5.3):   PostgreSQL-6.5.3
    
      Compiler used (example:  gcc 2.8.0)           : aCC  HP aC++ B3910B
    A.03.13
    
    
    
    Please enter a FULL description of your problem:
    ------------------------------------------------
    With the ecpg precompiler:
    when using structure to define a table or union to define a field
    and insert values into the table, the arguments of the function ECPGdo
    are not correctly generated.
    Then the compiler give errors ....
    
    
    
    Please describe a way to repeat the problem.   Please try to provide a
    concise reproducible example, if at all possible:
    ----------------------------------------------------------------------
    1) create the ttest table:
    create table ttest ( data0 double precision , data1 varchar(200));
    
    2) the .pc file edit :
    
    ....
    exec sql begin declare section;
    
    struct ttest1_{ double bla0; varchar bla1[200]; }ttest1;
    
    double data0;
    union ttest2_ {
            varchar bla1[200];
            struct {short len; short lost; float buf[50]; }bla2;
            }ttest2;
    
    exec sql end declare section;
    .....
    
    exec sql insert into ttest values ( :ttest1);
    
    exec sql insert into ttest values ( :data0,:ttest2.bla1);
    
    3) precompile
    
    the .c file give:
    
    ...
     struct ttest1_ {  double bla0 ;
        struct varchar_bla1 { int len; char arr[200]; } bla1 ;
      } ttest1 ;
      double data0 ;
      union ttest2_ {    struct varchar_bla1 { int len; char arr[200]; }
    bla1 ;
     struct  {  short len ;
      short lost ;
      float buf[ 50 ]  ;
      } bla2 ;
      } ttest2 ;
    .....
    
    { ECPGdo(__LINE__, NULL, "insert into ttest values(?)",
            ECPGt_double,&(ttest1.bla0),1L,1L,sizeof(double),
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
            ECPGt_varchar,&(ttest1.bla1),200L,1L,sizeof(struct
    varchar_bla1),
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
    
    .......
    
    { ECPGdo(__LINE__, NULL, "insert into ttest values(? , ?)",
            ECPGt_double,&(data0),1L,1L,sizeof(double),
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
            ECPGt_varchar,&(ttest2.bla1),200L,1L,sizeof(struct
    varchar_ttest2.bla1),
    
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
    
    .............
    
    and it should be:
    
    .............
    
    { ECPGdo(__LINE__, NULL, "insert into ttest values(? , ?)",
            ECPGt_double,&(ttest1.bla0),1L,1L,sizeof(double),
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
            ECPGt_varchar,&(ttest1.bla1),200L,1L,sizeof(struct
    ttest1_::varchar_bla1),
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
    
    .............
    
    { ECPGdo(__LINE__, NULL, "insert into ttest values(? , ?)",
            ECPGt_double,&(data0),1L,1L,sizeof(double),
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
            ECPGt_varchar,&(ttest2.bla1),200L,1L,sizeof(struct
    ttest2_::varchar_bla1),
            ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
    
    .............
    
    If you know how this problem might be fixed, list the solution below:
    ---------------------------------------------------------------------