Re: [BUGS] ECPG and NULL indicators - Mailing list pgsql-interfaces

From Bruce Momjian
Subject Re: [BUGS] ECPG and NULL indicators
Date
Msg-id 200310260519.h9Q5JvP22655@candle.pha.pa.us
Whole thread Raw
Responses Re: [BUGS] ECPG and NULL indicators  (Michael Meskes <meskes@postgresql.org>)
List pgsql-interfaces
I can confirm this ecpg bug exists in current CVS.  Let me see if the
ecpg guy can look at it soon.

---------------------------------------------------------------------------

Edmund Bacon wrote:
> 
> ============================================================================
>                         POSTGRESQL BUG REPORT
> ============================================================================
> 
> 
> Your name        :    Edmund Bacon
> Your email address    :    ebacon (at) onesystem (dot) com
> 
> 
> System Configuration
> ---------------------
>   Architecture       :   Intel Pentium
> 
>   Operating System   :   Linux 2.4.20
> 
>   PostgreSQL version :   PostgreSQL-7.3.3
> 
>   Compiler used      :     gcc-3.2.2
> 
> 
> Please enter a FULL description of your problem:
> ------------------------------------------------
> 
> ecpg does not correctly set null indicators when storage for the
> string is dynamically allocated
> 
> 
> Please describe a way to repeat the problem.   Please try to provide a
> concise reproducible example, if at all possible: 
> ----------------------------------------------------------------------
> 
> CREATE TABLE strings (string text);
> 
> insert into strings values('able');
> insert into strings values(null);
> insert into strings values('baker');
> insert into strings values(null);
> 
> 
> Source for foo.pgc:
> 
> ============================================================
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> 
> EXEC SQL WHENEVER SQLERROR sqlprint;
> 
> EXEC SQL INCLUDE sqlca;
> 
> int main()
> {
>     int i;
>     EXEC SQL BEGIN DECLARE SECTION;
>     char **a_str;
>     int *a_str_ind;
> 
>     char str[5][20];
>     int  str_ind[5];
>     EXEC SQL END DECLARE SECTION;
> 
> 
>     EXEC SQL CONNECT TO test;
> 
> 
>     printf("Test one: alloced string, allocated indicator:\n");
> 
>     a_str = NULL;
>     a_str_ind = NULL;
> 
>     EXEC SQL SELECT string INTO :a_str :a_str_ind FROM strings;
> 
>     printf("indicator      string\n");
>     for(i = 0; i < sqlca.sqlerrd[2]; i++)
>     printf("%8d       \"%s\"\n", a_str_ind[i], a_str[i]);
>     
>     free(a_str);
>     free(a_str_ind);
> 
> 
>     printf("\nTest two: alloced string, unalloced indicator:\n");
>     a_str = NULL;
>     for(i = 0; i < 5; i++) str_ind[i] = 99;
> 
>     EXEC SQL SELECT string INTO :a_str :str_ind FROM strings;
> 
>     printf("indicator      string\n");
>     for(i = 0; i < sqlca.sqlerrd[2]; i++)
>     printf("%8d       \"%s\"\n", str_ind[i], a_str[i]);
> 
>     free(a_str);
> 
> 
>     printf("\nTest three: unalloced string, alloced indicator:\n");
>     a_str_ind = NULL;
>     bzero(str, sizeof(str));
> 
>     EXEC SQL SELECT string INTO :str :a_str_ind FROM strings;
>     printf("indicator      string\n");
>     for(i = 0; i < sqlca.sqlerrd[2]; i++)
>     printf("%8d       \"%s\"\n", a_str_ind[i], str[i]);
> 
>     free(a_str_ind);
> 
> 
>     printf("\nTest four: unalloced string, unalloced indicator:\n");
>     bzero(str, sizeof(str));
>     for(i = 0; i < 5; i++) str_ind[i] = 99;
> 
>     EXEC SQL SELECT string INTO :str :str_ind FROM strings;
>     printf("indicator      string\n");
>     for(i = 0; i < sqlca.sqlerrd[2]; i++)
>     printf("%8d       \"%s\"\n", str_ind[i], str[i]);
> 
> 
>     return 0;
> }
> 
> ==================================================================
> 
> Output for foo:
> ==================================================================
> Test one: alloced string, allocated indicator:
> indicator      string
>       -1       "able"
>        0       ""
>        0       "baker"
>        0       ""
> 
> Test two: alloced string, unalloced indicator:
> indicator      string
>       -1       "able"
>       99       ""
>       99       "baker"
>       99       ""
> 
> Test three: unalloced string, alloced indicator:
> indicator      string
>        0       "able"
>       -1       ""
>        0       "baker"
>       -1       ""
> 
> Test four: unalloced string, unalloced indicator:
> indicator      string
>        0       "able"
>       -1       ""
>        0       "baker"
>       -1       ""
> 
> ==================================================================
> 
> Note that when the storage for the string is allocated, only the first 
> element of the indicator array is set.  This value is the value of
> the indicator for the last string in the string array, which can be
> confirmed by using the appropriate ORDER BY clause.
> 
> This problem does not arise with allocated integer or float values.
> This problem occurs if string is any multi-char type (e.g. TEXT, CHAR(),
> or VARCHAR())
> 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


pgsql-interfaces by date:

Previous
From: Brett Schwarz
Date:
Subject: Re: PgAccess
Next
From: Michael Meskes
Date:
Subject: Re: [BUGS] ECPG and NULL indicators