From: | Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> |
---|---|
To: | Edmund Bacon <ebacon(at)onesystem(dot)com> |
Cc: | PostgreSQL-interfaces <pgsql-interfaces(at)postgresql(dot)org>, Michael Meskes <Michael(dot)Meskes(at)credativ(dot)de> |
Subject: | Re: [BUGS] ECPG and NULL indicators |
Date: | 2003-10-26 05:19:57 |
Message-ID: | 200310260519.h9Q5JvP22655@candle.pha.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs 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(at)postgresql(dot)org)
>
--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
From | Date | Subject | |
---|---|---|---|
Next Message | Michael Meskes | 2003-10-26 09:51:07 | Re: [BUGS] ECPG and NULL indicators |
Previous Message | Bruce Momjian | 2003-10-26 04:55:34 | Re: ISM shared memory on solaris |
From | Date | Subject | |
---|---|---|---|
Next Message | Michael Meskes | 2003-10-26 09:51:07 | Re: [BUGS] ECPG and NULL indicators |
Previous Message | Brett Schwarz | 2003-10-23 23:10:40 | Re: PgAccess |