On Wed, Aug 05, 2009 at 04:22:53PM +0200, Boszormenyi Zoltan wrote:
> If you meant like this below, then ECPG segfaults on this too:

Right, because arrays as as well unimplemented as are structs. I meant
something like this;

int *
get_var(void)
{
        EXEC SQL BEGIN DECLARE SECTION;
        static int myvar;
        EXEC SQL END DECLARE SECTION;

        EXEC SQL DECLARE mycur CURSOR FOR SELECT id INTO :myvar FROM a1 WHERE 
id = 1;
        return (&myvar);
}

> Attached is my modified test28.pgc. Compiling it
> *without* -C INFORMIX makes it unusable, the variable
> or the address where the data should be fetched into
> doesn't even gets emitted in neither the DECLARE/OPEN
> nor the FETCH callsites. I think this code should be valid
> even in non-Informix-compatible mode.

I don't think i buy into this. The variable is out of scope at the time open is
called. Why do you think this should work? 

> > ... Just look at
> > test/compat_informix/test_informix.pgc for a real and working example.
> >   
> 
> The example there is the other way around.
> The variable, the DECLARE and FETCH commands
> are in the outer main() function, and it calls a function called
> openit() where the OPEN command is emitted, so that
> example doesn't help here too much.

Eh, why not? We're talking about a bug/missing feature in the precompiler
itself. And the precompiler doesn't see this difference. I just pointed you to
one working example. Anyway I attached a modified test28.pgc that should work
in compatibility mode.

Michael
-- 
Michael Meskes
Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org)
Michael at BorussiaFan dot De, Meskes at (Debian|Postgresql) dot Org
ICQ: 179140304, AIM/Yahoo/Skype: michaelmeskes, Jabber: mes...@jabber.org
Go VfL Borussia! Go SF 49ers! Use Debian GNU/Linux! Use PostgreSQL!
/*
 * Test DECLARE ... SELECT ... INTO ...
 * with "string"
 * Does make ecpg segfault when run with -C INFORMIX
 */

#include <stdio.h>
#include <stdlib.h>

EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL include test28.h;
EXEC SQL END DECLARE SECTION;

int *
get_var(void)
{
        EXEC SQL BEGIN DECLARE SECTION;
        static int myvar;
        EXEC SQL END DECLARE SECTION;

        EXEC SQL DECLARE mycur CURSOR FOR SELECT id INTO :myvar FROM a1 WHERE 
id = 1;
        return (&myvar);
}

int main(int argc, char **argv) {
        int *myvar1;

        EXEC SQL WHENEVER SQLWARNING SQLPRINT;
        EXEC SQL WHENEVER SQLERROR SQLPRINT;

        EXEC SQL connect to test;
        if (sqlca.sqlcode)
        {
                printf ("connect error = %ld\n", sqlca.sqlcode);
                exit (sqlca.sqlcode);
        }

        EXEC SQL CREATE TABLE a1 (id int, t text, d2 numeric, c text);

        EXEC SQL INSERT INTO a1 values(1, 'text1', 14.7, 'text2');

        myvar1 = get_var();
        EXEC SQL OPEN mycur;

        EXEC SQL WHENEVER NOT FOUND GOTO out;

        EXEC SQL FETCH FROM mycur;

        printf("id = %d\n", *myvar1);

out:
        EXEC SQL CLOSE mycur;

        EXEC SQL DISCONNECT;

        return 0;
}
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to