O catálogo pg_enum contém entradas que
mostram os valores e rótulos para cada tipo de dados enum.
A representação interna de um determinado valor enum é,
na verdade, o OID de sua linha associada
em pg_enum.
Tabela 52.20. Colunas de pg_enum
Coluna Tipo de dados Descrição |
|---|
Identificador da linha |
O OID da entrada em pg_type à qual pertence este valor de enumeração |
A posição de classificação desse valor |
O rótulo textual para este valor |
Os OIDs das linhas de
pg_enum seguem uma regra especial:
é garantido que os OIDs pares sejam classificados
da mesma maneira que a ordem de classificação de seu tipo de dados
enum.
Ou seja, se dois OIDs pares pertencerem ao mesmo
tipo de dados enum, o OID menor
deverá ter o valor de enumsortorder menor.
Os valores OID ímpares não precisam ter relação
com a ordem de classificação.
Esta regra permite que as rotinas de comparação de enum
evitem procuras no catálogo em muitos casos comuns.
As rotinas que criam e modificam tipos de dados enum
tentam atribuir OIDs pares a valores de
enum sempre que possível.
Quando é criado um tipo de dados enum, seus membros
recebem posições de ordem de classificação 1..n.
Mas os membros adicionados posteriormente podem receber valores
negativos ou fracionários para enumsortorder.
O único requisito para estes valores é que sejam ordenados corretamente
e sejam únicos em cada tipo de dados enum.
Exemplo 52.12. Exemplo do tradutor
Tipo de dados enum
Uso do catálogo pg_enum
para mostrar informações relacionadas ao tipo de dados
arco_iris, e uso também do meta-comando
\dTx+ arco_iris do psql
para mostrar esta informações.
Note que os valores dos OIDs são pares.
ana=> CREATE TYPE arco_iris AS ENUM
ana-> ('vermelho', 'laranja', 'amarelo',
ana(> 'verde', 'azul', 'anil', 'violeta');
CREATE TYPE
ana=> COMMENT ON TYPE arco_iris IS 'Cores do arco-iris';
COMMENT
ana=> SELECT e.oid AS "OID",
ana-> p.typname AS "Nome do tipo",
ana-> e.enumsortorder AS "Ordem",
ana-> e.enumlabel AS "Elemento"
ana-> FROM pg_enum e
ana-> LEFT JOIN pg_type p ON e.enumtypid = p.oid
ana-> ORDER BY "Nome do tipo", "Ordem";
OID | Nome do tipo | Ordem | Elemento --------+--------------+-------+---------- 117212 | arco_iris | 1 | vermelho 117214 | arco_iris | 2 | laranja 117216 | arco_iris | 3 | amarelo 117218 | arco_iris | 4 | verde 117220 | arco_iris | 5 | azul 117222 | arco_iris | 6 | anil 117224 | arco_iris | 7 | violeta (7 linhas)
ana=> \dTx+ arco_iris
Lista de tipos de dados
-[ RECORD 1 ]---------+-------------------
Esquema | public
Nome | arco_iris
Nome interno | arco_iris
Tamanho | 4
Elementos | vermelho +
| laranja +
| amarelo +
| verde +
| azul +
| anil +
| violeta
Dono | ana
Privilégios de acesso |
Descrição | Cores do arco-iris