--- /dev/null
+.. change::
+ :tags: bug, sql, regression
+ :tickets: 6549
+
+ Fixed regression in dynamic loader strategy and :func:`_orm.relationship`
+ overall where the :paramref:`_orm.relationship.order_by` parameter were
+ stored as a mutable list, which could then be mutated when combined with
+ additional "order_by" methods used against the dynamic query object,
+ causing the ORDER BY criteria to continue to grow repetitively.
supports_population = False
collection = False
dynamic = True
+ order_by = ()
def __init__(
self,
class_, key, typecallable, dispatch, **kw
)
self.target_mapper = target_mapper
- self.order_by = order_by
+ if order_by:
+ self.order_by = tuple(order_by)
if not query_class:
self.query_class = AppenderQuery
elif AppenderMixin in query_class.mro():
# ensure expressions in self.order_by, foreign_keys,
# remote_side are all columns, not strings.
if self.order_by is not False and self.order_by is not None:
- self.order_by = [
+ self.order_by = tuple(
coercions.expect(
roles.ColumnArgumentRole, x, argname="order_by"
)
for x in util.to_list(self.order_by)
- ]
+ )
self._user_defined_foreign_keys = util.column_set(
coercions.expect(
],
)
+ def test_order_by_composition_uses_immutable_tuple(self):
+ addresses = self.tables.addresses
+ User, Address = self._user_address_fixture(
+ addresses_args={"order_by": addresses.c.email_address.desc()}
+ )
+
+ sess = fixture_session()
+ u = sess.query(User).get(8)
+
+ with self.sql_execution_asserter() as asserter:
+ for i in range(3):
+ eq_(
+ list(u.addresses.order_by(desc(Address.email_address))),
+ [
+ Address(email_address="ed@wood.com"),
+ Address(email_address="ed@lala.com"),
+ Address(email_address="ed@bettyboop.com"),
+ ],
+ )
+ asserter.assert_(
+ *[
+ CompiledSQL(
+ "SELECT addresses.id AS addresses_id, addresses.user_id "
+ "AS addresses_user_id, addresses.email_address "
+ "AS addresses_email_address FROM addresses "
+ "WHERE :param_1 = addresses.user_id "
+ "ORDER BY addresses.email_address DESC, "
+ "addresses.email_address DESC",
+ [{"param_1": 8}],
+ )
+ for i in range(3)
+ ]
+ )
+
def test_configured_order_by(self):
addresses = self.tables.addresses
User, Address = self._user_address_fixture(