]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
remove _resolve_label and related attributes
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 18 Oct 2021 20:35:21 +0000 (16:35 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 20 Oct 2021 15:12:39 +0000 (11:12 -0400)
these seem to date back to 0.9 and revs like #3148 but none
of it seems to be affecting things now, try removing it all
and seeing what fails.

we've noted that _resolve_label does not appear to be
needed, however allow_label_resolve remains relevant both
for non-column elements like text() as well as that it is
used explicitly by the joined eager loader.

Change-Id: Ic8a5d8001ef2a4133360f51a92a6f7b0cc389095

lib/sqlalchemy/sql/elements.py
lib/sqlalchemy/sql/selectable.py
test/orm/test_eager_relations.py
test/sql/test_text.py

index ae105428c3c8af940f92af76809cac00f57e0d40..e883454de65f60fa8048a73cb2983641e197f69e 100644 (file)
@@ -790,23 +790,14 @@ class ColumnElement(
 
     """
 
-    _resolve_label = None
-    """The name that should be used to identify this ColumnElement in a
-    select() object when "label resolution" logic is used; this refers
-    to using a string name in an expression like order_by() or group_by()
-    that wishes to target a labeled expression in the columns clause.
+    _allow_label_resolve = True
+    """A flag that can be flipped to prevent a column from being resolvable
+    by string label name.
 
-    The name is distinct from that of .name or ._label to account for the case
-    where anonymizing logic may be used to change the name that's actually
-    rendered at compile time; this attribute should hold onto the original
-    name that was user-assigned when producing a .label() construct.
+    The joined eager loader strategy in the ORM uses this, for example.
 
     """
 
-    _allow_label_resolve = True
-    """A flag that can be flipped to prevent a column from being resolvable
-    by string label name."""
-
     _is_implicitly_boolean = False
 
     _alt_names = ()
@@ -1783,7 +1774,7 @@ class TextClause(
 
     # help in those cases where text() is
     # interpreted in a column expression situation
-    key = _label = _resolve_label = None
+    key = _label = None
 
     _allow_label_resolve = False
 
@@ -4533,10 +4524,6 @@ class Label(roles.LabeledColumnExprRole, ColumnElement):
 
         if name:
             self.name = name
-
-            # TODO: nothing fails if this is removed.  this is related
-            # to the order_by() string feature tested in test_text.py.
-            self._resolve_label = self.name
         else:
             self.name = _anonymous_label.safe_construct(
                 id(self), getattr(element, "name", "anon")
@@ -4601,7 +4588,7 @@ class Label(roles.LabeledColumnExprRole, ColumnElement):
         self._reset_memoizations()
         self._element = clone(self._element, **kw)
         if anonymize_labels:
-            self.name = self._resolve_label = _anonymous_label.safe_construct(
+            self.name = _anonymous_label.safe_construct(
                 id(self), getattr(self.element, "name", "anon")
             )
             self.key = self._tq_label = self._tq_key_label = self.name
index 616df0d05b565ffa9e6b79ac8ea226507eed959d..b0aaa5a31bcaa2e23dbf24373a52870f4c6381ea 100644 (file)
@@ -4486,7 +4486,7 @@ class SelectState(util.MemoizedSlots, CompileState):
 
     def _memoized_attr__label_resolve_dict(self):
         with_cols = dict(
-            (c._resolve_label or c._tq_label or c.key, c)
+            (c._tq_label or c.key, c)
             for c in self.statement._all_selected_columns
             if c._allow_label_resolve
         )
index 8f9c9d4b0cf64f4fbd0e8fbd6943e3fd2fc2921f..cb578ee2dad53440eddf5821ca4a826c011a57ab 100644 (file)
@@ -353,6 +353,10 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
         """part of #2992; make sure string label references can't
         access an eager loader, else an eager load can corrupt the query.
 
+        This behavior relies upon the allow_label_resolve flag to disable
+        a column expression from being resolvable in an "order by label"
+        context.
+
         """
         Address, addresses, users, User = (
             self.classes.Address,
index 407e8aeb585692454803543793e719cf298bff4c..15f6f604861bc20de04a4ddc7f382160d107140c 100644 (file)
@@ -31,6 +31,7 @@ from sqlalchemy.testing import assert_raises_message
 from sqlalchemy.testing import AssertsCompiledSQL
 from sqlalchemy.testing import eq_
 from sqlalchemy.testing import fixtures
+from sqlalchemy.testing.assertions import expect_raises_message
 from sqlalchemy.types import NullType
 
 table1 = table(
@@ -813,6 +814,15 @@ class OrderByLabelResolutionTest(fixtures.TestBase, AssertsCompiledSQL):
             stmt, "SELECT mytable.myid AS foo FROM mytable ORDER BY foo"
         )
 
+    def test_no_order_by_text(self):
+        stmt = select(text("foo")).order_by("foo")
+
+        with expect_raises_message(
+            exc.CompileError,
+            r"Can't resolve label reference for ORDER BY / GROUP BY / ",
+        ):
+            stmt.compile()
+
     def test_order_by_colname(self):
         stmt = select(table1.c.myid).order_by("name")
         self.assert_compile(