On Tue, Oct 19, 2010 at 08:59:19AM +0100, Martin J. Evans wrote: > On 18/10/10 22:54, Tim Bunce wrote: > > On Mon, Oct 18, 2010 at 04:45:51PM +0100, Martin J. Evans wrote: > >> > >> State 23000 you are getting is "Integrity constraint violation" which is > >> an error but note the text on the end of the error you are getting: > >> > >> "[state was 23000 now 01000]" > >> > >> 01000 is a general warning. I don't understand why the "now 01000" in the > >> text of the error. > > > > "[state was 23000 now 01000]" looks like the behaviour of the set_err > > method: http://search.cpan.org/~timb/DBI/DBI.pm#set_err > > Of course, I always forget that. > > > It looks like state 23000 was recorded but then updated to 01000 by a > > separate event. But, looking at the internal code for set_err_sv, > > I see that message might get appended even if the code then decides not > > to change the err value.
Which is probably a bug. > > You could use something like $h->{HandleSetErr} = sub { warn "@_"; return > > 0; } > > to see the second event getting recorded. > > All drivers I've tried this with report 2 things. The 23000 error for the > insert of a null into a column which does not allow nulls (the tds_error > packet) then a 01000 informational (tds_info) which states the statement has > been terminated. > > However, it does not get around the fact that SQLExecute is returning > SQL_SUCCESS_WITH_INFO with the broken driver. DBD::ODBC uses the SQLExecute > return to determine if the execute was successful or not (as per the ODBC > docs) and not the state of any error it sees when recovering details of the > errors and informationals. > > I suppose this could be changed but it would need additional logic everywhere > "if (SQL_SUCCEEDED(ret))" is called and some way of recording the states it > has seen since the last ODBC call. I'm not keen on doing that and not only > because the driver in this case is broken. I agree. Tim. p.s. Thanks for the doc patch. > > Tim. > > > >> So something is a amiss there. Having said that the MS native client > >> reports the same error but SQLExecute returns SQL_ERROR. > >> > >> As far as I am concerned (and I've written ODBC drivers and code to ODBC > >> Drivers for more years than I care to admit) the condition you have hit is > >> an error and when SQLError is called an error number, state and text is > >> returned BUT the call to SQLExecute is returning SQL_SUCCESS_WITH_INTO > >> instead of SQL_ERROR. I've read your comment from the Microsoft guy but I > >> don't believe it and in any case I have 1 of their drivers which behaves > >> differently than the one you've got. > >> > >> Martin > >> -- > >> Martin J. Evans > >> Easysoft Limited > >> http://www.easysoft.com > >> > > Martin > -- > Martin J. Evans > Easysoft Limited > http://www.easysoft.com >