Hi 2017-01-08 18:57 GMT+01:00 Victor Wagner <vi...@wagner.pp.ru>:
> > Collegues! > > Recently I've found out that PL/Python have very nice feature - explicit > subtransaction object, which allows to execute block of code in the > context of subtransaction. > > I've quite surprised that other PL languages, shipped with PostgreSQL do > not have such useful construction. > > If it might require considerable trickery to add such functionality into > PL/Perl, Tcl allows to add new control stuctures very easily. > > I'm attaching the patch which implements subtransaction command for > PL/Tcl which does almost same as PL/Python plpy.subtransction context > manager object does: executes a block of Tcl code in the context of > subtransaction, rolls subtransaction back if error occures and commits > it otherwise. > > It looks like > > subtransaction { > ...some Tcl code... > } > > Typically one would use it inside Tcl catch statement: > > if [catch { > subtransaction { > spi_exec "insert into..." > ... > } > } errormsg] { > # Handle an error > } > > See documentation and tests included in the patch for more complete > examples. > > Just like corresponding Python construction, this command doesn't > replace language builtin exception handling, just adds subtransaction > support to it. > > Patch includes sufficiently less tests than python subtransaction tests, > because Tcl implementation is way simpler than python one, and doesn't > have syntactic variatons which depend on language version. > > Also entering and exiting subtransactions are in the same piece of code > rather than in separate __enter__ and __exit__ methods as in Python, so > there is no possibility to call exit without enter or vice versa. > I did a review of this patch 1. This functionality has sense and nobody was against this feature. 2. This patch does what is proposed - it introduce new TCL function that wraps PostgreSQL subtransaction 3. This patch is really simple due massive using subtransactions already - every SPI called from TCL is wrapped to subtransaction. 4. A documentation is good - although I am not sure if it is well structured - is <sect2> level necessary? Probably there will not be any other similar command. 5. There are a basic regress tests, and all tests passed, but I miss a path, where subtransaction is commited - now rollback is every time 6. The code has some issues with white chars 7. I don't understand why TopMemoryContext is used there? Maybe some already used context should be there. +<->BeginInternalSubTransaction(NULL); +<->MemoryContextSwitchTo(TopTransactionContext); +<-> Regards Pavel > > -- > Victor Wagner <vi...@wagner.pp.ru> >