X-Original-To: pgsql-bugs-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id AC1FBD1B4ED for ; Thu, 23 Oct 2003 21:06:02 +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 35087-07 for ; Thu, 23 Oct 2003 18:05:32 -0300 (ADT) Received: from happy.onesystem.ca (happy.onesystem.ca [205.206.61.17]) by svr1.postgresql.org (Postfix) with ESMTP id 1174AD1B4E4 for ; Thu, 23 Oct 2003 18:05:30 -0300 (ADT) Received: from elb_lx.onesystem.ca ([10.1.1.50] helo=telvista) by happy.onesystem.ca with asmtp (Exim 4.14) id 1ACmj5-0005cO-WA for pgsql-bugs@postgresql.org; Thu, 23 Oct 2003 15:10:35 -0600 Subject: ECPG and NULL indicators From: Edmund Bacon To: pgsql-bugs@postgresql.org Content-Type: text/plain Message-Id: <1066943115.5145.3.camel@elb_lx.onesystem.ca> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.5 Date: Thu, 23 Oct 2003 15:05:15 -0600 Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200310/127 X-Sequence-Number: 6976 ============================================================================ 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())