为什么“SET LOCAL statement_timeout”在 PostgreSQL 函数中不能按预期工作?

M.S*_*sti 12 postgresql transaction functions query-timeout

我的理解是 PostgreSQL 函数的执行类似于事务。但是,当我尝试在函数中“SET LOCAL statement_timeout”时,它不起作用。以下是它在事务中的工作方式:

BEGIN; 
  SET LOCAL statement_timeout = 100; 
  SELECT pg_sleep(10); 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

结果在哪里(如预期的那样):

BEGIN
SET
ERROR:  canceling statement due to statement timeout
ROLLBACK
Run Code Online (Sandbox Code Playgroud)

但是,如果我将相同的命令放在函数体中:

CREATE OR REPLACE FUNCTION test() RETURNS void AS '
    SET LOCAL statement_timeout = 100;
    SELECT pg_sleep(10);
' LANGUAGE sql;

SELECT test();
Run Code Online (Sandbox Code Playgroud)

超时不会发生,函数test()执行需要 10 秒。

请告知为什么这两种情况不同,以及我如何纠正它以在函数内设置语句超时。

Dan*_*ité 15

方法statement_timeout是,当服务器收到来自客户端的新命令时,时间开始计算。

在服务器端函数中启动的查询不是来自客户端的命令,它们不会重置该计时器或将新计时器推送到计时器堆栈上。

这就是SET LOCAL statement_timeout = 100;没有效果的原因。

如果一个函数执行SET statement_timeout = 100;它,它只会从客户端的下一个命令开始生效。

我没有看到任何方法来控制函数内单个查询的执行时间。