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
p->day = INT_MAX;
p->month = INT_MAX;
#ifdef HAVE_INT64_TIMESTAMP
- p->time = INT64_MAX;
+ p->time = PG_INT64_MAX;
#else
p->time = DBL_MAX;
#endif
p->day = INT_MAX;
p->month = INT_MAX;
#ifdef HAVE_INT64_TIMESTAMP
- p->time = INT64_MAX;
+ p->time = PG_INT64_MAX;
#else
p->time = DBL_MAX;
#endif
*/
if (strncmp(ptr, "9223372036854775808", 19) == 0)
{
- result = INT64_MIN;
+ result = PG_INT64_MIN;
ptr += 19;
goto gotdigits;
}
FD_ZERO(&input_mask);
maxsock = -1;
- min_usec = INT64_MAX;
+ min_usec = PG_INT64_MAX;
for (i = 0; i < nstate; i++)
{
CState *st = &state[i];
{
int this_usec;
- if (min_usec == INT64_MAX)
+ if (min_usec == PG_INT64_MAX)
{
instr_time now;
{
int nsocks; /* return from select(2) */
- if (min_usec != INT64_MAX)
+ if (min_usec != PG_INT64_MAX)
{
struct timeval timeout;
{
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
&WALInsertLocks[i].l.insertingAt,
- UINT64_MAX);
+ PG_UINT64_MAX);
}
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
&WALInsertLocks[i].l.insertingAt,
for (f = 0; f < max_fragments; f++)
{
maxitems = 0;
- minwords = INT32_MAX;
+ minwords = PG_INT32_MAX;
minI = -1;
/*
*/
if (strncmp(ptr, "9223372036854775808", 19) == 0)
{
- tmp = INT64_MIN;
+ tmp = PG_INT64_MIN;
ptr += 19;
goto gotdigits;
}
* Avoid problems with the most negative integer not being representable
* as a positive integer.
*/
- if (value == INT64_MIN)
+ if (value == PG_INT64_MIN)
{
memcpy(a, "-9223372036854775808", 21);
return;
result->day += (int32) month_remainder_days;
#ifdef HAVE_INT64_TIMESTAMP
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,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg("interval out of range")));
/* 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 */
typedef uint64 txid;
typedef uint16 bits16; /* >= 16 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
*/
#define UINT64CONST(x) ((uint64) x)
#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 */
#define INT64_FORMAT "%" INT64_MODIFIER "d"
#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
* There currently is only a limited support for the type. E.g. 128bit
typedef unsigned PG_INT128_TYPE uint128;
#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 */
#ifndef HAVE_SIG_ATOMIC_T
typedef int sig_atomic_t;
* DT_NOBEGIN represents timestamp -infinity; DT_NOEND represents +infinity
*/
#ifdef HAVE_INT64_TIMESTAMP
-#define DT_NOBEGIN INT64_MIN
-#define DT_NOEND INT64_MAX
+#define DT_NOBEGIN PG_INT64_MIN
+#define DT_NOEND PG_INT64_MAX
#else /* !HAVE_INT64_TIMESTAMP */
#ifdef HUGE_VAL
#define DT_NOBEGIN (-HUGE_VAL)
INSTRUMENT_TIMER = 1 << 0, /* needs timer (and row counts) */
INSTRUMENT_BUFFERS = 1 << 1, /* needs buffer usage */
INSTRUMENT_ROWS = 1 << 2, /* needs row count */
- INSTRUMENT_ALL = INT32_MAX
+ INSTRUMENT_ALL = PG_INT32_MAX
} InstrumentOption;
typedef struct Instrumentation
CREATE_TABLE_LIKE_INDEXES = 1 << 2,
CREATE_TABLE_LIKE_STORAGE = 1 << 3,
CREATE_TABLE_LIKE_COMMENTS = 1 << 4,
- CREATE_TABLE_LIKE_ALL = INT32_MAX
+ CREATE_TABLE_LIKE_ALL = PG_INT32_MAX
} TableLikeOption;
/*
/*
* 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)
/*
* the older rand() function, which is often different from --- and
* 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
pg_atomic_fetch_sub_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
{
AssertPointerAlignment(ptr, 8);
- Assert(sub_ != INT64_MIN);
+ Assert(sub_ != PG_INT64_MIN);
return pg_atomic_fetch_sub_u64_impl(ptr, sub_);
}
pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
{
AssertPointerAlignment(ptr, 8);
- Assert(sub_ != INT64_MIN);
+ Assert(sub_ != PG_INT64_MIN);
return pg_atomic_sub_fetch_u64_impl(ptr, sub_);
}
* at that point. It's earlier than all normal sequence numbers,
* and is only used by recovered prepared transactions
*/
-#define InvalidSerCommitSeqNo ((SerCommitSeqNo) UINT64_MAX)
+#define InvalidSerCommitSeqNo ((SerCommitSeqNo) PG_UINT64_MAX)
#define RecoverySerCommitSeqNo ((SerCommitSeqNo) 1)
#define FirstNormalSerCommitSeqNo ((SerCommitSeqNo) 2)
/*
* Infinity and minus infinity must be the max and min values of DateADT.
*/
-#define DATEVAL_NOBEGIN ((DateADT) INT32_MIN)
-#define DATEVAL_NOEND ((DateADT) INT32_MAX)
+#define DATEVAL_NOBEGIN ((DateADT) PG_INT32_MIN)
+#define DATEVAL_NOEND ((DateADT) PG_INT32_MAX)
#define DATE_NOBEGIN(j) ((j) = DATEVAL_NOBEGIN)
#define DATE_IS_NOBEGIN(j) ((j) == DATEVAL_NOBEGIN)