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

时间:2016-08-22 22:45:22

标签: postgresql ubuntu postgresql-9.4

我正在尝试在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不太熟悉所以请详细说明。

查询的哪一部分返回bool?或者查询是否正确?

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

1 个答案:

答案 0 :(得分:1)

您没有返回与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。但是你要在一个应该是waiting的时间区域中返回一个布尔值(state_change)。

更正您的查询,以便按正确的顺序包含额外的列(例如state_changewaitingstatebackend_xidbackend_xmin,{{1 }})