Re: [HACKERS] Explicit subtransactions for PL/Tcl - Mailing list pgsql-hackers

From Pavel Stehule
Subject Re: [HACKERS] Explicit subtransactions for PL/Tcl
Date
Msg-id CAFj8pRBk9ji+5=jAb8s+0=fdCyz60MvPEchmW4jqx=XjDjH4zA@mail.gmail.com
Whole thread Raw
In response to [HACKERS] Explicit subtransactions for PL/Tcl  (Victor Wagner <vitus@wagner.pp.ru>)
Responses Re: [HACKERS] Explicit subtransactions for PL/Tcl  (Victor Wagner <vitus@wagner.pp.ru>)
Re: [HACKERS] Explicit subtransactions for PL/Tcl  (Victor Wagner <vitus@wagner.pp.ru>)
List pgsql-hackers
Hi

2017-01-08 18:57 GMT+01:00 Victor Wagner <vitus@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 <vitus@wagner.pp.ru>

pgsql-hackers by date:

Previous
From: Andreas Karlsson
Date:
Subject: Re: [HACKERS] REINDEX CONCURRENTLY 2.0
Next
From: Peter Eisentraut
Date:
Subject: Re: [HACKERS] new gcc 7.0.1 warnings