|
|
|
|
@ -121,22 +121,10 @@ toast_save_datum(Relation rel, Datum value, |
|
|
|
|
{ |
|
|
|
|
Relation toastrel; |
|
|
|
|
Relation *toastidxs; |
|
|
|
|
HeapTuple toasttup; |
|
|
|
|
TupleDesc toasttupDesc; |
|
|
|
|
Datum t_values[3]; |
|
|
|
|
bool t_isnull[3]; |
|
|
|
|
CommandId mycid = GetCurrentCommandId(true); |
|
|
|
|
struct varlena *result; |
|
|
|
|
struct varatt_external toast_pointer; |
|
|
|
|
union |
|
|
|
|
{ |
|
|
|
|
struct varlena hdr; |
|
|
|
|
/* 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 = {0}; /* silence compiler warning */ |
|
|
|
|
int32 chunk_size; |
|
|
|
|
int32 chunk_seq = 0; |
|
|
|
|
char *data_p; |
|
|
|
|
int32 data_todo; |
|
|
|
|
@ -289,21 +277,23 @@ toast_save_datum(Relation rel, Datum value, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Initialize constant parts of the tuple data |
|
|
|
|
*/ |
|
|
|
|
t_values[0] = ObjectIdGetDatum(toast_pointer.va_valueid); |
|
|
|
|
t_values[2] = PointerGetDatum(&chunk_data); |
|
|
|
|
t_isnull[0] = false; |
|
|
|
|
t_isnull[1] = false; |
|
|
|
|
t_isnull[2] = false; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Split up the item into chunks |
|
|
|
|
*/ |
|
|
|
|
while (data_todo > 0) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
HeapTuple toasttup; |
|
|
|
|
Datum t_values[3]; |
|
|
|
|
bool t_isnull[3] = {0}; |
|
|
|
|
union |
|
|
|
|
{ |
|
|
|
|
struct varlena hdr; |
|
|
|
|
/* 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; |
|
|
|
|
|
|
|
|
|
CHECK_FOR_INTERRUPTS(); |
|
|
|
|
|
|
|
|
|
@ -315,9 +305,12 @@ toast_save_datum(Relation rel, Datum value, |
|
|
|
|
/*
|
|
|
|
|
* Build a tuple and store it |
|
|
|
|
*/ |
|
|
|
|
t_values[0] = ObjectIdGetDatum(toast_pointer.va_valueid); |
|
|
|
|
t_values[1] = Int32GetDatum(chunk_seq++); |
|
|
|
|
SET_VARSIZE(&chunk_data, chunk_size + VARHDRSZ); |
|
|
|
|
memcpy(VARDATA(&chunk_data), data_p, chunk_size); |
|
|
|
|
t_values[2] = PointerGetDatum(&chunk_data); |
|
|
|
|
|
|
|
|
|
toasttup = heap_form_tuple(toasttupDesc, t_values, t_isnull); |
|
|
|
|
|
|
|
|
|
heap_insert(toastrel, toasttup, mycid, options, NULL); |
|
|
|
|
@ -333,7 +326,7 @@ toast_save_datum(Relation rel, Datum value, |
|
|
|
|
* Note also that there had better not be any user-created index on |
|
|
|
|
* the TOAST table, since we don't bother to update anything else. |
|
|
|
|
*/ |
|
|
|
|
for (i = 0; i < num_indexes; i++) |
|
|
|
|
for (int i = 0; i < num_indexes; i++) |
|
|
|
|
{ |
|
|
|
|
/* Only index relations marked as ready can be updated */ |
|
|
|
|
if (toastidxs[i]->rd_index->indisready) |
|
|
|
|
|