diff -cpr pgsql-orig/src/backend/access/common/heaptuple.c pgsql/src/backend/access/common/heaptuple.c *** pgsql-orig/src/backend/access/common/heaptuple.c 2005-11-09 18:07:14.000000000 +0900 --- pgsql/src/backend/access/common/heaptuple.c 2005-11-09 18:38:50.000000000 +0900 *************** heap_compute_data_size(TupleDesc tupleDe *** 43,63 **** Datum *values, bool *isnull) { ! Size data_length = 0; int i; int numberOfAttributes = tupleDesc->natts; Form_pg_attribute *att = tupleDesc->attrs; for (i = 0; i < numberOfAttributes; i++) { if (isnull[i]) continue; data_length = att_align(data_length, att[i]->attalign); data_length = att_addlength(data_length, att[i]->attlen, values[i]); } ! return data_length; } /* ---------------- --- 43,95 ---- Datum *values, bool *isnull) { ! Size start; ! Size end; ! heap_compute_data_size_aligned(tupleDesc, values, isnull, 0, &start, &end); ! return end - start; ! } ! ! /* ! * heap_compute_data_size_aligned ! * Determine size of the data area of a tuple to be constructed ! */ ! void ! heap_compute_data_size_aligned(TupleDesc tupleDesc, ! Datum *values, ! bool *isnull, ! Size offset, ! Size *start, ! Size *end) ! { ! Size data_length = offset; int i; int numberOfAttributes = tupleDesc->natts; Form_pg_attribute *att = tupleDesc->attrs; + AssertArg(start); + AssertArg(end); + for (i = 0; i < numberOfAttributes; i++) { if (isnull[i]) continue; data_length = att_align(data_length, att[i]->attalign); + *start = data_length; + data_length = att_addlength(data_length, att[i]->attlen, values[i]); + i++; + break; + } + for (; i < numberOfAttributes; i++) + { + if (isnull[i]) + continue; + + data_length = att_align(data_length, att[i]->attalign); data_length = att_addlength(data_length, att[i]->attlen, values[i]); } ! *end = data_length; } /* ---------------- *************** heap_compute_data_size(TupleDesc tupleDe *** 68,95 **** * OLD API with char 'n'/' ' convention for indicating nulls * ---------------- */ ! static Size ComputeDataSize(TupleDesc tupleDesc, Datum *values, ! char *nulls) { ! Size data_length = 0; int i; int numberOfAttributes = tupleDesc->natts; Form_pg_attribute *att = tupleDesc->attrs; for (i = 0; i < numberOfAttributes; i++) { if (nulls[i] != ' ') continue; data_length = att_align(data_length, att[i]->attalign); data_length = att_addlength(data_length, att[i]->attlen, values[i]); } ! return data_length; } /* * heap_fill_tuple * Load data portion of a tuple from values/isnull arrays --- 100,145 ---- * OLD API with char 'n'/' ' convention for indicating nulls * ---------------- */ ! static void ComputeDataSize(TupleDesc tupleDesc, Datum *values, ! char *nulls, ! Size offset, ! Size *start, ! Size *end) { ! Size data_length = offset; int i; int numberOfAttributes = tupleDesc->natts; Form_pg_attribute *att = tupleDesc->attrs; + AssertArg(start); + AssertArg(end); + for (i = 0; i < numberOfAttributes; i++) { if (nulls[i] != ' ') continue; data_length = att_align(data_length, att[i]->attalign); + *start = data_length; data_length = att_addlength(data_length, att[i]->attlen, values[i]); + i++; + break; } + for (; i < numberOfAttributes; i++) + { + if (nulls[i] != ' ') + continue; ! data_length = att_align(data_length, att[i]->attalign); ! data_length = att_addlength(data_length, att[i]->attlen, values[i]); ! } ! ! *end = data_length; } + /* * heap_fill_tuple * Load data portion of a tuple from values/isnull arrays *************** heap_form_tuple(TupleDesc tupleDescripto *** 666,673 **** { HeapTuple tuple; /* return tuple */ HeapTupleHeader td; /* tuple data */ ! unsigned long len; ! int hoff; bool hasnull = false; Form_pg_attribute *att = tupleDescriptor->attrs; int numberOfAttributes = tupleDescriptor->natts; --- 716,723 ---- { HeapTuple tuple; /* return tuple */ HeapTupleHeader td; /* tuple data */ ! Size len; ! Size hoff; bool hasnull = false; Form_pg_attribute *att = tupleDescriptor->attrs; int numberOfAttributes = tupleDescriptor->natts; *************** heap_form_tuple(TupleDesc tupleDescripto *** 714,724 **** len += BITMAPLEN(numberOfAttributes); if (tupleDescriptor->tdhasoid) len += sizeof(Oid); ! hoff = len = MAXALIGN(len); /* align user data safely */ ! ! len += heap_compute_data_size(tupleDescriptor, values, isnull); /* * Allocate and zero the space needed. Note that the tuple body and --- 764,775 ---- len += BITMAPLEN(numberOfAttributes); if (tupleDescriptor->tdhasoid) + { len += sizeof(Oid); + len = TYPEALIGN(ALIGNOF_OID, len); + } ! heap_compute_data_size_aligned(tupleDescriptor, values, isnull, len, &hoff, &len); /* * Allocate and zero the space needed. Note that the tuple body and *************** heap_formtuple(TupleDesc tupleDescriptor *** 774,781 **** { HeapTuple tuple; /* return tuple */ HeapTupleHeader td; /* tuple data */ ! unsigned long len; ! int hoff; bool hasnull = false; Form_pg_attribute *att = tupleDescriptor->attrs; int numberOfAttributes = tupleDescriptor->natts; --- 825,832 ---- { HeapTuple tuple; /* return tuple */ HeapTupleHeader td; /* tuple data */ ! Size len; ! Size hoff; bool hasnull = false; Form_pg_attribute *att = tupleDescriptor->attrs; int numberOfAttributes = tupleDescriptor->natts; *************** heap_formtuple(TupleDesc tupleDescriptor *** 822,832 **** len += BITMAPLEN(numberOfAttributes); if (tupleDescriptor->tdhasoid) len += sizeof(Oid); ! hoff = len = MAXALIGN(len); /* align user data safely */ ! ! len += ComputeDataSize(tupleDescriptor, values, nulls); /* * Allocate and zero the space needed. Note that the tuple body and --- 873,884 ---- len += BITMAPLEN(numberOfAttributes); if (tupleDescriptor->tdhasoid) + { len += sizeof(Oid); + len = TYPEALIGN(ALIGNOF_OID, len); + } ! ComputeDataSize(tupleDescriptor, values, nulls, len, &hoff, &len); /* * Allocate and zero the space needed. Note that the tuple body and diff -cpr pgsql-orig/src/include/access/heapam.h pgsql/src/include/access/heapam.h *** pgsql-orig/src/include/access/heapam.h 2005-11-09 18:07:14.000000000 +0900 --- pgsql/src/include/access/heapam.h 2005-11-09 18:17:06.000000000 +0900 *************** extern XLogRecPtr log_heap_move(Relation *** 188,193 **** --- 188,196 ---- /* in common/heaptuple.c */ extern Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull); + extern void heap_compute_data_size_aligned(TupleDesc tupleDesc, + Datum *values, bool *isnull, + Size offset, Size *start, Size *end); extern void heap_fill_tuple(TupleDesc tupleDesc, Datum *values, bool *isnull, char *data, uint16 *infomask, bits8 *bit); diff -cpr pgsql-orig/src/include/postgres_ext.h pgsql/src/include/postgres_ext.h *** pgsql-orig/src/include/postgres_ext.h 2005-11-09 18:07:14.000000000 +0900 --- pgsql/src/include/postgres_ext.h 2005-11-09 18:12:24.000000000 +0900 *************** typedef unsigned int Oid; *** 35,40 **** --- 35,41 ---- #endif #define OID_MAX UINT_MAX + #define ALIGNOF_OID ALIGNOF_INT /* you will need to include to use the above #define */