diff options
Diffstat (limited to 't/rt_32889_prepare_cached_reexecute.t')
-rw-r--r-- | t/rt_32889_prepare_cached_reexecute.t | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/t/rt_32889_prepare_cached_reexecute.t b/t/rt_32889_prepare_cached_reexecute.t new file mode 100644 index 0000000..e0a453b --- /dev/null +++ b/t/rt_32889_prepare_cached_reexecute.t @@ -0,0 +1,178 @@ +#!/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 t::lib::Test; +use Test::More tests => 32; +use Test::NoWarnings; + +# Create the table +SCOPE: { + my $dbh = connect_ok( dbfile => 'foo' ); + 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( dbfile => 'foo' ); + SCOPE: { + my $sth = $dbh->prepare($sql); + } + $dbh->disconnect; + is( $c, 0, 'No warnings' ); +} + +SCOPE: { + my $dbh = connect_ok( dbfile => 'foo' ); + SCOPE: { + my $sth = $dbh->prepare($sql); + $sth->execute; + } + $dbh->disconnect; + is( $c, 0, 'No warnings' ); +} + +SCOPE: { + my $dbh = connect_ok( dbfile => 'foo' ); + 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( dbfile => 'foo' ); + 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( dbfile => 'foo' ); + 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( dbfile => 'foo' ); + SCOPE: { + my $sth = $dbh->prepare_cached($sql); + } + $dbh->disconnect; + is( $c, 1, 'No warnings' ); +} + +SCOPE: { + my $dbh = connect_ok( dbfile => 'foo' ); + 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( dbfile => 'foo' ); + 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( dbfile => 'foo' ); + 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' ); +} |