GraphQL: ошибка функции OverLoaded при добавлении вычисляемого поля

Я пытаюсь добавить вычисленное поле к моему пользователю таблицы graphql в схеме abc, используя hasura API, но получаю следующую ошибку:

**Saving computed field failed**
in table "abc.user": in computed field "allaccounts": function "abc.get_accounts" 
is overloaded. Overloaded functions are not supported

Функция добавлена ​​правильно:

  CREATE OR REPLACE FUNCTION abc.get_accounts(id bigint)
    RETURNS VARCHAR immutable AS $$
DECLARE
    value VARCHAR;
BEGIN
    SELECT array_to_string(ARRAY_AGG( name ORDER BY name ASC )::varchar[], ',', '')
           into value
    FROM abc.account
             INNER JOIN abc.user_account ON (account.id=user_account.account_id)
    where user_account.user_id = id group by user_id;
    return value;
END;
$$ LANGUAGE plpgsql;

Поле id присутствует в пользовательской таблице.

Я могу выбрать функцию get_accounts из раскрывающегося списка, но получаю сообщение об ошибке при добавлении вычисляемого поля. Любое руководство приветствуется. Спасибо.


person Tanu    schedule 10.10.2020    source источник


Ответы (2)


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

Обычно вам нужно определить конфликтующую функцию и отбросить ее (если у вас нет веской причины не делать этого). Вы можете показать омонимы с помощью следующего запроса, который генерирует drop function операторы, которые вы можете использовать напрямую:

select format('drop %s %s;', case when proisagg then 'aggregate' else 'function' end, oid::regprocedure) as stmt
from pg_catalog.pg_proc
where proname = 'get_accounts'

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

person GMB    schedule 10.10.2020
comment
Спасибо за помощь. Я получаю другую ошибку: in table "abc.user": in computed field "all_accounts": the computed field "all_accounts" cannot be added to table "abc.user" for the following reasons: • first argument of the function "abc. get_accounts" is not COMPOSITE type • first argument of the function "abc. get_accounts" of type "pg_catalog.integer" is not the table to which the computed field is being added - person Tanu; 12.10.2020

Добавление STABLE сработало для меня:

CREATE OR REPLACE FUNCTION abc.all_accounts(user_row abc.user)
  RETURNS VARCHAR AS $$
DECLARE
  value VARCHAR;
BEGIN
  SELECT array_to_string(ARRAY_AGG( name ORDER BY name ASC )::varchar[], ',', '')
      into value
               FROM abc.account
                      INNER JOIN abc.user_account ON (account.id=user_account.account_id)
                   where abc.user_account.user_id = user_row.id
               group by user_id;
  return value;
END;
$$ LANGUAGE plpgsql STABLE;
person Tanu    schedule 12.10.2020