perl5-dbi/dbi

local $dbh->{HandleError} = ... is not localized

Opened this issue · 0 comments

A localized installation of a HandleError handler remains active even after exiting the localizing block.
See test below (perl 5.32.0, DBI v1.643).

use strict;
use warnings;
use Test::More;
use DBI;

run_tests(SQLITE => DBI->connect('dbi:SQLite:dbname=:memory:', '', '', {RaiseError => 1}));
run_tests(CSV    => DBI->connect('dbi:CSV:', '', '', {f_ext => "foo.csv", RaiseError => 1}));


sub run_tests {
  my ($db_name, $dbh) = @_;

  eval {my $bug = $dbh->prepare("BAD SQL")};
  unlike $@, qr/FROM HandleError/, "$db_name: HandleError not installed yet";

  {
    local $dbh->{HandleError} = sub {die shift . " FROM HandleError"};
    eval {my $bug = $dbh->prepare("BAD SQL")};
    like $@, qr/FROM HandleError/, "$db_name: HandleError installled";
  }

  eval {my $bug = $dbh->prepare("BAD SQL")};
  unlike $@, qr/FROM HandleError/, "$db_name: HandleError should no longer be active";

}


done_testing;