我正在尝试在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
答案 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_change
,waiting
,state
,backend_xid
,backend_xmin
,{{1 }})