2016-08-22 4 views
0

Ich versuche, Ubuntuone auf einem Ubuntu-Server 15.04 zu installieren und es scheint, dass es ein paar Dinge gibt, die nicht mehr funktionieren.Postgres-Funktion gibt falschen Datentyp zurück

Das Hauptproblem, das ich habe, ist eine Abfrage, die fehlschlägt. Hier ist, wie es aussieht:

CREATE FUNCTION activity() RETURNS SETOF pg_stat_activity 
    LANGUAGE sql SECURITY DEFINER 
    SET search_path TO public 
    AS $$ 
    SELECT 
     datid, datname, pid, usesysid, usename, 
     application_name, client_addr, client_hostname, client_port, 
     backend_start, xact_start, query_start, waiting, 
     CASE 
      WHEN query LIKE '<IDLE>%' 
       OR query LIKE 'autovacuum:%' 
       THEN query 
      ELSE 
       '<HIDDEN>' 
     END AS current_query 
    FROM pg_catalog.pg_stat_activity; 
$$; 

Wenn ich es laufen bekomme ich diesen Fehler:

ERROR: return type mismatch in function declared to return pg_stat_activity 
DETAIL: Final statement returns boolean instead of timestamp with time zone at column 13. 
CONTEXT: SQL function "activity" 

Ich verstehe den Fehler, aber ich weiß nicht, wie es ein Bool zurückkehrt. Ich habe dieselbe Abfrage manuell ausgeführt und bekomme immer noch denselben Fehler. Beachten Sie, dass ich mit Postgres nicht so vertraut bin, also seien Sie bitte ausführlich.

Welcher Teil der Abfrage gibt einen Bool zurück? oder ist die Anfrage überhaupt korrekt?

Hinweis wurde der Antrag auf postgresql-9.1 geschrieben, aber ich bin mit 9.4

Antwort

1

Sie sind nicht eine Reihe kompatibel mit dem Layout pg_stat_activity zurück. Das Layout der pg_stat_activity ist:

> \d pg_stat_activity ; 
      View "pg_catalog.pg_stat_activity" 
     Column  |   Type   | Modifiers 
------------------+--------------------------+----------- 
datid   | oid      | 
datname   | name      | 
pid    | integer     | 
usesysid   | oid      | 
usename   | name      | 
application_name | text      | 
client_addr  | inet      | 
client_hostname | text      | 
client_port  | integer     | 
backend_start | timestamp with time zone | 
xact_start  | timestamp with time zone | 
query_start  | timestamp with time zone | 
state_change  | timestamp with time zone | 
waiting   | boolean     | 
state   | text      | 
backend_xid  | xid      | 
backend_xmin  | xid      | 
query   | text      | 

Ihre Anfrage wird Spalten korrekt bis einschließlich query_start produzieren. Aber dann geben Sie einen Boolean (waiting) in der Spalte zurück, die state_change, eine Zeitzone sein sollte.

Korrigieren Sie Ihre Abfrage, um die zusätzliche Spalten in der richtigen Reihenfolge schließen (dh state_change, waiting, state, backend_xid, backend_xmin, query)

+0

Thank you so viel, jetzt endlich verstehe ich das Problem offenbar. Ich werde deine Antwort dem Bugfix-Commit hinzufügen. – Ibu

+0

Die Ansicht wurde in den Versionen 9.2 und 9.3 geändert. Siehe [in der Dokumentation v.9.4] (https://www.postgresql.org/docs/9.4/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW) – klin

Verwandte Themen