From: Inada Naoki Date: Wed, 22 Oct 2025 12:33:53 +0000 (+0900) Subject: don't use LABEL_STYLE_TABLENAME_PLUS_COL in _LazyLoader X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=802eb31fb97505bb8154bc9818cb9ad6fc03408d;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git don't use LABEL_STYLE_TABLENAME_PLUS_COL in _LazyLoader --- diff --git a/doc/build/orm/queryguide/columns.rst b/doc/build/orm/queryguide/columns.rst index 4b1947fd1f..d8b086efea 100644 --- a/doc/build/orm/queryguide/columns.rst +++ b/doc/build/orm/queryguide/columns.rst @@ -184,12 +184,12 @@ the SELECT statement emitted for each ``User.books`` collection:: {execsql}SELECT user_account.id, user_account.name, user_account.fullname FROM user_account [...] () - SELECT book.id AS book_id, book.title AS book_title + SELECT book.id, book.title FROM book WHERE ? = book.owner_id [...] (1,) {stop}Spongebob Squarepants ['100 Years of Krabby Patties', 'Sea Catch 22', 'The Sea Grapes of Wrath'] - {execsql}SELECT book.id AS book_id, book.title AS book_title + {execsql}SELECT book.id, book.title FROM book WHERE ? = book.owner_id [...] (2,) diff --git a/doc/build/orm/quickstart.rst b/doc/build/orm/quickstart.rst index 39f59b9e0e..0b9bc2a78a 100644 --- a/doc/build/orm/quickstart.rst +++ b/doc/build/orm/quickstart.rst @@ -341,7 +341,7 @@ address associated with "sandy", and also add a new email address to {stop} >>> patrick.addresses.append(Address(email_address="patrickstar@sqlalchemy.org")) - {execsql}SELECT address.id AS address_id, address.email_address AS address_email_address, address.user_id AS address_user_id + {execsql}SELECT address.id, address.email_address, address.user_id FROM address WHERE ? = address.user_id [...] (3,){stop} @@ -386,7 +386,7 @@ object by primary key using :meth:`_orm.Session.get`, then work with the object: [...] (2,){stop} >>> sandy.addresses.remove(sandy_address) - {execsql}SELECT address.id AS address_id, address.email_address AS address_email_address, address.user_id AS address_user_id + {execsql}SELECT address.id, address.email_address, address.user_id FROM address WHERE ? = address.user_id [...] (2,) @@ -420,7 +420,7 @@ options that we configured, in this case, onto the related ``Address`` objects: FROM user_account WHERE user_account.id = ? [...] (3,) - SELECT address.id AS address_id, address.email_address AS address_email_address, address.user_id AS address_user_id + SELECT address.id, address.email_address, address.user_id FROM address WHERE ? = address.user_id [...] (3,) diff --git a/doc/build/tutorial/orm_data_manipulation.rst b/doc/build/tutorial/orm_data_manipulation.rst index c555e4d108..f576b31071 100644 --- a/doc/build/tutorial/orm_data_manipulation.rst +++ b/doc/build/tutorial/orm_data_manipulation.rst @@ -353,8 +353,7 @@ until the flush proceeds, which as mentioned before occurs if we emit a query: .. sourcecode:: pycon+sql >>> session.execute(select(User).where(User.name == "patrick")).first() - {execsql}SELECT address.id AS address_id, address.email_address AS address_email_address, - address.user_id AS address_user_id + {execsql}SELECT address.id, address.email_address, address.user_id FROM address WHERE ? = address.user_id [...] (3,) diff --git a/doc/build/tutorial/orm_related_objects.rst b/doc/build/tutorial/orm_related_objects.rst index a08b0fb688..454875ab5f 100644 --- a/doc/build/tutorial/orm_related_objects.rst +++ b/doc/build/tutorial/orm_related_objects.rst @@ -241,8 +241,7 @@ we again see a :term:`lazy load` emitted in order to retrieve the objects: .. sourcecode:: pycon+sql >>> u1.addresses - {execsql}SELECT address.id AS address_id, address.email_address AS address_email_address, - address.user_id AS address_user_id + {execsql}SELECT address.id, address.email_address, address.user_id FROM address WHERE ? = address.user_id [...] (6,){stop} diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index cd0d97598f..6eb91af25c 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -1028,7 +1028,6 @@ class _LazyLoader( stmt = Select._create_raw_select( _raw_columns=[clauseelement], _propagate_attrs=clauseelement._propagate_attrs, - _label_style=LABEL_STYLE_TABLENAME_PLUS_COL, _compile_options=_ORMCompileState.default_compile_options, ) load_options = QueryContext.default_load_options diff --git a/test/orm/inheritance/test_poly_loading.py b/test/orm/inheritance/test_poly_loading.py index cf7d314665..f912710916 100644 --- a/test/orm/inheritance/test_poly_loading.py +++ b/test/orm/inheritance/test_poly_loading.py @@ -1322,8 +1322,8 @@ class IgnoreOptionsOnSubclassAttrLoad(fixtures.DeclarativeMappedTest): if will_lazyload: expected.append( CompiledSQL( - "SELECT entity.id AS entity_id, " - "entity.type AS entity_type FROM entity " + "SELECT entity.id, " + "entity.type FROM entity " "WHERE entity.id = :pk_1", [{"pk_1": entity_id}], ) diff --git a/test/orm/inheritance/test_relationship.py b/test/orm/inheritance/test_relationship.py index 49f8c90620..82ec9ebeea 100644 --- a/test/orm/inheritance/test_relationship.py +++ b/test/orm/inheritance/test_relationship.py @@ -3198,9 +3198,9 @@ class SingleSubclassInRelationship( asserter.assert_( CompiledSQL( - "SELECT log_entry_1.id AS log_entry_1_id, " - "log_entry_1.timestamp AS log_entry_1_timestamp, " - "log_entry_1.type AS log_entry_1_type " + "SELECT log_entry_1.id, " + "log_entry_1.timestamp, " + "log_entry_1.type " "FROM log_entry AS log_entry_1 " "WHERE log_entry_1.timestamp >= :param_1 AND " "((SELECT min(log_entry_2.timestamp) AS min_1 " diff --git a/test/orm/test_ac_relationships.py b/test/orm/test_ac_relationships.py index 34f4e37ee4..aa7a393ffb 100644 --- a/test/orm/test_ac_relationships.py +++ b/test/orm/test_ac_relationships.py @@ -272,7 +272,7 @@ class AltSelectableTest( asserter.assert_( CompiledSQL( - "SELECT b.id AS b_id FROM b JOIN d ON d.b_id = b.id " + "SELECT b.id FROM b JOIN d ON d.b_id = b.id " "JOIN c ON c.id = d.c_id WHERE :param_1 = b.id", [{"param_1": 1}], ) diff --git a/test/orm/test_cascade.py b/test/orm/test_cascade.py index a7c326f730..c91fc8e993 100644 --- a/test/orm/test_cascade.py +++ b/test/orm/test_cascade.py @@ -1094,8 +1094,7 @@ class M2OwNoUseGetCascadeTest( sess.flush, # looking for other bs' CompiledSQL( - "SELECT b.id AS b_id, b.email AS b_email " - "FROM b WHERE :param_1 = b.email", + "SELECT b.id, b.email " "FROM b WHERE :param_1 = b.email", lambda ctx: [{"param_1": "x"}], ), CompiledSQL( @@ -1127,8 +1126,7 @@ class M2OwNoUseGetCascadeTest( # we would like it to be able to skip this SELECT but this is not # implemented right now CompiledSQL( - "SELECT a.id AS a_id, a.email AS a_email FROM a " - "WHERE a.email = :param_1", + "SELECT a.id, a.email FROM a " "WHERE a.email = :param_1", [{"param_1": "x"}], ), CompiledSQL( diff --git a/test/orm/test_deferred.py b/test/orm/test_deferred.py index 1361ae488d..8c29831e4e 100644 --- a/test/orm/test_deferred.py +++ b/test/orm/test_deferred.py @@ -814,11 +814,11 @@ class DeferredOptionsTest(AssertsCompiledSQL, _fixtures.FixtureTest): {"id_1": 7}, ), ( - "SELECT orders.id AS orders_id, " - "orders.user_id AS orders_user_id, " - "orders.address_id AS orders_address_id, " - "orders.description AS orders_description, " - "orders.isopen AS orders_isopen " + "SELECT orders.id, " + "orders.user_id, " + "orders.address_id, " + "orders.description, " + "orders.isopen " "FROM orders WHERE :param_1 = orders.user_id " "ORDER BY orders.id", {"param_1": 7}, @@ -1456,14 +1456,14 @@ class DeferredOptionsTest(AssertsCompiledSQL, _fixtures.FixtureTest): {"id_1": [7, 8]}, ), ( - "SELECT addresses.id AS addresses_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id", {"param_1": 7}, ), ( - "SELECT addresses.id AS addresses_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id", {"param_1": 8}, ), diff --git a/test/orm/test_eager_relations.py b/test/orm/test_eager_relations.py index 80178582c6..18c443a6b7 100644 --- a/test/orm/test_eager_relations.py +++ b/test/orm/test_eager_relations.py @@ -1665,10 +1665,10 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL): testing.db, go, 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 = " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " + "FROM addresses WHERE :param_1 = " "addresses.user_id", {"param_1": 8}, ), @@ -1716,10 +1716,10 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL): testing.db, go, 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 = " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " + "FROM addresses WHERE :param_1 = " "addresses.user_id", {"param_1": 8}, ), @@ -3122,11 +3122,11 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL): {"id_1": 7}, ), ( - "SELECT orders.id AS orders_id, " - "orders.user_id AS orders_user_id, " - "orders.address_id AS orders_address_id, " - "orders.description AS orders_description, " - "orders.isopen AS orders_isopen FROM orders " + "SELECT orders.id, " + "orders.user_id, " + "orders.address_id, " + "orders.description, " + "orders.isopen FROM orders " "WHERE :param_1 = orders.user_id", {"param_1": 7}, ), @@ -7032,8 +7032,8 @@ class SecondaryOptionsTest(fixtures.MappedTest): testing.db, lambda: c1.child2, CompiledSQL( - "SELECT child2.id AS child2_id, base.id AS base_id, " - "base.type AS base_type " + "SELECT child2.id, base.id, " + "base.type " "FROM base JOIN child2 ON base.id = child2.id " "WHERE base.id = :pk_1", {"pk_1": 4}, @@ -7070,8 +7070,8 @@ class SecondaryOptionsTest(fixtures.MappedTest): testing.db, lambda: c1.child2, CompiledSQL( - "SELECT child2.id AS child2_id, base.id AS base_id, " - "base.type AS base_type " + "SELECT child2.id, base.id, " + "base.type " "FROM base JOIN child2 ON base.id = child2.id " "WHERE base.id = :pk_1", {"pk_1": 4}, @@ -7113,9 +7113,9 @@ class SecondaryOptionsTest(fixtures.MappedTest): testing.db, lambda: c1.child2, CompiledSQL( - "SELECT child2.id AS child2_id, base.id AS base_id, " - "base.type AS base_type, " - "related_1.id AS related_1_id FROM base JOIN child2 " + "SELECT child2.id, base.id, " + "base.type, " + "related_1.id FROM base JOIN child2 " "ON base.id = child2.id " "LEFT OUTER JOIN related AS related_1 " "ON base.id = related_1.id WHERE base.id = :pk_1", diff --git a/test/orm/test_events.py b/test/orm/test_events.py index 642ac6edd4..536aa654f7 100644 --- a/test/orm/test_events.py +++ b/test/orm/test_events.py @@ -140,9 +140,8 @@ class ORMExecuteTest(RemoveORMEventsGlobally, _fixtures.FixtureTest): [{"id_1": 7}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, addresses.user_id AS " - "addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "ORDER BY addresses.id", [{"param_1": 7}], diff --git a/test/orm/test_lazy_relations.py b/test/orm/test_lazy_relations.py index 9bb8071984..ff8063cc3a 100644 --- a/test/orm/test_lazy_relations.py +++ b/test/orm/test_lazy_relations.py @@ -1499,8 +1499,8 @@ class O2MWOSideFixedTest(fixtures.MappedTest): testing.db, go, CompiledSQL( - "SELECT person.id AS person_id, person.city_id AS " - "person_city_id FROM person WHERE person.city_id = :param_1 " + "SELECT person.id, person.city_id " + "FROM person WHERE person.city_id = :param_1 " "AND :param_2 = 0", {"param_1": 2, "param_2": 1}, ), @@ -1690,8 +1690,8 @@ class TypeCoerceTest(fixtures.MappedTest, testing.AssertsExecutionResults): asserter.assert_( CompiledSQL( - "SELECT pets.id AS pets_id, pets.person_id AS " - "pets_person_id FROM pets WHERE pets.person_id = " + "SELECT pets.id, pets.person_id " + "FROM pets WHERE pets.person_id = " "CAST(:param_1 AS INTEGER)", [{"param_1": 5}], ) diff --git a/test/orm/test_relationship_criteria.py b/test/orm/test_relationship_criteria.py index 29720f7dc8..3fe4d72e25 100644 --- a/test/orm/test_relationship_criteria.py +++ b/test/orm/test_relationship_criteria.py @@ -1046,36 +1046,36 @@ class LoaderCriteriaTest(_Fixtures, testing.AssertsCompiledSQL): [], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", [{"param_1": 7, "email_address_1": "name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", [{"param_1": 8, "email_address_1": "name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", [{"param_1": 9, "email_address_1": "name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", @@ -1114,36 +1114,36 @@ class LoaderCriteriaTest(_Fixtures, testing.AssertsCompiledSQL): [], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", [{"param_1": 7, "closure_1": "name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", [{"param_1": 8, "closure_1": "name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", [{"param_1": 9, "closure_1": "name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", @@ -1164,36 +1164,36 @@ class LoaderCriteriaTest(_Fixtures, testing.AssertsCompiledSQL): [], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", [{"param_1": 7, "closure_1": "new name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", [{"param_1": 8, "closure_1": "new name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", [{"param_1": 9, "closure_1": "new name"}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :closure_1 " "ORDER BY addresses.id", @@ -2309,36 +2309,36 @@ class RelationshipCriteriaTest(_Fixtures, testing.AssertsCompiledSQL): "SELECT users.id, users.name FROM users ORDER BY users.id" ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", [{"param_1": 7, "email_address_1": value}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", [{"param_1": 8, "email_address_1": value}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", [{"param_1": 9, "email_address_1": value}], ), CompiledSQL( - "SELECT addresses.id AS addresses_id, " - "addresses.user_id AS addresses_user_id, " - "addresses.email_address AS addresses_email_address " + "SELECT addresses.id, " + "addresses.user_id, " + "addresses.email_address " "FROM addresses WHERE :param_1 = addresses.user_id " "AND addresses.email_address != :email_address_1 " "ORDER BY addresses.id", diff --git a/test/orm/test_relationships.py b/test/orm/test_relationships.py index 3bfb9b06bf..8b14dae538 100644 --- a/test/orm/test_relationships.py +++ b/test/orm/test_relationships.py @@ -4858,7 +4858,7 @@ class SecondaryNestedJoinTest( testing.db, go, CompiledSQL( - "SELECT d.id AS d_id, d.name AS d_name FROM b " + "SELECT d.id, d.name FROM b " "JOIN d ON b.d_id = d.id JOIN c ON c.d_id = d.id " "WHERE :param_1 = b.id AND :param_2 = c.a_id " "AND d.id = b.d_id", diff --git a/test/orm/test_subquery_relations.py b/test/orm/test_subquery_relations.py index 4b839d8efc..b3c6f58775 100644 --- a/test/orm/test_subquery_relations.py +++ b/test/orm/test_subquery_relations.py @@ -147,9 +147,9 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL): # issue 7505 # subqueryload degrades for a from_statement. this is a lazyload CompiledSQL( - "SELECT addresses.id AS addresses_id, addresses.user_id AS " - "addresses_user_id, addresses.email_address AS " - "addresses_email_address FROM addresses " + "SELECT addresses.id, addresses.user_id, " + "addresses.email_address " + "FROM addresses " "WHERE :param_1 = addresses.user_id ORDER BY addresses.id", [{"param_1": 7}], ), diff --git a/test/orm/test_unitofworkv2.py b/test/orm/test_unitofworkv2.py index 942739ce9e..29240cfe6e 100644 --- a/test/orm/test_unitofworkv2.py +++ b/test/orm/test_unitofworkv2.py @@ -848,8 +848,7 @@ class RaiseLoadIgnoredTest( sess.flush, # for the flush process, lazy="raise" is ignored CompiledSQL( - "SELECT b.id AS b_id, b.a_id AS b_a_id FROM b " - "WHERE :param_1 = b.a_id", + "SELECT b.id, b.a_id FROM b " "WHERE :param_1 = b.a_id", [{"param_1": 1}], ), CompiledSQL( @@ -1501,8 +1500,8 @@ class SingleCycleM2MTest( # this is n1.parents firing off, as it should, since # passive_deletes is False for n1.parents CompiledSQL( - "SELECT nodes.id AS nodes_id, nodes.data AS nodes_data, " - "nodes.favorite_node_id AS nodes_favorite_node_id FROM " + "SELECT nodes.id, nodes.data, " + "nodes.favorite_node_id FROM " "nodes, node_to_nodes WHERE :param_1 = " "node_to_nodes.right_node_id AND nodes.id = " "node_to_nodes.left_node_id",