Обсуждение: Question: what is proper way to define python function asevent_trigger?

Поиск
Список
Период
Сортировка

Question: what is proper way to define python function asevent_trigger?

От
Andrei Pozolotin
Дата:

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.


Re: Question: what is proper way to define python function asevent_trigger?

От
Jeff Ross
Дата:
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




Re: Question: what is proper way to define python function asevent_trigger?

От
Jeff Ross
Дата:
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




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

От
Tom Lane
Дата:
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



Re: Question: what is proper way to define python function asevent_trigger?

От
Andrei Pozolotin
Дата:
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.

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



Re: Question: what is proper way to define python function asevent_trigger?

От
Andrei Pozolotin
Дата:
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"
https://www.postgresql.org/message-id/16177-053a34714817c3e1%40postgresql.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

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