On 13/12/10 21:00, Tim Bunce wrote: > On Mon, Dec 13, 2010 at 05:30:10PM +0000, Martin J. Evans wrote: >> See RT http://rt.cpan.org/Public/Bug/Display.html?id=63550 which started >> this off. >> >> DBD::ODBC optimises calls to the do method when no parameters are >> involved. Normally do is just a shortcut for prepare/execute except it >> should only be for non-result-set generating statements and hence does >> not return a statement handle. ODBC can optimise the do method to >> simply call SQLExecDirect instead of the normal SQLPrepare/SQLExecute >> (one round trip and other advantages). DBD::ODBC has been this way for >> years. >> >> However, the person reporting this issue is attempting to use the >> handle passed to an error handler when do fails to obtain the >> Statement attribute. The handle DBD::ODBC passes in to the error >> handler is the connection handle as DBD::ODBC never created a DBI >> statement handle and hence there is no Statement attribute to access. > > Actually, the database handle _does_ have a Statement attribute > http://search.cpan.org/~timb/DBI-1.615/DBI.pm#Statement
so it does, I missed that. > Feel free to patch the docs to change "most recent prepare method" > to "most recent prepare() or do() method". done >> Is DBD::ODBC breaking the rules here with this optimisation? > > No. excellent, so it is just failing to call STORE for the Statement in the optimised do method - which I have just fixed. > The DBI docs for do() should have a note along the lines that > "Drivers are free to avoid the overhead of creating an DBI statement > handle for do(), especially if there are no parameters. In which case > error handlers, if invoked during do(), will be passed the database handle." done > The docs for drivers using this approach should note the fact that a > statement handle isn't created, and that error handlers like HandleErr > will be called with the $dbh. done > Tim. Thanks Tim. BTW, I owe you an email as discussed at LPW - will try to get to it today. Martin -- Martin J. Evans Easysoft Limited http://www.easysoft.com