On login trigger: take three

Started by Konstantin Knizhnikover 5 years ago187 messageshackers
Jump to latest
#1Konstantin Knizhnik
k.knizhnik@postgrespro.ru

Hi hackers,

Recently I have asked once again by one of our customers about login
trigger in postgres. People are migrating to Postgres from Oracle and 
looking for Postgres analog of this Oracle feature.
This topic is not new:

/messages/by-id/1570308356720-0.post@n3.nabble.com
/messages/by-id/OSAPR01MB507373499CCCEA00EAE79875FE2D0@OSAPR01MB5073.jpnprd01.prod.outlook.com

end even session connect/disconnect hooks were sometimes committed (but
then reverted).
As far as I understand most of the concerns were related with disconnect
hook.
Performing some action on session disconnect is actually much more
complicated than on login.
But customers are not needed it, unlike actions performed at session start.

I wonder if we are really going to make some steps in this directions?
The discussion above was finished with "We haven't rejected the concept
altogether, AFAICT"

I have tried to resurrect this patch and implement on-connect trigger on
top of it.
The syntax is almost the same as proposed by Takayuki:

CREATE EVENT TRIGGER mytrigger
AFTER CONNECTION ON mydatabase
EXECUTE {PROCEDURE | FUNCTION} myproc();

I have replaced CONNECT with CONNECTION because last keyword is already
recognized by Postgres and
make ON clause mandatory to avoid shift-reduce conflicts.

Actually specifying database name is redundant, because we can define
on-connect trigger only for self database (just because triggers and
functions are local to the database).
It may be considered as argument against handling session start using
trigger. But it seems to be the most natural mechanism for users.

On connect trigger can be dropped almost in the same way as normal (on
relation) trigger, but with specifying name of the database instead of
relation name:

DROP TRIGGER mytrigger ON mydatabase;

It is possible to define arbitrary number of on-connect triggers with
different names.

I attached my prototype implementation of this feature.
I just to be sure first that this feature will be interested to community.
If so, I will continue work in it and prepare new version of the patch
for the commitfest.

Example

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

on_login_trigger.patchtext/x-patch; name=on_login_trigger.patchDownload+441-196
#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#1)
Re: On login trigger: take three

Hi

čt 3. 9. 2020 v 15:43 odesílatel Konstantin Knizhnik <
k.knizhnik@postgrespro.ru> napsal:

Hi hackers,

Recently I have asked once again by one of our customers about login
trigger in postgres. People are migrating to Postgres from Oracle and
looking for Postgres analog of this Oracle feature.
This topic is not new:

/messages/by-id/1570308356720-0.post@n3.nabble.com

/messages/by-id/OSAPR01MB507373499CCCEA00EAE79875FE2D0@OSAPR01MB5073.jpnprd01.prod.outlook.com

end even session connect/disconnect hooks were sometimes committed (but
then reverted).
As far as I understand most of the concerns were related with disconnect
hook.
Performing some action on session disconnect is actually much more
complicated than on login.
But customers are not needed it, unlike actions performed at session start.

I wonder if we are really going to make some steps in this directions?
The discussion above was finished with "We haven't rejected the concept
altogether, AFAICT"

I have tried to resurrect this patch and implement on-connect trigger on
top of it.
The syntax is almost the same as proposed by Takayuki:

CREATE EVENT TRIGGER mytrigger
AFTER CONNECTION ON mydatabase
EXECUTE {PROCEDURE | FUNCTION} myproc();

I have replaced CONNECT with CONNECTION because last keyword is already
recognized by Postgres and
make ON clause mandatory to avoid shift-reduce conflicts.

Actually specifying database name is redundant, because we can define
on-connect trigger only for self database (just because triggers and
functions are local to the database).
It may be considered as argument against handling session start using
trigger. But it seems to be the most natural mechanism for users.

On connect trigger can be dropped almost in the same way as normal (on
relation) trigger, but with specifying name of the database instead of
relation name:

DROP TRIGGER mytrigger ON mydatabase;

It is possible to define arbitrary number of on-connect triggers with
different names.

I attached my prototype implementation of this feature.
I just to be sure first that this feature will be interested to community.
If so, I will continue work in it and prepare new version of the patch
for the commitfest.

I have a customer that requires this feature too. Now it uses a solution
based on dll session autoloading. Native solution can be great.

+1

Pavel

Example

