Package: libdbd-sqlite3-perl Version: 1.14-1 Severity: normal The program foo.pl below run as "perl foo.pl" produces
DBD::SQLite::st execute failed: column x is not unique(19) at dbdimp.c line 403 at foo.pl line 17. Segmentation fault where I hoped it wouldn't seg fault, but just print the error message and otherwise succeed. I suspect that when sqlite_st_execute gets an "insert" error like this it ends up freeing the underlying "sqlite3_stmt" object, so that a further execute of it bombs. I think the free is done by the following line in sqlite_st_execute (the first one, at "return -5"), /* There are bug reports that say this should be sqlite3_reset() */ sqlite3_finalize(imp_sth->stmt); I think the comment is right, under gdb you can see the stmt pointer value getting used again on the next execute of the same perl-level $sth. Actually I saw that stmt space getting overwritten with the error message string "column x is not unique ...", which made me wonder if was some sort of pointer juggling mixup, but I think it's just coincidence that it's related data ending up there after the space has been free()ed and then handed out by malloc() again. (Results vary if for instance you turn on $dbh->trace()s.) -- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: i386 (i586) Kernel: Linux 2.6.22-2-486 Locale: LANG=en_AU, LC_CTYPE=en_AU (charmap=ISO-8859-1) Shell: /bin/sh linked to /bin/dash Versions of packages libdbd-sqlite3-perl depends on: ii libc6 2.6.1-2 GNU C Library: Shared libraries ii libdbi-perl 1.601-1 Perl5 database interface by Tim Bu ii libsqlite3-0 3.4.2-2 SQLite 3 shared library ii perl 5.8.8-11.1 Larry Wall's Practical Extraction ii perl-base [perlapi-5.8.8] 5.8.8-11.1 The Pathologically Eclectic Rubbis libdbd-sqlite3-perl recommends no packages. -- no debconf information
use strict; use warnings; use DBI; my $filename = '/tmp/foo.db'; unlink ($filename); my $dbh = DBI->connect ("dbi:SQLite:dbname=$filename", '', '', {RaiseError=>0, PrintError=>1}); $dbh->do ('CREATE TABLE bar (x TEXT, y TEXT, PRIMARY KEY (x))'); { my $sth = $dbh->prepare ("INSERT INTO bar (x, y) VALUES (?,?)"); $sth->execute ('a', 'b'); $sth->finish; $sth->execute ('a', 'b'); $sth->finish; $sth->execute ('c', 'd'); $sth->finish; }