Warum funktioniert "SET LOCAL statement_timeout" mit PostgreSQL-Funktionen nicht wie erwartet?

9

Nach meinem Verständnis werden PostgreSQL-Funktionen ähnlich wie eine Transaktion ausgeführt. Als ich jedoch versuchte, "SET LOCAL statement_timeout" innerhalb einer Funktion zu setzen, funktionierte dies nicht. So funktioniert es innerhalb einer Transaktion:

BEGIN; 
  SET LOCAL statement_timeout = 100; 
  SELECT pg_sleep(10); 
COMMIT;

wo die Ergebnisse sind (wie erwartet):

BEGIN
SET
ERROR:  canceling statement due to statement timeout
ROLLBACK

Wenn ich jedoch dieselben Befehle in einen Funktionskörper einfüge:

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

SELECT test();

Das Timeout tritt nicht auf und die test()Ausführung der Funktion dauert 10 Sekunden.

Bitte geben Sie an, warum sich die beiden Fälle unterscheiden und wie ich sie korrigieren kann, um Anweisungszeitlimits innerhalb einer Funktion festzulegen.

MS Dousti
quelle

Antworten:

10

So wie es statement_timeoutfunktioniert, beginnt die Zeit zu zählen, wenn der Server einen neuen Befehl vom Client erhält.

Abfragen, die innerhalb serverseitiger Funktionen gestartet werden, sind keine Befehle von einem Client. Sie setzen diesen Timer nicht zurück oder verschieben einen neuen auf einen Stapel von Timern.

Deshalb SET LOCAL statement_timeout = 100;hat keine Wirkung.

Und wenn eine Funktion dies tut SET statement_timeout = 100;, wirkt sie sich erst ab dem nächsten Befehl des Clients aus.

Ich sehe keine Möglichkeit, die Ausführungszeit einzelner Abfragen innerhalb einer Funktion zu steuern.

Daniel Vérité
quelle