O comportamento do
bit
PostgreSQL e bit varying
types é extremamente inútil, com a maneira como ele se recusa a estender campos de bits para operações, e os estende à direita para conversões em vez de à esquerda. Faria sentido para Pg estender à esquerda o operando menor com zeros antes de uma operação AND ou OR, em vez de falhar.
Você não pode usar uma conversão para
bit(n)
para obter os mesmos comprimentos, porque por algum motivo insano um cast para bit(n)
pads direito o argumento, tornando-o inútil em quase todas as situações. Você pode usar algo como
lpad($1::text, greatest(length($1), length($2)),'0')::bit varying
para estender à esquerda um campo de bits com zeros para o maior de dois comprimentos. É trabalhoso, mas vai funcionar. Eu recomendaria escrever funções de wrapper para conter a bagunça. Como alternativa, considere modificar o
bit
código de suporte em src/backend/utils/adt/varbit.c
para adicionar funções a campos de bits estendidos à esquerda e truncados à esquerda e funções para fazer comparações estendidas à esquerda. Deve ser muito fácil com base no código existente.