Reorder pg_sequence columns to avoid alignment issue
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 21 Dec 2016 17:00:00 +0000 (12:00 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 21 Dec 2016 14:06:49 +0000 (09:06 -0500)
On AIX, doubles are aligned at 4 bytes, but int64 is aligned at 8 bytes.
Our code assumes that doubles have alignment that can also be applied to
int64, but that fails in this case.  One effect is that
heap_form_tuple() writes tuples in a different layout than
Form_pg_sequence expects.

Rather than rewrite the whole alignment code, work around the issue by
reordering the columns in pg_sequence so that the first int64 column
naturally comes out at an 8-byte boundary.

doc/src/sgml/catalogs.sgml
src/backend/commands/sequence.c
src/include/catalog/catversion.h
src/include/catalog/pg_sequence.h

index 7a7bbde390b0887a5eb13fc1ef04c164c502c7db..493050618df25c7037bdf0c48769fd0d3d75b78f 100644 (file)
       <entry>The OID of the <structname>pg_class</> entry for this sequence</entry>
      </row>
 
+     <row>
+      <entry><structfield>seqcycle</structfield></entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>Whether the sequence cycles</entry>
+     </row>
+
      <row>
       <entry><structfield>seqstart</structfield></entry>
       <entry><type>int8</type></entry>
       <entry></entry>
       <entry>Cache size of the sequence</entry>
      </row>
-
-     <row>
-      <entry><structfield>seqcycle</structfield></entry>
-      <entry><type>bool</type></entry>
-      <entry></entry>
-      <entry>Whether the sequence cycles</entry>
-     </row>
     </tbody>
    </tgroup>
   </table>
index cdd32bc17e031ccf68414e5ed5e346397eecdbf0..668d82771a800e967d15afbb4daf460f50ac8e17 100644 (file)
@@ -227,12 +227,12 @@ DefineSequence(ParseState *pstate, CreateSeqStmt *seq)
    memset(pgs_nulls, 0, sizeof(pgs_nulls));
 
    pgs_values[Anum_pg_sequence_seqrelid - 1] = ObjectIdGetDatum(seqoid);
+   pgs_values[Anum_pg_sequence_seqcycle - 1] = BoolGetDatum(seqform.seqcycle);
    pgs_values[Anum_pg_sequence_seqstart - 1] = Int64GetDatumFast(seqform.seqstart);
    pgs_values[Anum_pg_sequence_seqincrement - 1] = Int64GetDatumFast(seqform.seqincrement);
    pgs_values[Anum_pg_sequence_seqmax - 1] = Int64GetDatumFast(seqform.seqmax);
    pgs_values[Anum_pg_sequence_seqmin - 1] = Int64GetDatumFast(seqform.seqmin);
    pgs_values[Anum_pg_sequence_seqcache - 1] = Int64GetDatumFast(seqform.seqcache);
-   pgs_values[Anum_pg_sequence_seqcycle - 1] = BoolGetDatum(seqform.seqcycle);
 
    tuple = heap_form_tuple(tupDesc, pgs_values, pgs_nulls);
    simple_heap_insert(rel, tuple);
@@ -622,11 +622,11 @@ nextval_internal(Oid relid)
    if (!HeapTupleIsValid(pgstuple))
        elog(ERROR, "cache lookup failed for sequence %u", relid);
    pgsform = (Form_pg_sequence) GETSTRUCT(pgstuple);
+   cycle = pgsform->seqcycle;
    incby = pgsform->seqincrement;
    maxv = pgsform->seqmax;
    minv = pgsform->seqmin;
    cache = pgsform->seqcache;
-   cycle = pgsform->seqcycle;
    ReleaseSysCache(pgstuple);
 
    /* lock page' buffer and read tuple */
index 5779f0d617feb27aeea2d4d08f32030e5c253faa..7d15189ead175491c8bd3d9d3e1bc5e198c78be4 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 201612201
+#define CATALOG_VERSION_NO 201612202
 
 #endif
index 3bcda6bef17dce34bf36ca3de05e42adb6162334..350b286e4574a5af98c7a1f3f9616254a253ac81 100644 (file)
@@ -8,23 +8,23 @@
 CATALOG(pg_sequence,2224) BKI_WITHOUT_OIDS
 {
    Oid         seqrelid;
+   bool        seqcycle;
    int64       seqstart;
    int64       seqincrement;
    int64       seqmax;
    int64       seqmin;
    int64       seqcache;
-   bool        seqcycle;
 } FormData_pg_sequence;
 
 typedef FormData_pg_sequence *Form_pg_sequence;
 
 #define Natts_pg_sequence              7
 #define Anum_pg_sequence_seqrelid      1
-#define Anum_pg_sequence_seqstart      2
-#define Anum_pg_sequence_seqincrement  3
-#define Anum_pg_sequence_seqmax            4
-#define Anum_pg_sequence_seqmin            5
-#define Anum_pg_sequence_seqcache      6
-#define Anum_pg_sequence_seqcycle      7
+#define Anum_pg_sequence_seqcycle      2
+#define Anum_pg_sequence_seqstart      3
+#define Anum_pg_sequence_seqincrement  4
+#define Anum_pg_sequence_seqmax            5
+#define Anum_pg_sequence_seqmin            6
+#define Anum_pg_sequence_seqcache      7
 
 #endif /* PG_SEQUENCE_H */