Re: Is DBD::ODBC breaking the rules with this optimisation?

Tim Bunce <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <20101215100551.GG89294@timac>
Great. Thanks Martin.

Tim.

On Tue, Dec 14, 2010 at 03:26:41PM +0000, Martin J. Evans wrote:
> 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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.