Het gedrag van de PostgreSQL bit
en bit varying
typen is buitengewoon nutteloos, met de manier waarop het weigert bitvelden uit te breiden voor bewerkingen, en het naar rechts uitbreidt voor casts in plaats van ze naar links uit te breiden.
Het zou logisch zijn als Pg de kleinere operand naar links zou uitbreiden met nullen vóór een EN- of OF-bewerking, in plaats van te falen.
Je kunt geen cast gebruiken voor bit(n)
om dezelfde lengtes te krijgen, omdat om de een of andere gekke reden een cast naar bit(n)
rechter-pads het argument, waardoor het in bijna alle situaties nutteloos is.
Je kunt zoiets gebruiken als lpad($1::text, greatest(length($1), length($2)),'0')::bit varying
om een bitveld met nullen naar links uit te breiden tot de grootste van twee lengtes. Het is omslachtig, maar het gaat lukken. Ik raad aan om wrapper-functies te schrijven om de rommel op te ruimen.
U kunt ook overwegen de bit
. aan te passen ondersteuningscode in src/backend/utils/adt/varbit.c
om functies toe te voegen aan links-uitbreidende en links-afgekapte bitvelden, en functies om links-uitbreidende vergelijkingen te maken. Het zou vrij eenvoudig moeten zijn op basis van de bestaande code.