Re: ECPG support for struct in INTO list - Mailing list pgsql-hackers

From Boszormenyi Zoltan
Subject Re: ECPG support for struct in INTO list
Date
Msg-id 4A7995BD.3090703@cybertec.at
Whole thread Raw
In response to Re: ECPG support for struct in INTO list  (Michael Meskes <meskes@postgresql.org>)
Responses Re: ECPG support for struct in INTO list
Re: ECPG support for struct in INTO list
List pgsql-hackers
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;
}

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: machine-readable explain output v4
Next
From: Boszormenyi Zoltan
Date:
Subject: Re: ECPG support for struct in INTO list