No manual de criação de UDTs no postgresql encontrei a seguinte declaração:
O PostgreSQL permite que os tipos definidos pelo usuário usem uma ou mais constantes ou identificadores simples como modificadores. No entanto, essas informações devem poder ser compactadas em um único valor inteiro não negativo para armazenamento nos catálogos do sistema.
Então, realmente não há como armazenar mais informações que caberiam em um número inteiro não negativo? Eu gostaria, por exemplo, de poder armazenar o nome de uma função que deve ser chamada como padrão na inserção dos dados (já que pode haver várias funções que podem funcionar nesses dados). Isso não é possível?
O catálogo do sistema para tipos,
pg_catalog.pg_type
, possui a seguinte coluna:como você pode ver executando
\d pg_type
.Não há como armazenar algo que não cabe em um número inteiro porque é assim que o catálogo armazena os typmods.
O requisito não negativo parece decorrer da utilização de
-1
valor reservado.O problema específico que você descreve parece mais adequado para a adição de um gatilho de coluna. Parece que o que você realmente quer é
DOMAIN
s e a capacidade de adicionar gatilhos em domínios - mas, infelizmente, neste momento, não há suporte para gatilhos em domínios.Depois de muita pesquisa, descobri uma outra possibilidade:
Embora realmente não seja possível armazenar mais informações dentro
pg_type
de , por ser do tipo integer, existe a opção de armazenar informações dentro de um atributo de uma tabela.No entanto, para isso, você deve alterar o código-fonte do postgresql: O arquivo
reloptions.c
permite adicionarkey=value
campos aceitáveis em um formato de chave-valor.SET
Usando o comando SQL (por exemploALTER TABLE tbl ALTER COLUMN col SET (k1 = v1)
, ) os valores-chave podem ser definidos. Esta informação é então armazenada noattoptions
campo empg_attribute
(e não empg_type
.