Replace some bogus "x[1]" declarations with "x[FLEXIBLE_ARRAY_MEMBER]".
Aside from being more self-documenting, this should help prevent bogus
warnings from static code analyzers and perhaps compiler misoptimizations.
This patch is just a down payment on eliminating the whole problem, but
it gets rid of a lot of easy-to-fix cases.
Note that the main problem with doing this is that one must no longer rely
on computing sizeof(the containing struct), since the result would be
compiler-dependent. Instead use offsetof(struct, lastfield). Autoconf
also warns against spelling that offsetof(struct, lastfield[0]).
Michael Paquier, review and additional fixes by me.
unsigned int header;
/*
- * Variable length array. The lower left coordinates for each dimension
- * come first, followed by upper right coordinates unless the point flag
- * is set.
+ * The lower left coordinates for each dimension come first, followed by
+ * upper right coordinates unless the point flag is set.
*/
- double x[1];
+ double x[FLEXIBLE_ARRAY_MEMBER];
} NDBOX;
#define POINT_BIT 0x80000000
#define LL_COORD(cube, i) ( (cube)->x[i] )
#define UR_COORD(cube, i) ( IS_POINT(cube) ? (cube)->x[i] : (cube)->x[(i) + DIM(cube)] )
-#define POINT_SIZE(_dim) (offsetof(NDBOX, x[0]) + sizeof(double)*(_dim))
-#define CUBE_SIZE(_dim) (offsetof(NDBOX, x[0]) + sizeof(double)*(_dim)*2)
+#define POINT_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim))
+#define CUBE_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim)*2)
-#define DatumGetNDBOX(x) ((NDBOX*)DatumGetPointer(x))
-#define PG_GETARG_NDBOX(x) DatumGetNDBOX( PG_DETOAST_DATUM(PG_GETARG_DATUM(x)) )
+#define DatumGetNDBOX(x) ((NDBOX *) PG_DETOAST_DATUM(x))
+#define PG_GETARG_NDBOX(x) DatumGetNDBOX(PG_GETARG_DATUM(x))
#define PG_RETURN_NDBOX(x) PG_RETURN_POINTER(x)
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 flag;
- char data[1];
+ char data[FLEXIBLE_ARRAY_MEMBER];
} GISTTYPE;
#define ALLISTRUE 0x04
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 size; /* number of ITEMs */
- ITEM items[1]; /* variable length array */
+ ITEM items[FLEXIBLE_ARRAY_MEMBER];
} QUERYTYPE;
#define HDRSIZEQT offsetof(QUERYTYPE, items)
typedef struct
{
uint16 len;
- char name[1];
+ char name[FLEXIBLE_ARRAY_MEMBER];
} ltree_level;
#define LEVEL_HDRSIZE (offsetof(ltree_level,name))
{
int32 vl_len_; /* varlena header (do not touch directly!) */
uint16 numlevel;
- char data[1];
+ char data[FLEXIBLE_ARRAY_MEMBER];
} ltree;
#define LTREE_HDRSIZE MAXALIGN( offsetof(ltree, data) )
int32 val;
uint16 len;
uint8 flag;
- char name[1];
+ char name[FLEXIBLE_ARRAY_MEMBER];
} lquery_variant;
#define LVAR_HDRSIZE MAXALIGN(offsetof(lquery_variant, name))
uint16 numvar;
uint16 low;
uint16 high;
- char variants[1];
+ char variants[FLEXIBLE_ARRAY_MEMBER];
} lquery_level;
#define LQL_HDRSIZE MAXALIGN( offsetof(lquery_level,variants) )
uint16 numlevel;
uint16 firstgood;
uint16 flag;
- char data[1];
+ char data[FLEXIBLE_ARRAY_MEMBER];
} lquery;
#define LQUERY_HDRSIZE MAXALIGN( offsetof(lquery, data) )
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 size;
- char data[1];
+ char data[FLEXIBLE_ARRAY_MEMBER];
} ltxtquery;
#define HDRSIZEQT MAXALIGN(VARHDRSZ + sizeof(int32))
{
int32 vl_len_; /* varlena header (do not touch directly!) */
uint32 flag;
- char data[1];
+ char data[FLEXIBLE_ARRAY_MEMBER];
} ltree_gist;
#define LTG_ONENODE 0x01
* Check that enough data was supplied, so that we don't try to access
* fields outside the supplied buffer.
*/
- if (raw_page_size < sizeof(PageHeaderData))
+ if (raw_page_size < SizeOfPageHeaderData)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("input page too small (%d bytes)", raw_page_size)));
{
int32 vl_len_; /* varlena header (do not touch directly!) */
uint8 flag;
- char data[1];
+ char data[FLEXIBLE_ARRAY_MEMBER];
} TRGM;
#define TRGMHDRSIZE (VARHDRSZ + sizeof(uint8))
* with the answer changing under them, or that they already hold some
* appropriate lock, and therefore return the first answer we get without
* checking for invalidation messages. Also, if the requested lock is
- * already held, LockRelationOid will not AcceptInvalidationMessages,
- * so we may fail to notice a change. We could protect against that case
- * by calling AcceptInvalidationMessages() before beginning this loop, but
+ * already held, LockRelationOid will not AcceptInvalidationMessages, so
+ * we may fail to notice a change. We could protect against that case by
+ * calling AcceptInvalidationMessages() before beginning this loop, but
* that would add a significant amount overhead, so for now we don't.
*/
for (;;)
*/
effective_nargs = Max(pronargs, nargs);
newResult = (FuncCandidateList)
- palloc(sizeof(struct _FuncCandidateList) - sizeof(Oid)
- + effective_nargs * sizeof(Oid));
+ palloc(offsetof(struct _FuncCandidateList, args) +
+ effective_nargs * sizeof(Oid));
newResult->pathpos = pathpos;
newResult->oid = HeapTupleGetOid(proctup);
newResult->nargs = effective_nargs;
* separate palloc for each operator, but profiling revealed that the
* pallocs used an unreasonably large fraction of parsing time.
*/
-#define SPACE_PER_OP MAXALIGN(sizeof(struct _FuncCandidateList) + sizeof(Oid))
+#define SPACE_PER_OP MAXALIGN(offsetof(struct _FuncCandidateList, args) + \
+ 2 * sizeof(Oid))
if (catlist->n_members > 0)
resultSpace = palloc(catlist->n_members * SPACE_PER_OP);
/* Prepare the expressions for execution */
exprstates = (List *) ExecPrepareExpr((Expr *) params, estate);
- /* sizeof(ParamListInfoData) includes the first array element */
paramLI = (ParamListInfo)
- palloc(sizeof(ParamListInfoData) +
- (num_params - 1) * sizeof(ParamExternData));
+ palloc(offsetof(ParamListInfoData, params) +
+ num_params * sizeof(ParamExternData));
/* we have static list of params, so no hooks needed */
paramLI->paramFetch = NULL;
paramLI->paramFetchArg = NULL;
if (fcache->paramLI == NULL)
{
- /* sizeof(ParamListInfoData) includes the first array element */
- paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) +
- (nargs - 1) * sizeof(ParamExternData));
+ paramLI = (ParamListInfo)
+ palloc(offsetof(ParamListInfoData, params) +
+ nargs * sizeof(ParamExternData));
/* we have static list of params, so no hooks needed */
paramLI->paramFetch = NULL;
paramLI->paramFetchArg = NULL;
{
int i;
- /* sizeof(ParamListInfoData) includes the first array element */
- paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) +
- (nargs - 1) * sizeof(ParamExternData));
+ paramLI = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) +
+ nargs * sizeof(ParamExternData));
/* we have static list of params, so no hooks needed */
paramLI->paramFetch = NULL;
paramLI->paramFetchArg = NULL;
if (from == NULL || from->numParams <= 0)
return NULL;
- /* sizeof(ParamListInfoData) includes the first array element */
- size = sizeof(ParamListInfoData) +
- (from->numParams - 1) * sizeof(ParamExternData);
+ size = offsetof(ParamListInfoData, params) +
+ from->numParams * sizeof(ParamExternData);
retval = (ParamListInfo) palloc(size);
retval->paramFetch = NULL;
int dest = LOG_DESTINATION_STDERR;
/* While we have enough for a header, process data... */
- while (count >= (int) sizeof(PipeProtoHeader))
+ while (count >= (int) (offsetof(PipeProtoHeader, data) +1))
{
PipeProtoHeader p;
int chunklen;
/* Do we have a valid header? */
- memcpy(&p, cursor, sizeof(PipeProtoHeader));
+ memcpy(&p, cursor, offsetof(PipeProtoHeader, data));
if (p.nuls[0] == '\0' && p.nuls[1] == '\0' &&
p.len > 0 && p.len <= PIPE_MAX_PAYLOAD &&
p.pid != 0 &&
{
int paramno;
- /* sizeof(ParamListInfoData) includes the first array element */
- params = (ParamListInfo) palloc(sizeof(ParamListInfoData) +
- (numParams - 1) * sizeof(ParamExternData));
+ params = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) +
+ numParams * sizeof(ParamExternData));
/* we have static list of params, so no hooks needed */
params->paramFetch = NULL;
params->paramFetchArg = NULL;
}
base_size = sizeof(path->p[0]) * npts;
- size = offsetof(PATH, p[0]) +base_size;
+ size = offsetof(PATH, p) +base_size;
/* Check for integer overflow */
if (base_size / npts != sizeof(path->p[0]) || size <= base_size)
closed = pq_getmsgbyte(buf);
npts = pq_getmsgint(buf, sizeof(int32));
- if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(PATH, p[0])) / sizeof(Point)))
+ if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(PATH, p)) / sizeof(Point)))
ereport(ERROR,
(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
errmsg("invalid number of points in external \"path\" value")));
- size = offsetof(PATH, p[0]) +sizeof(path->p[0]) * npts;
+ size = offsetof(PATH, p) +sizeof(path->p[0]) * npts;
path = (PATH *) palloc(size);
SET_VARSIZE(path, size);
errmsg("invalid input syntax for type polygon: \"%s\"", str)));
base_size = sizeof(poly->p[0]) * npts;
- size = offsetof(POLYGON, p[0]) +base_size;
+ size = offsetof(POLYGON, p) +base_size;
/* Check for integer overflow */
if (base_size / npts != sizeof(poly->p[0]) || size <= base_size)
int size;
npts = pq_getmsgint(buf, sizeof(int32));
- if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(POLYGON, p[0])) / sizeof(Point)))
+ if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(POLYGON, p)) / sizeof(Point)))
ereport(ERROR,
(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
errmsg("invalid number of points in external \"polygon\" value")));
- size = offsetof(POLYGON, p[0]) +sizeof(poly->p[0]) * npts;
+ size = offsetof(POLYGON, p) +sizeof(poly->p[0]) * npts;
poly = (POLYGON *) palloc0(size); /* zero any holes */
SET_VARSIZE(poly, size);
PG_RETURN_NULL();
base_size = sizeof(p1->p[0]) * (p1->npts + p2->npts);
- size = offsetof(PATH, p[0]) +base_size;
+ size = offsetof(PATH, p) +base_size;
/* Check for integer overflow */
if (base_size / sizeof(p1->p[0]) != (p1->npts + p2->npts) ||
* Never overflows: the old size fit in MaxAllocSize, and the new size is
* just a small constant larger.
*/
- size = offsetof(POLYGON, p[0]) +sizeof(poly->p[0]) * path->npts;
+ size = offsetof(POLYGON, p) +sizeof(poly->p[0]) * path->npts;
poly = (POLYGON *) palloc(size);
SET_VARSIZE(poly, size);
int size;
/* map four corners of the box to a polygon */
- size = offsetof(POLYGON, p[0]) +sizeof(poly->p[0]) * 4;
+ size = offsetof(POLYGON, p) +sizeof(poly->p[0]) * 4;
poly = (POLYGON *) palloc(size);
SET_VARSIZE(poly, size);
* Never overflows: the old size fit in MaxAllocSize, and the new size is
* smaller by a small constant.
*/
- size = offsetof(PATH, p[0]) +sizeof(path->p[0]) * poly->npts;
+ size = offsetof(PATH, p) +sizeof(path->p[0]) * poly->npts;
path = (PATH *) palloc(size);
SET_VARSIZE(path, size);
errmsg("must request at least 2 points")));
base_size = sizeof(poly->p[0]) * npts;
- size = offsetof(POLYGON, p[0]) +base_size;
+ size = offsetof(POLYGON, p) +base_size;
/* Check for integer overflow */
if (base_size / npts != sizeof(poly->p[0]) || size <= base_size)
oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
nmembers = list_length(ctlist);
cl = (CatCList *)
- palloc(sizeof(CatCList) + nmembers * sizeof(CatCTup *));
+ palloc(offsetof(CatCList, members) +nmembers * sizeof(CatCTup *));
heap_copytuple_with_tuple(ntp, &cl->tuple);
MemoryContextSwitchTo(oldcxt);
heap_freetuple(ntp);
{
SimpleStringListCell *cell;
- /* this calculation correctly accounts for the null trailing byte */
cell = (SimpleStringListCell *)
- pg_malloc(sizeof(SimpleStringListCell) + strlen(val));
+ pg_malloc(offsetof(SimpleStringListCell, val) +strlen(val) + 1);
cell->next = NULL;
strcpy(cell->val, val);
typedef struct SimpleStringListCell
{
struct SimpleStringListCell *next;
- char val[1]; /* VARIABLE LENGTH FIELD */
+ char val[FLEXIBLE_ARRAY_MEMBER]; /* null-terminated string here */
} SimpleStringListCell;
typedef struct SimpleStringList
{
int32 vl_len_; /* varlena header (do not touch directly!) */
bool useFastUpdate; /* use fast updates? */
- int pendingListCleanupSize; /* maximum size of pending list */
+ int pendingListCleanupSize; /* maximum size of pending list */
} GinOptions;
#define GIN_DEFAULT_USE_FASTUPDATE true
{
ItemPointerData first; /* first item in this posting list (unpacked) */
uint16 nbytes; /* number of bytes that follow */
- unsigned char bytes[1]; /* varbyte encoded items (variable length) */
+ unsigned char bytes[FLEXIBLE_ARRAY_MEMBER]; /* varbyte encoded items */
} GinPostingList;
#define SizeOfGinPostingList(plist) (offsetof(GinPostingList, bytes) + SHORTALIGN((plist)->nbytes) )
{
BlockNumber prev;
uint32 freespace;
- char tupledata[1];
+ char tupledata[FLEXIBLE_ARRAY_MEMBER];
} GISTNodeBufferPage;
#define BUFFER_PAGE_DATA_OFFSET MAXALIGN(offsetof(GISTNodeBufferPage, tupledata))
/* we must store parentlsn to detect whether a split occurred */
GISTSearchHeapItem heap; /* heap info, if heap tuple */
} data;
- double distances[1]; /* array with numberOfOrderBys entries */
+ double distances[FLEXIBLE_ARRAY_MEMBER]; /* numberOfOrderBys
+ * entries */
} GISTSearchItem;
#define GISTSearchItemIsHeap(item) ((item).blkno == InvalidBlockNumber)
typedef struct GISTScanOpaqueData
{
GISTSTATE *giststate; /* index information, see above */
- pairingheap *queue; /* queue of unvisited items */
+ pairingheap *queue; /* queue of unvisited items */
MemoryContext queueCxt; /* context holding the queue */
bool qual_ok; /* false if qual can never be satisfied */
bool firstCall; /* true until first gistgettuple call */
{
uint8 flags;
uint16 ntuples;
- OffsetNumber offsets[1];
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
} xl_heap_multi_insert;
#define SizeOfHeapMultiInsert offsetof(xl_heap_multi_insert, offsets)
* the dead tuple from the source
*----------
*/
- OffsetNumber offsets[1];
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
} spgxlogMoveLeafs;
#define SizeOfSpgxlogMoveLeafs offsetof(spgxlogMoveLeafs, offsets)
* list of leaf tuples, length nInsert (unaligned!)
*----------
*/
- OffsetNumber offsets[1];
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
} spgxlogPickSplit;
#define SizeOfSpgxlogPickSplit offsetof(spgxlogPickSplit, offsets)
* tuple numbers to insert in nextOffset links
*----------
*/
- OffsetNumber offsets[1];
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
} spgxlogVacuumLeaf;
#define SizeOfSpgxlogVacuumLeaf offsetof(spgxlogVacuumLeaf, offsets)
spgxlogState stateSrc;
/* offsets of tuples to delete follow */
- OffsetNumber offsets[1];
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
} spgxlogVacuumRoot;
#define SizeOfSpgxlogVacuumRoot offsetof(spgxlogVacuumRoot, offsets)
TransactionId newestRedirectXid; /* newest XID of removed redirects */
/* offsets of redirect tuples to make placeholders follow */
- OffsetNumber offsets[1];
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
} spgxlogVacuumRedirect;
#define SizeOfSpgxlogVacuumRedirect offsetof(spgxlogVacuumRedirect, offsets)
{
TransactionId xtop; /* assigned XID's top-level XID */
int nsubxacts; /* number of subtransaction XIDs */
- TransactionId xsub[1]; /* assigned subxids */
+ TransactionId xsub[FLEXIBLE_ARRAY_MEMBER]; /* assigned subxids */
} xl_xact_assignment;
#define MinSizeOfXactAssignment offsetof(xl_xact_assignment, xsub)
TimestampTz xact_time; /* time of commit */
int nsubxacts; /* number of subtransaction XIDs */
/* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
- TransactionId subxacts[1]; /* VARIABLE LENGTH ARRAY */
+ TransactionId subxacts[FLEXIBLE_ARRAY_MEMBER];
} xl_xact_commit_compact;
#define MinSizeOfXactCommitCompact offsetof(xl_xact_commit_compact, subxacts)
Oid dbId; /* MyDatabaseId */
Oid tsId; /* MyDatabaseTableSpace */
/* Array of RelFileNode(s) to drop at commit */
- RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */
+ RelFileNode xnodes[FLEXIBLE_ARRAY_MEMBER];
/* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
/* ARRAY OF SHARED INVALIDATION MESSAGES FOLLOWS */
} xl_xact_commit;
int nrels; /* number of RelFileNodes */
int nsubxacts; /* number of subtransaction XIDs */
/* Array of RelFileNode(s) to drop at abort */
- RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */
+ RelFileNode xnodes[FLEXIBLE_ARRAY_MEMBER];
/* ARRAY OF ABORTED SUBTRANSACTION XIDs FOLLOWS */
} xl_xact_abort;
Oid elemtype;
int dim1;
int lbound1;
- int16 values[1]; /* VARIABLE LENGTH ARRAY */
-} int2vector; /* VARIABLE LENGTH STRUCT */
+ int16 values[FLEXIBLE_ARRAY_MEMBER];
+} int2vector;
typedef struct
{
Oid elemtype;
int dim1;
int lbound1;
- Oid values[1]; /* VARIABLE LENGTH ARRAY */
-} oidvector; /* VARIABLE LENGTH STRUCT */
+ Oid values[FLEXIBLE_ARRAY_MEMBER];
+} oidvector;
/*
* Representation of a Name: effectively just a C string, but null-padded to
int nvargs; /* number of args to become variadic array */
int ndargs; /* number of defaulted args */
int *argnumbers; /* args' positional indexes, if named call */
- Oid args[1]; /* arg types --- VARIABLE LENGTH ARRAY */
-} *FuncCandidateList; /* VARIABLE LENGTH STRUCT */
+ Oid args[FLEXIBLE_ARRAY_MEMBER]; /* arg types */
+} *FuncCandidateList;
/*
* Structure for xxxOverrideSearchPath functions
#define XLOG_DBASE_CREATE 0x00
#define XLOG_DBASE_DROP 0x10
-typedef struct xl_dbase_create_rec_old
-{
- /* Records copying of a single subdirectory incl. contents */
- Oid db_id;
- char src_path[1]; /* VARIABLE LENGTH STRING */
- /* dst_path follows src_path */
-} xl_dbase_create_rec_old;
-
-typedef struct xl_dbase_drop_rec_old
-{
- /* Records dropping of a single subdirectory incl. contents */
- Oid db_id;
- char dir_path[1]; /* VARIABLE LENGTH STRING */
-} xl_dbase_drop_rec_old;
-
typedef struct xl_dbase_create_rec
{
/* Records copying of a single subdirectory incl. contents */
typedef struct xl_tblspc_create_rec
{
Oid ts_id;
- char ts_path[1]; /* VARIABLE LENGTH STRING */
+ char ts_path[FLEXIBLE_ARRAY_MEMBER]; /* null-terminated string */
} xl_tblspc_create_rec;
typedef struct xl_tblspc_drop_rec
struct HashMemoryChunkData *next; /* pointer to the next chunk (linked list) */
- char data[1]; /* buffer allocated at the end */
+ char data[FLEXIBLE_ARRAY_MEMBER]; /* buffer allocated at the end */
} HashMemoryChunkData;
typedef struct HashMemoryChunkData *HashMemoryChunk;
typedef struct Bitmapset
{
int nwords; /* number of words in array */
- bitmapword words[1]; /* really [nwords] */
-} Bitmapset; /* VARIABLE LENGTH STRUCT */
+ bitmapword words[FLEXIBLE_ARRAY_MEMBER]; /* really [nwords] */
+} Bitmapset;
/* result of bms_subset_compare */
ParserSetupHook parserSetup; /* parser setup hook */
void *parserSetupArg;
int numParams; /* number of ParamExternDatas following */
- ParamExternData params[1]; /* VARIABLE LENGTH ARRAY */
+ ParamExternData params[FLEXIBLE_ARRAY_MEMBER];
} ParamListInfoData;
int ntuples; /* -1 indicates lossy result */
bool recheck; /* should the tuples be rechecked? */
/* Note: recheck is always true if ntuples < 0 */
- OffsetNumber offsets[1]; /* VARIABLE LENGTH ARRAY */
-} TBMIterateResult; /* VARIABLE LENGTH STRUCT */
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
+} TBMIterateResult;
/* function prototypes in nodes/tidbitmap.c */
struct /* Normal varlena (4-byte length) */
{
uint32 va_header;
- char va_data[1];
+ char va_data[FLEXIBLE_ARRAY_MEMBER];
} va_4byte;
struct /* Compressed-in-line format */
{
uint32 va_header;
uint32 va_rawsize; /* Original data size (excludes header) */
- char va_data[1]; /* Compressed data */
+ char va_data[FLEXIBLE_ARRAY_MEMBER]; /* Compressed data */
} va_compressed;
} varattrib_4b;
typedef struct
{
uint8 va_header;
- char va_data[1]; /* Data begins here */
+ char va_data[FLEXIBLE_ARRAY_MEMBER]; /* Data begins here */
} varattrib_1b;
/* TOAST pointers are a subset of varattrib_1b with an identifying tag byte */
{
uint8 va_header; /* Always 0x80 or 0x01 */
uint8 va_tag; /* Type of datum */
- char va_data[1]; /* Data (of the type indicated by va_tag) */
+ char va_data[FLEXIBLE_ARRAY_MEMBER]; /* Type-specific data */
} varattrib_1b_e;
/*
int32 pid; /* writer's pid */
char is_last; /* last chunk of message? 't' or 'f' ('T' or
* 'F' for CSV case) */
- char data[1]; /* data payload starts here */
+ char data[FLEXIBLE_ARRAY_MEMBER]; /* data payload starts here */
} PipeProtoHeader;
typedef union
* Pointer to the walsender's latch. Used by backends to wake up this
* walsender when it has work to do. NULL if the walsender isn't active.
*/
- Latch *latch;
+ Latch *latch;
/*
* The priority order of the standby managed by this WALSender, as listed
*/
bool sync_standbys_defined;
- WalSnd walsnds[1]; /* VARIABLE LENGTH ARRAY */
+ WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER];
} WalSndCtlData;
extern WalSndCtlData *WalSndCtl;
LocationIndex pd_special; /* offset to start of special space */
uint16 pd_pagesize_version;
TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
- ItemIdData pd_linp[1]; /* beginning of line pointer array */
+ ItemIdData pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */
} PageHeaderData;
typedef PageHeaderData *PageHeader;
* NonLeafNodesPerPage elements are upper nodes, and the following
* LeafNodesPerPage elements are leaf nodes. Unused nodes are zero.
*/
- uint8 fp_nodes[1];
+ uint8 fp_nodes[FLEXIBLE_ARRAY_MEMBER];
} FSMPageData;
typedef FSMPageData *FSMPage;
typedef struct xl_standby_locks
{
int nlocks; /* number of entries in locks array */
- xl_standby_lock locks[1]; /* VARIABLE LENGTH ARRAY */
+ xl_standby_lock locks[FLEXIBLE_ARRAY_MEMBER];
} xl_standby_locks;
/*
TransactionId oldestRunningXid; /* *not* oldestXmin */
TransactionId latestCompletedXid; /* so we can set xmax */
- TransactionId xids[1]; /* VARIABLE LENGTH ARRAY */
+ TransactionId xids[FLEXIBLE_ARRAY_MEMBER];
} xl_running_xacts;
#define MinSizeOfXactRunningXacts offsetof(xl_running_xacts, xids)
len:16,
unused:14;
struct RegisNode *next;
- unsigned char data[1];
+ unsigned char data[FLEXIBLE_ARRAY_MEMBER];
} RegisNode;
#define RNHDRSZ (offsetof(RegisNode,data))
typedef struct SPNode
{
uint32 length;
- SPNodeData data[1];
+ SPNodeData data[FLEXIBLE_ARRAY_MEMBER];
} SPNode;
#define SPNHDRSZ (offsetof(SPNode,data))
int len;
} d;
} p;
- char word[1]; /* variable length, null-terminated */
+ char word[FLEXIBLE_ARRAY_MEMBER];
} SPELL;
#define SPELLHDRSZ (offsetof(SPELL, word))
{
uint32 isvoid:1,
length:31;
- AffixNodeData data[1];
+ AffixNodeData data[FLEXIBLE_ARRAY_MEMBER];
} AffixNode;
#define ANHRDSZ (offsetof(AffixNode, data))
typedef struct
{
uint16 npos;
- WordEntryPos pos[1]; /* variable length */
+ WordEntryPos pos[FLEXIBLE_ARRAY_MEMBER];
} WordEntryPosVector;
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 size;
- WordEntry entries[1]; /* variable length */
+ WordEntry entries[FLEXIBLE_ARRAY_MEMBER];
/* lexemes follow the entries[] array */
} TSVectorData;
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 size; /* number of QueryItems */
- char data[1]; /* data starts here */
+ char data[FLEXIBLE_ARRAY_MEMBER]; /* data starts here */
} TSQueryData;
typedef TSQueryData *TSQuery;
uint32 hash_value; /* hash value for lookup keys */
HeapTupleData tuple; /* header for tuple holding keys */
int n_members; /* number of member tuples */
- CatCTup *members[1]; /* members --- VARIABLE LENGTH ARRAY */
-} CatCList; /* VARIABLE LENGTH STRUCT */
+ CatCTup *members[FLEXIBLE_ARRAY_MEMBER]; /* members */
+} CatCList;
typedef struct catcacheheader
{
Size tblsize; /* size in bytes of TimeZoneAbbrevTable */
int numabbrevs; /* number of entries in abbrevs[] array */
- datetkn abbrevs[1]; /* VARIABLE LENGTH ARRAY */
+ datetkn abbrevs[FLEXIBLE_ARRAY_MEMBER];
/* DynamicZoneAbbrev(s) may follow the abbrevs[] array */
} TimeZoneAbbrevTable;
typedef struct DynamicZoneAbbrev
{
pg_tz *tz; /* NULL if not yet looked up */
- char zone[1]; /* zone name (var length, NUL-terminated) */
+ char zone[FLEXIBLE_ARRAY_MEMBER]; /* NUL-terminated zone name */
} DynamicZoneAbbrev;
int32 npts;
int32 closed; /* is this a closed polygon? */
int32 dummy; /* padding to make it double align */
- Point p[1]; /* variable length array of POINTs */
+ Point p[FLEXIBLE_ARRAY_MEMBER];
} PATH;
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 npts;
BOX boundbox;
- Point p[1]; /* variable length array of POINTs */
+ Point p[FLEXIBLE_ARRAY_MEMBER];
} POLYGON;
/*---------------------------------------------------------------------
{
uint32 header; /* number of elements or key/value pairs, and
* flags */
- JEntry children[1]; /* variable length */
+ JEntry children[FLEXIBLE_ARRAY_MEMBER];
/* the data for each child node follows. */
} JsonbContainer;
Oid dbid; /* database ID, or 0 for shared map */
Oid tsid; /* database's tablespace, or pg_global */
int32 nbytes; /* size of relmap data */
- char data[1]; /* VARIABLE LENGTH ARRAY */
+ char data[FLEXIBLE_ARRAY_MEMBER];
} xl_relmap_update;
#define MinSizeOfRelmapUpdate offsetof(xl_relmap_update, data)
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 bit_len; /* number of valid bits */
- bits8 bit_dat[1]; /* bit string, most sig. byte first */
+ bits8 bit_dat[FLEXIBLE_ARRAY_MEMBER]; /* bit string, most sig. byte
+ * first */
} VarBit;
/*