summaryrefslogtreecommitdiff
path: root/t/rt_32889_prepare_cached_reexecute.t
diff options
context:
space:
mode:
Diffstat (limited to 't/rt_32889_prepare_cached_reexecute.t')
-rw-r--r--t/rt_32889_prepare_cached_reexecute.t178
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' );
+}