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