.. changelog::
:version: 0.9.9
+ .. change::
+ :tags: bug, orm, sqlite
+ :versions: 1.0.0
+ :tickets: 3241
+
+ Fixed bug regarding expression mutations which could express
+ itself as a "Could not locate column" error when using
+ :class:`.Query` to select from multiple, anonymous column
+ entities when querying against SQLite, as a side effect of the
+ "join rewriting" feature used by the SQLite dialect.
+
.. change::
:tags: feature, sqlite
:versions: 1.0.0
expressions and function calls.
"""
+ while self._is_clone_of is not None:
+ self = self._is_clone_of
+
return _anonymous_label(
'%%(%d %s)s' % (id(self), getattr(self, 'name', 'anon'))
)
def self_group(self, against=None):
return self
+ @property
+ def _key_label(self):
+ return self._label
+
@property
def _label(self):
return getattr(self.element, '_label', None) or self.anon_label
assert struct == s2
assert struct.is_other(s2)
+ def test_clone_anon_label(self):
+ from sqlalchemy.sql.elements import Grouping
+ c1 = Grouping(literal_column('q'))
+ s1 = select([c1])
+
+ class Vis(CloningVisitor):
+ def visit_grouping(self, elem):
+ pass
+
+ vis = Vis()
+ s2 = vis.traverse(s1)
+ eq_(list(s2.inner_columns)[0].anon_label, c1.anon_label)
+
def test_change_in_place(self):
struct = B(A("expr1"), A("expr2"), B(A("expr1b"),
A("expr2b")), A("expr3"))
self._f_b1a_where_in_b2a
)
+ def test_anon_scalar_subqueries(self):
+ s1 = select([1]).as_scalar()
+ s2 = select([2]).as_scalar()
+
+ s = select([s1, s2]).apply_labels()
+ self._test(
+ s,
+ self._anon_scalar_subqueries
+ )
+
class JoinRewriteTest(_JoinRewriteTestBase, fixtures.TestBase):
"FROM a JOIN b2 ON a.id = b2.a_id)"
)
+ _anon_scalar_subqueries = (
+ "SELECT (SELECT 1) AS anon_1, (SELECT 2) AS anon_2"
+ )
+
class JoinPlainTest(_JoinRewriteTestBase, fixtures.TestBase):
"FROM a JOIN b2 ON a.id = b2.a_id)"
)
+ _anon_scalar_subqueries = (
+ "SELECT (SELECT 1) AS anon_1, (SELECT 2) AS anon_2"
+ )
+
class JoinNoUseLabelsTest(_JoinRewriteTestBase, fixtures.TestBase):
"FROM a JOIN b2 ON a.id = b2.a_id)"
)
+ _anon_scalar_subqueries = (
+ "SELECT (SELECT 1) AS anon_1, (SELECT 2) AS anon_2"
+ )
+
class JoinExecTest(_JoinRewriteTestBase, fixtures.TestBase):
_a_bc = _a_bc_comma_a1_selbc = _a__b_dc = _a_bkeyassoc = \
_a_bkeyassoc_aliased = _a_atobalias_balias_c_w_exists = \
_a_atobalias_balias = _b_ab1_union_c_ab2 = \
- _b_a_id_double_overlap_annotated = _f_b1a_where_in_b2a = None
+ _b_a_id_double_overlap_annotated = _f_b1a_where_in_b2a = \
+ _anon_scalar_subqueries = None
@classmethod
def setup_class(cls):