|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.52 2001/03/22 03:59:23 momjian Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.53 2001/04/03 21:58:00 vadim Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -181,9 +181,41 @@ DefineSequence(CreateSeqStmt *seq)
|
181 | 181 | /* Now - form & insert sequence tuple */
|
182 | 182 | tuple=heap_formtuple(tupDesc,value,null);
|
183 | 183 | heap_insert(rel,tuple);
|
| 184 | +ReleaseBuffer(buf); |
184 | 185 |
|
185 |
| -if (WriteBuffer(buf)==STATUS_ERROR) |
186 |
| -elog(ERROR,"DefineSequence: WriteBuffer failed"); |
| 186 | +/* |
| 187 | + * After crash REDO of heap_insert above would re-init page and |
| 188 | + * our magic number would be lost. We have to log sequence creation. |
| 189 | + * This means two log records instead of one -:( |
| 190 | + */ |
| 191 | +START_CRIT_SECTION(); |
| 192 | +{ |
| 193 | +xl_seq_recxlrec; |
| 194 | +XLogRecPtrrecptr; |
| 195 | +XLogRecDatardata[2]; |
| 196 | +Form_pg_sequencenewseq= (Form_pg_sequence)GETSTRUCT(tuple); |
| 197 | + |
| 198 | +/* We do not log first nextval call, so "advance" sequence here */ |
| 199 | +newseq->is_called='t'; |
| 200 | +newseq->log_cnt=0; |
| 201 | + |
| 202 | +xlrec.node=rel->rd_node; |
| 203 | +rdata[0].buffer=InvalidBuffer; |
| 204 | +rdata[0].data= (char*)&xlrec; |
| 205 | +rdata[0].len=sizeof(xl_seq_rec); |
| 206 | +rdata[0].next=&(rdata[1]); |
| 207 | + |
| 208 | +rdata[1].buffer=InvalidBuffer; |
| 209 | +rdata[1].data= (char*)tuple->t_data; |
| 210 | +rdata[1].len=tuple->t_len; |
| 211 | +rdata[1].next=NULL; |
| 212 | + |
| 213 | +recptr=XLogInsert(RM_SEQ_ID,XLOG_SEQ_LOG |XLOG_NO_TRAN,rdata); |
| 214 | + |
| 215 | +PageSetLSN(page,recptr); |
| 216 | +PageSetSUI(page,ThisStartUpID); |
| 217 | +} |
| 218 | +END_CRIT_SECTION(); |
187 | 219 |
|
188 | 220 | heap_close(rel,AccessExclusiveLock);
|
189 | 221 | }
|
|