mirror of
https://github.com/postgres/postgres.git
synced 2025-05-29 16:21:20 +03:00
pgbench: Install guard against overflow when dividing by -1.
Commit 64f5edca2401f6c2f23564da9dd52e92d08b3a20 fixed the same hazard on master; this is a backport, but the modulo operator does not exist in older releases. Michael Paquier
This commit is contained in:
parent
1f2b195ebf
commit
014796aa3f
@ -57,6 +57,10 @@
|
|||||||
#ifndef INT64_MAX
|
#ifndef INT64_MAX
|
||||||
#define INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
|
#define INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef INT64_MIN
|
||||||
|
#define INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Multi-platform pthread implementations
|
* Multi-platform pthread implementations
|
||||||
@ -1331,13 +1335,37 @@ top:
|
|||||||
snprintf(res, sizeof(res), INT64_FORMAT, ope1 * ope2);
|
snprintf(res, sizeof(res), INT64_FORMAT, ope1 * ope2);
|
||||||
else if (strcmp(argv[3], "/") == 0)
|
else if (strcmp(argv[3], "/") == 0)
|
||||||
{
|
{
|
||||||
|
int64 operes;
|
||||||
|
|
||||||
if (ope2 == 0)
|
if (ope2 == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: division by zero\n", argv[0]);
|
fprintf(stderr, "%s: division by zero\n", argv[0]);
|
||||||
st->ecnt++;
|
st->ecnt++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
snprintf(res, sizeof(res), INT64_FORMAT, ope1 / ope2);
|
/*
|
||||||
|
* INT64_MIN / -1 is problematic, since the result can't
|
||||||
|
* be represented on a two's-complement machine. Some
|
||||||
|
* machines produce INT64_MIN, some produce zero, some
|
||||||
|
* throw an exception. We can dodge the problem by
|
||||||
|
* recognizing that division by -1 is the same as
|
||||||
|
* negation.
|
||||||
|
*/
|
||||||
|
if (ope2 == -1)
|
||||||
|
{
|
||||||
|
operes = -ope1;
|
||||||
|
|
||||||
|
/* overflow check (needed for INT64_MIN) */
|
||||||
|
if (ope1 == INT64_MIN)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "bigint out of range\n");
|
||||||
|
st->ecnt++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
operes = ope1 / ope2;
|
||||||
|
snprintf(res, sizeof(res), INT64_FORMAT, operes);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user