--- /dev/null
+.. change::
+ :tags: orm, bug, regression
+ :tickets: 6401
+
+ Fixed regression in hybrid_property where a hybrid against a SQL function
+ would generate an ``AttributeError`` when attempting to generate an entry
+ for the ``.c`` collection of a subquery in some cases; among other things
+ this would impact its use in cases like that of ``Query.count()``.
+
HasEntityNamespace = util.namedtuple(
"HasEntityNamespace", ["entity_namespace"]
)
+HasEntityNamespace.is_mapper = HasEntityNamespace.is_aliased_class = False
def create_proxied_attribute(descriptor):
element.is_selectable
and "entity_namespace" in element._annotations
):
- for elem in _select_iterables(
- element._annotations[
- "entity_namespace"
- ]._all_column_expressions
- ):
- yield elem
+ ens = element._annotations["entity_namespace"]
+ if not ens.is_mapper and not ens.is_aliased_class:
+ for elem in _select_iterables([element]):
+ yield elem
+ else:
+ for elem in _select_iterables(ens._all_column_expressions):
+ yield elem
else:
for elem in _select_iterables([element]):
yield elem
return A
+ @testing.fixture
+ def _function_fixture(self):
+ Base = declarative_base()
+
+ class A(Base):
+ __tablename__ = "a"
+ id = Column(Integer, primary_key=True)
+ value = Column(Integer)
+
+ @hybrid.hybrid_property
+ def foo_value(self):
+ return func.foo(self.value)
+
+ return A
+
@testing.fixture
def _name_mismatch_fixture(self):
Base = declarative_base()
"FROM a AS a_1 JOIN b ON a_1.id = b.aid",
)
+ def test_c_collection_func_element(self, _function_fixture):
+ A = _function_fixture
+
+ stmt = select(A.id, A.foo_value)
+ eq_(stmt.subquery().c.keys(), ["id", "foo_value"])
+
def test_filter_by_mismatched_col(self, _name_mismatch_fixture):
A, B = _name_mismatch_fixture
self.assert_compile(