mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Fix integer-to-bit-string conversions to handle the first fractional byte
correctly when the output bit width is wider than the given integer by something other than a multiple of 8 bits. This has been wrong since I first wrote that code for 8.0 :-(. Kudos to Roman Kononov for being the first to notice, though I didn't use his patch. Per bug #5237.
This commit is contained in:
parent
02490d4692
commit
a4e035b2f1
@ -9,7 +9,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.58 2009/01/01 17:23:50 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.59 2009/12/12 19:24:35 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1346,7 +1346,12 @@ bitfromint4(PG_FUNCTION_ARGS)
|
||||
/* store first fractional byte */
|
||||
if (destbitsleft > srcbitsleft)
|
||||
{
|
||||
*r++ = (bits8) ((a >> (srcbitsleft - 8)) & BITMASK);
|
||||
int val = (int) (a >> (destbitsleft - 8));
|
||||
|
||||
/* Force sign-fill in case the compiler implements >> as zero-fill */
|
||||
if (a < 0)
|
||||
val |= (-1) << (srcbitsleft + 8 - destbitsleft);
|
||||
*r++ = (bits8) (val & BITMASK);
|
||||
destbitsleft -= 8;
|
||||
}
|
||||
/* Now srcbitsleft and destbitsleft are the same, need not track both */
|
||||
@ -1425,7 +1430,12 @@ bitfromint8(PG_FUNCTION_ARGS)
|
||||
/* store first fractional byte */
|
||||
if (destbitsleft > srcbitsleft)
|
||||
{
|
||||
*r++ = (bits8) ((a >> (srcbitsleft - 8)) & BITMASK);
|
||||
int val = (int) (a >> (destbitsleft - 8));
|
||||
|
||||
/* Force sign-fill in case the compiler implements >> as zero-fill */
|
||||
if (a < 0)
|
||||
val |= (-1) << (srcbitsleft + 8 - destbitsleft);
|
||||
*r++ = (bits8) (val & BITMASK);
|
||||
destbitsleft -= 8;
|
||||
}
|
||||
/* Now srcbitsleft and destbitsleft are the same, need not track both */
|
||||
|
Loading…
Reference in New Issue
Block a user