Re: pg_get_functiondef forgets about most GUC_LIST_INPUT GUCs

Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>

From: Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>
To: pavel.stehule@gmail.com
Cc: michael@paquier.xyz, a.zakirov@postgrespro.ru, michael.paquier@gmail.com, tgl@sss.pgh.pa.us, pgsql-hackers@postgresql.org
Date: 2018-03-14T08:30:59Z
Lists: pgsql-hackers

Attachments

Hello,

At Tue, 6 Mar 2018 07:14:00 +0100, Pavel Stehule <pavel.stehule@gmail.com> wrote in <CAFj8pRB7u-D1NA8a22dytwicKv4RWrYqKCF=yiL5kKMKbssPSw@mail.gmail.com>
> 2018-03-06 2:32 GMT+01:00 Michael Paquier <michael@paquier.xyz>:
> 
> > 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

Commits

  1. Prevent extensions from creating custom GUCs that are GUC_LIST_QUOTE.

  2. Fix mishandling of quoted-list GUC values in pg_dump and ruleutils.c.