Allow SET to not start a transaction

Started by Bruce Momjianalmost 24 years ago2 messagespatches
Jump to latest
#1Bruce Momjian
bruce@momjian.us

We have on the open items list:

Make SET not start a transaction with autocommit off, document it

The attached patch does exactly that (though without documentation). It
checks for the TRANS_DEFAULT transaction state, which is the state right
after a COMMIT. If the backend is in that state, and autocommit is off,
and the command is SET/SHOW/RESET, then a COMMIT will be forced, rather
than keeping the transaction open for the next command. It seems to
work, but i want to test it more before applying to CVS.

---------------------------------------------------------------------------

test=> set autocommit = off;
SET
test=> commit;
WARNING: COMMIT: no transaction in progress
COMMIT
test=> set statement_timeout = 9999999;
SET
test=> select 1;
?column?
----------
1
(1 row)

test=> abort;
ROLLBACK
test=> show statement_timeout;
statement_timeout
-------------------
9999999
(1 row)

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Attachments:

/bjm/difftext/plainDownload+27-26
#2Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#1)
Re: Allow SET to not start a transaction

OK, I have finished the patch and applied it, with doc updates.

---------------------------------------------------------------------------

Bruce Momjian wrote:

We have on the open items list:

Make SET not start a transaction with autocommit off, document it

The attached patch does exactly that (though without documentation). It
checks for the TRANS_DEFAULT transaction state, which is the state right
after a COMMIT. If the backend is in that state, and autocommit is off,
and the command is SET/SHOW/RESET, then a COMMIT will be forced, rather
than keeping the transaction open for the next command. It seems to
work, but i want to test it more before applying to CVS.

---------------------------------------------------------------------------

test=> set autocommit = off;
SET
test=> commit;
WARNING: COMMIT: no transaction in progress
COMMIT
test=> set statement_timeout = 9999999;
SET
test=> select 1;
?column?
----------
1
(1 row)

test=> abort;
ROLLBACK
test=> show statement_timeout;
statement_timeout
-------------------
9999999
(1 row)

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Attachments:

/bjm/difftext/plainDownload+73-44