Как проверить, какая функция использует тип?

У меня есть тип, который я бы хотел изменить, но я не знаю, кто еще его использует.

Как я могу проверить все функции, возвращающие этот тип?


person avi    schedule 05.11.2015    source источник


Ответы (2)


Вы можете найти все зависимости в системном каталоге pg_depend .

Это возвращает все функции в зависимости от типа. Т.е. не только с типом в предложении RETURNS, но и с типом в качестве параметра функции:

SELECT objid::regproc                            AS function_name
     , pg_get_functiondef(objid)                 AS function_definition
     , pg_get_function_identity_arguments(objid) AS function_args
     , pg_get_function_result(objid)             AS function_returns
FROM   pg_depend
WHERE  refclassid = 'pg_type'::regclass
AND    refobjid   = 'my_type'::regtype    -- insert your type name here
AND    classid    = 'pg_proc'::regclass;  -- only find functions

Это также работает для табличных функций:

...
RETURNS TABLE (foo my_type, bar int)

Использование функций информации системного каталога.

Могут быть и другие зависимости (не от функций). Удалите последнее условие WHERE из моего запроса для проверки (и, очевидно, адаптируйте список SELECT).

И все еще существует возможность использования типа явно (например, в приведении) в запросах в теле функции или в динамическом SQL. Вы можете определить такие варианты использования, только проанализировав текст тела функции. В системе не зарегистрировано явных зависимостей.

Связанный:

person Erwin Brandstetter    schedule 05.11.2015
comment
где мне поставить название типа? - person avi; 05.11.2015

Как упоминал Эрвин Брандштеттер, это работает только для функций, непосредственно возвращающих тип данных.

SELECT * FROM information_schema.routines r 
WHERE r.type_udt_name = 'YOUR_DATA_TYPE' ORDER BY r.routine_name;
person zb226    schedule 05.11.2015
comment
это не работает ... Я ввел свое имя типа в запрос ur, и он дает 0 строк ... это не имеет смысла, поскольку я вижу функцию, которая использует этот тип. - person avi; 05.11.2015
comment
@avi: Можешь попробовать SELECT * FROM information_schema.routines r WHERE r.type_udt_name = 'YOUR_DATA_TYPE' ORDER BY r.routine_name;? - person zb226; 05.11.2015
comment
@a_horse_with_no_name я копирую и вставляю имя типа из функции, которую он использует ... так что нет проблем со строчными буквами - person avi; 05.11.2015
comment
@a_horse_with_no_name: я использовал верхний регистр, чтобы подчеркнуть необходимость замены - person zb226; 05.11.2015
comment
Это не сработает для функций, возвращающих TABLE(...) или SETOF record содержащих рассматриваемый тип. - person Erwin Brandstetter; 05.11.2015