mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-24 23:47:18 +02:00
Define integer limits independently from the system definitions.
In 83ff1618
we defined integer limits iff they're not provided by the
system. That turns out not to be the greatest idea because there's
different ways some datatypes can be represented. E.g. on OSX PG's 64bit
datatype will be a 'long int', but OSX unconditionally uses 'long
long'. That disparity then can lead to warnings, e.g. around printf
formats.
One way to fix that would be to back int64 using stdint.h's
int64_t. While a good idea it's not that easy to implement. We would
e.g. need to include stdint.h in our external headers, which we don't
today. Also computing the correct int64 printf formats in that case is
nontrivial.
Instead simply prefix the integer limits with PG_ and define them
unconditionally. I've adjusted all the references to them in code, but
not the ones in comments; the latter seems unnecessary to me.
Discussion: 20150331141423.GK4878@alap3.anarazel.de
This commit is contained in:
parent
e146ca6820
commit
62e2a8dc2c
@ -154,7 +154,7 @@ ts_dist(PG_FUNCTION_ARGS)
|
|||||||
p->day = INT_MAX;
|
p->day = INT_MAX;
|
||||||
p->month = INT_MAX;
|
p->month = INT_MAX;
|
||||||
#ifdef HAVE_INT64_TIMESTAMP
|
#ifdef HAVE_INT64_TIMESTAMP
|
||||||
p->time = INT64_MAX;
|
p->time = PG_INT64_MAX;
|
||||||
#else
|
#else
|
||||||
p->time = DBL_MAX;
|
p->time = DBL_MAX;
|
||||||
#endif
|
#endif
|
||||||
@ -182,7 +182,7 @@ tstz_dist(PG_FUNCTION_ARGS)
|
|||||||
p->day = INT_MAX;
|
p->day = INT_MAX;
|
||||||
p->month = INT_MAX;
|
p->month = INT_MAX;
|
||||||
#ifdef HAVE_INT64_TIMESTAMP
|
#ifdef HAVE_INT64_TIMESTAMP
|
||||||
p->time = INT64_MAX;
|
p->time = PG_INT64_MAX;
|
||||||
#else
|
#else
|
||||||
p->time = DBL_MAX;
|
p->time = DBL_MAX;
|
||||||
#endif
|
#endif
|
||||||
|
@ -449,7 +449,7 @@ strtoint64(const char *str)
|
|||||||
*/
|
*/
|
||||||
if (strncmp(ptr, "9223372036854775808", 19) == 0)
|
if (strncmp(ptr, "9223372036854775808", 19) == 0)
|
||||||
{
|
{
|
||||||
result = INT64_MIN;
|
result = PG_INT64_MIN;
|
||||||
ptr += 19;
|
ptr += 19;
|
||||||
goto gotdigits;
|
goto gotdigits;
|
||||||
}
|
}
|
||||||
@ -3521,7 +3521,7 @@ threadRun(void *arg)
|
|||||||
FD_ZERO(&input_mask);
|
FD_ZERO(&input_mask);
|
||||||
|
|
||||||
maxsock = -1;
|
maxsock = -1;
|
||||||
min_usec = INT64_MAX;
|
min_usec = PG_INT64_MAX;
|
||||||
for (i = 0; i < nstate; i++)
|
for (i = 0; i < nstate; i++)
|
||||||
{
|
{
|
||||||
CState *st = &state[i];
|
CState *st = &state[i];
|
||||||
@ -3548,7 +3548,7 @@ threadRun(void *arg)
|
|||||||
{
|
{
|
||||||
int this_usec;
|
int this_usec;
|
||||||
|
|
||||||
if (min_usec == INT64_MAX)
|
if (min_usec == PG_INT64_MAX)
|
||||||
{
|
{
|
||||||
instr_time now;
|
instr_time now;
|
||||||
|
|
||||||
@ -3584,7 +3584,7 @@ threadRun(void *arg)
|
|||||||
{
|
{
|
||||||
int nsocks; /* return from select(2) */
|
int nsocks; /* return from select(2) */
|
||||||
|
|
||||||
if (min_usec != INT64_MAX)
|
if (min_usec != PG_INT64_MAX)
|
||||||
{
|
{
|
||||||
struct timeval timeout;
|
struct timeval timeout;
|
||||||
|
|
||||||
|
@ -1408,7 +1408,7 @@ WALInsertLockAcquireExclusive(void)
|
|||||||
{
|
{
|
||||||
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
|
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
|
||||||
&WALInsertLocks[i].l.insertingAt,
|
&WALInsertLocks[i].l.insertingAt,
|
||||||
UINT64_MAX);
|
PG_UINT64_MAX);
|
||||||
}
|
}
|
||||||
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
|
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
|
||||||
&WALInsertLocks[i].l.insertingAt,
|
&WALInsertLocks[i].l.insertingAt,
|
||||||
|
@ -2260,7 +2260,7 @@ mark_hl_fragments(HeadlineParsedText *prs, TSQuery query, int highlight,
|
|||||||
for (f = 0; f < max_fragments; f++)
|
for (f = 0; f < max_fragments; f++)
|
||||||
{
|
{
|
||||||
maxitems = 0;
|
maxitems = 0;
|
||||||
minwords = INT32_MAX;
|
minwords = PG_INT32_MAX;
|
||||||
minI = -1;
|
minI = -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -78,7 +78,7 @@ scanint8(const char *str, bool errorOK, int64 *result)
|
|||||||
*/
|
*/
|
||||||
if (strncmp(ptr, "9223372036854775808", 19) == 0)
|
if (strncmp(ptr, "9223372036854775808", 19) == 0)
|
||||||
{
|
{
|
||||||
tmp = INT64_MIN;
|
tmp = PG_INT64_MIN;
|
||||||
ptr += 19;
|
ptr += 19;
|
||||||
goto gotdigits;
|
goto gotdigits;
|
||||||
}
|
}
|
||||||
|
@ -190,7 +190,7 @@ pg_lltoa(int64 value, char *a)
|
|||||||
* Avoid problems with the most negative integer not being representable
|
* Avoid problems with the most negative integer not being representable
|
||||||
* as a positive integer.
|
* as a positive integer.
|
||||||
*/
|
*/
|
||||||
if (value == INT64_MIN)
|
if (value == PG_INT64_MIN)
|
||||||
{
|
{
|
||||||
memcpy(a, "-9223372036854775808", 21);
|
memcpy(a, "-9223372036854775808", 21);
|
||||||
return;
|
return;
|
||||||
|
@ -3309,7 +3309,7 @@ interval_mul(PG_FUNCTION_ARGS)
|
|||||||
result->day += (int32) month_remainder_days;
|
result->day += (int32) month_remainder_days;
|
||||||
#ifdef HAVE_INT64_TIMESTAMP
|
#ifdef HAVE_INT64_TIMESTAMP
|
||||||
result_double = rint(span->time * factor + sec_remainder * USECS_PER_SEC);
|
result_double = rint(span->time * factor + sec_remainder * USECS_PER_SEC);
|
||||||
if (result_double > INT64_MAX || result_double < INT64_MIN)
|
if (result_double > PG_INT64_MAX || result_double < PG_INT64_MIN)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
||||||
errmsg("interval out of range")));
|
errmsg("interval out of range")));
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/* txid will be signed int8 in database, so must limit to 63 bits */
|
/* txid will be signed int8 in database, so must limit to 63 bits */
|
||||||
#define MAX_TXID ((uint64) INT64_MAX)
|
#define MAX_TXID ((uint64) PG_INT64_MAX)
|
||||||
|
|
||||||
/* Use unsigned variant internally */
|
/* Use unsigned variant internally */
|
||||||
typedef uint64 txid;
|
typedef uint64 txid;
|
||||||
|
@ -249,36 +249,6 @@ typedef uint8 bits8; /* >= 8 bits */
|
|||||||
typedef uint16 bits16; /* >= 16 bits */
|
typedef uint16 bits16; /* >= 16 bits */
|
||||||
typedef uint32 bits32; /* >= 32 bits */
|
typedef uint32 bits32; /* >= 32 bits */
|
||||||
|
|
||||||
/* should be defined in stdint.h, but we guarantee them here */
|
|
||||||
#ifndef INT8_MIN
|
|
||||||
#define INT8_MIN (-0x7F-1)
|
|
||||||
#endif
|
|
||||||
#ifndef INT8_MAX
|
|
||||||
#define INT8_MAX (0x7F)
|
|
||||||
#endif
|
|
||||||
#ifndef INT16_MIN
|
|
||||||
#define INT16_MIN (-0x7FFF-1)
|
|
||||||
#endif
|
|
||||||
#ifndef INT16_MAX
|
|
||||||
#define INT16_MAX (0x7FFF)
|
|
||||||
#endif
|
|
||||||
#ifndef INT32_MIN
|
|
||||||
#define INT32_MIN (-0x7FFFFFFF-1)
|
|
||||||
#endif
|
|
||||||
#ifndef INT32_MAX
|
|
||||||
#define INT32_MAX (0x7FFFFFFF)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UINT8_MAX
|
|
||||||
#define UINT8_MAX (0xFF)
|
|
||||||
#endif
|
|
||||||
#ifndef UINT16_MAX
|
|
||||||
#define UINT16_MAX (0xFFFF)
|
|
||||||
#endif
|
|
||||||
#ifndef UINT32_MAX
|
|
||||||
#define UINT32_MAX (0xFFFFFFFF)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 64-bit integers
|
* 64-bit integers
|
||||||
*/
|
*/
|
||||||
@ -314,26 +284,10 @@ typedef unsigned long long int uint64;
|
|||||||
#define UINT64CONST(x) ((uint64) x)
|
#define UINT64CONST(x) ((uint64) x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* should be defined in stdint.h, but we guarantee them here */
|
|
||||||
#ifndef INT64_MIN
|
|
||||||
#define INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)
|
|
||||||
#endif
|
|
||||||
#ifndef INT64_MAX
|
|
||||||
#define INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
|
|
||||||
#endif
|
|
||||||
#ifndef UINT64_MAX
|
|
||||||
#define UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* snprintf format strings to use for 64-bit integers */
|
/* snprintf format strings to use for 64-bit integers */
|
||||||
#define INT64_FORMAT "%" INT64_MODIFIER "d"
|
#define INT64_FORMAT "%" INT64_MODIFIER "d"
|
||||||
#define UINT64_FORMAT "%" INT64_MODIFIER "u"
|
#define UINT64_FORMAT "%" INT64_MODIFIER "u"
|
||||||
|
|
||||||
/* Select timestamp representation (float8 or int64) */
|
|
||||||
#ifdef USE_INTEGER_DATETIMES
|
|
||||||
#define HAVE_INT64_TIMESTAMP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 128-bit signed and unsigned integers
|
* 128-bit signed and unsigned integers
|
||||||
* There currently is only a limited support for the type. E.g. 128bit
|
* There currently is only a limited support for the type. E.g. 128bit
|
||||||
@ -345,6 +299,28 @@ typedef PG_INT128_TYPE int128;
|
|||||||
typedef unsigned PG_INT128_TYPE uint128;
|
typedef unsigned PG_INT128_TYPE uint128;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* stdint.h limits aren't guaranteed to be present and aren't guaranteed to
|
||||||
|
* have compatible types with our fixed width types. So just define our own.
|
||||||
|
*/
|
||||||
|
#define PG_INT8_MIN (-0x7F-1)
|
||||||
|
#define PG_INT8_MAX (0x7F)
|
||||||
|
#define PG_UINT8_MAX (0xFF)
|
||||||
|
#define PG_INT16_MIN (-0x7FFF-1)
|
||||||
|
#define PG_INT16_MAX (0x7FFF)
|
||||||
|
#define PG_UINT16_MAX (0xFFFF)
|
||||||
|
#define PG_INT32_MIN (-0x7FFFFFFF-1)
|
||||||
|
#define PG_INT32_MAX (0x7FFFFFFF)
|
||||||
|
#define PG_UINT32_MAX (0xFFFFFFFF)
|
||||||
|
#define PG_INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)
|
||||||
|
#define PG_INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
|
||||||
|
#define PG_UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF)
|
||||||
|
|
||||||
|
/* Select timestamp representation (float8 or int64) */
|
||||||
|
#ifdef USE_INTEGER_DATETIMES
|
||||||
|
#define HAVE_INT64_TIMESTAMP
|
||||||
|
#endif
|
||||||
|
|
||||||
/* sig_atomic_t is required by ANSI C, but may be missing on old platforms */
|
/* sig_atomic_t is required by ANSI C, but may be missing on old platforms */
|
||||||
#ifndef HAVE_SIG_ATOMIC_T
|
#ifndef HAVE_SIG_ATOMIC_T
|
||||||
typedef int sig_atomic_t;
|
typedef int sig_atomic_t;
|
||||||
|
@ -119,8 +119,8 @@ typedef struct
|
|||||||
* DT_NOBEGIN represents timestamp -infinity; DT_NOEND represents +infinity
|
* DT_NOBEGIN represents timestamp -infinity; DT_NOEND represents +infinity
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_INT64_TIMESTAMP
|
#ifdef HAVE_INT64_TIMESTAMP
|
||||||
#define DT_NOBEGIN INT64_MIN
|
#define DT_NOBEGIN PG_INT64_MIN
|
||||||
#define DT_NOEND INT64_MAX
|
#define DT_NOEND PG_INT64_MAX
|
||||||
#else /* !HAVE_INT64_TIMESTAMP */
|
#else /* !HAVE_INT64_TIMESTAMP */
|
||||||
#ifdef HUGE_VAL
|
#ifdef HUGE_VAL
|
||||||
#define DT_NOBEGIN (-HUGE_VAL)
|
#define DT_NOBEGIN (-HUGE_VAL)
|
||||||
|
@ -38,7 +38,7 @@ typedef enum InstrumentOption
|
|||||||
INSTRUMENT_TIMER = 1 << 0, /* needs timer (and row counts) */
|
INSTRUMENT_TIMER = 1 << 0, /* needs timer (and row counts) */
|
||||||
INSTRUMENT_BUFFERS = 1 << 1, /* needs buffer usage */
|
INSTRUMENT_BUFFERS = 1 << 1, /* needs buffer usage */
|
||||||
INSTRUMENT_ROWS = 1 << 2, /* needs row count */
|
INSTRUMENT_ROWS = 1 << 2, /* needs row count */
|
||||||
INSTRUMENT_ALL = INT32_MAX
|
INSTRUMENT_ALL = PG_INT32_MAX
|
||||||
} InstrumentOption;
|
} InstrumentOption;
|
||||||
|
|
||||||
typedef struct Instrumentation
|
typedef struct Instrumentation
|
||||||
|
@ -587,7 +587,7 @@ typedef enum TableLikeOption
|
|||||||
CREATE_TABLE_LIKE_INDEXES = 1 << 2,
|
CREATE_TABLE_LIKE_INDEXES = 1 << 2,
|
||||||
CREATE_TABLE_LIKE_STORAGE = 1 << 3,
|
CREATE_TABLE_LIKE_STORAGE = 1 << 3,
|
||||||
CREATE_TABLE_LIKE_COMMENTS = 1 << 4,
|
CREATE_TABLE_LIKE_COMMENTS = 1 << 4,
|
||||||
CREATE_TABLE_LIKE_ALL = INT32_MAX
|
CREATE_TABLE_LIKE_ALL = PG_INT32_MAX
|
||||||
} TableLikeOption;
|
} TableLikeOption;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
/*
|
/*
|
||||||
* Set the upper and lower bounds of sequence values.
|
* Set the upper and lower bounds of sequence values.
|
||||||
*/
|
*/
|
||||||
#define SEQ_MAXVALUE INT64_MAX
|
#define SEQ_MAXVALUE PG_INT64_MAX
|
||||||
#define SEQ_MINVALUE (-SEQ_MAXVALUE)
|
#define SEQ_MINVALUE (-SEQ_MAXVALUE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -185,7 +185,7 @@
|
|||||||
* the older rand() function, which is often different from --- and
|
* the older rand() function, which is often different from --- and
|
||||||
* considerably inferior to --- random().
|
* considerably inferior to --- random().
|
||||||
*/
|
*/
|
||||||
#define MAX_RANDOM_VALUE INT32_MAX
|
#define MAX_RANDOM_VALUE PG_INT32_MAX
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On PPC machines, decide whether to use the mutex hint bit in LWARX
|
* On PPC machines, decide whether to use the mutex hint bit in LWARX
|
||||||
|
@ -489,7 +489,7 @@ STATIC_IF_INLINE uint64
|
|||||||
pg_atomic_fetch_sub_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
|
pg_atomic_fetch_sub_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
|
||||||
{
|
{
|
||||||
AssertPointerAlignment(ptr, 8);
|
AssertPointerAlignment(ptr, 8);
|
||||||
Assert(sub_ != INT64_MIN);
|
Assert(sub_ != PG_INT64_MIN);
|
||||||
return pg_atomic_fetch_sub_u64_impl(ptr, sub_);
|
return pg_atomic_fetch_sub_u64_impl(ptr, sub_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,7 +518,7 @@ STATIC_IF_INLINE uint64
|
|||||||
pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
|
pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
|
||||||
{
|
{
|
||||||
AssertPointerAlignment(ptr, 8);
|
AssertPointerAlignment(ptr, 8);
|
||||||
Assert(sub_ != INT64_MIN);
|
Assert(sub_ != PG_INT64_MIN);
|
||||||
return pg_atomic_sub_fetch_u64_impl(ptr, sub_);
|
return pg_atomic_sub_fetch_u64_impl(ptr, sub_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ typedef uint64 SerCommitSeqNo;
|
|||||||
* at that point. It's earlier than all normal sequence numbers,
|
* at that point. It's earlier than all normal sequence numbers,
|
||||||
* and is only used by recovered prepared transactions
|
* and is only used by recovered prepared transactions
|
||||||
*/
|
*/
|
||||||
#define InvalidSerCommitSeqNo ((SerCommitSeqNo) UINT64_MAX)
|
#define InvalidSerCommitSeqNo ((SerCommitSeqNo) PG_UINT64_MAX)
|
||||||
#define RecoverySerCommitSeqNo ((SerCommitSeqNo) 1)
|
#define RecoverySerCommitSeqNo ((SerCommitSeqNo) 1)
|
||||||
#define FirstNormalSerCommitSeqNo ((SerCommitSeqNo) 2)
|
#define FirstNormalSerCommitSeqNo ((SerCommitSeqNo) 2)
|
||||||
|
|
||||||
|
@ -36,8 +36,8 @@ typedef struct
|
|||||||
/*
|
/*
|
||||||
* Infinity and minus infinity must be the max and min values of DateADT.
|
* Infinity and minus infinity must be the max and min values of DateADT.
|
||||||
*/
|
*/
|
||||||
#define DATEVAL_NOBEGIN ((DateADT) INT32_MIN)
|
#define DATEVAL_NOBEGIN ((DateADT) PG_INT32_MIN)
|
||||||
#define DATEVAL_NOEND ((DateADT) INT32_MAX)
|
#define DATEVAL_NOEND ((DateADT) PG_INT32_MAX)
|
||||||
|
|
||||||
#define DATE_NOBEGIN(j) ((j) = DATEVAL_NOBEGIN)
|
#define DATE_NOBEGIN(j) ((j) = DATEVAL_NOBEGIN)
|
||||||
#define DATE_IS_NOBEGIN(j) ((j) == DATEVAL_NOBEGIN)
|
#define DATE_IS_NOBEGIN(j) ((j) == DATEVAL_NOBEGIN)
|
||||||
|
Loading…
Reference in New Issue
Block a user