> > The big picture here is that with the current behavior, it is
possible
> > to keep track of existence of prepared statements without wrapping
or
> > even being aware of transaction activity. This is tremendously
useful
> > for handling them in a generic way because transactions and prepared
> > statements are handled on different levels of my (and others')
> > technology stack. If you change that behavior, that is no longer
> > possible, period, and I will be forced to stop using them.
>
> But then how can you be sure that other layers in your stack won't try
to
> re-establish a broken connection, multiplex sessions, pool
connections,
> parallellize transactions or prepare their own statements?
Because the prepared statement and the connection are handled on the
same level, and will always be. If and when I decide to implement
multiplexing/pooling, this has to be handled a level above my driver.
Since the applications my driver is serving are written in COBOL,
prepared statement creation is highly unlikely (plus the statement names
are well mangled). My driver wraps the SQL interface and exposes some
of it as COBOL file I/O statements and some as library commands.
> What if we allowed the backend to match queries to the patterns of
> prepared statements without actually naming them? You'd then have two
> ways of executing a prepared query:
I would not necessarily be opposed to this type of optimization but it
seems more complicated. It would be up to smarter people than me to
judge it's value vs. implementation cost :). ISTM you are losing a
slight advantage in parsing time vs. a more general query plan
generation time speedup.
Right now, I'm transitioning to ExexPrepared to skip the string escaping
step on the client side. I would hate to lose that ability. ExecParams
is a little more work to set up (doable, though).
> Am I making things too simple here?
Unfortunately, I think the answer is yes. Being able to roll back
prepared statements would exclude them from a narrow but important class
of use.
With the introduction of nested x into the code base, your original
problem can be guarded against (albeit somewhat clumsily) by careful use
of wrapping PREPARE/DEALLOCATE. If you switch things up, every EXECUTE
has to be wrapped to guarantee safety in a transaction agnostic
scenario.
Now, which would you rather do: wrap PREPARE, or wrap EXECUTE?
Merlin