|
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_rec xlrec; |
| 194 | + XLogRecPtr recptr; |
| 195 | + XLogRecData rdata[2]; |
| 196 | + Form_pg_sequence newseq = (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 | }
|
|
0 commit comments