summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/context.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-08-23 11:24:48 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2021-08-23 11:29:27 -0400
commit21f9a94dbf0f2bdaa12bf23714e8f33b8f3f4125 (patch)
tree8a84a715c26893dbc73dcd80b03de815cc9b744f /lib/sqlalchemy/orm/context.py
parentb7378da077367c8eaa877362322fe08e3de59f0f (diff)
downloadsqlalchemy-21f9a94dbf0f2bdaa12bf23714e8f33b8f3f4125.tar.gz
qualify compile_state updates for non-current entities
Fixed issue in recently repaired ``Query.with_entities()`` method where the flag that determines automatic uniquing for legacy ORM ``Query`` objects only would be set to ``True`` inappropriately in cases where the ``with_entities()`` call would be setting the ``Query`` to return column-only rows, which are not uniqued. Fixes: #6924 Change-Id: I81120823914c989bb7a4d13ef2ec08809d8e5a4d
Diffstat (limited to 'lib/sqlalchemy/orm/context.py')
-rw-r--r--lib/sqlalchemy/orm/context.py42
1 files changed, 31 insertions, 11 deletions
diff --git a/lib/sqlalchemy/orm/context.py b/lib/sqlalchemy/orm/context.py
index 83b6586cc..9318bb163 100644
--- a/lib/sqlalchemy/orm/context.py
+++ b/lib/sqlalchemy/orm/context.py
@@ -417,7 +417,10 @@ class ORMFromStatementCompileState(ORMCompileState):
)
_QueryEntity.to_compile_state(
- self, statement_container._raw_columns, self._entities
+ self,
+ statement_container._raw_columns,
+ self._entities,
+ is_current_entities=True,
)
self.current_path = statement_container._compile_options._current_path
@@ -590,6 +593,7 @@ class ORMSelectCompileState(ORMCompileState, SelectState):
self,
memoized_entities._raw_columns,
[],
+ is_current_entities=False,
)
for memoized_entities in (
select_statement._memoized_select_entities
@@ -597,7 +601,10 @@ class ORMSelectCompileState(ORMCompileState, SelectState):
}
_QueryEntity.to_compile_state(
- self, select_statement._raw_columns, self._entities
+ self,
+ select_statement._raw_columns,
+ self._entities,
+ is_current_entities=True,
)
self.current_path = select_statement._compile_options._current_path
@@ -839,7 +846,9 @@ class ORMSelectCompileState(ORMCompileState, SelectState):
# entities will also set up polymorphic adapters for mappers
# that have with_polymorphic configured
- _QueryEntity.to_compile_state(self, query._raw_columns, self._entities)
+ _QueryEntity.to_compile_state(
+ self, query._raw_columns, self._entities, is_current_entities=True
+ )
return self
@classmethod
@@ -2278,13 +2287,18 @@ class _QueryEntity(object):
use_id_for_hash = False
@classmethod
- def to_compile_state(cls, compile_state, entities, entities_collection):
+ def to_compile_state(
+ cls, compile_state, entities, entities_collection, is_current_entities
+ ):
for idx, entity in enumerate(entities):
if entity._is_lambda_element:
if entity._is_sequence:
cls.to_compile_state(
- compile_state, entity._resolved, entities_collection
+ compile_state,
+ entity._resolved,
+ entities_collection,
+ is_current_entities,
)
continue
else:
@@ -2294,7 +2308,10 @@ class _QueryEntity(object):
if entity.is_selectable:
if "parententity" in entity._annotations:
_MapperEntity(
- compile_state, entity, entities_collection
+ compile_state,
+ entity,
+ entities_collection,
+ is_current_entities,
)
else:
_ColumnEntity._for_columns(
@@ -2343,12 +2360,15 @@ class _MapperEntity(_QueryEntity):
"_polymorphic_discriminator",
)
- def __init__(self, compile_state, entity, entities_collection):
+ def __init__(
+ self, compile_state, entity, entities_collection, is_current_entities
+ ):
entities_collection.append(self)
- if compile_state._primary_entity is None:
- compile_state._primary_entity = self
- compile_state._has_mapper_entities = True
- compile_state._has_orm_entities = True
+ if is_current_entities:
+ if compile_state._primary_entity is None:
+ compile_state._primary_entity = self
+ compile_state._has_mapper_entities = True
+ compile_state._has_orm_entities = True
entity = entity._annotations["parententity"]
entity._post_inspect