mirror of
https://github.com/postgres/postgres.git
synced 2025-07-21 16:02:15 +03:00
Avoid assuming that struct varattrib_pointer doesn't get padded by the
compiler --- at least on ARM, it does. I suspect that the varvarlena patch has been creating larger-than-intended toast pointers all along on ARM, but it wasn't exposed until the latest tweak added some Asserts that calculated the expected size in a different way. We could probably have fixed this by adding __attribute__((packed)) as is done for ItemPointerData, but struct varattrib_pointer isn't really all that useful anyway, so it seems cleanest to just get rid of it and have only struct varattrib_1b_e. Per results from buildfarm member quagga.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.76 2007/09/30 19:54:58 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.77 2007/10/01 16:25:56 tgl Exp $
|
||||
*
|
||||
*
|
||||
* INTERFACE ROUTINES
|
||||
@ -42,6 +42,9 @@
|
||||
|
||||
#undef TOAST_DEBUG
|
||||
|
||||
/* Size of an EXTERNAL datum that contains a standard TOAST pointer */
|
||||
#define TOAST_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(struct varatt_external))
|
||||
|
||||
/*
|
||||
* Testing whether an externally-stored value is compressed now requires
|
||||
* comparing extsize (the actual length of the external data) to rawsize
|
||||
@ -597,7 +600,7 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup,
|
||||
toast_values, toast_isnull) > maxDataLen)
|
||||
{
|
||||
int biggest_attno = -1;
|
||||
int32 biggest_size = MAXALIGN(sizeof(varattrib_pointer));
|
||||
int32 biggest_size = MAXALIGN(TOAST_POINTER_SIZE);
|
||||
Datum old_value;
|
||||
Datum new_value;
|
||||
|
||||
@ -660,7 +663,7 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup,
|
||||
rel->rd_rel->reltoastrelid != InvalidOid)
|
||||
{
|
||||
int biggest_attno = -1;
|
||||
int32 biggest_size = MAXALIGN(sizeof(varattrib_pointer));
|
||||
int32 biggest_size = MAXALIGN(TOAST_POINTER_SIZE);
|
||||
Datum old_value;
|
||||
|
||||
/*------
|
||||
@ -710,7 +713,7 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup,
|
||||
toast_values, toast_isnull) > maxDataLen)
|
||||
{
|
||||
int biggest_attno = -1;
|
||||
int32 biggest_size = MAXALIGN(sizeof(varattrib_pointer));
|
||||
int32 biggest_size = MAXALIGN(TOAST_POINTER_SIZE);
|
||||
Datum old_value;
|
||||
Datum new_value;
|
||||
|
||||
@ -772,7 +775,7 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup,
|
||||
rel->rd_rel->reltoastrelid != InvalidOid)
|
||||
{
|
||||
int biggest_attno = -1;
|
||||
int32 biggest_size = MAXALIGN(sizeof(varattrib_pointer));
|
||||
int32 biggest_size = MAXALIGN(TOAST_POINTER_SIZE);
|
||||
Datum old_value;
|
||||
|
||||
/*--------
|
||||
@ -1085,7 +1088,7 @@ toast_save_datum(Relation rel, Datum value,
|
||||
Datum t_values[3];
|
||||
bool t_isnull[3];
|
||||
CommandId mycid = GetCurrentCommandId();
|
||||
varattrib_pointer *result;
|
||||
struct varlena *result;
|
||||
struct varatt_external toast_pointer;
|
||||
struct
|
||||
{
|
||||
@ -1206,8 +1209,8 @@ toast_save_datum(Relation rel, Datum value,
|
||||
/*
|
||||
* Create the TOAST pointer value that we'll return
|
||||
*/
|
||||
result = (varattrib_pointer *) palloc(sizeof(varattrib_pointer));
|
||||
SET_VARSIZE_EXTERNAL(result, sizeof(varattrib_pointer));
|
||||
result = (struct varlena *) palloc(TOAST_POINTER_SIZE);
|
||||
SET_VARSIZE_EXTERNAL(result, TOAST_POINTER_SIZE);
|
||||
memcpy(VARDATA_EXTERNAL(result), &toast_pointer, sizeof(toast_pointer));
|
||||
|
||||
return PointerGetDatum(result);
|
||||
|
Reference in New Issue
Block a user