Michael Meskes írta: > On Wed, Aug 05, 2009 at 11:08:26AM +0200, Boszormenyi Zoltan wrote: > >> I have looked at it. The code seems to be invalid. >> > > Yes, it is, I was too lazy to make it valid. If you just allocate the memory > for the variable in get_var() it becomes valid. >
If you meant like this below, then ECPG segfaults on this too: int * get_var(void) { EXEC SQL BEGIN DECLARE SECTION; int *myvar; EXEC SQL END DECLARE SECTION; myvar = malloc(sizeof(int)); EXEC SQL DECLARE mycur CURSOR FOR SELECT id INTO :myvar FROM a1 WHERE id = 1; return myvar; } ecpg_type_name() aborts, ECPGt_array is unhandled besides struct and union, it's called at the same place in adjust_informix() as ECPGt_struct. 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. > ... 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. Best regards, Zoltán Böszörményi -- Bible has answers for everything. Proof: "But let your communication be, Yea, yea; Nay, nay: for whatsoever is more than these cometh of evil." (Matthew 5:37) - basics of digital technology. "May your kingdom come" - superficial description of plate tectonics ---------------------------------- Zoltán Böszörményi Cybertec Schönig & Schönig GmbH http://www.postgresql.at/
/* * 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; EXEC SQL BEGIN DECLARE SECTION; int *myvar1; EXEC SQL END DECLARE SECTION; int * get_var(void) { EXEC SQL BEGIN DECLARE SECTION; int *myvar; EXEC SQL END DECLARE SECTION; myvar = malloc(sizeof(int)); EXEC SQL DECLARE mycur CURSOR FOR SELECT id INTO :myvar FROM a1 WHERE id = 1; return myvar; } int main(int argc, char **argv) { 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 mycur2; 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