Re: COPY FREEZE has no warning - Mailing list pgsql-hackers

From Tom Lane
Subject Re: COPY FREEZE has no warning
Date
Msg-id 18389.1359824945@sss.pgh.pa.us
Whole thread Raw
In response to Re: COPY FREEZE has no warning  (Bruce Momjian <bruce@momjian.us>)
Responses Re: COPY FREEZE has no warning
List pgsql-hackers
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



pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: autovacuum not prioritising for-wraparound tables
Next
From: Tom Lane
Date:
Subject: Re: proposal - assign result of query to psql variable