Skip to content

Commit c6eeb67

Browse files
committed
Fix a bunch more portability bugs in commit 08bf6e5.
It seems like somebody used a dartboard while choosing integer widths for the various values taken and returned by these functions ... and then threw a fresh set of darts while writing the SQL declarations. This patch brings the C code into line with what the SQL declarations say, which is enough to make it not dump core on the particular 32-bit machine I'm testing on. But I think we could do with another round of looking at what the datum widths *should* be. For instance, it's not all that sensible that hash_bitmap_info decided to use int64 to represent a BlockNumber input when get_raw_page doesn't do it that way. There's also a remaining problem that the expected outputs from the test script are platform-dependent, but I'll leave that issue for somebody else. Per buildfarm.
1 parent ed807fd commit c6eeb67

File tree

1 file changed

+25
-24
lines changed

1 file changed

+25
-24
lines changed

contrib/pageinspect/hashfuncs.c

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ hash_page_items(PG_FUNCTION_ARGS)
360360
values[j++] = PointerGetDatum(&itup->t_tid);
361361

362362
hashkey = _hash_get_indextuple_hashkey(itup);
363-
values[j] = UInt32GetDatum(hashkey);
363+
values[j] = UInt64GetDatum((uint64) hashkey);
364364

365365
tuple = heap_form_tuple(fctx->attinmeta->tupdesc, values, nulls);
366366
result = HeapTupleGetDatum(tuple);
@@ -388,7 +388,7 @@ Datum
388388
hash_bitmap_info(PG_FUNCTION_ARGS)
389389
{
390390
Oid indexRelid = PG_GETARG_OID(0);
391-
BlockNumber ovflblkno = (BlockNumber) PG_GETARG_INT64(1);
391+
uint64 ovflblkno = PG_GETARG_INT64(1);
392392
HashMetaPage metap;
393393
Buffer buf,
394394
metabuf;
@@ -422,13 +422,14 @@ hash_bitmap_info(PG_FUNCTION_ARGS)
422422
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
423423
errmsg("cannot access temporary tables of other sessions")));
424424

425-
if (RelationGetNumberOfBlocks(indexRel) <= (BlockNumber) (ovflblkno))
425+
if (ovflblkno >= RelationGetNumberOfBlocks(indexRel))
426426
ereport(ERROR,
427427
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
428-
errmsg("block number %u is out of range for relation \"%s\"",
428+
errmsg("block number " UINT64_FORMAT " is out of range for relation \"%s\"",
429429
ovflblkno, RelationGetRelationName(indexRel))));
430430

431-
buf = ReadBufferExtended(indexRel, MAIN_FORKNUM, ovflblkno, RBM_NORMAL, NULL);
431+
buf = ReadBufferExtended(indexRel, MAIN_FORKNUM, (BlockNumber) ovflblkno,
432+
RBM_NORMAL, NULL);
432433
LockBuffer(buf, BUFFER_LOCK_SHARE);
433434
_hash_checkpage(indexRel, buf, LH_PAGE_TYPE);
434435
page = BufferGetPage(buf);
@@ -451,7 +452,7 @@ hash_bitmap_info(PG_FUNCTION_ARGS)
451452
metap = HashPageGetMeta(BufferGetPage(metabuf));
452453

453454
/* Identify overflow bit number */
454-
ovflbitno = _hash_ovflblkno_to_bitno(metap, ovflblkno);
455+
ovflbitno = _hash_ovflblkno_to_bitno(metap, (BlockNumber) ovflblkno);
455456

456457
bitmappage = ovflbitno >> BMPG_SHIFT(metap);
457458
bitmapbit = ovflbitno & BMPG_MASK(metap);
@@ -475,7 +476,7 @@ hash_bitmap_info(PG_FUNCTION_ARGS)
475476
MemSet(nulls, 0, sizeof(nulls));
476477

477478
j = 0;
478-
values[j++] = UInt32GetDatum(bitmapblkno);
479+
values[j++] = UInt64GetDatum((uint64) bitmapblkno);
479480
values[j++] = Int32GetDatum(bitmapbit);
480481
values[j++] = BoolGetDatum(bit);
481482

@@ -524,34 +525,34 @@ hash_metapage_info(PG_FUNCTION_ARGS)
524525
MemSet(nulls, 0, sizeof(nulls));
525526

526527
j = 0;
527-
values[j++] = UInt32GetDatum(metad->hashm_magic);
528-
values[j++] = UInt32GetDatum(metad->hashm_version);
528+
values[j++] = UInt64GetDatum(metad->hashm_magic);
529+
values[j++] = UInt64GetDatum(metad->hashm_version);
529530
values[j++] = Float8GetDatum(metad->hashm_ntuples);
530-
values[j++] = UInt16GetDatum(metad->hashm_ffactor);
531-
values[j++] = UInt16GetDatum(metad->hashm_bsize);
532-
values[j++] = UInt16GetDatum(metad->hashm_bmsize);
533-
values[j++] = UInt16GetDatum(metad->hashm_bmshift);
534-
values[j++] = UInt32GetDatum(metad->hashm_maxbucket);
535-
values[j++] = UInt32GetDatum(metad->hashm_highmask);
536-
values[j++] = UInt32GetDatum(metad->hashm_lowmask);
537-
values[j++] = UInt32GetDatum(metad->hashm_ovflpoint);
538-
values[j++] = UInt32GetDatum(metad->hashm_firstfree);
539-
values[j++] = UInt32GetDatum(metad->hashm_nmaps);
540-
values[j++] = UInt16GetDatum(metad->hashm_procid);
531+
values[j++] = UInt32GetDatum(metad->hashm_ffactor);
532+
values[j++] = UInt32GetDatum(metad->hashm_bsize);
533+
values[j++] = UInt32GetDatum(metad->hashm_bmsize);
534+
values[j++] = UInt32GetDatum(metad->hashm_bmshift);
535+
values[j++] = UInt64GetDatum(metad->hashm_maxbucket);
536+
values[j++] = UInt64GetDatum(metad->hashm_highmask);
537+
values[j++] = UInt64GetDatum(metad->hashm_lowmask);
538+
values[j++] = UInt64GetDatum(metad->hashm_ovflpoint);
539+
values[j++] = UInt64GetDatum(metad->hashm_firstfree);
540+
values[j++] = UInt64GetDatum(metad->hashm_nmaps);
541+
values[j++] = UInt32GetDatum(metad->hashm_procid);
541542

542543
for (i = 0; i < HASH_MAX_SPLITPOINTS; i++)
543-
spares[i] = UInt32GetDatum(metad->hashm_spares[i]);
544+
spares[i] = UInt64GetDatum(metad->hashm_spares[i]);
544545
values[j++] = PointerGetDatum(construct_array(spares,
545546
HASH_MAX_SPLITPOINTS,
546547
INT8OID,
547-
8, true, 'd'));
548+
8, FLOAT8PASSBYVAL, 'd'));
548549

549550
for (i = 0; i < HASH_MAX_BITMAPS; i++)
550-
mapp[i] = UInt32GetDatum(metad->hashm_mapp[i]);
551+
mapp[i] = UInt64GetDatum(metad->hashm_mapp[i]);
551552
values[j++] = PointerGetDatum(construct_array(mapp,
552553
HASH_MAX_BITMAPS,
553554
INT8OID,
554-
8, true, 'd'));
555+
8, FLOAT8PASSBYVAL, 'd'));
555556

556557
tuple = heap_form_tuple(tupleDesc, values, nulls);
557558

0 commit comments

Comments
 (0)