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_change
、waiting
、state
、backend_xid
、backend_xmin
、query
)
我正在尝试在 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_change
、waiting
、state
、backend_xid
、backend_xmin
、query
)