Tighten short-circuit tests for deciding whether we need to invoke

tuptoaster.c --- fields that are compressed in-line are not a reason
to invoke the toaster.  Along the way, add a couple more htup.h macros
to eliminate confusing negated tests, and get rid of the already
vestigial TUPLE_TOASTER_ACTIVE symbol.
This commit is contained in:
Tom Lane 2004-01-16 20:51:30 +00:00
parent b89744198e
commit 0966516b75
4 changed files with 26 additions and 31 deletions

View File

@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.88 2003/11/29 19:51:39 pgsql Exp $ * $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.89 2004/01/16 20:51:30 tgl Exp $
* *
* NOTES * NOTES
* The old interface functions have been converted to macros * The old interface functions have been converted to macros
@ -303,7 +303,7 @@ nocachegetattr(HeapTuple tuple,
return fetchatt(att[attnum], return fetchatt(att[attnum],
tp + att[attnum]->attcacheoff); tp + att[attnum]->attcacheoff);
} }
else if (!HeapTupleAllFixed(tuple)) else if (HeapTupleHasVarWidth(tuple))
{ {
int j; int j;
@ -378,13 +378,10 @@ nocachegetattr(HeapTuple tuple,
for (i = 0; i < attnum; i++) for (i = 0; i < attnum; i++)
{ {
if (!HeapTupleNoNulls(tuple)) if (HeapTupleHasNulls(tuple) && att_isnull(i, bp))
{ {
if (att_isnull(i, bp)) usecache = false;
{ continue;
usecache = false;
continue;
}
} }
/* If we know the next offset, we can skip the rest */ /* If we know the next offset, we can skip the rest */

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.161 2004/01/07 18:56:24 neilc Exp $ * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.162 2004/01/16 20:51:30 tgl Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
@ -1091,16 +1091,13 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid)
HeapTupleHeaderSetCmin(tup->t_data, cid); HeapTupleHeaderSetCmin(tup->t_data, cid);
tup->t_tableOid = relation->rd_id; tup->t_tableOid = relation->rd_id;
#ifdef TUPLE_TOASTER_ACTIVE
/* /*
* If the new tuple is too big for storage or contains already toasted * If the new tuple is too big for storage or contains already toasted
* attributes from some other relation, invoke the toaster. * out-of-line attributes from some other relation, invoke the toaster.
*/ */
if (HeapTupleHasExtended(tup) || if (HeapTupleHasExternal(tup) ||
(MAXALIGN(tup->t_len) > TOAST_TUPLE_THRESHOLD)) (MAXALIGN(tup->t_len) > TOAST_TUPLE_THRESHOLD))
heap_tuple_toast_attrs(relation, tup, NULL); heap_tuple_toast_attrs(relation, tup, NULL);
#endif
/* Find buffer to insert this tuple into */ /* Find buffer to insert this tuple into */
buffer = RelationGetBufferForTuple(relation, tup->t_len, InvalidBuffer); buffer = RelationGetBufferForTuple(relation, tup->t_len, InvalidBuffer);
@ -1352,17 +1349,14 @@ l1:
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
#ifdef TUPLE_TOASTER_ACTIVE
/* /*
* If the relation has toastable attributes, we need to delete no * If the tuple has toasted out-of-line attributes, we need to delete
* longer needed items there too. We have to do this before * those items too. We have to do this before WriteBuffer because we need
* WriteBuffer because we need to look at the contents of the tuple, * to look at the contents of the tuple, but it's OK to release the
* but it's OK to release the context lock on the buffer first. * context lock on the buffer first.
*/ */
if (HeapTupleHasExtended(&tp)) if (HeapTupleHasExternal(&tp))
heap_tuple_toast_attrs(relation, NULL, &(tp)); heap_tuple_toast_attrs(relation, NULL, &tp);
#endif
pgstat_count_heap_delete(&relation->pgstat_info); pgstat_count_heap_delete(&relation->pgstat_info);
@ -1572,11 +1566,11 @@ l2:
* implement UNDO and will re-use transaction IDs after postmaster * implement UNDO and will re-use transaction IDs after postmaster
* startup. * startup.
* *
* We need to invoke the toaster if there are already any toasted values * We need to invoke the toaster if there are already any out-of-line
* present, or if the new tuple is over-threshold. * toasted values present, or if the new tuple is over-threshold.
*/ */
need_toast = (HeapTupleHasExtended(&oldtup) || need_toast = (HeapTupleHasExternal(&oldtup) ||
HeapTupleHasExtended(newtup) || HeapTupleHasExternal(newtup) ||
(MAXALIGN(newtup->t_len) > TOAST_TUPLE_THRESHOLD)); (MAXALIGN(newtup->t_len) > TOAST_TUPLE_THRESHOLD));
newtupsize = MAXALIGN(newtup->t_len); newtupsize = MAXALIGN(newtup->t_len);

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/htup.h,v 1.63 2003/11/29 22:40:55 pgsql Exp $ * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.64 2004/01/16 20:51:30 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -436,9 +436,15 @@ typedef HeapTupleData *HeapTuple;
*/ */
#define HeapTupleIsValid(tuple) PointerIsValid(tuple) #define HeapTupleIsValid(tuple) PointerIsValid(tuple)
#define HeapTupleHasNulls(tuple) \
(((tuple)->t_data->t_infomask & HEAP_HASNULL) != 0)
#define HeapTupleNoNulls(tuple) \ #define HeapTupleNoNulls(tuple) \
(!((tuple)->t_data->t_infomask & HEAP_HASNULL)) (!((tuple)->t_data->t_infomask & HEAP_HASNULL))
#define HeapTupleHasVarWidth(tuple) \
(((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH) != 0)
#define HeapTupleAllFixed(tuple) \ #define HeapTupleAllFixed(tuple) \
(!((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH)) (!((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH))

View File

@ -10,7 +10,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1995, Regents of the University of California * Portions Copyright (c) 1995, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/postgres.h,v 1.67 2004/01/04 05:57:21 tgl Exp $ * $PostgreSQL: pgsql/src/include/postgres.h,v 1.68 2004/01/16 20:51:30 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -59,8 +59,6 @@
* TOASTed. * TOASTed.
* ---------------- * ----------------
*/ */
#define TUPLE_TOASTER_ACTIVE
typedef struct varattrib typedef struct varattrib
{ {
int32 va_header; /* External/compressed storage */ int32 va_header; /* External/compressed storage */