The copy binary ... from ... command was mishandling alignments. This caused files that were COPY'd out in binary form to not be COPY'd back in properly.
Thanks to Liakakis Kostas who inadvertently led me to this bug when he asked about differences in the regression test output.
Apply this patch.
===================================================================
RCS file: /usr/local/devel/pglite/cvs/src/backend/commands/copy.c,v
retrieving revision 1.13
diff -c -r1.13 copy.c
*** 1.13 1995/09/01 07:36:53
--- src/backend/commands/copy.c 1995/09/12 23:07:16
***************
*** 439,450 ****
break;
}
}else if (nulls[i] != 'n') {
! if (attr[i]->attlen == -1) {
! ptr = (char *)INTALIGN(ptr);
values[i] = (Datum) ptr;
ptr += * (uint32 *) ptr;
! }else {
! ptr = (char *)LONGALIGN(ptr); /* XXX ? */
values[i] = (Datum) ptr;
ptr += attr[i]->attlen;
}
--- 439,472 ----
break;
}
}else if (nulls[i] != 'n') {
! switch (attr[i]->attlen) {
! case -1:
! if (attr[i]->attalign == 'd')
! ptr = (char *)DOUBLEALIGN(ptr);
! else
! ptr = (char *)INTALIGN(ptr);
values[i] = (Datum) ptr;
ptr += * (uint32 *) ptr;
! break;
! case sizeof(char):
! values[i] = (Datum)ptr;
! ptr += attr[i]->attlen;
! break;
! case sizeof(short):
! ptr = (char*)SHORTALIGN(ptr);
! values[i] = (Datum)ptr;
! ptr += attr[i]->attlen;
! break;
! case sizeof(int32):
! ptr = (char*)INTALIGN(ptr);
! values[i] = (Datum)ptr;
! ptr += attr[i]->attlen;
! break;
! default:
! if (attr[i]->attalign == 'd')
! ptr = (char *)DOUBLEALIGN(ptr);
! else
! ptr = (char *)LONGALIGN(ptr);
values[i] = (Datum) ptr;
ptr += attr[i]->attlen;
}