Поведението на PostgreSQL bit
и bit varying
типове е изключително безполезно, с начина, по който отказва да разшири битови полета за операции и ги разширява надясно за прехвърляния, вместо да ги разширява наляво.
Би било логично Pg да разшири наляво по-малкия операнд с нули преди операция И или ИЛИ, вместо да се провали.
Не можете да използвате прехвърляне към bit(n)
за да получите същите дължини, защото по някаква безумна причина прехвърляне към bit(n)
десни подложки аргумента, което го прави безполезен в почти всички ситуации.
Можете да използвате нещо като lpad($1::text, greatest(length($1), length($2)),'0')::bit varying
за разширяване на ляво битово поле с нули до по-голямата от две дължини. Тромаво е, но ще свърши работа. Бих препоръчал да се напишат функции за обвивка, които да съдържат бъркотията.
Алтернативно, помислете за модифициране на bit
код за поддръжка в src/backend/utils/adt/varbit.c
за добавяне на функции към ляво разширение и ляво съкращаване на битови полета и функции за извършване на ляво разширение на сравнения. Би трябвало да е доста лесно въз основа на съществуващия код.