Hi! I have looked at your patch and have a few questions.
110: static bool SafeCopying(CopyFromState cstate, ExprContext *econtext, 111: TupleTableSlot *myslot); --- 636: bool 637: SafeCopying(CopyFromState cstate, ExprContext *econtext, TupleTableSlot *myslot) Why is there no static keyword in the definition of the SafeCopying() function, but it is in the function declaration. 675: MemoryContext cxt = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); 676: 677: valid_row = NextCopyFrom(cstate, econtext, myslot->tts_values, myslot->tts_isnull); 678: tuple_is_valid = valid_row; 679: 680: if (valid_row) 681: sfcstate->safeBufferBytes += cstate->line_buf.len; 682: 683: CurrentMemoryContext = cxt; Why are you using a direct assignment to CurrentMemoryContext instead of using the MemoryContextSwitchTo function in the SafeCopying() routine? 1160: /* Standard copying with option "safe copying" enabled by IGNORE_ERRORS. */ 1161: if (!SafeCopying(cstate, econtext, myslot)) 1162: break; I checked with GDB that the CurrentMemoryContext changes when SafeCopying returns. And the target context may be different each time you do a COPY in psql. 1879: cstate->sfcstate->safe_cxt = AllocSetContextCreate(oldcontext, 1880: "Safe_context", 1881: ALLOCSET_DEFAULT_SIZES); When you initialize the cstate->sfcstate structure, you create a cstate->sfcstate->safe_cxt memory context that inherits from oldcontext. Was it intended to use cstate->copycontext as the parent context here? On Wed, Nov 2, 2022 at 11:46 AM Damir Belyalov <dam.be...@gmail.com> wrote: > Updated the patch: > - Optimized and simplified logic of IGNORE_ERRORS > - Changed variable names to more understandable ones > - Added an analogue of MAX_BUFFERED_BYTES for safe buffer > > > Regards, > Damir Belyalov > Postgres Professional > Regards, Daniil Anisimov Postgres Professional