Re: Weird prepared stmt behavior

Oliver Jowett <oliver@opencloud.com>

From: Oliver Jowett <oliver@opencloud.com>
To: alvherre@dcc.uchile.cl
Cc: tgl@sss.pgh.pa.us, pgsql-hackers@postgresql.org, pgsql-jdbc@postgresql.org
Date: 2004-05-01T22:08:50Z
Lists: pgsql-hackers
(I'm not on -hackers, but saw this in the archives)

Alvaro Herrera wrote:
> On Fri, Apr 30, 2004 at 09:44:52PM -0400, Tom Lane wrote:
>> Alvaro Herrera <alvherre ( at ) dcc ( dot ) uchile ( dot ) cl> writes:
>> > Is this expected?  If so, why?  I'd expect the prepared stmt to be
>> > deallocated.
>> 
>> prepare.c probably should have provisions for rolling back its state to
>> the start of a failed transaction ... but it doesn't.
>> 
>> Before jumping into doing that, though, I'd want to have some
>> discussions about the implications for the V3 protocol's notion of
>> prepared statements.  The protocol spec does not say anything that
>> would suggest that prepared statements are lost on transaction rollback,
>> and offhand it seems like they shouldn't be because the protocol is
>> lower-level than transactions.
> 
> Right now there is no distinction between a PREPARE prepared statement
> and a protocol-level one.  If we want to have the v3proto's statements
> behave different from PREPARE's, it's just a matter of adding a new
> field into the PreparedStatement.  I can do that and make them behave
> different if people think this is how it should be.
> 
> I don't really have an opinion on whether protocol-level should behave
> different.  What do people think?

At least from the JDBC driver's point of view, having prepared 
statements roll back is more work for the driver. Currently it uses 
PREPARE/EXECUTE statements, but eventually it'll use the protocol-level 
messages.

When the JDBC driver is given a query to execute and decides to use 
server-side preparation, it sends a PREPARE (or eventually a Parse 
message). Thereafter, when that same query is executed it will send an 
EXECUTE (or Bind/Execute) instead of the full query. It does this by 
setting some state in the driver-side object representing the query to 
say "this query is prepared with name 'foo'".

If PREPARE can roll back, the driver must maintain a set of all 
statements that were sucessfully PREPAREd in the current transaction, 
and fix up the corresponding query object state whenever a transaction 
rolls back.

 From that point of view, it's much simpler to keep PREPARE (or at least 
Parse) as it currently is. I suspect the same argument applies to any 
interface layer that uses PREPARE or Parse automatically.

-O