mirror of
https://github.com/postgres/postgres.git
synced 2026-06-10 17:20:31 -04:00
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:
parent
c546f008cd
commit
1bd6f22f43
4 changed files with 20 additions and 17 deletions
|
|
@ -57,7 +57,7 @@
|
||||||
|
|
||||||
|
|
||||||
static HeapTuple heap_prepare_insert(Relation relation, HeapTuple tup,
|
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,
|
static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf,
|
||||||
Buffer newbuf, HeapTuple oldtup,
|
Buffer newbuf, HeapTuple oldtup,
|
||||||
HeapTuple newtup, HeapTuple old_key_tuple,
|
HeapTuple newtup, HeapTuple old_key_tuple,
|
||||||
|
|
@ -2148,7 +2148,7 @@ ReleaseBulkInsertStatePin(BulkInsertState bistate)
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
heap_insert(Relation relation, HeapTuple tup, CommandId cid,
|
heap_insert(Relation relation, HeapTuple tup, CommandId cid,
|
||||||
int options, BulkInsertState bistate)
|
bits32 options, BulkInsertState bistate)
|
||||||
{
|
{
|
||||||
TransactionId xid = GetCurrentTransactionId();
|
TransactionId xid = GetCurrentTransactionId();
|
||||||
HeapTuple heaptup;
|
HeapTuple heaptup;
|
||||||
|
|
@ -2339,7 +2339,7 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid,
|
||||||
*/
|
*/
|
||||||
static HeapTuple
|
static HeapTuple
|
||||||
heap_prepare_insert(Relation relation, HeapTuple tup, TransactionId xid,
|
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
|
* 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
|
void
|
||||||
heap_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples,
|
heap_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples,
|
||||||
CommandId cid, int options, BulkInsertState bistate)
|
CommandId cid, bits32 options, BulkInsertState bistate)
|
||||||
{
|
{
|
||||||
TransactionId xid = GetCurrentTransactionId();
|
TransactionId xid = GetCurrentTransactionId();
|
||||||
HeapTuple *heaptuples;
|
HeapTuple *heaptuples;
|
||||||
|
|
|
||||||
|
|
@ -252,7 +252,7 @@ heapam_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot,
|
||||||
|
|
||||||
static void
|
static void
|
||||||
heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
|
heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
|
||||||
int options, BulkInsertState bistate)
|
bits32 options, BulkInsertState bistate)
|
||||||
{
|
{
|
||||||
bool shouldFree = true;
|
bool shouldFree = true;
|
||||||
HeapTuple tuple = ExecFetchSlotHeapTuple(slot, true, &shouldFree);
|
HeapTuple tuple = ExecFetchSlotHeapTuple(slot, true, &shouldFree);
|
||||||
|
|
@ -271,7 +271,7 @@ heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
|
||||||
|
|
||||||
static void
|
static void
|
||||||
heapam_tuple_insert_speculative(Relation relation, TupleTableSlot *slot,
|
heapam_tuple_insert_speculative(Relation relation, TupleTableSlot *slot,
|
||||||
CommandId cid, int options,
|
CommandId cid, bits32 options,
|
||||||
BulkInsertState bistate, uint32 specToken)
|
BulkInsertState bistate, uint32 specToken)
|
||||||
{
|
{
|
||||||
bool shouldFree = true;
|
bool shouldFree = true;
|
||||||
|
|
|
||||||
|
|
@ -379,9 +379,9 @@ extern void FreeBulkInsertState(BulkInsertState);
|
||||||
extern void ReleaseBulkInsertStatePin(BulkInsertState bistate);
|
extern void ReleaseBulkInsertStatePin(BulkInsertState bistate);
|
||||||
|
|
||||||
extern void heap_insert(Relation relation, HeapTuple tup, CommandId cid,
|
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,
|
extern void heap_multi_insert(Relation relation, TupleTableSlot **slots,
|
||||||
int ntuples, CommandId cid, int options,
|
int ntuples, CommandId cid, bits32 options,
|
||||||
BulkInsertState bistate);
|
BulkInsertState bistate);
|
||||||
extern TM_Result heap_delete(Relation relation, const ItemPointerData *tid,
|
extern TM_Result heap_delete(Relation relation, const ItemPointerData *tid,
|
||||||
CommandId cid, Snapshot crosscheck, bool wait,
|
CommandId cid, Snapshot crosscheck, bool wait,
|
||||||
|
|
|
||||||
|
|
@ -254,7 +254,10 @@ typedef struct TM_IndexDeleteOp
|
||||||
TM_IndexStatus *status;
|
TM_IndexStatus *status;
|
||||||
} TM_IndexDeleteOp;
|
} 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 */
|
/* TABLE_INSERT_SKIP_WAL was 0x0001; RelationNeedsWAL() now governs */
|
||||||
#define TABLE_INSERT_SKIP_FSM 0x0002
|
#define TABLE_INSERT_SKIP_FSM 0x0002
|
||||||
#define TABLE_INSERT_FROZEN 0x0004
|
#define TABLE_INSERT_FROZEN 0x0004
|
||||||
|
|
@ -508,14 +511,14 @@ typedef struct TableAmRoutine
|
||||||
|
|
||||||
/* see table_tuple_insert() for reference about parameters */
|
/* see table_tuple_insert() for reference about parameters */
|
||||||
void (*tuple_insert) (Relation rel, TupleTableSlot *slot,
|
void (*tuple_insert) (Relation rel, TupleTableSlot *slot,
|
||||||
CommandId cid, int options,
|
CommandId cid, bits32 options,
|
||||||
BulkInsertStateData *bistate);
|
BulkInsertStateData *bistate);
|
||||||
|
|
||||||
/* see table_tuple_insert_speculative() for reference about parameters */
|
/* see table_tuple_insert_speculative() for reference about parameters */
|
||||||
void (*tuple_insert_speculative) (Relation rel,
|
void (*tuple_insert_speculative) (Relation rel,
|
||||||
TupleTableSlot *slot,
|
TupleTableSlot *slot,
|
||||||
CommandId cid,
|
CommandId cid,
|
||||||
int options,
|
bits32 options,
|
||||||
BulkInsertStateData *bistate,
|
BulkInsertStateData *bistate,
|
||||||
uint32 specToken);
|
uint32 specToken);
|
||||||
|
|
||||||
|
|
@ -527,7 +530,7 @@ typedef struct TableAmRoutine
|
||||||
|
|
||||||
/* see table_multi_insert() for reference about parameters */
|
/* see table_multi_insert() for reference about parameters */
|
||||||
void (*multi_insert) (Relation rel, TupleTableSlot **slots, int nslots,
|
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 */
|
/* see table_tuple_delete() for reference about parameters */
|
||||||
TM_Result (*tuple_delete) (Relation rel,
|
TM_Result (*tuple_delete) (Relation rel,
|
||||||
|
|
@ -574,7 +577,7 @@ typedef struct TableAmRoutine
|
||||||
*
|
*
|
||||||
* Optional callback.
|
* 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
|
static inline void
|
||||||
table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid,
|
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,
|
rel->rd_tableam->tuple_insert(rel, slot, cid, options,
|
||||||
bistate);
|
bistate);
|
||||||
|
|
@ -1405,7 +1408,7 @@ table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid,
|
||||||
*/
|
*/
|
||||||
static inline void
|
static inline void
|
||||||
table_tuple_insert_speculative(Relation rel, TupleTableSlot *slot,
|
table_tuple_insert_speculative(Relation rel, TupleTableSlot *slot,
|
||||||
CommandId cid, int options,
|
CommandId cid, bits32 options,
|
||||||
BulkInsertStateData *bistate,
|
BulkInsertStateData *bistate,
|
||||||
uint32 specToken)
|
uint32 specToken)
|
||||||
{
|
{
|
||||||
|
|
@ -1441,7 +1444,7 @@ table_tuple_complete_speculative(Relation rel, TupleTableSlot *slot,
|
||||||
*/
|
*/
|
||||||
static inline void
|
static inline void
|
||||||
table_multi_insert(Relation rel, TupleTableSlot **slots, int nslots,
|
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,
|
rel->rd_tableam->multi_insert(rel, slots, nslots,
|
||||||
cid, options, bistate);
|
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.
|
* tuple_insert and multi_insert with a BulkInsertState specified.
|
||||||
*/
|
*/
|
||||||
static inline void
|
static inline void
|
||||||
table_finish_bulk_insert(Relation rel, int options)
|
table_finish_bulk_insert(Relation rel, bits32 options)
|
||||||
{
|
{
|
||||||
/* optional callback */
|
/* optional callback */
|
||||||
if (rel->rd_tableam && rel->rd_tableam->finish_bulk_insert)
|
if (rel->rd_tableam && rel->rd_tableam->finish_bulk_insert)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue