diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-09-12 16:07:50 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-09-12 16:07:50 -0400 |
| commit | a4bfde4a18e50d93e44aec5c6216be8a6f9fbacb (patch) | |
| tree | 271ab4178a669115ffa66f8f81a02831c53fa1ac /lib/sqlalchemy/engine | |
| parent | 645be4aa24a06241dfeb635aee8ca7a09574d800 (diff) | |
| download | sqlalchemy-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.py | 24 |
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: |
