]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
dont assume _compile_options are present
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 17 Apr 2023 14:16:35 +0000 (10:16 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 17 Apr 2023 14:21:51 +0000 (10:21 -0400)
Fixed bug where various ORM-specific getters such as
:attr:`.ORMExecuteState.is_column_load`,
:attr:`.ORMExecuteState.is_relationship_load`,
:attr:`.ORMExecuteState.loader_strategy_path` etc. would throw an
``AttributeError`` if the SQL statement itself were a "compound select"
such as a UNION.

Fixes: #9634
Change-Id: Ia37df5d6f89d6534d69237dcab294bd849ece28b
(cherry picked from commit 89608ccd3f5e5796d578e9a39201f7c5c45a61fe)

doc/build/changelog/unreleased_14/9634.rst [new file with mode: 0644]
lib/sqlalchemy/orm/session.py
test/orm/test_events.py

diff --git a/doc/build/changelog/unreleased_14/9634.rst b/doc/build/changelog/unreleased_14/9634.rst
new file mode 100644 (file)
index 0000000..664e857
--- /dev/null
@@ -0,0 +1,11 @@
+.. change::
+    :tags: bug, orm
+    :tickets: 9634
+    :versions: 2.0.10
+
+    Fixed bug where various ORM-specific getters such as
+    :attr:`.ORMExecuteState.is_column_load`,
+    :attr:`.ORMExecuteState.is_relationship_load`,
+    :attr:`.ORMExecuteState.loader_strategy_path` etc. would throw an
+    ``AttributeError`` if the SQL statement itself were a "compound select"
+    such as a UNION.
index 753d1ec5f937ecdba582d523533ab3760ba7fcf4..5a7a8bb211f47597d59684e9763f656e130ad3f8 100644 (file)
@@ -347,7 +347,10 @@ class ORMExecuteState(util.MemoizedSlots):
     def _orm_compile_options(self):
         if not self.is_select:
             return None
-        opts = self.statement._compile_options
+        try:
+            opts = self.statement._compile_options
+        except AttributeError:
+            return None
         if opts.isinstance(context.ORMCompileState.default_compile_options):
             return opts
         else:
index efb39bd2fdc6ae0a1ac80472bf882449d34c1ff5..052b9e0163779ecf96f29eb08bcff48e845e0e2d 100644 (file)
@@ -8,6 +8,7 @@ from sqlalchemy import literal_column
 from sqlalchemy import select
 from sqlalchemy import String
 from sqlalchemy import testing
+from sqlalchemy import text
 from sqlalchemy import update
 from sqlalchemy.orm import attributes
 from sqlalchemy.orm import class_mapper
@@ -292,6 +293,37 @@ class ORMExecuteTest(_RemoveListeners, _fixtures.FixtureTest):
 
         return canary
 
+    @testing.combinations(
+        (lambda: select(1), True),
+        (lambda User: select(User).union(select(User)), True),
+        (lambda: text("select * from users"), False),
+    )
+    def test_non_orm_statements(self, stmt, is_select):
+        sess = Session(testing.db, future=True)
+
+        canary = self._flag_fixture(sess)
+
+        User, Address = self.classes("User", "Address")
+        stmt = testing.resolve_lambda(stmt, User=User)
+        sess.execute(stmt).all()
+
+        eq_(
+            canary.mock_calls,
+            [
+                call.options(
+                    bind_mapper=None,
+                    all_mappers=[],
+                    is_select=is_select,
+                    is_update=False,
+                    is_delete=False,
+                    is_orm_statement=False,
+                    is_relationship_load=False,
+                    is_column_load=False,
+                    lazy_loaded_from=None,
+                )
+            ],
+        )
+
     def test_all_mappers_accessor_one(self):
         User, Address = self.classes("User", "Address")