Hello,
At Tue, 6 Mar 2018 07:14:00 +0100, Pavel Stehule <[email protected]>
wrote in <CAFj8pRB7u-D1NA8a22dytwicKv4RWrYqKCF=yil5kkmkbss...@mail.gmail.com>
> 2018-03-06 2:32 GMT+01:00 Michael Paquier <[email protected]>:
>
> > On Mon, Mar 05, 2018 at 09:25:09PM +0100, Pavel Stehule wrote:
> > > I afraid so there is not good solution. Is possible to store options in
> > > original form? When the function will be displayed, then the original
> > value
> > > will be displayed. The current patch (with known extensions) can be used
> > as
> > > bug fix and back patched. In new version we store original value with
> > > quotes.
> >
> > You mean storing the values in pg_proc.proconfig at the creation time of
> > the function? That would basically work, except for the case of a
> > function using a parameter which is not from the same PL. The function
> > creation would fail because it cannot find the parameter it is looking
> > for as we need to look at loaded parameters to know it uses a list or
> > not :(
> >
>
> yes. It can fails on execution time, but it is something like runtime error.
>
> just dump should to produce same form like was input. So if on input we got
> quotes, then we should to use quotes on output. Without querying somewhere.
>
> The possible quotes can be removed in function compile time.
Doesn't it make sense if we provide a buildtime-script that
collects the function names and builds a .h file containing a
function using the list?
The attached perl script is a rush work of such script, which
works at the top of the source tree. It just prints the function
definition, does not generate a .h file.
I haven't confirmed anything about it but I had the following
output from the current master.
> inline bool
> IsConfigOptionIsAList(const char *name)
>
> {
> if (pg_strcasecmp(name, "DateStyle") == 0
> || pg_strcasecmp(name, "temp_tablespaces") == 0
> || pg_strcasecmp(name, "session_preload_libraries") == 0
> || pg_strcasecmp(name, "shared_preload_libraries") == 0
> || pg_strcasecmp(name, "local_preload_libraries") == 0
> || pg_strcasecmp(name, "search_path") == 0
> || pg_strcasecmp(name, "log_destination") == 0
> || pg_strcasecmp(name, "listen_addresses") == 0
> || pg_strcasecmp(name, "synchronous_standby_names") == 0
> || pg_strcasecmp(name, "wal_consistency_checking") == 0)
> return true;
> return false;
> }
regards,
--
Kyotaro Horiguchi
NTT Open Source Software Center
#! /usr/bin/perl
$gucfile = "src/backend/utils/misc/guc.c";
open $in, '<', $gucfile || die "hoge";
$gucfilecontent = "";
while (<$in>)
{
chomp;
$gucfilecontent .= $_;
}
print "inline bool
IsConfigOptionIsAList(const char *name)\n
{
if (";
$first = 1;
while ($gucfilecontent =~ /{"([^"]+)" *, *PGC_[^}]*[ ]*GUC_LIST_INPUT[
]*[^}]*},/g)
{
print "\n || " if (!$first);
$first = 0;
print "pg_strcasecmp(name, \"$1\") == 0";
}
print ")\n return true;\n return false;\n}\n";