mirror of
https://github.com/postgres/postgres.git
synced 2025-05-14 00:03:46 -04:00
Use FLEXIBLE_ARRAY_MEMBER in a number of other places.
I think we're about done with this...
This commit is contained in:
parent
e1a11d9311
commit
2e211211a7
@ -41,7 +41,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
int32 vl_len_; /* varlena header (do not touch directly!) */
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int32 flag;
|
int32 flag;
|
||||||
char data[1];
|
char data[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} GISTTYPE;
|
} GISTTYPE;
|
||||||
|
|
||||||
#define ALLISTRUE 0x04
|
#define ALLISTRUE 0x04
|
||||||
|
@ -35,10 +35,10 @@ static int nPlans = 0;
|
|||||||
typedef struct _TTOffList
|
typedef struct _TTOffList
|
||||||
{
|
{
|
||||||
struct _TTOffList *next;
|
struct _TTOffList *next;
|
||||||
char name[1];
|
char name[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} TTOffList;
|
} TTOffList;
|
||||||
|
|
||||||
static TTOffList TTOff = {NULL, {0}};
|
static TTOffList *TTOff = NULL;
|
||||||
|
|
||||||
static int findTTStatus(char *name);
|
static int findTTStatus(char *name);
|
||||||
static EPlan *find_plan(char *ident, EPlan **eplan, int *nplans);
|
static EPlan *find_plan(char *ident, EPlan **eplan, int *nplans);
|
||||||
@ -428,10 +428,11 @@ set_timetravel(PG_FUNCTION_ARGS)
|
|||||||
char *d;
|
char *d;
|
||||||
char *s;
|
char *s;
|
||||||
int32 ret;
|
int32 ret;
|
||||||
TTOffList *p,
|
TTOffList *prev,
|
||||||
*pp;
|
*pp;
|
||||||
|
|
||||||
for (pp = (p = &TTOff)->next; pp; pp = (p = pp)->next)
|
prev = NULL;
|
||||||
|
for (pp = TTOff; pp; prev = pp, pp = pp->next)
|
||||||
{
|
{
|
||||||
if (namestrcmp(relname, pp->name) == 0)
|
if (namestrcmp(relname, pp->name) == 0)
|
||||||
break;
|
break;
|
||||||
@ -442,7 +443,10 @@ set_timetravel(PG_FUNCTION_ARGS)
|
|||||||
if (on != 0)
|
if (on != 0)
|
||||||
{
|
{
|
||||||
/* turn ON */
|
/* turn ON */
|
||||||
p->next = pp->next;
|
if (prev)
|
||||||
|
prev->next = pp->next;
|
||||||
|
else
|
||||||
|
TTOff = pp->next;
|
||||||
free(pp);
|
free(pp);
|
||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -456,15 +460,18 @@ set_timetravel(PG_FUNCTION_ARGS)
|
|||||||
s = rname = DatumGetCString(DirectFunctionCall1(nameout, NameGetDatum(relname)));
|
s = rname = DatumGetCString(DirectFunctionCall1(nameout, NameGetDatum(relname)));
|
||||||
if (s)
|
if (s)
|
||||||
{
|
{
|
||||||
pp = malloc(sizeof(TTOffList) + strlen(rname));
|
pp = malloc(offsetof(TTOffList, name) +strlen(rname) + 1);
|
||||||
if (pp)
|
if (pp)
|
||||||
{
|
{
|
||||||
pp->next = NULL;
|
pp->next = NULL;
|
||||||
p->next = pp;
|
|
||||||
d = pp->name;
|
d = pp->name;
|
||||||
while (*s)
|
while (*s)
|
||||||
*d++ = tolower((unsigned char) *s++);
|
*d++ = tolower((unsigned char) *s++);
|
||||||
*d = '\0';
|
*d = '\0';
|
||||||
|
if (prev)
|
||||||
|
prev->next = pp;
|
||||||
|
else
|
||||||
|
TTOff = pp;
|
||||||
}
|
}
|
||||||
pfree(rname);
|
pfree(rname);
|
||||||
}
|
}
|
||||||
@ -486,7 +493,7 @@ get_timetravel(PG_FUNCTION_ARGS)
|
|||||||
Name relname = PG_GETARG_NAME(0);
|
Name relname = PG_GETARG_NAME(0);
|
||||||
TTOffList *pp;
|
TTOffList *pp;
|
||||||
|
|
||||||
for (pp = TTOff.next; pp; pp = pp->next)
|
for (pp = TTOff; pp; pp = pp->next)
|
||||||
{
|
{
|
||||||
if (namestrcmp(relname, pp->name) == 0)
|
if (namestrcmp(relname, pp->name) == 0)
|
||||||
PG_RETURN_INT32(0);
|
PG_RETURN_INT32(0);
|
||||||
@ -499,7 +506,7 @@ findTTStatus(char *name)
|
|||||||
{
|
{
|
||||||
TTOffList *pp;
|
TTOffList *pp;
|
||||||
|
|
||||||
for (pp = TTOff.next; pp; pp = pp->next)
|
for (pp = TTOff; pp; pp = pp->next)
|
||||||
if (pg_strcasecmp(name, pp->name) == 0)
|
if (pg_strcasecmp(name, pp->name) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -103,10 +103,11 @@ typedef struct ss_scan_locations_t
|
|||||||
{
|
{
|
||||||
ss_lru_item_t *head;
|
ss_lru_item_t *head;
|
||||||
ss_lru_item_t *tail;
|
ss_lru_item_t *tail;
|
||||||
ss_lru_item_t items[1]; /* SYNC_SCAN_NELEM items */
|
ss_lru_item_t items[FLEXIBLE_ARRAY_MEMBER]; /* SYNC_SCAN_NELEM items */
|
||||||
} ss_scan_locations_t;
|
} ss_scan_locations_t;
|
||||||
|
|
||||||
#define SizeOfScanLocations(N) offsetof(ss_scan_locations_t, items[N])
|
#define SizeOfScanLocations(N) \
|
||||||
|
(offsetof(ss_scan_locations_t, items) + (N) * sizeof(ss_lru_item_t))
|
||||||
|
|
||||||
/* Pointer to struct in shared memory */
|
/* Pointer to struct in shared memory */
|
||||||
static ss_scan_locations_t *scan_locations;
|
static ss_scan_locations_t *scan_locations;
|
||||||
|
@ -237,8 +237,8 @@ typedef struct AsyncQueueControl
|
|||||||
QueuePosition tail; /* the global tail is equivalent to the tail
|
QueuePosition tail; /* the global tail is equivalent to the tail
|
||||||
* of the "slowest" backend */
|
* of the "slowest" backend */
|
||||||
TimestampTz lastQueueFillWarn; /* time of last queue-full msg */
|
TimestampTz lastQueueFillWarn; /* time of last queue-full msg */
|
||||||
QueueBackendStatus backend[1]; /* actually of length MaxBackends+1 */
|
QueueBackendStatus backend[FLEXIBLE_ARRAY_MEMBER];
|
||||||
/* DO NOT ADD FURTHER STRUCT MEMBERS HERE */
|
/* backend[0] is not used; used entries are from [1] to [MaxBackends] */
|
||||||
} AsyncQueueControl;
|
} AsyncQueueControl;
|
||||||
|
|
||||||
static AsyncQueueControl *asyncQueueControl;
|
static AsyncQueueControl *asyncQueueControl;
|
||||||
@ -303,7 +303,7 @@ typedef enum
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ListenActionKind action;
|
ListenActionKind action;
|
||||||
char channel[1]; /* actually, as long as needed */
|
char channel[FLEXIBLE_ARRAY_MEMBER]; /* nul-terminated string */
|
||||||
} ListenAction;
|
} ListenAction;
|
||||||
|
|
||||||
static List *pendingActions = NIL; /* list of ListenAction */
|
static List *pendingActions = NIL; /* list of ListenAction */
|
||||||
@ -417,8 +417,8 @@ AsyncShmemSize(void)
|
|||||||
Size size;
|
Size size;
|
||||||
|
|
||||||
/* This had better match AsyncShmemInit */
|
/* This had better match AsyncShmemInit */
|
||||||
size = mul_size(MaxBackends, sizeof(QueueBackendStatus));
|
size = mul_size(MaxBackends + 1, sizeof(QueueBackendStatus));
|
||||||
size = add_size(size, sizeof(AsyncQueueControl));
|
size = add_size(size, offsetof(AsyncQueueControl, backend));
|
||||||
|
|
||||||
size = add_size(size, SimpleLruShmemSize(NUM_ASYNC_BUFFERS, 0));
|
size = add_size(size, SimpleLruShmemSize(NUM_ASYNC_BUFFERS, 0));
|
||||||
|
|
||||||
@ -438,12 +438,11 @@ AsyncShmemInit(void)
|
|||||||
/*
|
/*
|
||||||
* Create or attach to the AsyncQueueControl structure.
|
* Create or attach to the AsyncQueueControl structure.
|
||||||
*
|
*
|
||||||
* The used entries in the backend[] array run from 1 to MaxBackends.
|
* The used entries in the backend[] array run from 1 to MaxBackends; the
|
||||||
* sizeof(AsyncQueueControl) already includes space for the unused zero'th
|
* zero'th entry is unused but must be allocated.
|
||||||
* entry, but we need to add on space for the used entries.
|
|
||||||
*/
|
*/
|
||||||
size = mul_size(MaxBackends, sizeof(QueueBackendStatus));
|
size = mul_size(MaxBackends + 1, sizeof(QueueBackendStatus));
|
||||||
size = add_size(size, sizeof(AsyncQueueControl));
|
size = add_size(size, offsetof(AsyncQueueControl, backend));
|
||||||
|
|
||||||
asyncQueueControl = (AsyncQueueControl *)
|
asyncQueueControl = (AsyncQueueControl *)
|
||||||
ShmemInitStruct("Async Queue Control", size, &found);
|
ShmemInitStruct("Async Queue Control", size, &found);
|
||||||
@ -605,7 +604,8 @@ queue_listen(ListenActionKind action, const char *channel)
|
|||||||
oldcontext = MemoryContextSwitchTo(CurTransactionContext);
|
oldcontext = MemoryContextSwitchTo(CurTransactionContext);
|
||||||
|
|
||||||
/* space for terminating null is included in sizeof(ListenAction) */
|
/* space for terminating null is included in sizeof(ListenAction) */
|
||||||
actrec = (ListenAction *) palloc(sizeof(ListenAction) + strlen(channel));
|
actrec = (ListenAction *) palloc(offsetof(ListenAction, channel) +
|
||||||
|
strlen(channel) + 1);
|
||||||
actrec->action = action;
|
actrec->action = action;
|
||||||
strcpy(actrec->channel, channel);
|
strcpy(actrec->channel, channel);
|
||||||
|
|
||||||
|
@ -2172,7 +2172,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
uint8 attribute;
|
uint8 attribute;
|
||||||
uint8 length;
|
uint8 length;
|
||||||
uint8 data[1];
|
uint8 data[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} radius_attribute;
|
} radius_attribute;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -2220,7 +2220,6 @@ radius_add_attribute(radius_packet *packet, uint8 type, const unsigned char *dat
|
|||||||
"Adding attribute code %d with length %d to radius packet would create oversize packet, ignoring",
|
"Adding attribute code %d with length %d to radius packet would create oversize packet, ignoring",
|
||||||
type, len);
|
type, len);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
attr = (radius_attribute *) ((unsigned char *) packet + packet->length);
|
attr = (radius_attribute *) ((unsigned char *) packet + packet->length);
|
||||||
|
@ -93,7 +93,7 @@ typedef struct BufferAccessStrategyData
|
|||||||
* simplicity this is palloc'd together with the fixed fields of the
|
* simplicity this is palloc'd together with the fixed fields of the
|
||||||
* struct.
|
* struct.
|
||||||
*/
|
*/
|
||||||
Buffer buffers[1]; /* VARIABLE SIZE ARRAY */
|
Buffer buffers[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} BufferAccessStrategyData;
|
} BufferAccessStrategyData;
|
||||||
|
|
||||||
|
|
||||||
|
@ -184,12 +184,9 @@ typedef struct SISeg
|
|||||||
SharedInvalidationMessage buffer[MAXNUMMESSAGES];
|
SharedInvalidationMessage buffer[MAXNUMMESSAGES];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Per-backend state info.
|
* Per-backend invalidation state info (has MaxBackends entries).
|
||||||
*
|
|
||||||
* We declare procState as 1 entry because C wants a fixed-size array, but
|
|
||||||
* actually it is maxBackends entries long.
|
|
||||||
*/
|
*/
|
||||||
ProcState procState[1]; /* reflects the invalidation state */
|
ProcState procState[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} SISeg;
|
} SISeg;
|
||||||
|
|
||||||
static SISeg *shmInvalBuffer; /* pointer to the shared inval buffer */
|
static SISeg *shmInvalBuffer; /* pointer to the shared inval buffer */
|
||||||
@ -221,16 +218,12 @@ SInvalShmemSize(void)
|
|||||||
void
|
void
|
||||||
CreateSharedInvalidationState(void)
|
CreateSharedInvalidationState(void)
|
||||||
{
|
{
|
||||||
Size size;
|
|
||||||
int i;
|
int i;
|
||||||
bool found;
|
bool found;
|
||||||
|
|
||||||
/* Allocate space in shared memory */
|
/* Allocate space in shared memory */
|
||||||
size = offsetof(SISeg, procState);
|
|
||||||
size = add_size(size, mul_size(sizeof(ProcState), MaxBackends));
|
|
||||||
|
|
||||||
shmInvalBuffer = (SISeg *)
|
shmInvalBuffer = (SISeg *)
|
||||||
ShmemInitStruct("shmInvalBuffer", size, &found);
|
ShmemInitStruct("shmInvalBuffer", SInvalShmemSize(), &found);
|
||||||
if (found)
|
if (found)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -123,14 +123,14 @@ typedef int16 NumericDigit;
|
|||||||
struct NumericShort
|
struct NumericShort
|
||||||
{
|
{
|
||||||
uint16 n_header; /* Sign + display scale + weight */
|
uint16 n_header; /* Sign + display scale + weight */
|
||||||
NumericDigit n_data[1]; /* Digits */
|
NumericDigit n_data[FLEXIBLE_ARRAY_MEMBER]; /* Digits */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NumericLong
|
struct NumericLong
|
||||||
{
|
{
|
||||||
uint16 n_sign_dscale; /* Sign + display scale */
|
uint16 n_sign_dscale; /* Sign + display scale */
|
||||||
int16 n_weight; /* Weight of 1st digit */
|
int16 n_weight; /* Weight of 1st digit */
|
||||||
NumericDigit n_data[1]; /* Digits */
|
NumericDigit n_data[FLEXIBLE_ARRAY_MEMBER]; /* Digits */
|
||||||
};
|
};
|
||||||
|
|
||||||
union NumericChoice
|
union NumericChoice
|
||||||
|
@ -50,7 +50,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
int32 vl_len_; /* varlena header (do not touch directly!) */
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int32 flag;
|
int32 flag;
|
||||||
char data[1];
|
char data[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} SignTSVector;
|
} SignTSVector;
|
||||||
|
|
||||||
#define ARRKEY 0x01
|
#define ARRKEY 0x01
|
||||||
|
@ -44,7 +44,7 @@ typedef struct StatEntry
|
|||||||
struct StatEntry *left;
|
struct StatEntry *left;
|
||||||
struct StatEntry *right;
|
struct StatEntry *right;
|
||||||
uint32 lenlexeme;
|
uint32 lenlexeme;
|
||||||
char lexeme[1];
|
char lexeme[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} StatEntry;
|
} StatEntry;
|
||||||
|
|
||||||
#define STATENTRYHDRSZ (offsetof(StatEntry, lexeme))
|
#define STATENTRYHDRSZ (offsetof(StatEntry, lexeme))
|
||||||
|
@ -64,7 +64,8 @@ typedef struct
|
|||||||
uint32 nxip; /* number of txids in xip array */
|
uint32 nxip; /* number of txids in xip array */
|
||||||
txid xmin;
|
txid xmin;
|
||||||
txid xmax;
|
txid xmax;
|
||||||
txid xip[1]; /* in-progress txids, xmin <= xip[i] < xmax */
|
/* in-progress txids, xmin <= xip[i] < xmax: */
|
||||||
|
txid xip[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} TxidSnapshot;
|
} TxidSnapshot;
|
||||||
|
|
||||||
#define TXID_SNAPSHOT_SIZE(nxip) \
|
#define TXID_SNAPSHOT_SIZE(nxip) \
|
||||||
|
@ -51,12 +51,7 @@ typedef struct df_files
|
|||||||
ino_t inode; /* Inode number of file */
|
ino_t inode; /* Inode number of file */
|
||||||
#endif
|
#endif
|
||||||
void *handle; /* a handle for pg_dl* functions */
|
void *handle; /* a handle for pg_dl* functions */
|
||||||
char filename[1]; /* Full pathname of file */
|
char filename[FLEXIBLE_ARRAY_MEMBER]; /* Full pathname of file */
|
||||||
|
|
||||||
/*
|
|
||||||
* we allocate the block big enough for actual length of pathname.
|
|
||||||
* filename[] must be last item in struct!
|
|
||||||
*/
|
|
||||||
} DynamicFileList;
|
} DynamicFileList;
|
||||||
|
|
||||||
static DynamicFileList *file_list = NULL;
|
static DynamicFileList *file_list = NULL;
|
||||||
@ -217,13 +212,13 @@ internal_load_library(const char *libname)
|
|||||||
* File not loaded yet.
|
* File not loaded yet.
|
||||||
*/
|
*/
|
||||||
file_scanner = (DynamicFileList *)
|
file_scanner = (DynamicFileList *)
|
||||||
malloc(sizeof(DynamicFileList) + strlen(libname));
|
malloc(offsetof(DynamicFileList, filename) +strlen(libname) + 1);
|
||||||
if (file_scanner == NULL)
|
if (file_scanner == NULL)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_OUT_OF_MEMORY),
|
(errcode(ERRCODE_OUT_OF_MEMORY),
|
||||||
errmsg("out of memory")));
|
errmsg("out of memory")));
|
||||||
|
|
||||||
MemSet(file_scanner, 0, sizeof(DynamicFileList));
|
MemSet(file_scanner, 0, offsetof(DynamicFileList, filename));
|
||||||
strcpy(file_scanner->filename, libname);
|
strcpy(file_scanner->filename, libname);
|
||||||
file_scanner->device = stat_buf.st_dev;
|
file_scanner->device = stat_buf.st_dev;
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
|
@ -166,12 +166,9 @@ struct LogicalTapeSet
|
|||||||
int nFreeBlocks; /* # of currently free blocks */
|
int nFreeBlocks; /* # of currently free blocks */
|
||||||
int freeBlocksLen; /* current allocated length of freeBlocks[] */
|
int freeBlocksLen; /* current allocated length of freeBlocks[] */
|
||||||
|
|
||||||
/*
|
/* The array of logical tapes. */
|
||||||
* tapes[] is declared size 1 since C wants a fixed size, but actually it
|
|
||||||
* is of length nTapes.
|
|
||||||
*/
|
|
||||||
int nTapes; /* # of logical tapes in set */
|
int nTapes; /* # of logical tapes in set */
|
||||||
LogicalTape tapes[1]; /* must be last in struct! */
|
LogicalTape tapes[FLEXIBLE_ARRAY_MEMBER]; /* has nTapes nentries */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void ltsWriteBlock(LogicalTapeSet *lts, long blocknum, void *buffer);
|
static void ltsWriteBlock(LogicalTapeSet *lts, long blocknum, void *buffer);
|
||||||
@ -519,12 +516,11 @@ LogicalTapeSetCreate(int ntapes)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create top-level struct including per-tape LogicalTape structs. First
|
* Create top-level struct including per-tape LogicalTape structs.
|
||||||
* LogicalTape struct is already counted in sizeof(LogicalTapeSet).
|
|
||||||
*/
|
*/
|
||||||
Assert(ntapes > 0);
|
Assert(ntapes > 0);
|
||||||
lts = (LogicalTapeSet *) palloc(sizeof(LogicalTapeSet) +
|
lts = (LogicalTapeSet *) palloc(offsetof(LogicalTapeSet, tapes) +
|
||||||
(ntapes - 1) *sizeof(LogicalTape));
|
ntapes * sizeof(LogicalTape));
|
||||||
lts->pfile = BufFileCreateTemp(false);
|
lts->pfile = BufFileCreateTemp(false);
|
||||||
lts->nFileBlocks = 0L;
|
lts->nFileBlocks = 0L;
|
||||||
lts->forgetFreeSpace = false;
|
lts->forgetFreeSpace = false;
|
||||||
|
@ -33,7 +33,7 @@ enum ARRAY_TYPE
|
|||||||
struct ECPGgeneric_varchar
|
struct ECPGgeneric_varchar
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
char arr[1];
|
char arr[FLEXIBLE_ARRAY_MEMBER];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user