|
|
|
@ -10,7 +10,7 @@ |
|
|
|
|
* |
|
|
|
|
* |
|
|
|
|
* IDENTIFICATION |
|
|
|
|
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.293 2010/07/06 19:18:55 momjian Exp $ |
|
|
|
|
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.294 2010/07/23 00:43:00 rhaas Exp $ |
|
|
|
|
* |
|
|
|
|
*------------------------------------------------------------------------- |
|
|
|
|
*/ |
|
|
|
@ -408,10 +408,32 @@ AssignTransactionId(TransactionState s) |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Ensure parent(s) have XIDs, so that a child always has an XID later |
|
|
|
|
* than its parent. |
|
|
|
|
* than its parent. Musn't recurse here, or we might get a stack overflow |
|
|
|
|
* if we're at the bottom of a huge stack of subtransactions none of which |
|
|
|
|
* have XIDs yet. |
|
|
|
|
*/ |
|
|
|
|
if (isSubXact && !TransactionIdIsValid(s->parent->transactionId)) |
|
|
|
|
AssignTransactionId(s->parent); |
|
|
|
|
{ |
|
|
|
|
TransactionState p = s->parent; |
|
|
|
|
TransactionState *parents; |
|
|
|
|
size_t parentOffset = 0; |
|
|
|
|
|
|
|
|
|
parents = palloc(sizeof(TransactionState) * s->nestingLevel); |
|
|
|
|
while (p != NULL && !TransactionIdIsValid(p->transactionId)) |
|
|
|
|
{ |
|
|
|
|
parents[parentOffset++] = p; |
|
|
|
|
p = p->parent; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This is technically a recursive call, but the recursion will |
|
|
|
|
* never be more than one layer deep. |
|
|
|
|
*/ |
|
|
|
|
while (parentOffset != 0) |
|
|
|
|
AssignTransactionId(parents[--parentOffset]); |
|
|
|
|
|
|
|
|
|
pfree(parents); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Generate a new Xid and record it in PG_PROC and pg_subtrans. |
|
|
|
|