Beteendet för PostgreSQL bit
och bit varying
typer är ytterst ohjälpsam, med det sätt som den vägrar att utöka bitfält för operationer, och den högerförlänger dem för cast istället för att vänsterförlänga dem.
Det skulle vara vettigt för Pg att vänsterförlänga den mindre operanden med nollor före en OCH- eller ELLER-operation, snarare än att misslyckas.
Du kan inte använda en cast till bit(n)
för att få samma längder, för av någon galen anledning en cast till bit(n)
höger kuddar argumentet, vilket gör det värdelöst i nästan alla situationer.
Du kan använda något som lpad($1::text, greatest(length($1), length($2)),'0')::bit varying
att vänsterförlänga ett bitfält med nollor till den största av två längder. Det är krångligt, men det kommer att fungera. Jag rekommenderar att du skriver omslagsfunktioner för att innehålla röran.
Alternativt kan du överväga att ändra bit
stödkod i src/backend/utils/adt/varbit.c
att lägga till funktioner till vänsterförlängda och vänsteravkortade bitfält, och funktioner för att göra jämförelser med vänsterförlängning. Det borde vara ganska enkelt baserat på den befintliga koden.