diff options
author | Robert Haas | 2010-01-10 04:26:36 +0000 |
---|---|---|
committer | Robert Haas | 2010-01-10 04:26:36 +0000 |
commit | 84b6d5f35941a0406210e7938d10c3cce4e11340 (patch) | |
tree | 23fa242445215cc5ff36b06ac9af3abeeca37e2e /src/backend/access/common/heaptuple.c | |
parent | 8b9fa7a93ab32f670de9931c0e0f104befed64af (diff) |
Remove partial, broken support for NULL pointers when fetching attributes.
Previously, fastgetattr() and heap_getattr() tested their fourth argument
against a null pointer, but any attempt to use them with a literal-NULL
fourth argument evaluated to *(void *)0, resulting in a compiler error.
Remove these NULL tests to avoid leading future readers of this code to
believe that this has a chance of working. Also clean up related legacy
code in nocachegetattr(), heap_getsysattr(), and nocache_index_getattr().
The new coding standard is that any code which calls a getattr-type
function or macro which takes an isnull argument MUST pass a valid
boolean pointer. Per discussion with Bruce Momjian, Tom Lane, Alvaro
Herrera.
Diffstat (limited to 'src/backend/access/common/heaptuple.c')
-rw-r--r-- | src/backend/access/common/heaptuple.c | 74 |
1 files changed, 17 insertions, 57 deletions
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index 1ece4f02bf3..8d770a368b4 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -50,7 +50,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.129 2010/01/02 16:57:33 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.130 2010/01/10 04:26:36 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -323,8 +323,7 @@ heap_attisnull(HeapTuple tup, int attnum) Datum nocachegetattr(HeapTuple tuple, int attnum, - TupleDesc tupleDesc, - bool *isnull) + TupleDesc tupleDesc) { HeapTupleHeader tup = tuple->t_data; Form_pg_attribute *att = tupleDesc->attrs; @@ -333,8 +332,6 @@ nocachegetattr(HeapTuple tuple, bool slow = false; /* do we have to walk attrs? */ int off; /* current offset within data */ - (void) isnull; /* not used */ - /* ---------------- * Three cases: * @@ -344,68 +341,32 @@ nocachegetattr(HeapTuple tuple, * ---------------- */ -#ifdef IN_MACRO -/* This is handled in the macro */ - Assert(attnum > 0); - - if (isnull) - *isnull = false; -#endif - attnum--; - if (HeapTupleNoNulls(tuple)) - { -#ifdef IN_MACRO -/* This is handled in the macro */ - if (att[attnum]->attcacheoff >= 0) - { - return fetchatt(att[attnum], - (char *) tup + tup->t_hoff + - att[attnum]->attcacheoff); - } -#endif - } - else + if (!HeapTupleNoNulls(tuple)) { /* * there's a null somewhere in the tuple * - * check to see if desired att is null + * check to see if any preceding bits are null... */ + int byte = attnum >> 3; + int finalbit = attnum & 0x07; -#ifdef IN_MACRO -/* This is handled in the macro */ - if (att_isnull(attnum, bp)) - { - if (isnull) - *isnull = true; - return (Datum) NULL; - } -#endif - - /* - * Now check to see if any preceding bits are null... - */ + /* check for nulls "before" final bit of last byte */ + if ((~bp[byte]) & ((1 << finalbit) - 1)) + slow = true; + else { - int byte = attnum >> 3; - int finalbit = attnum & 0x07; + /* check for nulls in any "earlier" bytes */ + int i; - /* check for nulls "before" final bit of last byte */ - if ((~bp[byte]) & ((1 << finalbit) - 1)) - slow = true; - else + for (i = 0; i < byte; i++) { - /* check for nulls in any "earlier" bytes */ - int i; - - for (i = 0; i < byte; i++) + if (bp[i] != 0xFF) { - if (bp[i] != 0xFF) - { - slow = true; - break; - } + slow = true; + break; } } } @@ -567,8 +528,7 @@ heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) Assert(tup); /* Currently, no sys attribute ever reads as NULL. */ - if (isnull) - *isnull = false; + *isnull = false; switch (attnum) { |