summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2020-09-12 16:07:50 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2020-09-12 16:07:50 -0400
commita4bfde4a18e50d93e44aec5c6216be8a6f9fbacb (patch)
tree271ab4178a669115ffa66f8f81a02831c53fa1ac /lib/sqlalchemy/engine
parent645be4aa24a06241dfeb635aee8ca7a09574d800 (diff)
downloadsqlalchemy-a4bfde4a18e50d93e44aec5c6216be8a6f9fbacb.tar.gz
Ensure cursor is closed for scalar() if make_row fails
As we have some tests that are against enums which can raise on fetch, if we call scalar() and it fails, we need to close the cursor. mariadb segfaults etc. seem to have been caused by this. Change-Id: I8261f6fe7f972ae2d8702650440fd8d71e9bce53
Diffstat (limited to 'lib/sqlalchemy/engine')
-rw-r--r--lib/sqlalchemy/engine/result.py24
1 files changed, 16 insertions, 8 deletions
diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py
index ab9fb4ac0..9b0bdf9a3 100644
--- a/lib/sqlalchemy/engine/result.py
+++ b/lib/sqlalchemy/engine/result.py
@@ -561,7 +561,11 @@ class ResultInternal(InPlaceGenerative):
else:
make_row = self._row_getter
- row = make_row(row) if make_row else row
+ try:
+ row = make_row(row) if make_row else row
+ except:
+ self._soft_close(hard=True)
+ raise
if raise_for_second_row:
if self._unique_filter_state:
@@ -577,15 +581,19 @@ class ResultInternal(InPlaceGenerative):
next_row = _NO_ROW
break
- next_row = make_row(next_row) if make_row else next_row
+ try:
+ next_row = make_row(next_row) if make_row else next_row
- if strategy:
- if existing_row_hash == strategy(next_row):
+ if strategy:
+ if existing_row_hash == strategy(next_row):
+ continue
+ elif row == next_row:
continue
- elif row == next_row:
- continue
- # here, we have a row and it's different
- break
+ # here, we have a row and it's different
+ break
+ except:
+ self._soft_close(hard=True)
+ raise
else:
next_row = onerow(hard_close=True)
if next_row is None: