On 2/22/07, Jim Kenedy <[EMAIL PROTECTED]> wrote:
Note: This was previously posted on c.d.i but should have been posted
here (as kindly noted by Jonathan Leffler). Also included are the
run output with DBI_TRACE=3 as well as the perl -Ilib BugReport
output.
--------------------------------------------------------------------------
I'm trying to install this module using Bundle::DBD::Informix but the
t/t20error.t test is failing.
I've narrowed it down to the fact that in t/t20error.t the ISAM error
number in $msg is incorrect (here it's 4294967196 when it should be
100):
DBD::Informix::st execute failed: SQL: -239: Could not insert new row
- duplicate value in a UNIQUE INDEX column.
ISAM: 4294967196: ISAM error: duplicate value for a record with
unique key. at t/t20error.t line 44.
Does anyone have an idea why the ISAM error is incorrect? I've
checked that all components are 64 bit.
Yes...in dbdimp.ec, in the function dbd_ix_fmterror(), there is the code:
/* Format ISAM (secondary) error */
if (sqlca.sqlerrd[1] != 0)
{
if (rgetmsg(sqlca.sqlerrd[1], errbuf, sizeof(errbuf)) != 0)
strcpy(errbuf, "<<Failed to locate ISAM error message>>");
sprintf(fmtbuf, errbuf, sqlca.sqlerrm);
sprintf(isambuf, "ISAM: %ld: %s", sqlca.sqlerrd[1], fmtbuf);
}
else
isambuf[0] = '\0';
On your 64-bit platform, %ld is consuming 8 bytes - but sqlca.sqlerrd[1] is
an int4 (see $INFORMIXDIR/incl/esql/sqlca.h). We need to make the format
and the value self-consistent - one way to do that is to cast sqlca.sqlerrd[1]
to long. This will work on 32-bit and 64-bit platforms - so it is a
reasonable fix. The alternative more complex fix is to use string
concatenation and the macros in esqltype.h - PRId_ixInt4 - to yield:
sprintf(isambuf, "ISAM: " PRId_ixInt4 " %s", sqlca.sqlerrd[1].fmtbuf);
The long term fix will more likely add the cast - the ISAM errors are
actually relatively small (-1 .. -200 or thereabouts, usually - and
certainly nowhere near the 32-bit limits), so it is slightly simpler to
understand. What I'll need to understand is how (if) my 64-bit Sun SPARC
tests passed - and how you got the string information out.
The trace information did help - it crystallized where I needed to look.
Version Info...
Kernel: Linux ahost.aserver.com 2.6.9-42.0.3.ELsmp #1 SMP Fri Oct 6
06:28:26 CDT 2006 x86_64 x86_64 x86_64 GNU/Linux
Perl: v5.8.5 built for x86_64-linux-thread-multi
Esql: IBM Informix CSDK Version 2.90, IBM Informix-ESQL Version
2.90.FC4
IDS Version 10.00.FC5 installed locally, and connecting using
onsoctcp. And running the exact same statements in dbaccess correctly
shows ISAM error
number 100.
################################################################
### export DBI_TRACE=3; sh testone.sh t/t20error.t ####################
DBI 1.53-ithread default trace level set to 0x0/3 (pid 12543)
# DBI->connect('dbi:Informix:stores', '', '');
# Connect Attribute: ChopBlanks => 1
-> DBI->connect(dbi:Informix:stores, , ****, HASH(0x506430))
-> DBI->install_driver(Informix) for linux perl=5.008005 pid=12543
ruid=0 euid=0
install_driver: DBD::Informix version 2005.02 loaded from
blib/lib/DBD/Informix.pm
New DBI::dr (for DBD::Informix::dr, parent=, id=)
dbih_setup_handle(DBI::dr=HASH(0x6bc180)=>DBI::dr=HASH(0x848d30),
DBD::Informix::dr, 0, Null!)
dbih_make_com(Null!, 0, DBD::Informix::dr, 192, 0) thr#505010
<- install_driver= DBI::dr=HASH(0x6bc180)
[...lots of snipping...]
-> prepare for DBD::Informix::db (DBI::db=HASH(0x848d10)~0x84a4c0
' INSERT INTO dbd_ix_err01 VALUES(0, 'Gee Whizz!') ') thr#505010
New DBI::st (for DBD::Informix::st, parent=DBI::db=HASH(0x84a4c0),
id=)
dbih_setup_handle(DBI::st=HASH(0x84a860)=>DBI::st=HASH(0x84a470),
DBD::Informix::st, 84a880, Null!)
dbih_make_com(DBI::db=HASH(0x84a4c0), 82c990, DBD::Informix::st,
360, 0) thr#505010
-->> DBD::Informix::dbd_ix_st_prepare()
-->> DBD::Informix::dbd_ix_setbindnum()
<<-- DBD::Informix::dbd_ix_setbindnum()
number of described fields 0
dbd_ix_st_prepare() ALLOCATE descriptor d_000000002
dbd_ix_st_prepare() DEALLOCATE DESCRIPTOR d_000000002
dbd_ix_st_prepare'imp_sth->n_ocols: 0
<<-- DBD::Informix::dbd_ix_st_prepare()
<- prepare= DBI::st=HASH(0x84a860) at t20error.t line 34
-> execute for DBD::Informix::st (DBI::st=HASH(0x84a860)~0x84a470)
thr#505010
-->> DBD::Informix::dbd_ix_st_execute()
-->> DBD::Informix::dbd_ix_exec()
---- EXECUTE p_000000002 - no parameters
<<-- DBD::Informix::dbd_ix_exec()
<<-- DBD::Informix::dbd_ix_st_execute()
<- execute= 1 at t20error.t line 37
-> execute for DBD::Informix::st (DBI::st=HASH(0x84a860)~0x84a470)
thr#505010
!! ERROR: -239 'SQL: -239: Could not insert new row - duplicate
value in a UNIQUE INDEX column.
ISAM: 4294967196: ISAM error: duplicate value for a record with
unique key.' (err#0)
<- execute= undef at t20error.t line 44
not ok 4
-> $DBI::errstr (&) FETCH from lasth=HASH
>> DBD::Informix::st::errstr
<- $DBI::errstr= 'SQL: -239: Could not insert new row - duplicate
value in a UNIQUE INDEX column.
ISAM: 4294967196: ISAM error: duplicate value for a record with unique
key.'
-> $DBI::errstr (&) FETCH from lasth=HASH
>> DBD::Informix::st::errstr
<- $DBI::errstr= 'SQL: -239: Could not insert new row - duplicate
value in a UNIQUE INDEX column.
ISAM: 4294967196: ISAM error: duplicate value for a record with unique
key.'
[...more snippage...]
Thank you for the complete bug report information.
--
Jonathan Leffler #include <disclaimer.h>
Guardian of DBD::Informix v2005.02 -- see http://dbi.perl.org
"I don't suffer from insanity; I enjoy every minute of it!"