Lee Kindness ([EMAIL PROTECTED]) reports a bug with a severity of 1
The lower the number the more severe it is.

Short Description
ECPG does not correctly identify pointer type

Long Description
The embedded SQL preprocessor, ecpg, does not correctly identify pointer types. 
Example #1 below results in the output #2 (edited for clarity) which incorrectly has 
references to 'ptr.id' and 'ptr.name' rather than 'ptr->id' and 'ptr->name' 
respectively.

When the 'ExamplePtr ptr' definition is replaced by 'ExampleStr *ptr' the same output 
is produced, when changed to 'struct ExampleStr_ *ptr' ecpg outputs the error:

    test.pc:16: ERROR: parse error

I am running ecpg version 2.7.1 on a Redhat Linux 7.0 system.

Sample Code
#1:

typedef struct ExampleStr_
{
  int  id;
  char name[100];
} ExampleStr, *ExamplePtr;

EXEC SQL TYPE ExampleStr IS STRUCT
{
  int  id;
  char name[100];
};
EXEC SQL TYPE ExamplePtr IS ExampleStr REFERENCE;

ExamplePtr getExample(int id)
{
  EXEC SQL BEGIN DECLARE SECTION;
  ExamplePtr ptr;
  int s_id = id;
  EXEC SQL END DECLARE SECTION;

  if( (ptr = calloc(1, sizeof(ExampleStr))) != NULL )
    {
      EXEC SQL SELECT *
        INTO :ptr
        FROM example
        WHERE id = :s_id;
    }
  return( ptr );
}

#2:

/* Processed by ecpg (2.7.1) */
/* These three include files are added by the preprocessor */
#include <ecpgtype.h>
#include <ecpglib.h>
#include <ecpgerrno.h>

typedef struct ExampleStr_
{
  int  id;
  char name[100];
} ExampleStr, *ExamplePtr;

/* exec sql type ExampleStr is struct  { 
   int  id   ;
   char  name [ 100 ]   ;
 }   */
/* exec sql type ExamplePtr is ExampleStr  reference */

ExamplePtr getExample(int id)
{
  /* exec sql begin declare section */
   ExamplePtr  ptr   ;
   int  s_id  = id ;
  /* exec sql end declare section */

  if( (ptr = calloc(1, sizeof(ExampleStr))) != NULL )
    {
{ ECPGdo(__LINE__, NULL, "select  *  from example  where id  = ?     ", 
        ECPGt_int,&(s_id),1L,1L,sizeof(int), 
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, 
        ECPGt_int,&(ptr.id),1L,1L,sizeof(int), 
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
        ECPGt_char,(ptr.name),100L,1L,100*sizeof(char), 
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
    }
  return( ptr );
}

No file was uploaded with this report


---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to