Skip to content

Commit 84b6d5f

Browse files
committed
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.
1 parent 8b9fa7a commit 84b6d5f

File tree

5 files changed

+36
-109
lines changed

5 files changed

+36
-109
lines changed

src/backend/access/common/heaptuple.c

Lines changed: 17 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
*
5151
*
5252
* IDENTIFICATION
53-
* $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.129 2010/01/02 16:57:33 momjian Exp $
53+
* $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.130 2010/01/10 04:26:36 rhaas Exp $
5454
*
5555
*-------------------------------------------------------------------------
5656
*/
@@ -323,8 +323,7 @@ heap_attisnull(HeapTuple tup, int attnum)
323323
Datum
324324
nocachegetattr(HeapTuple tuple,
325325
int attnum,
326-
TupleDesc tupleDesc,
327-
bool *isnull)
326+
TupleDesc tupleDesc)
328327
{
329328
HeapTupleHeader tup = tuple->t_data;
330329
Form_pg_attribute *att = tupleDesc->attrs;
@@ -333,8 +332,6 @@ nocachegetattr(HeapTuple tuple,
333332
bool slow = false; /* do we have to walk attrs? */
334333
int off; /* current offset within data */
335334

336-
(void) isnull; /* not used */
337-
338335
/* ----------------
339336
* Three cases:
340337
*
@@ -344,68 +341,32 @@ nocachegetattr(HeapTuple tuple,
344341
* ----------------
345342
*/
346343

347-
#ifdef IN_MACRO
348-
/* This is handled in the macro */
349-
Assert(attnum > 0);
350-
351-
if (isnull)
352-
*isnull = false;
353-
#endif
354-
355344
attnum--;
356345

357-
if (HeapTupleNoNulls(tuple))
358-
{
359-
#ifdef IN_MACRO
360-
/* This is handled in the macro */
361-
if (att[attnum]->attcacheoff >= 0)
362-
{
363-
return fetchatt(att[attnum],
364-
(char *) tup + tup->t_hoff +
365-
att[attnum]->attcacheoff);
366-
}
367-
#endif
368-
}
369-
else
346+
if (!HeapTupleNoNulls(tuple))
370347
{
371348
/*
372349
* there's a null somewhere in the tuple
373350
*
374-
* check to see if desired att is null
351+
* check to see if any preceding bits are null...
375352
*/
353+
int byte = attnum >> 3;
354+
int finalbit = attnum & 0x07;
376355

377-
#ifdef IN_MACRO
378-
/* This is handled in the macro */
379-
if (att_isnull(attnum, bp))
380-
{
381-
if (isnull)
382-
*isnull = true;
383-
return (Datum) NULL;
384-
}
385-
#endif
386-
387-
/*
388-
* Now check to see if any preceding bits are null...
389-
*/
356+
/* check for nulls "before" final bit of last byte */
357+
if ((~bp[byte]) & ((1 << finalbit) - 1))
358+
slow = true;
359+
else
390360
{
391-
int byte = attnum >> 3;
392-
int finalbit = attnum & 0x07;
361+
/* check for nulls in any "earlier" bytes */
362+
int i;
393363

394-
/* check for nulls "before" final bit of last byte */
395-
if ((~bp[byte]) & ((1 << finalbit) - 1))
396-
slow = true;
397-
else
364+
for (i = 0; i < byte; i++)
398365
{
399-
/* check for nulls in any "earlier" bytes */
400-
int i;
401-
402-
for (i = 0; i < byte; i++)
366+
if (bp[i] != 0xFF)
403367
{
404-
if (bp[i] != 0xFF)
405-
{
406-
slow = true;
407-
break;
408-
}
368+
slow = true;
369+
break;
409370
}
410371
}
411372
}
@@ -567,8 +528,7 @@ heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
567528
Assert(tup);
568529

569530
/* Currently, no sys attribute ever reads as NULL. */
570-
if (isnull)
571-
*isnull = false;
531+
*isnull = false;
572532

573533
switch (attnum)
574534
{

src/backend/access/common/indextuple.c

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $PostgreSQL: pgsql/src/backend/access/common/indextuple.c,v 1.90 2010/01/02 16:57:33 momjian Exp $
12+
* $PostgreSQL: pgsql/src/backend/access/common/indextuple.c,v 1.91 2010/01/10 04:26:36 rhaas Exp $
1313
*
1414
*-------------------------------------------------------------------------
1515
*/
@@ -200,8 +200,7 @@ index_form_tuple(TupleDesc tupleDescriptor,
200200
Datum
201201
nocache_index_getattr(IndexTuple tup,
202202
int attnum,
203-
TupleDesc tupleDesc,
204-
bool *isnull)
203+
TupleDesc tupleDesc)
205204
{
206205
Form_pg_attribute *att = tupleDesc->attrs;
207206
char *tp; /* ptr to data part of tuple */
@@ -210,8 +209,6 @@ nocache_index_getattr(IndexTuple tup,
210209
int data_off; /* tuple data offset */
211210
int off; /* current offset within data */
212211

213-
(void) isnull; /* not used */
214-
215212
/* ----------------
216213
* Three cases:
217214
*
@@ -221,31 +218,11 @@ nocache_index_getattr(IndexTuple tup,
221218
* ----------------
222219
*/
223220

224-
#ifdef IN_MACRO
225-
/* This is handled in the macro */
226-
Assert(PointerIsValid(isnull));
227-
Assert(attnum > 0);
228-
229-
*isnull = false;
230-
#endif
231-
232221
data_off = IndexInfoFindDataOffset(tup->t_info);
233222

234223
attnum--;
235224

236-
if (!IndexTupleHasNulls(tup))
237-
{
238-
#ifdef IN_MACRO
239-
/* This is handled in the macro */
240-
if (att[attnum]->attcacheoff >= 0)
241-
{
242-
return fetchatt(att[attnum],
243-
(char *) tup + data_off +
244-
att[attnum]->attcacheoff);
245-
}
246-
#endif
247-
}
248-
else
225+
if (IndexTupleHasNulls(tup))
249226
{
250227
/*
251228
* there's a null somewhere in the tuple
@@ -256,16 +233,6 @@ nocache_index_getattr(IndexTuple tup,
256233
/* XXX "knows" t_bits are just after fixed tuple header! */
257234
bp = (bits8 *) ((char *) tup + sizeof(IndexTupleData));
258235

259-
#ifdef IN_MACRO
260-
/* This is handled in the macro */
261-
262-
if (att_isnull(attnum, bp))
263-
{
264-
*isnull = true;
265-
return (Datum) NULL;
266-
}
267-
#endif
268-
269236
/*
270237
* Now check to see if any preceding bits are null...
271238
*/

src/backend/access/heap/heapam.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.280 2010/01/02 16:57:34 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.281 2010/01/10 04:26:36 rhaas Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -834,7 +834,7 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
834834
return (
835835
(attnum) > 0 ?
836836
(
837-
((isnull) ? (*(isnull) = false) : (dummyret) NULL),
837+
(*(isnull) = false),
838838
HeapTupleNoNulls(tup) ?
839839
(
840840
(tupleDesc)->attrs[(attnum) - 1]->attcacheoff >= 0 ?
@@ -844,18 +844,18 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
844844
(tupleDesc)->attrs[(attnum) - 1]->attcacheoff)
845845
)
846846
:
847-
nocachegetattr((tup), (attnum), (tupleDesc), (isnull))
847+
nocachegetattr((tup), (attnum), (tupleDesc))
848848
)
849849
:
850850
(
851851
att_isnull((attnum) - 1, (tup)->t_data->t_bits) ?
852852
(
853-
((isnull) ? (*(isnull) = true) : (dummyret) NULL),
853+
(*(isnull) = true),
854854
(Datum) NULL
855855
)
856856
:
857857
(
858-
nocachegetattr((tup), (attnum), (tupleDesc), (isnull))
858+
nocachegetattr((tup), (attnum), (tupleDesc))
859859
)
860860
)
861861
)

src/include/access/htup.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/access/htup.h,v 1.109 2010/01/02 16:58:00 momjian Exp $
10+
* $PostgreSQL: pgsql/src/include/access/htup.h,v 1.110 2010/01/10 04:26:36 rhaas Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -763,7 +763,7 @@ extern void HeapTupleHeaderAdjustCmax(HeapTupleHeader tup,
763763
#define fastgetattr(tup, attnum, tupleDesc, isnull) \
764764
( \
765765
AssertMacro((attnum) > 0), \
766-
(((isnull) != NULL) ? (*(isnull) = false) : (dummyret)NULL), \
766+
(*(isnull) = false), \
767767
HeapTupleNoNulls(tup) ? \
768768
( \
769769
(tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \
@@ -773,18 +773,18 @@ extern void HeapTupleHeaderAdjustCmax(HeapTupleHeader tup,
773773
(tupleDesc)->attrs[(attnum)-1]->attcacheoff) \
774774
) \
775775
: \
776-
nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) \
776+
nocachegetattr((tup), (attnum), (tupleDesc)) \
777777
) \
778778
: \
779779
( \
780780
att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \
781781
( \
782-
(((isnull) != NULL) ? (*(isnull) = true) : (dummyret)NULL), \
782+
(*(isnull) = true), \
783783
(Datum)NULL \
784784
) \
785785
: \
786786
( \
787-
nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) \
787+
nocachegetattr((tup), (attnum), (tupleDesc)) \
788788
) \
789789
) \
790790
)
@@ -818,7 +818,7 @@ extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
818818
( \
819819
((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \
820820
( \
821-
(((isnull) != NULL) ? (*(isnull) = true) : (dummyret)NULL), \
821+
(*(isnull) = true), \
822822
(Datum)NULL \
823823
) \
824824
: \
@@ -838,7 +838,7 @@ extern void heap_fill_tuple(TupleDesc tupleDesc,
838838
uint16 *infomask, bits8 *bit);
839839
extern bool heap_attisnull(HeapTuple tup, int attnum);
840840
extern Datum nocachegetattr(HeapTuple tup, int attnum,
841-
TupleDesc att, bool *isnull);
841+
TupleDesc att);
842842
extern Datum heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
843843
bool *isnull);
844844
extern HeapTuple heap_copytuple(HeapTuple tuple);

src/include/access/itup.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/access/itup.h,v 1.53 2010/01/02 16:58:00 momjian Exp $
10+
* $PostgreSQL: pgsql/src/include/access/itup.h,v 1.54 2010/01/10 04:26:36 rhaas Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -110,7 +110,7 @@ typedef IndexAttributeBitMapData *IndexAttributeBitMap;
110110
+ (tupleDesc)->attrs[(attnum)-1]->attcacheoff) \
111111
) \
112112
: \
113-
nocache_index_getattr((tup), (attnum), (tupleDesc), (isnull)) \
113+
nocache_index_getattr((tup), (attnum), (tupleDesc)) \
114114
) \
115115
: \
116116
( \
@@ -121,7 +121,7 @@ typedef IndexAttributeBitMapData *IndexAttributeBitMap;
121121
) \
122122
: \
123123
( \
124-
nocache_index_getattr((tup), (attnum), (tupleDesc), (isnull)) \
124+
nocache_index_getattr((tup), (attnum), (tupleDesc)) \
125125
) \
126126
) \
127127
)
@@ -142,7 +142,7 @@ typedef IndexAttributeBitMapData *IndexAttributeBitMap;
142142
extern IndexTuple index_form_tuple(TupleDesc tupleDescriptor,
143143
Datum *values, bool *isnull);
144144
extern Datum nocache_index_getattr(IndexTuple tup, int attnum,
145-
TupleDesc tupleDesc, bool *isnull);
145+
TupleDesc tupleDesc);
146146
extern void index_deform_tuple(IndexTuple tup, TupleDesc tupleDescriptor,
147147
Datum *values, bool *isnull);
148148
extern IndexTuple CopyIndexTuple(IndexTuple source);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy