PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Operadores bit a bit do PostgreSQL com bit variando não podem AND bit strings de tamanhos diferentes


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.