X-Original-To: pgsql-interfaces-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id C46B4D1B520 for ; Sun, 26 Oct 2003 05:20:36 +0000 (GMT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (neptune.hub.org [200.46.204.2]) (amavisd-new, port 10024) with ESMTP id 63418-06 for ; Sun, 26 Oct 2003 01:20:05 -0400 (AST) Received: from candle.pha.pa.us (momjian.navpoint.com [207.106.42.251]) by svr1.postgresql.org (Postfix) with ESMTP id 9F024D1B51B for ; Sun, 26 Oct 2003 01:20:03 -0400 (AST) Received: (from pgman@localhost) by candle.pha.pa.us (8.11.6/8.11.6) id h9Q5JvP22655; Sun, 26 Oct 2003 01:19:57 -0400 (EDT) From: Bruce Momjian Message-Id: <200310260519.h9Q5JvP22655@candle.pha.pa.us> Subject: Re: [BUGS] ECPG and NULL indicators In-Reply-To: <1066943115.5145.3.camel@elb_lx.onesystem.ca> To: Edmund Bacon Date: Sun, 26 Oct 2003 01:19:57 -0400 (EDT) Cc: PostgreSQL-interfaces , Michael Meskes X-Mailer: ELM [version 2.4ME+ PL108 (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200310/46 X-Sequence-Number: 4535 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 > #include > #include > > 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, Pennsylvania 19073