@@ -98,7 +98,7 @@ static HTAB *seqhashtab = NULL; /* hash table for SeqTable items */
98
98
static SeqTableData * last_used_seq = NULL ;
99
99
100
100
static void fill_seq_with_data (Relation rel , HeapTuple tuple );
101
- static void fill_seq_fork_with_data (Relation rel , HeapTuple tuple , ForkNumber forkNum );
101
+ static void fill_seq_fork_with_data (Relation rel , HeapTuple tuple , ForkNumber forkNum , Buffer buf );
102
102
static Relation lock_and_open_sequence (SeqTable seq );
103
103
static void create_seq_hashtable (void );
104
104
static void init_sequence (Oid relid , SeqTable * p_elm , Relation * p_rel );
@@ -351,7 +351,7 @@ ResetSequence(Oid seq_relid)
351
351
static void
352
352
fill_seq_with_data (Relation rel , HeapTuple tuple )
353
353
{
354
- fill_seq_fork_with_data (rel , tuple , MAIN_FORKNUM );
354
+ fill_seq_fork_with_data (rel , tuple , MAIN_FORKNUM , InvalidBuffer );
355
355
356
356
if (rel -> rd_rel -> relpersistence == RELPERSISTENCE_UNLOGGED )
357
357
{
@@ -360,7 +360,7 @@ fill_seq_with_data(Relation rel, HeapTuple tuple)
360
360
srel = smgropen (rel -> rd_node , InvalidBackendId , rel -> rd_rel -> relpersistence );
361
361
smgrcreate (srel , INIT_FORKNUM , false);
362
362
log_smgrcreate (& rel -> rd_node , INIT_FORKNUM );
363
- fill_seq_fork_with_data (rel , tuple , INIT_FORKNUM );
363
+ fill_seq_fork_with_data (rel , tuple , INIT_FORKNUM , InvalidBuffer );
364
364
FlushRelationBuffers (rel );
365
365
smgrclose (srel );
366
366
}
@@ -370,28 +370,28 @@ fill_seq_with_data(Relation rel, HeapTuple tuple)
370
370
* Initialize a sequence's relation fork with the specified tuple as content
371
371
*/
372
372
static void
373
- fill_seq_fork_with_data (Relation rel , HeapTuple tuple , ForkNumber forkNum )
373
+ fill_seq_fork_with_data (Relation rel , HeapTuple tuple , ForkNumber forkNum , Buffer buf )
374
374
{
375
- Buffer buf ;
376
375
Page page ;
377
376
sequence_magic * sm ;
378
377
OffsetNumber offnum ;
378
+ bool lockBuffer = false;
379
379
380
380
/* Initialize first page of relation with special magic number */
381
-
382
- buf = ReadBufferExtended (rel , forkNum , P_NEW , RBM_NORMAL , NULL );
383
- Assert (BufferGetBlockNumber (buf ) == 0 );
384
-
381
+ if (buf == InvalidBuffer )
382
+ {
383
+ buf = ReadBufferExtended (rel , forkNum , P_NEW , RBM_NORMAL , NULL );
384
+ Assert (BufferGetBlockNumber (buf ) == 0 );
385
+ LockBuffer (buf , BUFFER_LOCK_EXCLUSIVE );
386
+ lockBuffer = true;
387
+ }
385
388
page = BufferGetPage (buf );
386
-
387
389
PageInit (page , BufferGetPageSize (buf ), sizeof (sequence_magic ));
388
390
sm = (sequence_magic * ) PageGetSpecialPointer (page );
389
391
sm -> magic = SEQ_MAGIC ;
390
392
391
393
/* Now insert sequence tuple */
392
394
393
- LockBuffer (buf , BUFFER_LOCK_EXCLUSIVE );
394
-
395
395
/*
396
396
* Since VACUUM does not process sequences, we have to force the tuple to
397
397
* have xmin = FrozenTransactionId now. Otherwise it would become
@@ -440,7 +440,8 @@ fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum)
440
440
441
441
END_CRIT_SECTION ();
442
442
443
- UnlockReleaseBuffer (buf );
443
+ if (lockBuffer )
444
+ UnlockReleaseBuffer (buf );
444
445
}
445
446
446
447
/*
@@ -1215,9 +1216,29 @@ read_seq_tuple(Relation rel, Buffer *buf, HeapTuple seqdatatuple)
1215
1216
sm = (sequence_magic * ) PageGetSpecialPointer (page );
1216
1217
1217
1218
if (sm -> magic != SEQ_MAGIC )
1218
- elog (ERROR , "bad magic number in sequence \"%s\": %08X" ,
1219
- RelationGetRelationName (rel ), sm -> magic );
1220
-
1219
+ {
1220
+ /* NEON: reinitialize unlogged sequence */
1221
+ if (rel -> rd_rel -> relpersistence == RELPERSISTENCE_UNLOGGED )
1222
+ {
1223
+ Datum value [SEQ_COL_LASTCOL ] = {0 };
1224
+ bool null [SEQ_COL_LASTCOL ] = {false};
1225
+ HeapTuple tuple ;
1226
+ Form_pg_sequence pgsform ;
1227
+
1228
+ tuple = SearchSysCache1 (SEQRELID , RelationGetRelid (rel ));
1229
+ if (!HeapTupleIsValid (tuple ))
1230
+ elog (ERROR , "cache lookup failed for sequence %u" , RelationGetRelid (rel ));
1231
+ pgsform = (Form_pg_sequence ) GETSTRUCT (tuple );
1232
+ value [SEQ_COL_LASTVAL - 1 ] = Int64GetDatumFast (pgsform -> seqstart );
1233
+ ReleaseSysCache (tuple );
1234
+
1235
+ tuple = heap_form_tuple (RelationGetDescr (rel ), value , null );
1236
+ fill_seq_fork_with_data (rel , tuple , MAIN_FORKNUM , * buf );
1237
+ }
1238
+ else
1239
+ elog (ERROR , "bad magic number in sequence \"%s\": %08X" ,
1240
+ RelationGetRelationName (rel ), sm -> magic );
1241
+ }
1221
1242
lp = PageGetItemId (page , FirstOffsetNumber );
1222
1243
Assert (ItemIdIsNormal (lp ));
1223
1244
0 commit comments