diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/commands/copy.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 4172c0cfbe6..abd82cf9f59 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -1963,8 +1963,18 @@ CopyFrom(CopyState cstate) * routine first. * * As mentioned in comments in utils/rel.h, the in-same-transaction test - * is not completely reliable, since in rare cases rd_createSubid or - * rd_newRelfilenodeSubid can be cleared before the end of the transaction. + * is not always set correctly, since in rare cases rd_newRelfilenodeSubid + * can be cleared before the end of the transaction. The exact case is + * when a relation sets a new relfilenode twice in same transaction, yet + * the second one fails in an aborted subtransaction, e.g. + * + * BEGIN; + * TRUNCATE t; + * SAVEPOINT save; + * TRUNCATE t; + * ROLLBACK TO save; + * COPY ... + * * However this is OK since at worst we will fail to make the optimization. * * Also, if the target file is new-in-transaction, we assume that checking @@ -1994,10 +2004,9 @@ CopyFrom(CopyState cstate) * which subtransaction created it is crucial for correctness * of this optimisation. * - * Note that because the test is unreliable in case of relcache reset - * we cannot guarantee that we can honour the request to FREEZE. - * If we cannot honour the request we do so silently, firstly to - * avoid noise for the user and also to avoid obscure test failures. + * As noted above rd_newRelfilenodeSubid is not set in all cases + * where we can apply the optimization, so in those rare cases + * where we cannot honour the request we do so silently. */ if (cstate->freeze && ThereAreNoPriorRegisteredSnapshots() && |