Bug in Function-Transactions?
Folks,
I just encountered a very interesting bug in ver 7.2.1.
As an experiment, I tried running a VACCUUM ANALYZE on a table inside a
Function after the function had made a large number of updates to that
table. I assumed that this wouldn't work, but I thought I'd give it a
try.
It did not work. What it did was interesting.
Postgres terminated my back-end connection to the server when it
reached the VACUUM statement.
Next, I reconnected. I was quite surprised to discover that Postgres
had *not* rolled back the changes made by the function before it
crashed.
I'm testing to see if I can reproduce this issue on 7.3b1. I'll
e-mail you with a test database if I can.
-Josh Berkus
Josh Berkus wrote:
Folks,
I just encountered a very interesting bug in ver 7.2.1.
As an experiment, I tried running a VACCUUM ANALYZE on a table inside a
Function after the function had made a large number of updates to that
table. I assumed that this wouldn't work, but I thought I'd give it a
try.It did not work. What it did was interesting.
Postgres terminated my back-end connection to the server when it
reached the VACUUM statement.Next, I reconnected. I was quite surprised to discover that Postgres
had *not* rolled back the changes made by the function before it
crashed.I'm testing to see if I can reproduce this issue on 7.3b1. I'll
e-mail you with a test database if I can.
You will not be able to reproduce it. 7.3 disabled VACUUM inside
functions for that exact reason.
--
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
"Josh Berkus" <josh@agliodbs.com> writes:
Postgres terminated my back-end connection to the server when it
reached the VACUUM statement.
Next, I reconnected. I was quite surprised to discover that Postgres
had *not* rolled back the changes made by the function before it
crashed.
Yeah. The problem here is precisely that VACUUM does internal commits
--- so it committed your function's earlier changes too. When you
returned from the VACUUM, the function's execution context was gone
as a byproduct of post-commit cleanup. Oops. VACUUM is disallowed
inside functions as of 7.3 to prevent this problem.
I don't think you need to be too worried about database corruption
as a result of this experiment, fortunately.
regards, tom lane