Show quoted text

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#3tsunakawa.takay@fujitsu.com
tsunakawa.takay@fujitsu.com
In reply to: Konstantin Knizhnik (#1)
RE: On login trigger: take three

From: Konstantin Knizhnik <k.knizhnik@postgrespro.ru>

Recently I have asked once again by one of our customers about login trigger in
postgres. People are migrating to Postgres from Oracle and looking for Postgres
analog of this Oracle feature.
This topic is not new:

I attached my prototype implementation of this feature.
I just to be sure first that this feature will be interested to community.
If so, I will continue work in it and prepare new version of the patch for the
commitfest.

Thanks a lot for taking on this! +10

It may be considered as argument against handling session start using trigger.
But it seems to be the most natural mechanism for users.

Yeah, it's natural, just like the Unix shells run some shell scripts in the home directory.

Regards
Takayuki Tsunakawa

#4Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: tsunakawa.takay@fujitsu.com (#3)
Re: On login trigger: take three

Sorry, attached version of the patch is missing changes in one file.
Here is it correct patch.

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

on_login_trigger-2.patchtext/x-patch; name=on_login_trigger-2.patchDownload+443-196
#5Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#2)
Re: On login trigger: take three

On 03.09.2020 17:18, Pavel Stehule wrote:

Hi

čt 3. 9. 2020 v 15:43 odesílatel Konstantin Knizhnik
<k.knizhnik@postgrespro.ru <mailto:k.knizhnik@postgrespro.ru>> napsal:

Hi hackers,

Recently I have asked once again by one of our customers about login
trigger in postgres. People are migrating to Postgres from Oracle and
looking for Postgres analog of this Oracle feature.
This topic is not new:

/messages/by-id/1570308356720-0.post@n3.nabble.com
/messages/by-id/OSAPR01MB507373499CCCEA00EAE79875FE2D0@OSAPR01MB5073.jpnprd01.prod.outlook.com

end even session connect/disconnect hooks were sometimes committed
(but
then reverted).
As far as I understand most of the concerns were related with
disconnect
hook.
Performing some action on session disconnect is actually much more
complicated than on login.
But customers are not needed it, unlike actions performed at
session start.

I wonder if we are really going to make some steps in this directions?
The discussion above was finished with "We haven't rejected the
concept
altogether, AFAICT"

I have tried to resurrect this patch and implement on-connect
trigger on
top of it.
The syntax is almost the same as proposed by Takayuki:

CREATE EVENT TRIGGER mytrigger
AFTER CONNECTION ON mydatabase
EXECUTE {PROCEDURE | FUNCTION} myproc();

I have replaced CONNECT with CONNECTION because last keyword is
already
recognized by Postgres and
make ON clause mandatory to avoid shift-reduce conflicts.

Actually specifying database name is redundant, because we can define
on-connect trigger only for self database (just because triggers and
functions are local to the database).
It may be considered as argument against handling session start using
trigger. But it seems to be the most natural mechanism for users.

On connect trigger can be dropped almost in the same way as normal
(on
relation) trigger, but with specifying name of the database
instead of
relation name:

DROP TRIGGER mytrigger ON mydatabase;

It is possible to define arbitrary number of on-connect triggers with
different names.

I attached my prototype implementation of this feature.
I just to be sure first that this feature will be interested to
community.
If so, I will continue work in it and prepare new version of the
patch
for the commitfest.

I have a customer that requires this feature too. Now it uses a
solution based on dll session autoloading.  Native solution can be great.

+1

I realized that on connect trigger should be implemented as EVENT TRIGGER.
So I have reimplemented my patch using event trigger and use
session_start even name to make it more consistent with other events.
Now on login triggers can be created in this way:

create table connects(id serial, who text);
create function on_login_proc() returns event_trigger as $$
begin
  insert into connects (who) values (current_user());
  raise notice 'You are welcome!';
end;
$$ language plpgsql;
create event trigger on_login_trigger on session_start execute procedure
on_login_proc();
alter event trigger on_login_trigger enable always;

Attachments:

on_connect_event_trigger-6.patchtext/x-patch; name=on_connect_event_trigger-6.patchDownload+257-19
#6Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#5)
Re: On login trigger: take three

Hi

I am checking last patch, and there are notices

1. disable_session_start_trigger should be SU_BACKEND instead SUSET

2. The documentation should be enhanced - there is not any note about
behave when there are unhandled exceptions, about motivation for this event
trigger

3. regress tests should be enhanced - the cases with exceptions are not
tested

4. This trigger is not executed again after RESET ALL or DISCARD ALL - it
can be a problem if somebody wants to use this trigger for initialisation
of some session objects with some pooling solutions.

5. The handling errors don't work well for canceling. If event trigger
waits for some event, then cancel disallow connect although connected user
is superuser

CREATE OR REPLACE FUNCTION on_login_proc2() RETURNS EVENT_TRIGGER AS $$
begin perform pg_sleep(10000); raise notice '%', fx1(100);raise notice
'kuku kuku'; end $$ language plpgsql;

probably nobody will use pg_sleep in this routine, but there can be wait on
some locks ...

Regards

Pavel

#7Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#6)
Re: On login trigger: take three

On 14.09.2020 12:44, Pavel Stehule wrote:

Hi

I am checking last patch, and there are notices

1. disable_session_start_trigger should be SU_BACKEND instead SUSET

2. The documentation should be enhanced - there is not any note about
behave when there are unhandled exceptions, about motivation for this
event trigger

3. regress tests should be enhanced - the cases with exceptions are
not tested

4. This trigger is not executed again after RESET ALL or DISCARD ALL -
it can be a problem if somebody wants to use this trigger for
initialisation of some session objects with some pooling solutions.

5. The handling errors don't work well for canceling. If event trigger
waits for some event, then cancel disallow connect although connected
user is superuser

CREATE OR REPLACE FUNCTION on_login_proc2() RETURNS EVENT_TRIGGER AS
$$ begin perform pg_sleep(10000); raise notice '%', fx1(100);raise
notice 'kuku kuku'; end  $$ language plpgsql;

probably nobody will use pg_sleep in this routine, but there can be
wait on some locks ...

Regards

Pavel

Hi
Thank you very much for looking at my patch for connection triggers.
I have fixed 1-3 issues in the attached patch.
Concerning 4 and 5 I have some doubts:

4. Should I add some extra GUC to allow firing of session_start trigger
in case of  RESET ALL or DISCARD ALL ?
Looks like such behavior contradicts with event name "session_start"...
And do we really need it? If some pooler is using RESET ALL/DISCARD ALL
to emulate session semantic then  most likely it provides way to define
custom actions which
should be perform for session initialization. As far as I know, for
example pgbouncer allows do define own on-connect hooks.

5. I do not quite understand your concern. If I define  trigger
procedure which is  blocked (for example as in your example), then I can
use pg_cancel_backend to interrupt execution of login trigger and
superuser can login. What should be changed here?

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

on_connect_event_trigger-7.patchtext/x-patch; name=on_connect_event_trigger-7.patchDownload+287-19
#8Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#7)
Re: On login trigger: take three

po 14. 9. 2020 v 16:12 odesílatel Konstantin Knizhnik <
k.knizhnik@postgrespro.ru> napsal:

On 14.09.2020 12:44, Pavel Stehule wrote:

Hi

I am checking last patch, and there are notices

1. disable_session_start_trigger should be SU_BACKEND instead SUSET

2. The documentation should be enhanced - there is not any note about
behave when there are unhandled exceptions, about motivation for this
event trigger

3. regress tests should be enhanced - the cases with exceptions are
not tested

4. This trigger is not executed again after RESET ALL or DISCARD ALL -
it can be a problem if somebody wants to use this trigger for
initialisation of some session objects with some pooling solutions.

5. The handling errors don't work well for canceling. If event trigger
waits for some event, then cancel disallow connect although connected
user is superuser

CREATE OR REPLACE FUNCTION on_login_proc2() RETURNS EVENT_TRIGGER AS
$$ begin perform pg_sleep(10000); raise notice '%', fx1(100);raise
notice 'kuku kuku'; end $$ language plpgsql;

probably nobody will use pg_sleep in this routine, but there can be
wait on some locks ...

Regards

Pavel

Hi
Thank you very much for looking at my patch for connection triggers.
I have fixed 1-3 issues in the attached patch.
Concerning 4 and 5 I have some doubts:

4. Should I add some extra GUC to allow firing of session_start trigger
in case of RESET ALL or DISCARD ALL ?
Looks like such behavior contradicts with event name "session_start"...
And do we really need it? If some pooler is using RESET ALL/DISCARD ALL
to emulate session semantic then most likely it provides way to define
custom actions which
should be perform for session initialization. As far as I know, for
example pgbouncer allows do define own on-connect hooks.

If we introduce buildin session trigger , we should to define what is the
session. Your design is much more related to the process than to session.
So the correct name should be "process_start" trigger, or some should be
different. I think there are two different events - process_start, and
session_start, and there should be two different event triggers. Maybe the
name "session_start" is just ambiguous and should be used with a different
name.

5. I do not quite understand your concern. If I define trigger
procedure which is blocked (for example as in your example), then I can
use pg_cancel_backend to interrupt execution of login trigger and
superuser can login. What should be changed here?

You cannot run pg_cancel_backend, because you cannot open a new session.
There is a cycle.

Regards

Pavel

Show quoted text

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#9Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#8)
Re: On login trigger: take three

On 14.09.2020 17:34, Pavel Stehule wrote:

If we introduce buildin session trigger , we should to define what is
the session. Your design is much more related to the process than to
session. So the correct name should be "process_start" trigger, or
some should be different. I think there are two different events -
process_start, and session_start, and there should be two different
event triggers. Maybe the name "session_start" is just ambiguous and
should be used with a different name.

I agree.
I can rename trigger to backend_start or process_start or whatever else.

5. I do not quite understand your concern. If I define trigger
procedure which is  blocked (for example as in your example), then
I can
use pg_cancel_backend to interrupt execution of login trigger and
superuser can login. What should be changed here?

You cannot run pg_cancel_backend, because you cannot open a new
session. There is a cycle.

It is always possible to login by disabling startup triggers using
disable_session_start_trigger GUC:

psql "dbname=postgres options='-c disable_session_start_trigger=true'"

#10Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#9)
Re: On login trigger: take three

po 14. 9. 2020 v 17:53 odesílatel Konstantin Knizhnik <
k.knizhnik@postgrespro.ru> napsal:

On 14.09.2020 17:34, Pavel Stehule wrote:

If we introduce buildin session trigger , we should to define what is the
session. Your design is much more related to the process than to session.
So the correct name should be "process_start" trigger, or some should be
different. I think there are two different events - process_start, and
session_start, and there should be two different event triggers. Maybe the
name "session_start" is just ambiguous and should be used with a different
name.

I agree.
I can rename trigger to backend_start or process_start or whatever else.

Creating a good name can be hard - it is not called for any process - so
maybe "user_backend_start" ?

5. I do not quite understand your concern. If I define trigger
procedure which is blocked (for example as in your example), then I can
use pg_cancel_backend to interrupt execution of login trigger and
superuser can login. What should be changed here?

You cannot run pg_cancel_backend, because you cannot open a new session.
There is a cycle.

It is always possible to login by disabling startup triggers using
disable_session_start_trigger GUC:

psql "dbname=postgres options='-c disable_session_start_trigger=true'"

sure, I know. Just this behavior can be a very unpleasant surprise, and my
question is if it can be fixed. Creating custom libpq variables can be the
stop for people that use pgAdmin.

#11Greg Nancarrow
gregn4422@gmail.com
In reply to: Pavel Stehule (#10)
Re: On login trigger: take three

On Tue, Sep 15, 2020 at 2:12 AM Pavel Stehule <pavel.stehule@gmail.com> wrote:

It is always possible to login by disabling startup triggers using disable_session_start_trigger GUC:

psql "dbname=postgres options='-c disable_session_start_trigger=true'"

sure, I know. Just this behavior can be a very unpleasant surprise, and my question is if it can be fixed. Creating custom libpq variables can be the stop for people that use pgAdmin.

Hi,

I thought in the case of using pgAdmin (assuming you can connect as
superuser to a database, say the default "postgres" maintenance
database, that doesn't have an EVENT TRIGGER defined for the
session_start event) you could issue the query "ALTER SYSTEM SET
disable_session_start_trigger TO true;" and then reload the
configuration?

Anyway, I am wondering if this patch is still being actively developed/improved?

Regarding the last-posted patch, I'd like to give some feedback. I
found that the documentation part wouldn't build because of errors in
the SGML tags. There are some grammatical errors too, and some minor
inconsistencies with the current documentation, and some descriptions
could be improved. I think that a colon separator should be added to
the NOTICE message for superuser, so it's clear exactly where the text
of the underlying error message starts. Also, I think that
"client_connection" is perhaps a better and more intuitive event name
than "session_start", or the suggested "user_backend_start".
I've therefore attached an updated patch with these suggested minor
improvements, please take a look and see what you think (please
compare with the original patch).

Regards,
Greg Nancarrow
Fujitsu Australia

Attachments:

on_connect_event_trigger_WITH_SUGGESTED_UPDATES.patchapplication/octet-stream; name=on_connect_event_trigger_WITH_SUGGESTED_UPDATES.patchDownload+292-19
#12Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Greg Nancarrow (#11)
Re: On login trigger: take three

On 04.12.2020 3:50, Greg Nancarrow wrote:

On Tue, Sep 15, 2020 at 2:12 AM Pavel Stehule <pavel.stehule@gmail.com> wrote:

It is always possible to login by disabling startup triggers using disable_session_start_trigger GUC:

psql "dbname=postgres options='-c disable_session_start_trigger=true'"

sure, I know. Just this behavior can be a very unpleasant surprise, and my question is if it can be fixed. Creating custom libpq variables can be the stop for people that use pgAdmin.

Hi,

I thought in the case of using pgAdmin (assuming you can connect as
superuser to a database, say the default "postgres" maintenance
database, that doesn't have an EVENT TRIGGER defined for the
session_start event) you could issue the query "ALTER SYSTEM SET
disable_session_start_trigger TO true;" and then reload the
configuration?

As far as I understand Pavel concern was about the case when superuser
defines wrong login trigger which prevents login to the system
all user including himself. Right now solution of this problem is to
include "options='-c disable_session_start_trigger=true'" in connection
string.
I do not know if it can be done with pgAdmin.

Anyway, I am wondering if this patch is still being actively developed/improved?

I do not know what else has to be improved.
If you, Pavel or anybody else have some suggestions: please let me know.

Regarding the last-posted patch, I'd like to give some feedback. I
found that the documentation part wouldn't build because of errors in
the SGML tags. There are some grammatical errors too, and some minor
inconsistencies with the current documentation, and some descriptions
could be improved. I think that a colon separator should be added to
the NOTICE message for superuser, so it's clear exactly where the text
of the underlying error message starts. Also, I think that
"client_connection" is perhaps a better and more intuitive event name
than "session_start", or the suggested "user_backend_start".
I've therefore attached an updated patch with these suggested minor
improvements, please take a look and see what you think (please
compare with the original patch).

Thank you very much for detecting the problems and much more thanks for
fixing them and providing your version of the patch.
I have nothing against renaming "session_start" to "client_connection".

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#13Greg Nancarrow
gregn4422@gmail.com
In reply to: Konstantin Knizhnik (#12)
Re: On login trigger: take three

On Fri, Dec 4, 2020 at 9:05 PM Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

As far as I understand Pavel concern was about the case when superuser
defines wrong login trigger which prevents login to the system
all user including himself. Right now solution of this problem is to
include "options='-c disable_session_start_trigger=true'" in connection
string.
I do not know if it can be done with pgAdmin.

As an event trigger is tied to a particular database, and a GUC is
global to the cluster, as long as there is one database in the cluster
for which an event trigger for the "client_connection" event is NOT
defined (say the default "postgres" maintenance database), then the
superuser can always connect to that database, issue "ALTER SYSTEM SET
disable_client_connection_trigger TO true" and reload the
configuration. I tested this with pgAdmin4 and it worked fine for me,
to allow login to a database for which login was previously prevented
due to a badly-defined logon trigger.

Pavel, is this an acceptable solution or do you still see problems
with this approach?

Regards,
Greg Nancarrow
Fujitsu Australia

#14Pavel Stehule
pavel.stehule@gmail.com
In reply to: Greg Nancarrow (#13)
Re: On login trigger: take three

út 8. 12. 2020 v 1:17 odesílatel Greg Nancarrow <gregn4422@gmail.com>
napsal:

On Fri, Dec 4, 2020 at 9:05 PM Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

As far as I understand Pavel concern was about the case when superuser
defines wrong login trigger which prevents login to the system
all user including himself. Right now solution of this problem is to
include "options='-c disable_session_start_trigger=true'" in connection
string.
I do not know if it can be done with pgAdmin.

As an event trigger is tied to a particular database, and a GUC is
global to the cluster, as long as there is one database in the cluster
for which an event trigger for the "client_connection" event is NOT
defined (say the default "postgres" maintenance database), then the
superuser can always connect to that database, issue "ALTER SYSTEM SET
disable_client_connection_trigger TO true" and reload the
configuration. I tested this with pgAdmin4 and it worked fine for me,
to allow login to a database for which login was previously prevented
due to a badly-defined logon trigger.

yes, it can work .. Maybe for this operation only database owner rights
should be necessary. The super user is maybe too strong.

There are two maybe generic questions?

1. Maybe we can introduce more generic GUC for all event triggers like
disable_event_triggers? This GUC can be checked only by the database owner
or super user. It can be an alternative ALTER TABLE DISABLE TRIGGER ALL. It
can be protection against necessity to restart to single mode to repair the
event trigger. I think so more generic solution is better than special
disable_client_connection_trigger GUC.

2. I have no objection against client_connection. It is probably better for
the mentioned purpose - possibility to block connection to database. Can be
interesting, and I am not sure how much work it is to introduce the second
event - session_start. This event should be started after connecting - so
the exception there doesn't block connect, and should be started also after
the new statement "DISCARD SESSION", that will be started automatically
after DISCARD ALL. This feature should not be implemented in first step,
but it can be a plan for support pooled connections

Regards

Pavel

Show quoted text

Pavel, is this an acceptable solution or do you still see problems
with this approach?

Regards,
Greg Nancarrow
Fujitsu Australia

#15Greg Nancarrow
gregn4422@gmail.com
In reply to: Pavel Stehule (#14)
Re: On login trigger: take three

On Tue, Dec 8, 2020 at 3:26 PM Pavel Stehule <pavel.stehule@gmail.com> wrote:

There are two maybe generic questions?

1. Maybe we can introduce more generic GUC for all event triggers like disable_event_triggers? This GUC can be checked only by the database owner or super user. It can be an alternative ALTER TABLE DISABLE TRIGGER ALL. It can be protection against necessity to restart to single mode to repair the event trigger. I think so more generic solution is better than special disable_client_connection_trigger GUC.

2. I have no objection against client_connection. It is probably better for the mentioned purpose - possibility to block connection to database. Can be interesting, and I am not sure how much work it is to introduce the second event - session_start. This event should be started after connecting - so the exception there doesn't block connect, and should be started also after the new statement "DISCARD SESSION", that will be started automatically after DISCARD ALL. This feature should not be implemented in first step, but it can be a plan for support pooled connections

I've created a separate patch to address question (1), rather than
include it in the main patch, which I've adjusted accordingly. I'll
leave question (2) until another time, as you suggest.
See the attached patches.

Regards,
Greg Nancarrow
Fujitsu Australia

Attachments:

v1-0001-Add-new-config-parameter-disable_event_triggers.patchapplication/octet-stream; name=v1-0001-Add-new-config-parameter-disable_event_triggers.patchDownload+40-2
v1-0002-Add-new-client_connection-event-supporting-a-logon-trigger.patchapplication/octet-stream; name=v1-0002-Add-new-client_connection-event-supporting-a-logon-trigger.patchDownload+290-20
#16Pavel Stehule
pavel.stehule@gmail.com
In reply to: Greg Nancarrow (#15)
Re: On login trigger: take three

st 9. 12. 2020 v 13:17 odesílatel Greg Nancarrow <gregn4422@gmail.com>
napsal:

On Tue, Dec 8, 2020 at 3:26 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

There are two maybe generic questions?

1. Maybe we can introduce more generic GUC for all event triggers like

disable_event_triggers? This GUC can be checked only by the database owner
or super user. It can be an alternative ALTER TABLE DISABLE TRIGGER ALL. It
can be protection against necessity to restart to single mode to repair the
event trigger. I think so more generic solution is better than special
disable_client_connection_trigger GUC.

2. I have no objection against client_connection. It is probably better

for the mentioned purpose - possibility to block connection to database.
Can be interesting, and I am not sure how much work it is to introduce the
second event - session_start. This event should be started after connecting
- so the exception there doesn't block connect, and should be started also
after the new statement "DISCARD SESSION", that will be started
automatically after DISCARD ALL. This feature should not be implemented in
first step, but it can be a plan for support pooled connections

PGC_SU_BACKEND is too strong, there should be PGC_BACKEND if this option
can be used by database owner

Pavel

Show quoted text

I've created a separate patch to address question (1), rather than
include it in the main patch, which I've adjusted accordingly. I'll
leave question (2) until another time, as you suggest.
See the attached patches.

Regards,
Greg Nancarrow
Fujitsu Australia

#17Pavel Stehule
pavel.stehule@gmail.com
In reply to: Greg Nancarrow (#15)
Re: On login trigger: take three

Hi

st 9. 12. 2020 v 13:17 odesílatel Greg Nancarrow <gregn4422@gmail.com>
napsal:

On Tue, Dec 8, 2020 at 3:26 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

There are two maybe generic questions?

1. Maybe we can introduce more generic GUC for all event triggers like

disable_event_triggers? This GUC can be checked only by the database owner
or super user. It can be an alternative ALTER TABLE DISABLE TRIGGER ALL. It
can be protection against necessity to restart to single mode to repair the
event trigger. I think so more generic solution is better than special
disable_client_connection_trigger GUC.

2. I have no objection against client_connection. It is probably better

for the mentioned purpose - possibility to block connection to database.
Can be interesting, and I am not sure how much work it is to introduce the
second event - session_start. This event should be started after connecting
- so the exception there doesn't block connect, and should be started also
after the new statement "DISCARD SESSION", that will be started
automatically after DISCARD ALL. This feature should not be implemented in
first step, but it can be a plan for support pooled connections

I've created a separate patch to address question (1), rather than
include it in the main patch, which I've adjusted accordingly. I'll
leave question (2) until another time, as you suggest.
See the attached patches.

I see two possible questions?

1. when you introduce this event, then the new hook is useless ?

2. what is a performance impact for users that want not to use this
feature. What is a overhead of EventTriggerOnConnect and is possible to
skip this step if database has not any event trigger

Pavel

Show quoted text

Regards,
Greg Nancarrow
Fujitsu Australia

#18Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#17)
Re: On login trigger: take three

On 09.12.2020 15:34, Pavel Stehule wrote:

Hi

st 9. 12. 2020 v 13:17 odesílatel Greg Nancarrow <gregn4422@gmail.com
<mailto:gregn4422@gmail.com>> napsal:

On Tue, Dec 8, 2020 at 3:26 PM Pavel Stehule
<pavel.stehule@gmail.com <mailto:pavel.stehule@gmail.com>> wrote:

There are two maybe generic questions?

1. Maybe we can introduce more generic GUC for all event

triggers like disable_event_triggers? This GUC can be checked only
by the database owner or super user. It can be an alternative
ALTER TABLE DISABLE TRIGGER ALL. It can be protection against
necessity to restart to single mode to repair the event trigger. I
think so more generic solution is better than special
disable_client_connection_trigger GUC.

2. I have no objection against client_connection. It is probably

better for the mentioned purpose - possibility to block connection
to database. Can be interesting, and I am not sure how much work
it is to introduce the second event - session_start. This event
should be started after connecting - so the exception there
doesn't block connect, and should be started also after the new
statement "DISCARD SESSION", that will be started automatically
after DISCARD ALL.  This feature should not be implemented in
first step, but it can be a plan for support pooled connections

I've created a separate patch to address question (1), rather than
include it in the main patch, which I've adjusted accordingly. I'll
leave question (2) until another time, as you suggest.
See the attached patches.

I see two possible questions?

1. when you introduce this event, then the new hook is useless ?

2. what is a performance impact for users that want not to use this
feature. What is a overhead of EventTriggerOnConnect and is possible
to skip this step if database has not any event trigger

As far as I understand this are questions to me rather than to Greg.
1. Do you mean client_connection_hook? It is used to implement this new
event type. It can be also used for other purposes.
2. Connection overhead is quite large. Supporting on connect hook
requires traversal of event trigger relation. But this overhead is
negligible comparing with overhead of establishing connection. In any
case I did the following test (with local connection):

pgbench -C -S -T 100 -P 1 -M prepared postgres

without this patch:
tps = 424.287889 (including connections establishing)
tps = 952.911068 (excluding connections establishing)

with this patch (but without any connection trigger defined):
tps = 434.642947 (including connections establishing)
tps = 995.525383 (excluding connections establishing)

As you can see - there is almost now different (patched version is even
faster, but it seems to be just "white noise".

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#19Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#18)
Re: On login trigger: take three

st 9. 12. 2020 v 14:28 odesílatel Konstantin Knizhnik <
k.knizhnik@postgrespro.ru> napsal:

On 09.12.2020 15:34, Pavel Stehule wrote:

Hi

st 9. 12. 2020 v 13:17 odesílatel Greg Nancarrow <gregn4422@gmail.com>
napsal:

On Tue, Dec 8, 2020 at 3:26 PM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

There are two maybe generic questions?

1. Maybe we can introduce more generic GUC for all event triggers like

disable_event_triggers? This GUC can be checked only by the database owner
or super user. It can be an alternative ALTER TABLE DISABLE TRIGGER ALL. It
can be protection against necessity to restart to single mode to repair the
event trigger. I think so more generic solution is better than special
disable_client_connection_trigger GUC.

2. I have no objection against client_connection. It is probably better

for the mentioned purpose - possibility to block connection to database.
Can be interesting, and I am not sure how much work it is to introduce the
second event - session_start. This event should be started after connecting
- so the exception there doesn't block connect, and should be started also
after the new statement "DISCARD SESSION", that will be started
automatically after DISCARD ALL. This feature should not be implemented in
first step, but it can be a plan for support pooled connections

I've created a separate patch to address question (1), rather than
include it in the main patch, which I've adjusted accordingly. I'll
leave question (2) until another time, as you suggest.
See the attached patches.

I see two possible questions?

1. when you introduce this event, then the new hook is useless ?

2. what is a performance impact for users that want not to use this
feature. What is a overhead of EventTriggerOnConnect and is possible to
skip this step if database has not any event trigger

As far as I understand this are questions to me rather than to Greg.
1. Do you mean client_connection_hook? It is used to implement this new
event type. It can be also used for other purposes.

ok. I don't like it, but there are redundant hooks (against event triggers)
already.

2. Connection overhead is quite large. Supporting on connect hook requires

traversal of event trigger relation. But this overhead is negligible
comparing with overhead of establishing connection. In any case I did the
following test (with local connection):

pgbench -C -S -T 100 -P 1 -M prepared postgres

without this patch:
tps = 424.287889 (including connections establishing)
tps = 952.911068 (excluding connections establishing)

with this patch (but without any connection trigger defined):
tps = 434.642947 (including connections establishing)
tps = 995.525383 (excluding connections establishing)

As you can see - there is almost now different (patched version is even
faster, but it seems to be just "white noise".

This is not the worst case probably. In this patch the
StartTransactionCommand is executed on every connection, although it is not
necessary - and for most use cases it will not be used.

I did more tests - see attachments and I see a 5% slowdown - I don't think
so it is acceptable for this case. This feature is nice, and for some users
important, but only really few users can use it.

┌────────────────┬─────────┬────────────┬─────────────┐
│ test │ WITH LT │ LT ENABLED │ LT DISABLED │
╞════════════════╪═════════╪════════════╪═════════════╡
│ ro_constant_10 │ 539 │ 877 │ 905 │
│ ro_index_10 │ 562 │ 808 │ 855 │
│ ro_constant_50 │ 527 │ 843 │ 863 │
│ ro_index_50 │ 544 │ 731 │ 742 │
└────────────────┴─────────┴────────────┴─────────────┘
(4 rows)

I tested a performance of trigger (results of first column in table):

CREATE OR REPLACE FUNCTION public.foo()
RETURNS event_trigger
LANGUAGE plpgsql
AS $function$
begin
if not pg_has_role(session_user, 'postgres', 'member') then
raise exception 'you are not super user';
end if;
end;
$function$;

There is an available snapshot in InitPostgres, and then there is possible
to check if for the current database some connect event trigger exists.This
can reduce an overhead of this patch, when there are no logon triggers.

I think so implemented and used names are ok, but for this feature the
performance impact should be really very minimal.

There is other small issue - missing tab-complete support for CREATE
TRIGGER statement in psql

Regards

Pavel

Show quoted text

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

test-ro-2.sqlapplication/sql; name=test-ro-2.sqlDownload
dataapplication/octet-stream; name=dataDownload
test-ro.sqlapplication/sql; name=test-ro.sqlDownload
#20Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#19)
Re: On login trigger: take three

On 10.12.2020 10:45, Pavel Stehule wrote:

st 9. 12. 2020 v 14:28 odesílatel Konstantin Knizhnik
<k.knizhnik@postgrespro.ru <mailto:k.knizhnik@postgrespro.ru>> napsal:

On 09.12.2020 15:34, Pavel Stehule wrote:

Hi

st 9. 12. 2020 v 13:17 odesílatel Greg Nancarrow
<gregn4422@gmail.com <mailto:gregn4422@gmail.com>> napsal:

On Tue, Dec 8, 2020 at 3:26 PM Pavel Stehule
<pavel.stehule@gmail.com <mailto:pavel.stehule@gmail.com>> wrote:

There are two maybe generic questions?

1. Maybe we can introduce more generic GUC for all event

triggers like disable_event_triggers? This GUC can be checked
only by the database owner or super user. It can be an
alternative ALTER TABLE DISABLE TRIGGER ALL. It can be
protection against necessity to restart to single mode to
repair the event trigger. I think so more generic solution is
better than special disable_client_connection_trigger GUC.

2. I have no objection against client_connection. It is

probably better for the mentioned purpose - possibility to
block connection to database. Can be interesting, and I am
not sure how much work it is to introduce the second event -
session_start. This event should be started after connecting
- so the exception there doesn't block connect, and should be
started also after the new statement "DISCARD SESSION", that
will be started automatically after DISCARD ALL. This feature
should not be implemented in first step, but it can be a plan
for support pooled connections

I've created a separate patch to address question (1), rather
than
include it in the main patch, which I've adjusted
accordingly. I'll
leave question (2) until another time, as you suggest.
See the attached patches.

I see two possible questions?

1. when you introduce this event, then the new hook is useless ?

2. what is a performance impact for users that want not to use
this feature. What is a overhead of EventTriggerOnConnect and is
possible to skip this step if database has not any event trigger

As far as I understand this are questions to me rather than to Greg.
1. Do you mean client_connection_hook? It is used to implement
this new event type. It can be also used for other purposes.

ok. I don't like it, but there are redundant hooks (against event
triggers) already.

2. Connection overhead is quite large. Supporting on connect hook
requires traversal of event trigger relation. But this overhead is
negligible comparing with overhead of establishing connection. In
any case I did the following test (with local connection):

pgbench -C -S -T 100 -P 1 -M prepared postgres

without this patch:
tps = 424.287889 (including connections establishing)
tps = 952.911068 (excluding connections establishing)

with this patch (but without any connection trigger defined):
tps = 434.642947 (including connections establishing)
tps = 995.525383 (excluding connections establishing)

As you can see - there is almost now different (patched version is
even faster, but it seems to be just "white noise".

This is not the worst case probably. In this patch the
StartTransactionCommand is executed on every connection, although it
is not necessary - and for most use cases it will not be used.

I did more tests - see attachments and I see a 5% slowdown - I don't
think so it is acceptable for this case. This feature is nice, and for
some users important, but only really few users can use it.

┌────────────────┬─────────┬────────────┬─────────────┐
│      test      │ WITH LT │ LT ENABLED │ LT DISABLED │
╞════════════════╪═════════╪════════════╪═════════════╡
│ ro_constant_10 │     539 │        877 │         905 │
│ ro_index_10    │     562 │        808 │         855 │
│ ro_constant_50 │     527 │        843 │         863 │
│ ro_index_50    │     544 │        731 │         742 │
└────────────────┴─────────┴────────────┴─────────────┘
(4 rows)

I tested a performance of trigger (results of first column in table):

CREATE OR REPLACE FUNCTION public.foo()
 RETURNS event_trigger
 LANGUAGE plpgsql
AS $function$
begin
  if not pg_has_role(session_user, 'postgres', 'member') then
    raise exception 'you are not super user';
  end if;
end;
$function$;

There is an available snapshot in InitPostgres, and then there is
possible to check if for the current database some connect event
trigger exists.This can reduce an overhead of this patch, when there
are no logon triggers.

I think so implemented and used names are ok, but for this feature the
performance impact should be really very minimal.

There is other small issue - missing tab-complete support for CREATE
TRIGGER statement in psql

Regards

Pavel

Unfortunately I was not able to reproduce your results.
I just tried the case "select 1" because for this trivial query the
overhead of session hooks should be the largest.
In my case variation of results was large enough.
Did you try to run test multiple times?

pgbench -j 2 -c 10 --connect -f test-ro.sql -T 60 -n postgres

disable_event_triggers = off
tps = 1812.250463 (including connections establishing)
tps = 2256.285712 (excluding connections establishing)

tps = 1838.107242 (including connections establishing)
tps = 2288.507668 (excluding connections establishing)

tps = 1830.879302 (including connections establishing)
tps = 2279.302553 (excluding connections establishing)

disable_event_triggers = on
tps = 1858.328717 (including connections establishing)
tps = 2313.661689 (excluding connections establishing)

tps = 1832.932960 (including connections establishing)
tps = 2282.074346 (excluding connections establishing)

tps = 1868.908521 (including connections establishing)
tps = 2326.559150 (excluding connections establishing)

I tried to increase run time to 1000 seconds.
Results are the following:

disable_event_triggers = off
tps = 1813.587876 (including connections establishing)
tps = 2257.844703 (excluding connections establishing)

disable_event_triggers = on
tps = 1838.107242 (including connections establishing)
tps = 2288.507668 (excluding connections establishing)

So the difference on this extreme case is 1%.

I tried your suggestion and move client_connection_hook invocation to
postinit.c
It slightly improve performance:

tps = 1828.446959 (including connections establishing)
tps = 2276.142972 (excluding connections establishing)

So result is somewhere in the middle, because it allows to eliminate
overhead of
starting transaction or taking snapshots but not of lookup through
pg_event_trigger table (although it it empty).

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#21Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#20)
#22Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#21)
#23Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#22)
#24Pavel Stehule
pavel.stehule@gmail.com
In reply to: Pavel Stehule (#23)
#25Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#23)
#26Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#16)
#27Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#26)
#28Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#27)
#29Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#28)
#30Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#29)
#31Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#30)
#32Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#31)
#33Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#32)
#34Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#32)
#35Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#34)
#36Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#35)
#37Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#36)
#38Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#37)
#39Zhihong Yu
zyu@yugabyte.com
In reply to: Pavel Stehule (#38)
#40Pavel Stehule
pavel.stehule@gmail.com
In reply to: Pavel Stehule (#38)
#41Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#40)
#42Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Zhihong Yu (#39)
#43Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#41)
#44Pavel Stehule
pavel.stehule@gmail.com
In reply to: Pavel Stehule (#43)
#45Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#44)
#46Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#45)
#47Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#46)
#48Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#47)
#49Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Pavel Stehule (#48)
#50Pavel Stehule
pavel.stehule@gmail.com
In reply to: Konstantin Knizhnik (#49)
#51Pavel Stehule
pavel.stehule@gmail.com
In reply to: Pavel Stehule (#50)
#52Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Pavel Stehule (#51)
#53Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#52)
#54Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#53)
#55Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Amit Kapila (#53)
In reply to: Konstantin Knizhnik (#55)
In reply to: Ivan Panchenko (#56)
#58Greg Nancarrow
gregn4422@gmail.com
In reply to: Ivan Panchenko (#57)
#59Greg Nancarrow
gregn4422@gmail.com
In reply to: Greg Nancarrow (#58)
#60vignesh C
vignesh21@gmail.com
In reply to: Greg Nancarrow (#59)
#61Greg Nancarrow
gregn4422@gmail.com
In reply to: vignesh C (#60)
#62Ibrar Ahmed
ibrar.ahmad@gmail.com
In reply to: Greg Nancarrow (#61)
#63Greg Nancarrow
gregn4422@gmail.com
In reply to: Ibrar Ahmed (#62)
In reply to: Greg Nancarrow (#61)
#65Greg Nancarrow
gregn4422@gmail.com
In reply to: Ivan Panchenko (#64)
#66Daniel Gustafsson
daniel@yesql.se
In reply to: Greg Nancarrow (#63)
#67Pavel Stehule
pavel.stehule@gmail.com
In reply to: Daniel Gustafsson (#66)
#68Daniel Gustafsson
daniel@yesql.se
In reply to: Pavel Stehule (#67)
#69Pavel Stehule
pavel.stehule@gmail.com
In reply to: Daniel Gustafsson (#68)
#70Greg Nancarrow
gregn4422@gmail.com
In reply to: Daniel Gustafsson (#66)
#71Teodor Sigaev
teodor@sigaev.ru
In reply to: Greg Nancarrow (#70)
#72Greg Nancarrow
gregn4422@gmail.com
In reply to: Teodor Sigaev (#71)
#73Daniel Gustafsson
daniel@yesql.se
In reply to: Greg Nancarrow (#72)
#74Greg Nancarrow
gregn4422@gmail.com
In reply to: Greg Nancarrow (#70)
In reply to: Teodor Sigaev (#71)
#76Daniel Gustafsson
daniel@yesql.se
In reply to: Ivan Panchenko (#75)
#77Greg Nancarrow
gregn4422@gmail.com
In reply to: Daniel Gustafsson (#76)
#78Greg Nancarrow
gregn4422@gmail.com
In reply to: Greg Nancarrow (#77)
#79Daniel Gustafsson
daniel@yesql.se
In reply to: Greg Nancarrow (#78)
#80Pavel Stehule
pavel.stehule@gmail.com
In reply to: Daniel Gustafsson (#79)
#81Greg Nancarrow
gregn4422@gmail.com
In reply to: Daniel Gustafsson (#79)
#82Daniel Gustafsson
daniel@yesql.se
In reply to: Greg Nancarrow (#81)
#83Greg Nancarrow
gregn4422@gmail.com
In reply to: Daniel Gustafsson (#82)
#84Greg Nancarrow
gregn4422@gmail.com
In reply to: Daniel Gustafsson (#82)
#85Greg Nancarrow
gregn4422@gmail.com
In reply to: Greg Nancarrow (#84)
#86Greg Nancarrow
gregn4422@gmail.com
In reply to: Greg Nancarrow (#85)
#87Greg Nancarrow
gregn4422@gmail.com
In reply to: Greg Nancarrow (#86)
#88Daniel Gustafsson
daniel@yesql.se
In reply to: Greg Nancarrow (#87)
#89Robert Haas
robertmhaas@gmail.com
In reply to: Greg Nancarrow (#87)
#90Andres Freund
andres@anarazel.de
In reply to: Greg Nancarrow (#87)
#91Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#90)
#92Andres Freund
andres@anarazel.de
In reply to: Daniel Gustafsson (#91)
#93Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#92)
#94Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#93)
#95Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#94)
#96Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#95)
#97Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#92)
#98Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#92)
#99Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#94)
#100Andres Freund
andres@anarazel.de
In reply to: Daniel Gustafsson (#99)
#101Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#100)
#102Noname
a.sokolov@postgrespro.ru
In reply to: Daniel Gustafsson (#101)
#103Daniel Gustafsson
daniel@yesql.se
In reply to: Noname (#102)
#104Andres Freund
andres@anarazel.de
In reply to: Daniel Gustafsson (#103)
#105Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#104)
#106Noname
a.sokolov@postgrespro.ru
In reply to: Daniel Gustafsson (#105)
#107Andres Freund
andres@anarazel.de
In reply to: Noname (#106)
#108Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#107)
#109Andres Freund
andres@anarazel.de
In reply to: Daniel Gustafsson (#108)
#110Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#109)
#111Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#109)
In reply to: Andres Freund (#109)
#113Daniel Gustafsson
daniel@yesql.se
In reply to: Ivan Panchenko (#112)
#114Daniel Gustafsson
daniel@yesql.se
In reply to: Tom Lane (#111)
#115Noname
a.sokolov@postgrespro.ru
In reply to: Daniel Gustafsson (#113)
#116Daniel Gustafsson
daniel@yesql.se
In reply to: Noname (#115)
#117Daniel Gustafsson
daniel@yesql.se
In reply to: Daniel Gustafsson (#116)
#118Zhihong Yu
zyu@yugabyte.com
In reply to: Daniel Gustafsson (#117)
#119Sergey Shinderuk
s.shinderuk@postgrespro.ru
In reply to: Daniel Gustafsson (#117)
#120Daniel Gustafsson
daniel@yesql.se
In reply to: Sergey Shinderuk (#119)
#121Sergey Shinderuk
s.shinderuk@postgrespro.ru
In reply to: Daniel Gustafsson (#120)
#122Daniel Gustafsson
daniel@yesql.se
In reply to: Daniel Gustafsson (#120)
#123Ian Lawrence Barwick
barwick@gmail.com
In reply to: Daniel Gustafsson (#122)
#124Mikhail Gribkov
youzhick@gmail.com
In reply to: Ian Lawrence Barwick (#123)
#125Mikhail Gribkov
youzhick@gmail.com
In reply to: Mikhail Gribkov (#124)
#126Nikita Malakhov
hukutoc@gmail.com
In reply to: Mikhail Gribkov (#125)
#127Mikhail Gribkov
youzhick@gmail.com
In reply to: Nikita Malakhov (#126)
#128Ted Yu
yuzhihong@gmail.com
In reply to: Mikhail Gribkov (#127)
#129Mikhail Gribkov
youzhick@gmail.com
In reply to: Ted Yu (#128)
#130Ted Yu
yuzhihong@gmail.com
In reply to: Mikhail Gribkov (#129)
#131Pavel Stehule
pavel.stehule@gmail.com
In reply to: Mikhail Gribkov (#129)
#132Mikhail Gribkov
youzhick@gmail.com
In reply to: Pavel Stehule (#131)
#133Pavel Stehule
pavel.stehule@gmail.com
In reply to: Mikhail Gribkov (#132)
#134Pavel Stehule
pavel.stehule@gmail.com
In reply to: Pavel Stehule (#133)
#135Mikhail Gribkov
youzhick@gmail.com
In reply to: Pavel Stehule (#134)
#136Pavel Stehule
pavel.stehule@gmail.com
In reply to: Mikhail Gribkov (#135)
#137Mikhail Gribkov
youzhick@gmail.com
In reply to: Pavel Stehule (#136)
#138Gregory Stark (as CFM)
stark.cfm@gmail.com
In reply to: Mikhail Gribkov (#137)
#139Daniel Gustafsson
daniel@yesql.se
In reply to: Gregory Stark (as CFM) (#138)
#140Andres Freund
andres@anarazel.de
In reply to: Gregory Stark (as CFM) (#138)
#141Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#140)
#142Gregory Stark (as CFM)
stark.cfm@gmail.com
In reply to: Mikhail Gribkov (#137)
#143Mikhail Gribkov
youzhick@gmail.com
In reply to: Gregory Stark (as CFM) (#142)
#144Robert Haas
robertmhaas@gmail.com
In reply to: Daniel Gustafsson (#101)
#145Daniel Gustafsson
daniel@yesql.se
In reply to: Robert Haas (#144)
#146Mikhail Gribkov
youzhick@gmail.com
In reply to: Daniel Gustafsson (#145)
#147Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mikhail Gribkov (#146)
#148Daniel Gustafsson
daniel@yesql.se
In reply to: Alexander Korotkov (#147)
#149Alexander Korotkov
aekorotkov@gmail.com
In reply to: Daniel Gustafsson (#148)
#150Daniel Gustafsson
daniel@yesql.se
In reply to: Alexander Korotkov (#149)
#151Alexander Korotkov
aekorotkov@gmail.com
In reply to: Daniel Gustafsson (#150)
#152Robert Haas
robertmhaas@gmail.com
In reply to: Daniel Gustafsson (#150)
#153Daniel Gustafsson
daniel@yesql.se
In reply to: Robert Haas (#152)
#154Robert Haas
robertmhaas@gmail.com
In reply to: Daniel Gustafsson (#153)
#155Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#154)
#156Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#155)
#157Andres Freund
andres@anarazel.de
In reply to: Alexander Korotkov (#156)
#158Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andres Freund (#157)
#159Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#156)
#160Andres Freund
andres@anarazel.de
In reply to: Alexander Korotkov (#158)
#161Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andres Freund (#160)
#162Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#159)
#163Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#162)
#164Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#163)
#165Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#164)
#166Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#165)
#167Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#166)
#168Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#167)
#169Michael Paquier
michael@paquier.xyz
In reply to: Alexander Korotkov (#168)
#170Alexander Korotkov
aekorotkov@gmail.com
In reply to: Michael Paquier (#169)
#171Mikhail Gribkov
youzhick@gmail.com
In reply to: Alexander Korotkov (#170)
#172Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mikhail Gribkov (#171)
#173Mikhail Gribkov
youzhick@gmail.com
In reply to: Alexander Korotkov (#172)
#174Tom Lane
tgl@sss.pgh.pa.us
In reply to: Mikhail Gribkov (#173)
#175Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tom Lane (#174)
#176Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alexander Korotkov (#175)
#177Alexander Lakhin
exclusion@gmail.com
In reply to: Alexander Korotkov (#175)
#178Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Lakhin (#177)
#179Daniel Gustafsson
daniel@yesql.se
In reply to: Alexander Lakhin (#177)
#180Daniel Gustafsson
daniel@yesql.se
In reply to: Alexander Lakhin (#177)
#181Alexander Korotkov
aekorotkov@gmail.com
In reply to: Daniel Gustafsson (#180)
#182Alexander Lakhin
exclusion@gmail.com
In reply to: Alexander Korotkov (#181)
#183Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Lakhin (#182)
#184Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#183)
#185Alexander Lakhin
exclusion@gmail.com
In reply to: Alexander Korotkov (#184)
#186Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Lakhin (#185)
#187Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Alexander Korotkov (#170)