From: Mike Bayer Date: Mon, 18 Oct 2021 20:35:21 +0000 (-0400) Subject: remove _resolve_label and related attributes X-Git-Tag: rel_1_4_27~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b961505986c0499ba63a0105d1b79aaa6db738a0;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git remove _resolve_label and related attributes 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 --- diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index ae105428c3..e883454de6 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -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 diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index 616df0d05b..b0aaa5a31b 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -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 ) diff --git a/test/orm/test_eager_relations.py b/test/orm/test_eager_relations.py index 8f9c9d4b0c..cb578ee2da 100644 --- a/test/orm/test_eager_relations.py +++ b/test/orm/test_eager_relations.py @@ -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, diff --git a/test/sql/test_text.py b/test/sql/test_text.py index 407e8aeb58..15f6f60486 100644 --- a/test/sql/test_text.py +++ b/test/sql/test_text.py @@ -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(