2016-08-22 4 views
0

Я пытаюсь установить ubuntuone на сервер ubuntu 15.04, и кажется, что есть несколько вещей, которые больше не работают.Функция Postgres, возвращающая неправильный тип данных

Основная проблема, с которой я столкнулся, - это запрос, который терпит неудачу. Вот как это выглядит:

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

Вы не возвращает строку, совместимый с расположением 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, query)

+0

Спасибо большое, теперь я, наконец, ясно понять проблему. Я добавлю ваш ответ на фиксацию bugfix. – Ibu

+0

Вид был изменен в версиях 9.2 и 9.3. См. Его [в документации v.9.4] (https://www.postgresql.org/docs/9.4/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW) – klin

Смежные вопросы