Have table_insert and siblings use an unsigned type for options

Using signed types can lead to bugs, such as the one fixed by commit
2a2e1b470b.

Discussion: https://postgr.es/m/44e6ze3kuunhky63wmfjxrmn72pds2whwf5ok6hpz7c4my7k2h@l65zhpcuasnf
This commit is contained in:
Álvaro Herrera 2026-03-30 13:27:04 +02:00
parent c546f008cd
commit 1bd6f22f43
No known key found for this signature in database
GPG key ID: 1C20ACB9D5C564AE
4 changed files with 20 additions and 17 deletions

View file

@ -57,7 +57,7 @@
static HeapTuple heap_prepare_insert(Relation relation, HeapTuple tup,
TransactionId xid, CommandId cid, int options);
TransactionId xid, CommandId cid, bits32 options);
static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf,
Buffer newbuf, HeapTuple oldtup,
HeapTuple newtup, HeapTuple old_key_tuple,
@ -2148,7 +2148,7 @@ ReleaseBulkInsertStatePin(BulkInsertState bistate)
*/
void
heap_insert(Relation relation, HeapTuple tup, CommandId cid,
int options, BulkInsertState bistate)
bits32 options, BulkInsertState bistate)
{
TransactionId xid = GetCurrentTransactionId();
HeapTuple heaptup;
@ -2339,7 +2339,7 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid,
*/
static HeapTuple
heap_prepare_insert(Relation relation, HeapTuple tup, TransactionId xid,
CommandId cid, int options)
CommandId cid, bits32 options)
{
/*
* To allow parallel inserts, we need to ensure that they are safe to be
@ -2419,7 +2419,7 @@ heap_multi_insert_pages(HeapTuple *heaptuples, int done, int ntuples, Size saveF
*/
void
heap_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples,
CommandId cid, int options, BulkInsertState bistate)
CommandId cid, bits32 options, BulkInsertState bistate)
{
TransactionId xid = GetCurrentTransactionId();
HeapTuple *heaptuples;

View file

@ -252,7 +252,7 @@ heapam_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot,
static void
heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
int options, BulkInsertState bistate)
bits32 options, BulkInsertState bistate)
{
bool shouldFree = true;
HeapTuple tuple = ExecFetchSlotHeapTuple(slot, true, &shouldFree);
@ -271,7 +271,7 @@ heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
static void
heapam_tuple_insert_speculative(Relation relation, TupleTableSlot *slot,
CommandId cid, int options,
CommandId cid, bits32 options,
BulkInsertState bistate, uint32 specToken)
{
bool shouldFree = true;

View file

@ -379,9 +379,9 @@ extern void FreeBulkInsertState(BulkInsertState);
extern void ReleaseBulkInsertStatePin(BulkInsertState bistate);
extern void heap_insert(Relation relation, HeapTuple tup, CommandId cid,
int options, BulkInsertState bistate);
bits32 options, BulkInsertState bistate);
extern void heap_multi_insert(Relation relation, TupleTableSlot **slots,
int ntuples, CommandId cid, int options,
int ntuples, CommandId cid, bits32 options,
BulkInsertState bistate);
extern TM_Result heap_delete(Relation relation, const ItemPointerData *tid,
CommandId cid, Snapshot crosscheck, bool wait,

View file

@ -254,7 +254,10 @@ typedef struct TM_IndexDeleteOp
TM_IndexStatus *status;
} TM_IndexDeleteOp;
/* "options" flag bits for table_tuple_insert */
/*
* "options" flag bits for table_tuple_insert. Access methods may define
* their own bits for internal use, as long as they don't collide with these.
*/
/* TABLE_INSERT_SKIP_WAL was 0x0001; RelationNeedsWAL() now governs */
#define TABLE_INSERT_SKIP_FSM 0x0002
#define TABLE_INSERT_FROZEN 0x0004
@ -508,14 +511,14 @@ typedef struct TableAmRoutine
/* see table_tuple_insert() for reference about parameters */
void (*tuple_insert) (Relation rel, TupleTableSlot *slot,
CommandId cid, int options,
CommandId cid, bits32 options,
BulkInsertStateData *bistate);
/* see table_tuple_insert_speculative() for reference about parameters */
void (*tuple_insert_speculative) (Relation rel,
TupleTableSlot *slot,
CommandId cid,
int options,
bits32 options,
BulkInsertStateData *bistate,
uint32 specToken);
@ -527,7 +530,7 @@ typedef struct TableAmRoutine
/* see table_multi_insert() for reference about parameters */
void (*multi_insert) (Relation rel, TupleTableSlot **slots, int nslots,
CommandId cid, int options, BulkInsertStateData *bistate);
CommandId cid, bits32 options, BulkInsertStateData *bistate);
/* see table_tuple_delete() for reference about parameters */
TM_Result (*tuple_delete) (Relation rel,
@ -574,7 +577,7 @@ typedef struct TableAmRoutine
*
* Optional callback.
*/
void (*finish_bulk_insert) (Relation rel, int options);
void (*finish_bulk_insert) (Relation rel, bits32 options);
/* ------------------------------------------------------------------------
@ -1386,7 +1389,7 @@ table_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate)
*/
static inline void
table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid,
int options, BulkInsertStateData *bistate)
bits32 options, BulkInsertStateData *bistate)
{
rel->rd_tableam->tuple_insert(rel, slot, cid, options,
bistate);
@ -1405,7 +1408,7 @@ table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid,
*/
static inline void
table_tuple_insert_speculative(Relation rel, TupleTableSlot *slot,
CommandId cid, int options,
CommandId cid, bits32 options,
BulkInsertStateData *bistate,
uint32 specToken)
{
@ -1441,7 +1444,7 @@ table_tuple_complete_speculative(Relation rel, TupleTableSlot *slot,
*/
static inline void
table_multi_insert(Relation rel, TupleTableSlot **slots, int nslots,
CommandId cid, int options, BulkInsertStateData *bistate)
CommandId cid, bits32 options, BulkInsertStateData *bistate)
{
rel->rd_tableam->multi_insert(rel, slots, nslots,
cid, options, bistate);
@ -1582,7 +1585,7 @@ table_tuple_lock(Relation rel, ItemPointer tid, Snapshot snapshot,
* tuple_insert and multi_insert with a BulkInsertState specified.
*/
static inline void
table_finish_bulk_insert(Relation rel, int options)
table_finish_bulk_insert(Relation rel, bits32 options)
{
/* optional callback */
if (rel->rd_tableam && rel->rd_tableam->finish_bulk_insert)