]> granicus.if.org Git - postgresql/commitdiff
Use FLEXIBLE_ARRAY_MEMBER in struct varlena.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 21:51:53 +0000 (16:51 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 21:51:53 +0000 (16:51 -0500)
This forces some minor coding adjustments in tuptoaster.c and inv_api.c,
but the new coding there is cleaner anyway.

Michael Paquier

src/backend/access/heap/tuptoaster.c
src/backend/storage/large_object/inv_api.c
src/include/c.h

index f8c1401d7fa483436aeebecc44b0ca80b913a0c9..deb33720ab7568f60f6d06ea1ee8bed776be4e07 100644 (file)
@@ -1365,11 +1365,13 @@ toast_save_datum(Relation rel, Datum value,
        CommandId       mycid = GetCurrentCommandId(true);
        struct varlena *result;
        struct varatt_external toast_pointer;
-       struct
+       union
        {
                struct varlena hdr;
-               char            data[TOAST_MAX_CHUNK_SIZE]; /* make struct big enough */
-               int32           align_it;       /* ensure struct is aligned well enough */
+               /* this is to make the union big enough for a chunk: */
+               char            data[TOAST_MAX_CHUNK_SIZE + VARHDRSZ];
+               /* ensure union is aligned well enough: */
+               int32           align_it;
        }                       chunk_data;
        int32           chunk_size;
        int32           chunk_seq = 0;
index a19c40186f5b295f4de2a4034ef2865bf8aad1ae..ecd5e618f3c25cc257fa503dbcf5014e9bce2088 100644 (file)
@@ -562,11 +562,13 @@ inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
        bool            neednextpage;
        bytea      *datafield;
        bool            pfreeit;
-       struct
+       union
        {
                bytea           hdr;
-               char            data[LOBLKSIZE];        /* make struct big enough */
-               int32           align_it;       /* ensure struct is aligned well enough */
+               /* this is to make the union big enough for a LO data chunk: */
+               char            data[LOBLKSIZE + VARHDRSZ];
+               /* ensure union is aligned well enough: */
+               int32           align_it;
        }                       workbuf;
        char       *workb = VARDATA(&workbuf.hdr);
        HeapTuple       newtup;
@@ -748,11 +750,13 @@ inv_truncate(LargeObjectDesc *obj_desc, int64 len)
        SysScanDesc sd;
        HeapTuple       oldtuple;
        Form_pg_largeobject olddata;
-       struct
+       union
        {
                bytea           hdr;
-               char            data[LOBLKSIZE];        /* make struct big enough */
-               int32           align_it;       /* ensure struct is aligned well enough */
+               /* this is to make the union big enough for a LO data chunk: */
+               char            data[LOBLKSIZE + VARHDRSZ];
+               /* ensure union is aligned well enough: */
+               int32           align_it;
        }                       workbuf;
        char       *workb = VARDATA(&workbuf.hdr);
        HeapTuple       newtup;
index 2de86f91416f368ff7cd9260403ef032ae86f9c8..ee615ee687f8249fed037136cfd0cc6027d1ccaa 100644 (file)
@@ -391,7 +391,7 @@ typedef struct
 struct varlena
 {
        char            vl_len_[4];             /* Do not touch this field directly! */
-       char            vl_dat[1];
+       char            vl_dat[FLEXIBLE_ARRAY_MEMBER];  /* Data content is here */
 };
 
 #define VARHDRSZ               ((int32) sizeof(int32))