|
9 | 9 | * Portions Copyright (c) 1994, Regents of the University of California
|
10 | 10 | *
|
11 | 11 | * IDENTIFICATION
|
12 |
| - * $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.58 2009/01/01 17:23:50 momjian Exp $ |
| 12 | + * $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.59 2009/12/12 19:24:35 tgl Exp $ |
13 | 13 | *
|
14 | 14 | *-------------------------------------------------------------------------
|
15 | 15 | */
|
@@ -1346,7 +1346,12 @@ bitfromint4(PG_FUNCTION_ARGS)
|
1346 | 1346 | /* store first fractional byte */
|
1347 | 1347 | if (destbitsleft > srcbitsleft)
|
1348 | 1348 | {
|
1349 |
| - *r++ = (bits8) ((a >> (srcbitsleft - 8)) & BITMASK); |
| 1349 | + int val = (int) (a >> (destbitsleft - 8)); |
| 1350 | + |
| 1351 | + /* Force sign-fill in case the compiler implements >> as zero-fill */ |
| 1352 | + if (a < 0) |
| 1353 | + val |= (-1) << (srcbitsleft + 8 - destbitsleft); |
| 1354 | + *r++ = (bits8) (val & BITMASK); |
1350 | 1355 | destbitsleft -= 8;
|
1351 | 1356 | }
|
1352 | 1357 | /* Now srcbitsleft and destbitsleft are the same, need not track both */
|
@@ -1425,7 +1430,12 @@ bitfromint8(PG_FUNCTION_ARGS)
|
1425 | 1430 | /* store first fractional byte */
|
1426 | 1431 | if (destbitsleft > srcbitsleft)
|
1427 | 1432 | {
|
1428 |
| - *r++ = (bits8) ((a >> (srcbitsleft - 8)) & BITMASK); |
| 1433 | + int val = (int) (a >> (destbitsleft - 8)); |
| 1434 | + |
| 1435 | + /* Force sign-fill in case the compiler implements >> as zero-fill */ |
| 1436 | + if (a < 0) |
| 1437 | + val |= (-1) << (srcbitsleft + 8 - destbitsleft); |
| 1438 | + *r++ = (bits8) (val & BITMASK); |
1429 | 1439 | destbitsleft -= 8;
|
1430 | 1440 | }
|
1431 | 1441 | /* Now srcbitsleft and destbitsleft are the same, need not track both */
|
|
0 commit comments