Thread: proposal: function pg_setting_value_split() to parse shared_preload_libraries etc.

proposal: function pg_setting_value_split() to parse shared_preload_libraries etc.

From
Ian Lawrence Barwick
Date:
Hi

From time to time I find myself in a situation where it would be very useful to
be able to programatically determine whether a particular library is included in
"shared_preload_libraries", which accepts a comma-separated list of values.

Unfortunately it's not as simple as splitting the list on the commas, as while
that will *usually* work, the following is also valid:

    shared_preload_libraries = 'foo,bar,"baz ,"'

and reliably splitting it up into its constituent parts would mean re-inventing
a wheel (and worse possibly introducing some regular expressions into the
process, cf. https://xkcd.com/1171/ ).

Now, while it's highly unlikely someone will go to the trouble of creating a
library name with commas and spaces in it, "highly unlikely" is not the same as
"will definitely never ever happen". So it would be very handy to be able to use
the same function PostgreSQL uses internally ("SplitDirectoriesString()") to
produce the guaranteed same result.

Attached patch provides a new function "pg_setting_value_split()" which does
exactly this, i.e. called with a string containing such a list, it calls
"SplitDirectoriesString()" and returns the result as a set of text, e.g.:

    postgres# SELECT setting FROM pg_setting_value_split('foo,bar,"baz ,"');

     setting
    ---------
     foo
     bar
     baz ,
    (3 rows)

though a more likely use would be:

   SELECT setting FROM
pg_setting_value_split(current_setting('shared_preload_libraries'));

Other GUCs this applies to:

  - local_preload_libraries
  - session_preload_libraries
  - unix_socket_directories

I will add this to the next CF.

Regards

Ian Barwick

-- 
EnterpriseDB: https://www.enterprisedb.com

Attachment

Re: proposal: function pg_setting_value_split() to parse shared_preload_libraries etc.

From
Ian Lawrence Barwick
Date:
2020年10月23日(金) 9:53 Ian Lawrence Barwick <barwick@gmail.com>:
>
> Hi
>
> From time to time I find myself in a situation where it would be very useful to
> be able to programatically determine whether a particular library is included in
> "shared_preload_libraries", which accepts a comma-separated list of values.
>
> Unfortunately it's not as simple as splitting the list on the commas, as while
> that will *usually* work, the following is also valid:
>
>     shared_preload_libraries = 'foo,bar,"baz ,"'
>
> and reliably splitting it up into its constituent parts would mean re-inventing
> a wheel (and worse possibly introducing some regular expressions into the
> process, cf. https://xkcd.com/1171/ ).
>
> Now, while it's highly unlikely someone will go to the trouble of creating a
> library name with commas and spaces in it, "highly unlikely" is not the same as
> "will definitely never ever happen". So it would be very handy to be able to use
> the same function PostgreSQL uses internally ("SplitDirectoriesString()") to
> produce the guaranteed same result.
>
> Attached patch provides a new function "pg_setting_value_split()" which does
> exactly this, i.e. called with a string containing such a list, it calls
> "SplitDirectoriesString()" and returns the result as a set of text, e.g.:
>
>     postgres# SELECT setting FROM pg_setting_value_split('foo,bar,"baz ,"');
>
>      setting
>     ---------
>      foo
>      bar
>      baz ,
>     (3 rows)
>
> though a more likely use would be:
>
>    SELECT setting FROM
> pg_setting_value_split(current_setting('shared_preload_libraries'));
>
> Other GUCs this applies to:
>
>   - local_preload_libraries
>   - session_preload_libraries
>   - unix_socket_directories

Having just submitted this, I realised I'm focussing on the GUCs which call
"SplitDirectoriesString()" (as my specific uses case is for
"shared_preload_libraries")
but the patch does not consider the other GUC_LIST_INPUT settings, which
call "SplitIdentifierString()", so as is, it might produce unexpected
results for those.

I'll rethink and submit an updated version.


Regards

Ian Barwick



Re: proposal: function pg_setting_value_split() to parse shared_preload_libraries etc.

From
Anastasia Lubennikova
Date:
On 23.10.2020 05:06, Ian Lawrence Barwick wrote:
> Having just submitted this, I realised I'm focussing on the GUCs which call
> "SplitDirectoriesString()" (as my specific uses case is for
> "shared_preload_libraries")
> but the patch does not consider the other GUC_LIST_INPUT settings, which
> call "SplitIdentifierString()", so as is, it might produce unexpected
> results for those.
>
> I'll rethink and submit an updated version.

Status update for a commitfest entry.

This entry was "Waiting on author" during this CF. As I see, the patch 
needs more work before review, so I changed it to "Withdrawn".
Feel free to resubmit an updated version to a future commitfest.

-- 
Anastasia Lubennikova
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company




On Mon, 30 Nov 2020 at 03:24, Anastasia Lubennikova
<a.lubennikova@postgrespro.ru> wrote:
>
> On 23.10.2020 05:06, Ian Lawrence Barwick wrote:
> > Having just submitted this, I realised I'm focussing on the GUCs which call
> > "SplitDirectoriesString()" (as my specific uses case is for
> > "shared_preload_libraries")
> > but the patch does not consider the other GUC_LIST_INPUT settings, which
> > call "SplitIdentifierString()", so as is, it might produce unexpected
> > results for those.
> >
> > I'll rethink and submit an updated version.
>
> Status update for a commitfest entry.
>
> This entry was "Waiting on author" during this CF. As I see, the patch
> needs more work before review, so I changed it to "Withdrawn".
> Feel free to resubmit an updated version to a future commitfest.


FWIW I was looking for this functionality just the other day, for
parsing synchronous_standby_names . So I'd definitely welcome it.



Re: proposal: function pg_setting_value_split() to parse shared_preload_libraries etc.

From
Ian Lawrence Barwick
Date:
2020年11月30日(月) 14:53 Craig Ringer <craig.ringer@enterprisedb.com>:
>
> On Mon, 30 Nov 2020 at 03:24, Anastasia Lubennikova
> <a.lubennikova@postgrespro.ru> wrote:
> >
> > On 23.10.2020 05:06, Ian Lawrence Barwick wrote:
> > > Having just submitted this, I realised I'm focussing on the GUCs which call
> > > "SplitDirectoriesString()" (as my specific uses case is for
> > > "shared_preload_libraries")
> > > but the patch does not consider the other GUC_LIST_INPUT settings, which
> > > call "SplitIdentifierString()", so as is, it might produce unexpected
> > > results for those.
> > >
> > > I'll rethink and submit an updated version.
> >
> > Status update for a commitfest entry.
> >
> > This entry was "Waiting on author" during this CF. As I see, the patch
> > needs more work before review, so I changed it to "Withdrawn".
> > Feel free to resubmit an updated version to a future commitfest.
>
>
> FWIW I was looking for this functionality just the other day, for
> parsing synchronous_standby_names . So I'd definitely welcome it.

Thanks, useful to know someone else has a use-case for this I'll
resubmit for the next CF.


Regards

Ian Barwick

--
EnterpriseDB: https://www.enterprisedb.com