name
это встроенный тип, расположенный в public
пространстве имен.
При создании таблицы с этим именем в select * from pg_catalog.pg_type where typname='name'
схеме создается другой тип, также называемый name
в name
схеме, поскольку каждая таблица также является составным типом. Вы можете проверить это с помощьюSELECT 'bigint'::name AS sequence_type...
Обычно, когда вы делаете что-то name
, как и запрос, который терпит неудачу ( pg_catalog
), это тот тип, pg_catalog
который получает выбранный, потому что он public
неявно предшествует search_path
в 'bigint'::name
, как указано в документе :
В дополнение к общедоступным и созданным пользователями схемам каждая база данных содержит схему pg_catalog, которая содержит системные таблицы и все встроенные типы данных, функции и операторы. pg_catalog всегда эффективно является частью пути поиска. Если он явно не указан явно в пути, он неявно просматривается перед поиском схем пути. Это гарантирует, что встроенные имена всегда будут доступны. Однако вы можете явно разместить pg_catalog в конце вашего пути поиска, если вы предпочитаете, чтобы пользовательские имена переопределяли встроенные имена .
Сообщение об ошибке, полученное с pg_dump
помощью средств postgres, разрешает листинг с типом, соответствующим вашей таблице в public
схеме, тогда как явно name
ожидает, что name
вместо этого будет найден встроенный тип.
Таким образом, похоже, что вы в этом случае подчеркнуты в приведенном выше параграфе, что противоречит встроенным типам, по крайней мере для pg_dump
.
Чтобы проверить эту теорию, проверьте работоспособность search_path
пользователя pg_dump
и попытайтесь сбросить его после сброса до безобидного значения, например:
ALTER USER user_running_pg_dump SET search_path TO public;