El comportamiento del bit
de PostgreSQL y bit varying
tipos es extremadamente inútil, con la forma en que se niega a extender los campos de bits para las operaciones, y los extiende a la derecha para las conversiones en lugar de extenderlos a la izquierda.
Tendría sentido que Pg extendiera a la izquierda el operando más pequeño con ceros antes de una operación AND u OR, en lugar de fallar.
No puedes usar una conversión a bit(n)
para obtener las mismas longitudes, porque por alguna razón insensata se convirtió a bit(n)
almohadillas derechas el argumento, haciéndolo inútil en casi todas las situaciones.
Puede usar algo como lpad($1::text, greatest(length($1), length($2)),'0')::bit varying
para extender a la izquierda un campo de bits con ceros a la mayor de dos longitudes. Es engorroso, pero funcionará. Recomiendo escribir funciones de envoltura para contener el desorden.
Alternativamente, considere modificar el bit
código de soporte en src/backend/utils/adt/varbit.c
para agregar funciones a los campos de bits extendidos a la izquierda y truncados a la izquierda, y funciones para hacer comparaciones extendidas a la izquierda. Debería ser bastante fácil según el código existente.