SPI Interface to Call Procedure with Transaction Control Statements

From: Jack LIU <toliujiayi(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: SPI Interface to Call Procedure with Transaction Control Statements
Date: 2019-01-04 07:14:42
Message-ID: CABZ0cG3ZhKRJGHNOgpO_Ae73N-K=Wj++MOGmvB5QzXZHxS0kfQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi All,

In PG-11, procedures were introduced. In the pg_partman tool, a procedure
named run_maintenance_proc was developed to replace run_maintenance
function. I was trying to call this procedure in pg_partman with
SPI_execute() interface and this is the command being executed:
CALL "partman".run_maintenance_proc(p_analyze := true, p_jobmon := true)

I received the following error:

2019-01-02 20:13:04.951 PST [26446] ERROR: invalid transaction termination
2019-01-02 20:13:04.951 PST [26446] CONTEXT: PL/pgSQL function
partman.run_maintenance_proc(integer,boolean,boolean,boolean) line 45
at COMMIT

Apparently, the transaction control command 'COMMIT' is not allowed in a
procedure CALL function. But I can CALL this procedure in psql directly.

According to the documentation of CALL, "If CALL is executed in a
transaction block, then the called procedure cannot execute transaction
control statements. Transaction control statements are only allowed if CALL is
executed in its own transaction."

Therefore, it looks like that SPI_execute() is calling the procedure within
a transaction block. So my question is that is there any SPI interface that
can call a procedure with transaction control commands? (I tried to use
SPI_connect_ext(SPI_OPT_NONATOMIC) to establish a nonatomic connection but
it doesn't help.)

Thanks,

Jiayi Liu

Browse pgsql-general by date

  From Date Subject
Next Message Zexuan Luo 2019-01-04 09:36:55 Function `set_config` doesn't work in with query?
Previous Message Chuck Martin 2019-01-03 23:41:34 Re: getting pg_basebackup to use remote destination