Statement handles are cached... so the same statement handle may be retrieved for another query, but the destructor for the Results object calls finish on the handle.
my $results = $db->query('select * from foo');
$results = $db->query('select * from foo');
# The assignment causes the first Results object destructor be called, calling finish on the statement handle which is still in use for the second Results object!
This only happens if the first $results handle is rendered inactive by retrieving all results or ->finish, so that the second query reuses the cached handle.
Statement handles are cached... so the same statement handle may be retrieved for another query, but the destructor for the Results object calls finish on the handle.