On Wed, Apr 01, 2015 at 03:20:31PM +0100, Martin J. Evans wrote:
> 
> However, having said all that I didn't see you were using freeTDS
> until the last email. I've seen an issue with freeTDS returning and
> error status and then not supplying the reason before.
> 
> I have to say at this point I'm pointing a finger at your driver as
> whatever, if it returns SQL_ERROR from SQLFreeHandle it should tell us
> the error when we call SQLError. However, your ODBC log is strange as
> it does not show any SQLFreeHandle call failing (and it does not look
> long enough for what you do in your script).
> 
> The only bit I'm not too sure about (I doubt has anything to do with
> your problem) is that DBD::ODBC does the following at the end of
> dbd_st_destroy

>     if (imp_dbh->hdbc != SQL_NULL_HDBC && !PL_dirty) {
> 
>         rc = SQLFreeHandle(SQL_HANDLE_STMT, imp_sth->hstmt);
> 
>         if (DBIc_TRACE(imp_sth, DBD_TRACING, 0, 5))
>             TRACE1(imp_dbh, "    SQLFreeHandle(stmt)=%d\n", rc);
> 
>         if (!SQL_SUCCEEDED(rc)) {
>             dbd_error(sth, rc, "st_destroy/SQLFreeHandle(stmt)");
>             /* return 0; */
>         }
>     }
> 
>     DBIc_IMPSET_off(imp_sth);         /* let DBI know we've done it   */
> 
> In this case, when no error can be found by dbd_error it does:
> 
>         DBIh_SET_ERR_CHAR(
>             h, imp_xxh, Nullch, 1,
>             "    Unable to fetch information about the error", "HY000", 
> Nullch);
> 
> but of course then drops into DBIc_IMPSET_off(imp_sth) and returns which 
> might not be ok. I don't know if Tim could comment on this.

DBIc_IMPSET_off is how the driver indicates that it's done all the
cleanup it can. The current code seems reasonable.

Tim.

> So, in summary, I cannot reproduce your error, I've seen freeTDS error and 
> fail to tell us the error before, your code works flawlessly with the 
> Easysoft and MS ODBC drivers and your ODBC log contradicts the DBI/DBD::ODBC 
> log so I'm going to suggest you've updated or changed your freeTDS driver and 
> this one is broken.
> 
> Martin
> 
> >
> >On Tue, Mar 31, 2015 at 4:23 AM, Martin J. Evans <martin.ev...@easysoft.com 
> ><mailto:martin.ev...@easysoft.com>> wrote:
> >
> >    On 31/03/15 06:04, Joel Plotkin wrote:
> >
> >        Hi,
> >
> >        I've attached the sample test8.pl <http://test8.pl> 
> > <http://test8.pl> script (smallest one possible that creates the problem) 
> > and a trace file at level 15.
> >
> >        Thanks for any insight,
> >
> >        Joel
> >
> >
> >         -dbd_st_execute(ac3cb0)=-1
> >         <- execute= -1 at test8.pl <http://test8.pl> line 74 via  at 
> > test8.pl <http://test8.pl> line 53
> >         -> DESTROY for DBD::ODBC::st (DBI::st=HASH(0xac3818)~INNER) 
> > thr#974010
> >         SQLFreeHandle(stmt)=-1
> >         !!dbd_error2(err_rc=-1, what=st_destroy/SQLFreeHandle(__stmt), 
> > handles=(c2abd0,c2b1c0,c802c0)
> >         ** No error found -1 **
> >         !! ERROR: 1 '    Unable to fetch information about the error' 
> > (err#1)
> >         <- DESTROY= undef at test8.pl <http://test8.pl> line 54 via  at 
> > test8.pl <http://test8.pl> line 54
> >         !! ERROR: 1 CLEARED by call to fetchall_arrayref method
> >
> >    This is suspicious - SQLFreeHandle failed and then the error was cleared.
> >
> >    I cannot reproduce and we need further clues.
> >
> >    Instead of starting tracing in the script could you rerun with 
> > DBI_TRACE=DBD=x.log
> >
> >    e.g.,
> >    set DBI_TRACE=DBD=x.log
> >    perl myscript.pl <http://myscript.pl>
> >
> >    This will put in the x.log file a load of ODBC info for the driver etc - 
> > could you send me the whole log file.
> >
> >    Another thing well worth doing is enabling tracing at the ODBC level as 
> > then we can try and find out why SQLFreeHandle is failing. You can do this 
> > by going to the ODBC administrator (make sure you pick the right one 32 bit 
> > or 64 bit depending on what your perl is) and selecting the tracing tab, 
> > enter a file and click on start then run your script.
> >
> >    Martin
> >
> >
> 

Reply via email to