diff options
Diffstat (limited to 'src/backend/access/heap/tuptoaster.c')
-rw-r--r-- | src/backend/access/heap/tuptoaster.c | 89 |
1 files changed, 45 insertions, 44 deletions
diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c index 44ed126fca2..3a3e2d301b6 100644 --- a/src/backend/access/heap/tuptoaster.c +++ b/src/backend/access/heap/tuptoaster.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.48 2005/03/14 04:41:12 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.49 2005/03/21 01:23:58 tgl Exp $ * * * INTERFACE ROUTINES @@ -283,7 +283,7 @@ toast_delete(Relation rel, HeapTuple oldtup) int numAttrs; int i; Datum toast_values[MaxHeapAttributeNumber]; - char toast_nulls[MaxHeapAttributeNumber]; + bool toast_isnull[MaxHeapAttributeNumber]; /* * Get the tuple descriptor and break down the tuple into fields. @@ -301,7 +301,7 @@ toast_delete(Relation rel, HeapTuple oldtup) numAttrs = tupleDesc->natts; Assert(numAttrs <= MaxHeapAttributeNumber); - heap_deformtuple(oldtup, tupleDesc, toast_values, toast_nulls); + heap_deform_tuple(oldtup, tupleDesc, toast_values, toast_isnull); /* * Check for external stored attributes and delete them from the @@ -313,7 +313,7 @@ toast_delete(Relation rel, HeapTuple oldtup) { Datum value = toast_values[i]; - if (toast_nulls[i] != 'n' && VARATT_IS_EXTERNAL(value)) + if (!toast_isnull[i] && VARATT_IS_EXTERNAL(value)) toast_delete_datum(rel, value); } } @@ -343,8 +343,8 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) Size maxDataLen; char toast_action[MaxHeapAttributeNumber]; - char toast_nulls[MaxHeapAttributeNumber]; - char toast_oldnulls[MaxHeapAttributeNumber]; + bool toast_isnull[MaxHeapAttributeNumber]; + bool toast_oldisnull[MaxHeapAttributeNumber]; Datum toast_values[MaxHeapAttributeNumber]; Datum toast_oldvalues[MaxHeapAttributeNumber]; int32 toast_sizes[MaxHeapAttributeNumber]; @@ -359,9 +359,9 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) numAttrs = tupleDesc->natts; Assert(numAttrs <= MaxHeapAttributeNumber); - heap_deformtuple(newtup, tupleDesc, toast_values, toast_nulls); + heap_deform_tuple(newtup, tupleDesc, toast_values, toast_isnull); if (oldtup != NULL) - heap_deformtuple(oldtup, tupleDesc, toast_oldvalues, toast_oldnulls); + heap_deform_tuple(oldtup, tupleDesc, toast_oldvalues, toast_oldisnull); /* ---------- * Then collect information about the values given @@ -396,10 +396,10 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) * If the old value is an external stored one, check if it has * changed so we have to delete it later. */ - if (att[i]->attlen == -1 && toast_oldnulls[i] != 'n' && + if (att[i]->attlen == -1 && !toast_oldisnull[i] && VARATT_IS_EXTERNAL(old_value)) { - if (toast_nulls[i] == 'n' || !VARATT_IS_EXTERNAL(new_value) || + if (toast_isnull[i] || !VARATT_IS_EXTERNAL(new_value) || old_value->va_content.va_external.va_valueid != new_value->va_content.va_external.va_valueid || old_value->va_content.va_external.va_toastrelid != @@ -436,7 +436,7 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) /* * Handle NULL attributes */ - if (toast_nulls[i] == 'n') + if (toast_isnull[i]) { toast_action[i] = 'p'; has_nulls = true; @@ -499,7 +499,8 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) /* * Look for attributes with attstorage 'x' to compress */ - while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) > + while (MAXALIGN(heap_compute_data_size(tupleDesc, + toast_values, toast_isnull)) > maxDataLen) { int biggest_attno = -1; @@ -560,7 +561,8 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) * Second we look for attributes of attstorage 'x' or 'e' that are * still inline. */ - while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) > + while (MAXALIGN(heap_compute_data_size(tupleDesc, + toast_values, toast_isnull)) > maxDataLen && rel->rd_rel->reltoastrelid != InvalidOid) { int biggest_attno = -1; @@ -611,7 +613,8 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) * Round 3 - this time we take attributes with storage 'm' into * compression */ - while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) > + while (MAXALIGN(heap_compute_data_size(tupleDesc, + toast_values, toast_isnull)) > maxDataLen) { int biggest_attno = -1; @@ -671,7 +674,8 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) /* * Finally we store attributes of type 'm' external */ - while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) > + while (MAXALIGN(heap_compute_data_size(tupleDesc, + toast_values, toast_isnull)) > maxDataLen && rel->rd_rel->reltoastrelid != InvalidOid) { int biggest_attno = -1; @@ -739,7 +743,8 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) new_len += sizeof(Oid); new_len = MAXALIGN(new_len); Assert(new_len == olddata->t_hoff); - new_len += ComputeDataSize(tupleDesc, toast_values, toast_nulls); + new_len += heap_compute_data_size(tupleDesc, + toast_values, toast_isnull); /* * Allocate new tuple in same context as old one. @@ -753,12 +758,12 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup) */ memcpy(new_data, olddata, olddata->t_hoff); - DataFill((char *) new_data + olddata->t_hoff, - tupleDesc, - toast_values, - toast_nulls, - &(newtup->t_data->t_infomask), - has_nulls ? newtup->t_data->t_bits : NULL); + heap_fill_tuple(tupleDesc, + toast_values, + toast_isnull, + (char *) new_data + olddata->t_hoff, + &(newtup->t_data->t_infomask), + has_nulls ? newtup->t_data->t_bits : NULL); /* * In the case we modified a previously modified tuple again, free @@ -810,7 +815,7 @@ toast_flatten_tuple_attribute(Datum value, bool need_change = false; bool has_nulls = false; Datum toast_values[MaxTupleAttributeNumber]; - char toast_nulls[MaxTupleAttributeNumber]; + bool toast_isnull[MaxTupleAttributeNumber]; bool toast_free[MaxTupleAttributeNumber]; /* @@ -836,7 +841,7 @@ toast_flatten_tuple_attribute(Datum value, tmptup.t_data = olddata; Assert(numAttrs <= MaxTupleAttributeNumber); - heap_deformtuple(&tmptup, tupleDesc, toast_values, toast_nulls); + heap_deform_tuple(&tmptup, tupleDesc, toast_values, toast_isnull); memset(toast_free, 0, numAttrs * sizeof(bool)); @@ -845,7 +850,7 @@ toast_flatten_tuple_attribute(Datum value, /* * Look at non-null varlena attributes */ - if (toast_nulls[i] == 'n') + if (toast_isnull[i]) has_nulls = true; else if (att[i]->attlen == -1) { @@ -879,7 +884,7 @@ toast_flatten_tuple_attribute(Datum value, new_len += sizeof(Oid); new_len = MAXALIGN(new_len); Assert(new_len == olddata->t_hoff); - new_len += ComputeDataSize(tupleDesc, toast_values, toast_nulls); + new_len += heap_compute_data_size(tupleDesc, toast_values, toast_isnull); new_data = (HeapTupleHeader) palloc0(new_len); @@ -890,12 +895,12 @@ toast_flatten_tuple_attribute(Datum value, HeapTupleHeaderSetDatumLength(new_data, new_len); - DataFill((char *) new_data + olddata->t_hoff, - tupleDesc, - toast_values, - toast_nulls, - &(new_data->t_infomask), - has_nulls ? new_data->t_bits : NULL); + heap_fill_tuple(tupleDesc, + toast_values, + toast_isnull, + (char *) new_data + olddata->t_hoff, + &(new_data->t_infomask), + has_nulls ? new_data->t_bits : NULL); /* * Free allocated temp values @@ -955,10 +960,9 @@ toast_save_datum(Relation rel, Datum value) Relation toastrel; Relation toastidx; HeapTuple toasttup; - InsertIndexResult idxres; TupleDesc toasttupDesc; Datum t_values[3]; - char t_nulls[3]; + bool t_isnull[3]; varattrib *result; struct { @@ -996,9 +1000,9 @@ toast_save_datum(Relation rel, Datum value) */ t_values[0] = ObjectIdGetDatum(result->va_content.va_external.va_valueid); t_values[2] = PointerGetDatum(&chunk_data); - t_nulls[0] = ' '; - t_nulls[1] = ' '; - t_nulls[2] = ' '; + t_isnull[0] = false; + t_isnull[1] = false; + t_isnull[2] = false; /* * Get the data to process @@ -1031,7 +1035,7 @@ toast_save_datum(Relation rel, Datum value) t_values[1] = Int32GetDatum(chunk_seq++); VARATT_SIZEP(&chunk_data) = chunk_size + VARHDRSZ; memcpy(VARATT_DATA(&chunk_data), data_p, chunk_size); - toasttup = heap_formtuple(toasttupDesc, t_values, t_nulls); + toasttup = heap_form_tuple(toasttupDesc, t_values, t_isnull); if (!HeapTupleIsValid(toasttup)) elog(ERROR, "failed to build TOAST tuple"); @@ -1045,16 +1049,13 @@ 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. */ - idxres = index_insert(toastidx, t_values, t_nulls, - &(toasttup->t_self), - toastrel, toastidx->rd_index->indisunique); - if (idxres == NULL) - elog(ERROR, "failed to insert index entry for TOAST tuple"); + index_insert(toastidx, t_values, t_isnull, + &(toasttup->t_self), + toastrel, toastidx->rd_index->indisunique); /* * Free memory */ - pfree(idxres); heap_freetuple(toasttup); /* |