Postgres 函数返回错误的数据类型

Postgres function returning wrong datatype

我正在尝试在 ubuntu 服务器 15.04 上安装 ubuntuone,似乎有一些东西不再起作用了。

我遇到的主要问题是查询失败。这是它的样子:

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;
$$;

当我 运行 它时,我得到这个错误:

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"

我明白这个错误,但我不知道它是如何返回布尔值的。我 运行 手动执行相同的查询,但仍然出现相同的错误。请注意,我对 postgres 不太熟悉,所以请详细说明。

查询的哪一部分返回布尔值?还是查询完全正确?

请注意,该应用程序是为 postgresql-9.1 编写的,但我 运行ning 9.4

您没有返回与 pg_stat_activity 的布局兼容的行。 pg_stat_activity的布局是:

> \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                     | 

您的查询正在正确生成 query_start 之前的列并包括在内。但是你在应该是state_change的列中返回一个布尔值(waiting),一个时区。

更正您的查询以包含正确顺序的额外列(即 state_changewaitingstatebackend_xidbackend_xminquery)