From: Mike Bayer Date: Sat, 12 Sep 2020 20:07:50 +0000 (-0400) Subject: Ensure cursor is closed for scalar() if make_row fails X-Git-Tag: rel_1_4_0b1~101 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4bfde4a18e50d93e44aec5c6216be8a6f9fbacb;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git 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 --- 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: