]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Ensure cursor is closed for scalar() if make_row fails
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 12 Sep 2020 20:07:50 +0000 (16:07 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 12 Sep 2020 20:07:50 +0000 (16:07 -0400)
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

index ab9fb4ac08e44cc47141fb38c6cefde612ba5e03..9b0bdf9a3e8f9bbdc7a420574336bf1e1805c80c 100644 (file)
@@ -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: