Commit 83ff1618 authored by Andres Freund's avatar Andres Freund

Centralize definition of integer limits.

Several submitted and even committed patches have run into the problem
that C89, our baseline, does not provide minimum/maximum values for
various integer datatypes. C99's stdint.h does, but we can't rely on
it.

Several parts of the code defined limits locally, so instead centralize
the definitions to c.h.

This patch also changes the more obvious usages of literal limit values;
there's more places that could be changed, but it's less clear whether
it's beneficial to change those.

Author: Andrew Gierth
Discussion: 87619tc5wc.fsf@news-spur.riddles.org.uk
parent bdc3d7fa
...@@ -153,7 +153,7 @@ ts_dist(PG_FUNCTION_ARGS) ...@@ -153,7 +153,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 = INT64CONST(0x7FFFFFFFFFFFFFFF); p->time = INT64_MAX;
#else #else
p->time = DBL_MAX; p->time = DBL_MAX;
#endif #endif
...@@ -181,7 +181,7 @@ tstz_dist(PG_FUNCTION_ARGS) ...@@ -181,7 +181,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 = INT64CONST(0x7FFFFFFFFFFFFFFF); p->time = INT64_MAX;
#else #else
p->time = DBL_MAX; p->time = DBL_MAX;
#endif #endif
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include <limits.h>
#include "access/gist.h" #include "access/gist.h"
#include "access/skey.h" #include "access/skey.h"
...@@ -191,7 +193,7 @@ g_int_compress(PG_FUNCTION_ARGS) ...@@ -191,7 +193,7 @@ g_int_compress(PG_FUNCTION_ARGS)
cand = 1; cand = 1;
while (len > MAXNUMRANGE * 2) while (len > MAXNUMRANGE * 2)
{ {
min = 0x7fffffff; min = INT_MAX;
for (i = 2; i < len; i += 2) for (i = 2; i < len; i += 2)
if (min > (dr[i] - dr[i - 1])) if (min > (dr[i] - dr[i - 1]))
{ {
......
...@@ -49,10 +49,6 @@ ...@@ -49,10 +49,6 @@
#include <sys/resource.h> /* for getrlimit */ #include <sys/resource.h> /* for getrlimit */
#endif #endif
#ifndef INT64_MAX
#define INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
#endif
#ifndef M_PI #ifndef M_PI
#define M_PI 3.14159265358979323846 #define M_PI 3.14159265358979323846
#endif #endif
...@@ -453,7 +449,7 @@ strtoint64(const char *str) ...@@ -453,7 +449,7 @@ strtoint64(const char *str)
*/ */
if (strncmp(ptr, "9223372036854775808", 19) == 0) if (strncmp(ptr, "9223372036854775808", 19) == 0)
{ {
result = -INT64CONST(0x7fffffffffffffff) - 1; result = INT64_MIN;
ptr += 19; ptr += 19;
goto gotdigits; goto gotdigits;
} }
......
...@@ -1408,7 +1408,7 @@ WALInsertLockAcquireExclusive(void) ...@@ -1408,7 +1408,7 @@ WALInsertLockAcquireExclusive(void)
{ {
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock, LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
&WALInsertLocks[i].l.insertingAt, &WALInsertLocks[i].l.insertingAt,
UINT64CONST(0xFFFFFFFFFFFFFFFF)); UINT64_MAX);
} }
LWLockAcquireWithVar(&WALInsertLocks[i].l.lock, LWLockAcquireWithVar(&WALInsertLocks[i].l.lock,
&WALInsertLocks[i].l.insertingAt, &WALInsertLocks[i].l.insertingAt,
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include "postgres.h" #include "postgres.h"
#include <limits.h>
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "commands/defrem.h" #include "commands/defrem.h"
#include "tsearch/ts_locale.h" #include "tsearch/ts_locale.h"
...@@ -2047,7 +2049,7 @@ hlCover(HeadlineParsedText *prs, TSQuery query, int *p, int *q) ...@@ -2047,7 +2049,7 @@ hlCover(HeadlineParsedText *prs, TSQuery query, int *p, int *q)
int pos = *p; int pos = *p;
*q = -1; *q = -1;
*p = 0x7fffffff; *p = INT_MAX;
for (j = 0; j < query->size; j++) for (j = 0; j < query->size; j++)
{ {
...@@ -2258,7 +2260,7 @@ mark_hl_fragments(HeadlineParsedText *prs, TSQuery query, int highlight, ...@@ -2258,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 = 0x7fffffff; minwords = INT32_MAX;
minI = -1; minI = -1;
/* /*
......
...@@ -78,7 +78,7 @@ scanint8(const char *str, bool errorOK, int64 *result) ...@@ -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 = -INT64CONST(0x7fffffffffffffff) - 1; tmp = INT64_MIN;
ptr += 19; ptr += 19;
goto gotdigits; goto gotdigits;
} }
......
...@@ -190,7 +190,7 @@ pg_lltoa(int64 value, char *a) ...@@ -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 == (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)) if (value == INT64_MIN)
{ {
memcpy(a, "-9223372036854775808", 21); memcpy(a, "-9223372036854775808", 21);
return; return;
......
...@@ -44,14 +44,6 @@ ...@@ -44,14 +44,6 @@
#define SAMESIGN(a,b) (((a) < 0) == ((b) < 0)) #define SAMESIGN(a,b) (((a) < 0) == ((b) < 0))
#ifndef INT64_MAX
#define INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
#endif
#ifndef INT64_MIN
#define INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)
#endif
/* Set at postmaster start */ /* Set at postmaster start */
TimestampTz PgStartTime; TimestampTz PgStartTime;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include <limits.h>
#include <math.h> #include <math.h>
#include "tsearch/ts_utils.h" #include "tsearch/ts_utils.h"
...@@ -555,7 +556,7 @@ Cover(DocRepresentation *doc, int len, QueryRepresentation *qr, CoverExt *ext) ...@@ -555,7 +556,7 @@ Cover(DocRepresentation *doc, int len, QueryRepresentation *qr, CoverExt *ext)
memset(qr->operandexist, 0, sizeof(bool) * qr->query->size); memset(qr->operandexist, 0, sizeof(bool) * qr->query->size);
ext->p = 0x7fffffff; ext->p = INT_MAX;
ext->q = 0; ext->q = 0;
ptr = doc + ext->pos; ptr = doc + ext->pos;
......
...@@ -34,7 +34,7 @@ ...@@ -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 UINT64CONST(0x7FFFFFFFFFFFFFFF) #define MAX_TXID ((uint64) INT64_MAX)
/* Use unsigned variant internally */ /* Use unsigned variant internally */
typedef uint64 txid; typedef uint64 txid;
......
...@@ -249,6 +249,36 @@ typedef uint8 bits8; /* >= 8 bits */ ...@@ -249,6 +249,36 @@ 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
*/ */
...@@ -284,6 +314,17 @@ typedef unsigned long long int uint64; ...@@ -284,6 +314,17 @@ 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"
......
...@@ -119,8 +119,8 @@ typedef struct ...@@ -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 (-INT64CONST(0x7fffffffffffffff) - 1) #define DT_NOBEGIN INT64_MIN
#define DT_NOEND (INT64CONST(0x7fffffffffffffff)) #define DT_NOEND 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 ...@@ -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 = 0x7FFFFFFF INSTRUMENT_ALL = INT32_MAX
} InstrumentOption; } InstrumentOption;
typedef struct Instrumentation typedef struct Instrumentation
......
...@@ -587,7 +587,7 @@ typedef enum TableLikeOption ...@@ -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 = 0x7FFFFFFF CREATE_TABLE_LIKE_ALL = INT32_MAX
} TableLikeOption; } TableLikeOption;
/* /*
......
...@@ -48,7 +48,7 @@ ...@@ -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 INT64CONST(0x7FFFFFFFFFFFFFFF) #define SEQ_MAXVALUE INT64_MAX
#define SEQ_MINVALUE (-SEQ_MAXVALUE) #define SEQ_MINVALUE (-SEQ_MAXVALUE)
/* /*
...@@ -185,7 +185,7 @@ ...@@ -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 (0x7FFFFFFF) #define MAX_RANDOM_VALUE 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 ...@@ -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_ != -INT64CONST(0x7FFFFFFFFFFFFFFF) - 1); Assert(sub_ != 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 ...@@ -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_ != -INT64CONST(0x7FFFFFFFFFFFFFFF) - 1); Assert(sub_ != 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; ...@@ -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) UINT64CONST(0xFFFFFFFFFFFFFFFF)) #define InvalidSerCommitSeqNo ((SerCommitSeqNo) UINT64_MAX)
#define RecoverySerCommitSeqNo ((SerCommitSeqNo) 1) #define RecoverySerCommitSeqNo ((SerCommitSeqNo) 1)
#define FirstNormalSerCommitSeqNo ((SerCommitSeqNo) 2) #define FirstNormalSerCommitSeqNo ((SerCommitSeqNo) 2)
......
...@@ -35,11 +35,9 @@ typedef struct ...@@ -35,11 +35,9 @@ 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.
* We could use INT_MIN and INT_MAX here, but seems better to not assume that
* int32 == int.
*/ */
#define DATEVAL_NOBEGIN ((DateADT) (-0x7fffffff - 1)) #define DATEVAL_NOBEGIN ((DateADT) INT32_MIN)
#define DATEVAL_NOEND ((DateADT) 0x7fffffff) #define DATEVAL_NOEND ((DateADT) 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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment