Bruce Momjian <bruce@momjian.us> writes:
> Well, so you are saying that there really isn't any use-visible logic
> for those messages to be different,
No, and in fact the whole block of code is badly written because it
conflates two unrelated tests. I guess somebody was trying to save
a couple of nanoseconds by not calling GetCurrentSubTransactionId
if a previous test had failed, but really why should we care about
that number of cycles in COPY preliminaries? The code ought to be
more like this:
/* comment about skipping FSM or WAL here */ if (cstate->rel->rd_createSubid != InvalidSubTransactionId ||
cstate->rel->rd_newRelfilenodeSubid!= InvalidSubTransactionId) { hi_options |= HEAP_INSERT_SKIP_FSM; if
(!XLogIsNeeded()) hi_options |= HEAP_INSERT_SKIP_WAL; } /* comment about when we can perform FREEZE here
*/ if (cstate->freeze) { if (!ThereAreNoPriorRegisteredSnapshots() || !ThereAreNoReadyPortals())
ereport(ERROR, (ERRCODE_INVALID_TRANSACTION_STATE, errmsg("cannot perform FREEZE
becauseof prior transaction activity")));
if (cstate->rel->rd_createSubid != GetCurrentSubTransactionId() && cstate->rel->rd_newRelfilenodeSubid
!=GetCurrentSubTransactionId()) ereport(ERROR,
(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE, errmsg("cannot perform FREEZE because the table was not
createdor truncated in the current subtransaction"))); hi_options |= HEAP_INSERT_FROZEN; }
regards, tom lane