On Wed, Oct 21, 2020 at 7:42 PM Amit Kapila <amit.kapil...@gmail.com> wrote: > > On Wed, Oct 21, 2020 at 1:38 PM Peter Smith <smithpb2...@gmail.com> wrote: > > > > The PG docs for PREPARE TRANSACTION [1] don't say anything about an > > empty (zero length) transaction-id. > > e.g. PREPARE TRANSACTION ''; > > [1] https://www.postgresql.org/docs/current/sql-prepare-transaction.html > > > > ~ > > > > Meanwhile, during testing I found the 2PC prepare hangs when an empty > > id is used. > > > > Can you please take an example to explain what you are trying to say?
I was referring to an empty (zero length) transaction ID, not an empty transaction. The example was already given as PREPARE TRANSACTION ''; A longer example from my regress test is shown below. Using 2PC pub/sub this will currently hang: # -------------------- # Test using empty GID # -------------------- # check that 2PC gets replicated to subscriber $node_publisher->safe_psql('postgres', "BEGIN;INSERT INTO tab_full VALUES (51);PREPARE TRANSACTION '';"); $node_publisher->poll_query_until('postgres', $caughtup_query) or die "Timed out while waiting for subscriber to catch up"; # check that transaction is in prepared state on subscriber $result = $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts where gid = '';"); is($result, qq(1), 'transaction is prepared on subscriber'); # ROLLBACK $node_publisher->safe_psql('postgres', "ROLLBACK PREPARED '';"); # check that 2PC gets aborted on subscriber $node_publisher->poll_query_until('postgres', $caughtup_query) or die "Timed out while waiting for subscriber to catch up"; $result = $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts where gid = '';"); is($result, qq(0), 'transaction is aborted on subscriber'); ~ Is that something that should be made to work for 2PC pub/sub, or was Postgres PREPARE TRANSACTION statement wrong to allow the user to specify an empty transaction ID in the first place? Kind Regards Peter Smith. Fujitsu Australia.