On Wed, Apr 02, 2008 at 11:55:53AM +0200, Mark Lawrence wrote:
> After hours of googling and testing I'm down to you guys as my last
> resort. I have an issue that results in execute() failing with the
> error:
> 
>   not an error(21) at dbdimp.c line 376

> The test script below brings out the problem, everywhere except my
> development environment. I get the same problem if I
> use prepare() instead of prepare_cached().
> 
> Would really appreciate it if someone can duplicate this, especially
> against a target other than DBD::SQLite (that's all I'm able to try at
> the moment). Any ideas before I start submitting bugs to RT?

I believe it's an error from DBD::SQLite

Google http://www.google.com/search?q=sqlite+error+%2B21 suggests
http://www.sqlite.org/cvstrac/wiki?p=LibraryRoutineCalledOutOfSequence

Tim.

> Cheers,
> Mark.
> 
> 
> 1. Debian GNU/Linux (i686), DBI v1.53, Perl v5.8.8, DBD::SQLite v1.14
> =====================================================================
> 
> 1..3
> ok 1 - insert id 1
> DBD::SQLite::st execute failed: PRIMARY KEY must be unique(19) at dbdimp.c 
> line 403 at x.pl line 32.
> ok 2 - insert duplicate id 1
> ok 3 - insert id 2
> closing dbh with active statement handles at x.pl line 46.
> 
> 
> 2. Windows XP, DBI v1.601, Perl v5.10.0 (Strawberry), DBD::SQLite v1.14
> =======================================================================
> 1..3
> ok 1 - insert id 1
> DBD::SQLite::st execute failed: PRIMARY KEY must be unique(19) at dbdimp.c 
> line 403 at x.pl line 32.
> ok 2 - insert duplicate id 1
> DBD::SQLite::st execute failed: not an error(21) at dbdimp.c line 376 at x.pl 
> line 40.
> not ok 3 - insert id 2
> #   Failed test 'insert id 2'
> #   at x.pl line 41.
> # Looks like you failed 1 test of 3.
> 
> 
> 3. The Test Case
> ================
> 
> #!/usr/bin/perl
> BEGIN {$ENV{DBI_TRACE} = 0;}
> use strict;
> use warnings;
> use Test::More tests => 3;
> use DBI;
> 
> my $dbh;
> my $sth;
> my $res;
> 
> unlink('test.db');
> $dbh = DBI->connect('dbi:SQLite:test.db');
> $dbh->{RaiseError} = 0;
> 
> $dbh->do('
>     CREATE TABLE artists (
>         id INTEGER,
>         name VARCHAR(32),
>         PRIMARY KEY(id)
>     )
> ');
> 
> 
> $sth = $dbh->prepare_cached('INSERT INTO artists(id,name) VALUES(?,?)');
> $res = $sth->execute(1,'one');
> ok($res, 'insert id 1');
> $sth->finish;
> 
> $dbh->begin_work;
> $sth = $dbh->prepare_cached('INSERT INTO artists(id,name) VALUES(?,?)');
> $res = $sth->execute(1,'one');
> ok(!$res, 'insert duplicate id 1');
> $dbh->commit if($res);
> $dbh->rollback if(!$res);
> $sth->finish;
> 
> $dbh->begin_work;
> $sth = $dbh->prepare_cached('INSERT INTO artists(id,name) VALUES(?,?)');
> $res = $sth->execute(2, 'two'); # <===== This fails: "not an error"
> ok($res, 'insert id 2');
> $dbh->commit if($res);
> $dbh->rollback if(!$res);
> $sth->finish;
> 
> $dbh->disconnect;
> exit;
> 
> 
> -- 
> Mark Lawrence

Reply via email to