From a4bfde4a18e50d93e44aec5c6216be8a6f9fbacb Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 12 Sep 2020 16:07:50 -0400 Subject: [PATCH] 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 --- lib/sqlalchemy/engine/result.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py index ab9fb4ac08..9b0bdf9a3e 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: -- 2.47.2