Question: what is proper way to define python function as event_trigger?

Started by Andrei Pozolotinover 6 years ago6 messagesgeneral
Jump to latest
#1Andrei Pozolotin
andrei.pozolotin@gmail.com

Hello.

Problem:

1. any attempt to define python function as an event_trigger, i.e.:

CREATE FUNCTION public.verify()
RETURNS event_trigger
LANGUAGE 'plpython3u'
AS $$ print("hello-kitty") $$;

2. fails with message:

ERROR: trigger functions can only be called as triggers

SQL state: 0A000

3. here in the source:

https://github.com/postgres/postgres/blob/master/src/pl/plpython/plpy_procedure.c#L226

Question:

what is proper way to define python function as event_trigger?

Thank you.

#2Jeff Ross
jross@openvistas.net
In reply to: Andrei Pozolotin (#1)
Re: Question: what is proper way to define python function as event_trigger?

On 2019-12-22 15:27, Andrei Pozolotin wrote:

Hello.

Problem:

1. any attempt to define python function as an event_trigger, i.e.:

CREATE FUNCTION public.verify()
RETURNS event_trigger
LANGUAGE 'plpython3u'
AS $$ print("hello-kitty") $$;

2. fails with message:

ERROR: trigger functions can only be called as triggers

SQL state: 0A000

3. here in the source:

https://github.com/postgres/postgres/blob/master/src/pl/plpython/plpy_procedure.c#L226

Question:

what is proper way to define python function as event_trigger?

Thank you.

Just do

"create function public.verify() as trigger..."

https://www.postgresql.org/docs/10/plpython-trigger.html

TD["event"] contains the type of event as a string and I routinely do
things like

    if TD["event"] == "UPDATE":
        #do update stuff
    elif TD["event'} == "INSERT":
        #do insert related stuff

Jeff

#3Jeff Ross
jross@openvistas.net
In reply to: Jeff Ross (#2)
Re: Question: what is proper way to define python function as event_trigger?

On 2019-12-22 16:07, Jeff Ross wrote:

On 2019-12-22 15:27, Andrei Pozolotin wrote:

Hello.

Problem:

1. any attempt to define python function as an event_trigger, i.e.:

CREATE FUNCTION public.verify()
RETURNS event_trigger
LANGUAGE 'plpython3u'
AS $$ print("hello-kitty") $$;

2. fails with message:

ERROR: trigger functions can only be called as triggers

SQL state: 0A000

3. here in the source:

https://github.com/postgres/postgres/blob/master/src/pl/plpython/plpy_procedure.c#L226

Question:

what is proper way to define python function as event_trigger?

Thank you.

Just do

"create function public.verify() as trigger..."

My bad--that should be "create function public.verify() returns trigger... "

Jeff

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrei Pozolotin (#1)
Re: Question: what is proper way to define python function as event_trigger?

Andrei Pozolotin <andrei.pozolotin@gmail.com> writes:

1. any attempt to define python function as an event_trigger, i.e.:

AFAICS, there's not really any event trigger support in plpython.
That feature has only been built out in the other three PLs.

Somebody oughta fix this sometime, I guess, but it evidently hasn't
been high priority. If you feel like working on it, you could look
at commits e5dc4cc24d2e1e94ac572a2c64103710bf15d21e (for plperl)
and/or a5036ca998a6058f60913d43a80badfcbb65f5bb (for pltcl).

regards, tom lane

#5Andrei Pozolotin
andrei.pozolotin@gmail.com
In reply to: Jeff Ross (#3)
Re: Question: what is proper way to define python function as event_trigger?

Jeff, hi:

1. my concern is global "event_trigger" for DDL, not per-table "trigger"
for DML

2. regardless - thank you for the link, I found it helpful

3. Tom Lane says event_trigger is just not implemented in plpython

Andrei.

Show quoted text

On 2019-12-22 17:20, Jeff Ross wrote:

On 2019-12-22 16:07, Jeff Ross wrote:

On 2019-12-22 15:27, Andrei Pozolotin wrote:

Hello.

Problem:

1. any attempt to define python function as an event_trigger, i.e.:

CREATE FUNCTION public.verify()
RETURNS event_trigger
LANGUAGE 'plpython3u'
AS $$ print("hello-kitty") $$;

2. fails with message:

ERROR: trigger functions can only be called as triggers

SQL state: 0A000

3. here in the source:

https://github.com/postgres/postgres/blob/master/src/pl/plpython/plpy_procedure.c#L226
Question:

what is proper way to define python function as event_trigger?

Thank you.

Just do

"create function public.verify() as trigger..."

My bad--that should be "create function public.verify() returns
trigger... "

Jeff

#6Andrei Pozolotin
andrei.pozolotin@gmail.com
In reply to: Tom Lane (#4)
Re: Question: what is proper way to define python function as event_trigger?

Tom, hi:

1. actual use case has to do with:
BUG #16177: pg_event_trigger_ddl_commands() returns empty set for
ddl_command_start and "drop table"
/messages/by-id/16177-053a34714817c3e1@postgresql.org

2. I was merely hoping to re-implement pg_event_trigger_ddl_commands as
part of python event_trigger

3. do you think "pg_event_trigger_ddl_commands" is any easier to fix
then "support event_trigger in python"?

Thank you,

Andrei

Show quoted text

On 2019-12-22 17:40, Tom Lane wrote:

Andrei Pozolotin <andrei.pozolotin@gmail.com> writes:

1. any attempt to define python function as an event_trigger, i.e.:

AFAICS, there's not really any event trigger support in plpython.
That feature has only been built out in the other three PLs.

Somebody oughta fix this sometime, I guess, but it evidently hasn't
been high priority. If you feel like working on it, you could look
at commits e5dc4cc24d2e1e94ac572a2c64103710bf15d21e (for plperl)
and/or a5036ca998a6058f60913d43a80badfcbb65f5bb (for pltcl).

regards, tom lane