"cannot execute CREATE TABLE in a read-only transaction" bei Seitenweisen Ergebnissen in phpPgAdmin

Hallo Miteinander,

ich arbeite mich gerade in die Erstellung eigener Funktionen in pgSQL ein, jetzt stehe ich vor einem Problem bei dem ich nicht weiß ob es sich um einen Bug oder ein Feature handelt:

Erstelle ich beispielsweise folgende Funktion:

CREATE OR REPLACE FUNCTION public.ocm_test() RETURNS integer AS '
BEGIN
    CREATE TEMP TABLE t_points (id integer);
    RETURN 1;
END;
' LANGUAGE "plpgsql" COST 100
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER

und rufe sie anschließend via Komandozeile mit

select * from ocm_test();

auf, ist das Ergebnis erwartungsgemäß

ocm_test
1

selbes Ergebis erhalte ich, wenn ich die Funktion in phpPgAdmin aufrufe. Allerdings nur dann, wenn ich das Häckchen bei “Ergebnisse seitenweise anzeigennicht gesetzt habe.
Setze ich das Häcken, dann gibt es seltsamerweise diese Fehlermeldung:

SQL-Fehler:

ERROR: cannot execute CREATE TABLE in a read-only transaction
CONTEXT: SQL statement “CREATE TEMP TABLE t_points (id integer)”
PL/pgSQL function ocm_test() line 3 at SQL statement

In der Anweisung:
SELECT COUNT(*) AS total FROM (select * from ocm_test()) AS sub

Ist das Verhalten so normal?


Ubuntu 14.04
PostgreSQL 9.3.5
postgis-2.1
phpPgAdmin 5.1 (PHP 5.5.9-1ubuntu4.5)

wäre interessant zu sehen, was da PhpPGAdmin an die DB schickt. Dazu solltest Du einfach mal alle Statements loggen und dann im Log nachschauen.

Wäre ich Du würde ich aber mir überlegen, eine temp. Tabelle innerhalb einer Funktion zu erstellen und stehen zu lassen.

Ok, das bringt mich ein kleines bisschen weiter:
im Log taucht auf:

statement: SET TRANSACTION READ ONLY

Das erklärt, warum jeder Schreibzugriff zu einer Fehlermeldung führt, aber leider nicht, warum dieser Wert überhaupt gesetzt wird.
default_transaction_read_only in der postgresql.config steht auf off

Vermutlich weil PhpPgAdmin behindert ist. Durch das Paging wird es wohl so versuchen zu verhindern, daß entwas verändert wird.

Ich hätte jetzt nicht unbedingt ein Problem damit auf PhpPgAdmin zu verzichten, aber ich sehe das Problem eher auf der Postgresql Seite, zumal dieselbe Fehlermeldung auch auftritt, wenn ich die Funktion aus Tilemill/Mapnik heraus ausrufe.

PostgreSQL macht das, was man ihm sagt. Wenn ein Client eine TX Read Only setzt, dann respektiert PostgreSQL das. So what?

Versuche es im CLI, also psql, nachzustellen.