Имя параметра Информация отсутствует в системном представлении PG_PROC_INFO.proargnames для неназванных параметров - PullRequest
0 голосов
/ 11 июня 2019

Создание процедуры, включающей неназванный параметр, не приведет к PG_PROC_INFO.proargnames для этой процедуры, содержащей пустую строку для этого параметра.

Это не соответствует описанию столбца proargnames в документации PostgreSQL. https://www.postgresql.org/docs/8.0/catalog-pg-proc.html.

Кто-нибудь знает, умышленно это или нет?

Пример Определение процедуры с использованием следующих параметров

CREATE PROCEDURE testunnamed (IN INTEGER, IN p2 INTEGER)

дает следующее значение для proargnames.

  • PostgreSQL: {"", "p2"}
  • Redshift: {"p2"}

Для красного смещения одно и то же значение присутствует как в представлении PG_PROC_INFO, так и в таблице PG_PROC.

Информация необходима для генерации "(IN INTEGER, IN p2 INTEGER)" из данных в PG_PROC_INFO. В postgreSQL есть функция pg_get_function_arguments, которая недоступна в красном смещении.

ПРИЧИНА - Проблема с драйвером Как я и начал подозревать, что это проблема с драйвером (Запуск с RedshiftJDBC 01.02.27.1051) Я провел тестирование, запустив соединение с Redshift, используя вместо этого драйвер PostgreSQL. Кажется, это точно. Теперь я получаю ожидаемый результат.

SELECT p.proname, p.pronargs, p.proargnames FROM pg_catalog.pg_proc_info p WHERE p.proname LIKE 'testunnamed%' ;

Driver       proname       pronargs   proargnames 
-------      -----------   --------   ----------- 
PostgresSQL  testunnamed   2          {"","p2"}   
Redshift     testunnamed   2          {"p2"}   

1 Ответ

0 голосов
/ 11 июня 2019

Я не могу воспроизвести ваши результаты.Можете ли вы предоставить запросы, которые вы использовали, чтобы получить {"p2"}?

SELECT version();
--  … Redshift 1.0.7804

CREATE PROCEDURE testunnamed (IN INTEGER, IN p2 INTEGER) language plpgsql as $$ begin null; end; $$;
-- CREATE PROCEDURE

SELECT proargnames FROM pg_proc_info WHERE proname = 'testunnamed';
--  proargnames
-- -------------
--  {"",p2}

SELECT proargnames FROM pg_proc WHERE proname = 'testunnamed';
--  proargnames
-- -------------
--  {"",p2}
...