mirror of
https://github.com/DBD-SQLite/DBD-SQLite
synced 2025-06-08 06:38:12 -04:00
Resolved #32889: prepare_cached does not work correctly
Also resolved a few other minor things.
This commit is contained in:
parent
aa9335b2af
commit
8bd54f9930
5 changed files with 252 additions and 10 deletions
3
Changes
3
Changes
|
@ -5,6 +5,9 @@ Changes for Perl extension DBD-SQLite.
|
||||||
- Resolved #29629: sqlite where length issue (actually this has
|
- Resolved #29629: sqlite where length issue (actually this has
|
||||||
been fixed before) (ISHIGAKI)
|
been fixed before) (ISHIGAKI)
|
||||||
- Applied an enable_load_extension patch from RT #32998 (ISHIGAKI)
|
- Applied an enable_load_extension patch from RT #32998 (ISHIGAKI)
|
||||||
|
- Resolved #42940: DBD-SQLite make test faild (ADAMK)
|
||||||
|
- Resolved #26460: Sorting numeric values in aggregate functions (ADAMK)
|
||||||
|
- Resolved #32889: prepare_cached does not work correctly (ADAMK)
|
||||||
|
|
||||||
1.19_09 Sun 5 Apr 2009
|
1.19_09 Sun 5 Apr 2009
|
||||||
- Require perl 5.6 because dependencies require it
|
- Require perl 5.6 because dependencies require it
|
||||||
|
|
|
@ -97,6 +97,10 @@ sub _get_version {
|
||||||
return( DBD::SQLite::db::FETCH($_[0], 'sqlite_version') );
|
return( DBD::SQLite::db::FETCH($_[0], 'sqlite_version') );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub disconnect {
|
||||||
|
$DB::single = 1;
|
||||||
|
}
|
||||||
|
|
||||||
my %info = (
|
my %info = (
|
||||||
17 => 'SQLite', # SQL_DBMS_NAME
|
17 => 'SQLite', # SQL_DBMS_NAME
|
||||||
18 => \&_get_version, # SQL_DBMS_VER
|
18 => \&_get_version, # SQL_DBMS_VER
|
||||||
|
|
|
@ -75,24 +75,21 @@ Cannot connect to database 'DBI:SQLite:dbname=foo', please check directory and
|
||||||
permissions.
|
permissions.
|
||||||
MESSAGE
|
MESSAGE
|
||||||
|
|
||||||
Test( (my $table = FindNewTable($dbh)), "FindNewTable")
|
eval { $dbh->do("DROP TABLE table1"); };
|
||||||
or DbiError($dbh->error, $dbh->errstr);
|
|
||||||
|
|
||||||
eval { $dbh->do("DROP TABLE $table"); };
|
$dbh->do("CREATE TABLE table1 (a TEXT, b BLOB)");
|
||||||
|
|
||||||
$dbh->do("CREATE TABLE $table (a TEXT, b BLOB)");
|
|
||||||
|
|
||||||
# Sends $ain and $bin into TEXT resp. BLOB columns the database, then
|
# Sends $ain and $bin into TEXT resp. BLOB columns the database, then
|
||||||
# reads them again and returns the result as a list ($aout, $bout).
|
# reads them again and returns the result as a list ($aout, $bout).
|
||||||
sub database_roundtrip {
|
sub database_roundtrip {
|
||||||
my ($ain, $bin) = @_;
|
my ($ain, $bin) = @_;
|
||||||
$dbh->do("DELETE FROM $table");
|
$dbh->do("DELETE FROM table1");
|
||||||
my $sth = $dbh->prepare("INSERT INTO $table (a, b) VALUES (?, ?)");
|
my $sth = $dbh->prepare("INSERT INTO table1 (a, b) VALUES (?, ?)");
|
||||||
$sth->bind_param(1, $ain, SQL_VARCHAR);
|
$sth->bind_param(1, $ain, SQL_VARCHAR);
|
||||||
$sth->bind_param(2, $bin, SQL_BLOB);
|
$sth->bind_param(2, $bin, SQL_BLOB);
|
||||||
$sth->execute();
|
$sth->execute();
|
||||||
|
|
||||||
$sth = $dbh->prepare("SELECT a, b FROM $table");
|
$sth = $dbh->prepare("SELECT a, b FROM table1");
|
||||||
$sth->execute();
|
$sth->execute();
|
||||||
my @row = $sth->fetchrow_array;
|
my @row = $sth->fetchrow_array;
|
||||||
undef $sth;
|
undef $sth;
|
||||||
|
@ -118,11 +115,11 @@ Test($bytesback eq $bytestring, "Still no blob corruption");
|
||||||
Test($textback eq $utfstring, "Same text");
|
Test($textback eq $utfstring, "Same text");
|
||||||
|
|
||||||
my $lengths = $dbh->selectall_arrayref(
|
my $lengths = $dbh->selectall_arrayref(
|
||||||
"SELECT length(a), length(b) FROM $table"
|
"SELECT length(a), length(b) FROM table1"
|
||||||
);
|
);
|
||||||
|
|
||||||
Test($lengths->[0]->[0] == $lengths->[0]->[1],
|
Test($lengths->[0]->[0] == $lengths->[0]->[1],
|
||||||
"Database actually understands char set") or
|
"Database actually understands char set") or
|
||||||
warn "($lengths->[0]->[0] != $lengths->[0]->[1])";
|
warn "($lengths->[0]->[0] != $lengths->[0]->[1])";
|
||||||
|
|
||||||
$dbh->do("DROP TABLE $table");
|
$dbh->do("DROP TABLE table1");
|
||||||
|
|
61
t/rt_25460_numeric_aggregate.t
Normal file
61
t/rt_25460_numeric_aggregate.t
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
$^W = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
use Test::More tests => 13;
|
||||||
|
use t::lib::Test;
|
||||||
|
|
||||||
|
# Create the table
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
ok( $dbh->do(<<'END_SQL'), 'CREATE TABLE' );
|
||||||
|
create table foo (
|
||||||
|
id integer primary key not null,
|
||||||
|
mygroup varchar(255) not null,
|
||||||
|
mynumber numeric(20,3) not null
|
||||||
|
)
|
||||||
|
END_SQL
|
||||||
|
|
||||||
|
# Fill the table
|
||||||
|
my @data = qw{
|
||||||
|
a -2
|
||||||
|
a 1
|
||||||
|
b 2
|
||||||
|
b 1
|
||||||
|
c 3
|
||||||
|
c -1
|
||||||
|
d 4
|
||||||
|
d 5
|
||||||
|
e 6
|
||||||
|
e 7
|
||||||
|
};
|
||||||
|
$dbh->begin_work;
|
||||||
|
while ( @data ) {
|
||||||
|
ok $dbh->do(
|
||||||
|
'insert into foo ( mygroup, mynumber ) values ( ?, ? )', {},
|
||||||
|
shift(@data), shift(@data),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$dbh->commit;
|
||||||
|
|
||||||
|
# Issue the group/sum/sort/limit query
|
||||||
|
my $rv = $dbh->selectall_arrayref(<<'END_SQL');
|
||||||
|
select mygroup, sum(mynumber) as total
|
||||||
|
from foo
|
||||||
|
group by mygroup
|
||||||
|
order by total
|
||||||
|
limit 3
|
||||||
|
END_SQL
|
||||||
|
|
||||||
|
is_deeply(
|
||||||
|
$rv,
|
||||||
|
[
|
||||||
|
[ 'a', -1 ],
|
||||||
|
[ 'c', 2 ],
|
||||||
|
[ 'b', 3 ],
|
||||||
|
],
|
||||||
|
'group/sum/sort/limit query ok'
|
||||||
|
);
|
177
t/rt_32889_prepare_cached_reexecute.t
Normal file
177
t/rt_32889_prepare_cached_reexecute.t
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Tests that executing the same prepare_cached twice without a
|
||||||
|
# finish in between does not prevent it being automatically cleaned
|
||||||
|
# up and that it does not generate a warning.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
$^W = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
use Test::More tests => 31;
|
||||||
|
use t::lib::Test;
|
||||||
|
|
||||||
|
# Create the table
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
ok( $dbh->do(<<'END_SQL'), 'CREATE TABLE' );
|
||||||
|
create table foo (
|
||||||
|
id integer primary key not null
|
||||||
|
)
|
||||||
|
END_SQL
|
||||||
|
$dbh->begin_work;
|
||||||
|
ok( $dbh->do('insert into foo values ( 1 )'), 'insert 1' );
|
||||||
|
ok( $dbh->do('insert into foo values ( 2 )'), 'insert 2' );
|
||||||
|
$dbh->commit;
|
||||||
|
$dbh->disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Collect the warnings
|
||||||
|
my $c = 0;
|
||||||
|
my @w = ();
|
||||||
|
$SIG{__WARN__} = sub { $c++; push @w, [ @_ ]; return };
|
||||||
|
|
||||||
|
# Conveniences
|
||||||
|
my $sql = 'select * from foo order by id';
|
||||||
|
|
||||||
|
sub fetchrow_1 {
|
||||||
|
my $row = $_[0]->fetchrow_arrayref;
|
||||||
|
is_deeply( $row, [ 1 ], 'Got row 1' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# A well-behaved non-cached statement
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare($sql);
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 0, 'No warnings' );
|
||||||
|
}
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare($sql);
|
||||||
|
$sth->execute;
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 0, 'No warnings' );
|
||||||
|
}
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare($sql);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 0, 'No warnings' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# A badly-behaved regular statement
|
||||||
|
|
||||||
|
# Double execute, no warnings
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare($sql);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 0, 'No warnings' );
|
||||||
|
}
|
||||||
|
|
||||||
|
# We expect a warnings from this one
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
my $sth = $dbh->prepare($sql);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 1, 'Got a warning' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# A well-behaved cached statement
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare_cached($sql);
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 1, 'No warnings' );
|
||||||
|
}
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare_cached($sql);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
$sth->finish;
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 1, 'No warnings' );
|
||||||
|
}
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare_cached($sql);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
$sth->finish;
|
||||||
|
}
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare_cached($sql);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
$sth->finish;
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 1, 'No warnings' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Badly-behaved prepare_cached (but still acceptable)
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $dbh = connect_ok();
|
||||||
|
SCOPE: {
|
||||||
|
my $sth = $dbh->prepare_cached($sql);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
$sth->execute;
|
||||||
|
fetchrow_1($sth);
|
||||||
|
$sth->finish;
|
||||||
|
}
|
||||||
|
$dbh->disconnect;
|
||||||
|
is( $c, 1, 'No warnings' );
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue