Estou escrevendo um script no qual preciso analisar o nome de uma tabela (em regclass
). A análise (com parse_ident()
) funciona até agora. No entanto, o script falha quando a tabela está no public
esquema porque o PostgreSQL (10.3) remove automaticamente o nome do esquema.
Por exemplo, se uma tabela tt
estiver em um não- public
esquema ex
, o valor de texto de regclass
é o mesmo que o original:
=> select 'ex.tt'::regclass::text;
text
-------
ex.tt
Quando está em public
, o nome do esquema é perdido:
=> select 'public.tt'::regclass::text;
text
------
tt
Existe uma maneira de desabilitar esse comportamento ou converter text
sem perder o nome do esquema?
Isso não está relacionado ao esquema em
public
si - que é apenas outro esquema sem poderes especiais, exceto que é criado por padrão - e incluído nosearch_path
por padrão.A corrente
search_path
está por trás disso. A representação de texto de umregclass
valor se baseia nele. O nome da tabela só é qualificado pelo esquema se o esquema não for a primeira correspondência desearch_path
qualquer maneira. O manual :Você pode forçar o Postgres a imprimir o nome do esquema definindo um vazio
search_path
(localmente):Mas isso força você a qualificar tudo pelo esquema para o resto da transação ou até que você defina
search_path
novamente. Bem, quase tudo,pg_catalog
epg_temp
são especiais. Ver:Ou você evita o cast especial e o
search_path
e obtém o nome do esquemapg_class
diretamente: