Thread: BUG #8608: ECPG: sizeof() in EXEC SQL DECLARE SECTION

BUG #8608: ECPG: sizeof() in EXEC SQL DECLARE SECTION

From
alexsav23@gmail.com
Date:
The following bug has been logged on the website:

Bug reference:      8608
Logged by:          Alexei Savchik
Email address:      alexsav23@gmail.com
PostgreSQL version: 9.3.1
Operating system:   Windows 8 x64
Description:

void MyFunc( MyClass*unit_address )
{
    EXEC SQL BEGIN DECLARE SECTION;
       unsigned char      var1[sizeof(MyClass)];
    EXEC SQL END DECLARE SECTION;
}


d:\>"c:\Program Files\PostgreSQL\9.3\bin\ecpg.exe"-o 1.c 1.pgc
1.pgc: 4: ERROR: syntax error at or near  "("
error deleting output file "1.c"


http://stackoverflow.com/questions/20049432/ecpg-sizeof-in-exec-sql-declare-section

Re: BUG #8608: ECPG: sizeof() in EXEC SQL DECLARE SECTION

From
Michael Meskes
Date:
On Tue, Nov 19, 2013 at 10:39:48PM +0000, alexsav23@gmail.com wrote:
> d:\>"c:\Program Files\PostgreSQL\9.3\bin\ecpg.exe"-o 1.c 1.pgc
> 1.pgc: 4: ERROR: syntax error at or near  "("
> error deleting output file "1.c"

And another patch to try. Please send me feedback.

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
Jabber: michael.meskes at gmail dot com
VfL Borussia! Força Barça! Go SF 49ers! Use Debian GNU/Linux, PostgreSQL

Attachment

Re: BUG #8608: ECPG: sizeof() in EXEC SQL DECLARE SECTION

From
Boszormenyi Zoltan
Date:
2013-11-24 12:55 keltezéssel, Michael Meskes írta:
> On Tue, Nov 19, 2013 at 10:39:48PM +0000, alexsav23@gmail.com wrote:
>> d:\>"c:\Program Files\PostgreSQL\9.3\bin\ecpg.exe"-o 1.c 1.pgc
>> 1.pgc: 4: ERROR: syntax error at or near  "("
>> error deleting output file "1.c"
> And another patch to try. Please send me feedback.

I think it's needlessly narrows the scope of the problem.
Consider this code:

#include <stdio.h>

#define hide_size_of_var sizeof

int main(void) {
     int a[hide_size_of_var(int)];
     int i;

     for (i = 0; i < hide_size_of_var(int); i++) {
         a[i] = i*3;
         printf("i: %d a[i]: %d\n", i, a[i]);
     }

     return 0;
}

It compiles just fine in a C compiler and runs from 0 to 3 as expected.
GCC 4.8.2 doesn't say anything about it with -Wall.

I think you should pass everything through as is inside the '[' and ']' and
let the C compiler fail if the code is not valid.

Best regards,
Zoltán Böszörményi

>
> Michael
>
>


--
----------------------------------
Zoltán Böszörményi
Cybertec Schönig & Schönig GmbH
Gröhrmühlgasse 26
A-2700 Wiener Neustadt, Austria
Web: http://www.postgresql-support.de
      http://www.postgresql.at/

Re: BUG #8608: ECPG: sizeof() in EXEC SQL DECLARE SECTION

From
Michael Meskes
Date:
On Sun, Nov 24, 2013 at 03:59:40PM +0100, Boszormenyi Zoltan wrote:
> I think it's needlessly narrows the scope of the problem.
> Consider this code:
>
> #include <stdio.h>
>
> #define hide_size_of_var sizeof
> ...

I assume you'd want to put this defined name into a declare section, right?
Well, that's what EXEC SQL DECLARE is for, isn't it?

> I think you should pass everything through as is inside the '[' and ']' and
> let the C compiler fail if the code is not valid.

I prefer catching as much as possible without re-implementing a C-compiler of course.

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
Jabber: michael.meskes at gmail dot com
VfL Borussia! Força Barça! Go SF 49ers! Use Debian GNU/Linux, PostgreSQL

Re: BUG #8608: ECPG: sizeof() in EXEC SQL DECLARE SECTION

From
Boszormenyi Zoltan
Date:
2013-11-25 09:18 keltezéssel, Michael Meskes írta:
> On Sun, Nov 24, 2013 at 03:59:40PM +0100, Boszormenyi Zoltan wrote:
>> I think it's needlessly narrows the scope of the problem.
>> Consider this code:
>>
>> #include <stdio.h>
>>
>> #define hide_size_of_var sizeof
>> ...
> I assume you'd want to put this defined name into a declare section, right?
> Well, that's what EXEC SQL DECLARE is for, isn't it?

Of course. And of course you meant EXEC SQL DEFINE.

The attached code throws syntax errors over sizeof(int) and
sizeof(struct somestruct). I compiled GIT HEAD which contains your fix:

commit 08d1b22b3be2305ad6b83ca275829ff26305f5d7
Author: Michael Meskes <meskes@postgresql.org>
Date:   Sun Nov 24 12:51:21 2013 +0100

     Allow C array definitions to use sizeof().

     When parsing C variable definitions ecpg should allow sizeof() operators as array
dimensions.

So it seems it's not enough, try these with the attached code:

Succeeds:
$ ecpg array-sizeof.pgc

These fail:
$ ecpg -D TRY_INT array-sizeof.pgc
array-sizeof.pgc:24: ERROR: syntax error at or near "int"

$ ecpg -D TRY_STRUCT array-sizeof.pgc
array-sizeof.pgc:30: ERROR: syntax error at or near "struct"

The attached patch fixes "sizeof(struct something)" but the
"simple_type" variant that should also accept
[signed|unsigned]{char|short|int|long|long long}
causes 2 shift/reduce problems when processing preproc.y.

Best regards,
Zoltán Böszörményi

>
>> I think you should pass everything through as is inside the '[' and ']' and
>> let the C compiler fail if the code is not valid.
> I prefer catching as much as possible without re-implementing a C-compiler of course.
>
> Michael


--
----------------------------------
Zoltán Böszörményi
Cybertec Schönig & Schönig GmbH
Gröhrmühlgasse 26
A-2700 Wiener Neustadt, Austria
Web: http://www.postgresql-support.de
      http://www.postgresql.at/


Attachment

Re: BUG #8608: ECPG: sizeof() in EXEC SQL DECLARE SECTION

From
Michael Meskes
Date:
On Mon, Nov 25, 2013 at 02:19:13PM +0100, Boszormenyi Zoltan wrote:
> Of course. And of course you meant EXEC SQL DEFINE.

Yes. :)

> The attached code throws syntax errors over sizeof(int) and
> sizeof(struct somestruct). I compiled GIT HEAD which contains your fix:

Thanks for spotting this. Using ColId as type name was pretty stupid of me, in particular when a non-terminal var_type
alreadyexists. 

> The attached patch fixes "sizeof(struct something)" but the
> "simple_type" variant that should also accept
> [signed|unsigned]{char|short|int|long|long long}
> causes 2 shift/reduce problems when processing preproc.y.

That's because with the additional rules we add CHAR and DOUBLE twice. Should be fixed now.

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
Jabber: michael.meskes at gmail dot com
VfL Borussia! Força Barça! Go SF 49ers! Use Debian GNU/Linux, PostgreSQL