Bruce Momjian <br...@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 because of 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 
created or truncated in the current subtransaction")));
        hi_options |= HEAP_INSERT_FROZEN;
    }


                        regards, tom lane


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to