Re: BUG #15080: ecpg on windows doesn't define HAVE_LONG_LONG_INT

Tom Lane <tgl@sss.pgh.pa.us>

From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andrew Dunstan <andrew@dunslane.net>
Cc: Huong Dangminh <huo-dangminh@ys.jp.nec.com>, Jonathan Allen <jallen@americansavingslife.com>, Andrew Gierth <andrew@tao11.riddles.org.uk>, "pgsql-bugs@lists.postgresql.org" <pgsql-bugs@lists.postgresql.org>, Michael Meskes <meskes@postgresql.org>, Akio Iwaasa <aki-iwaasa@vt.jp.nec.com>
Date: 2018-05-19T22:49:20Z
Lists: pgsql-bugs
Andrew Dunstan <andrew@dunslane.net> writes:
> On 05/19/2018 12:45 PM, Tom Lane wrote:
>> However ... we've got a ton of other places that use INT64_FORMAT with
>> the native printf, eg in pgbench, and frogmouth is not producing
>> warnings about those usages.  So I'm confused about exactly what is
>> happening there.  Andrew, do you have any insight?

> Very occasionally ;-)

> A little Googling suggested that __USE_MINGW_ANSI_STDIO might help. 
> Here's what happened

>     $ gcc -Wall -o testme testme.c
>     testme.c: In function 'main':
>     testme.c:7:5: warning: unknown conversion type character 'l' in format
>     testme.c:7:5: warning: too many arguments for format

>     $ ./testme
>     sizeof long long = 8
>     val = 734294471 (%lld) 3153770738837321131 (%I64d)

Yeah, this agrees with what we're seeing in the ecpg test failures, both
as to the warning and the wrong run-time answer.  What remains unexplained
is why we don't see the same compile-time warning for uses of
printf("%lld") elsewhere in the build.  

>     $ gcc -Wall -D__USE_MINGW_ANSI_STDIO -o testme testme.c

[ works as expected ]

> So maybe we just need to define this on XP/mingw (shouldn't be necessary 
> on anything later). I don't know what other effects it might have, 
> though. Perhaps there is some other flag or define that has the same 
> effect that we use in compiling pgbench etc that isn't used by ecpg?

Might be worth trying.  As I mentioned in
<13103.1526749980@sss.pgh.pa.us>, it seems like it's time to jettison
any pretense of support for non-C99-compliant spellings of "%lld".
It'd be good to know whether __USE_MINGW_ANSI_STDIO works for that
purpose on ancient MinGW.

> Now recall that this animal is on serious life support. ...
> Not sure how much more effort I should put in here.

I couldn't blame you for just deciding to skip the ecpg tests on
this critter.

			regards, tom lane


Commits

  1. Remove configure's check for nonstandard "long long" printf modifiers.

  2. printf("%lf") is not portable, so omit the "l".

  3. Support platforms where strtoll/strtoull are spelled __strtoll/__strtoull.

  4. Arrange to supply declarations for strtoll/strtoull if needed.

  5. Hot-fix ecpg regression test for missing ecpg_config.h inclusion.

  6. Add some test coverage for ecpg's "long long" support.

  7. Recognize that MSVC can support strtoll() and strtoull().

  8. Fix up ecpg's configuration so it handles "long long int" in MSVC builds.