From a13c6dcdced01e43c069d018223794659ca1a361 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 18 Jul 2009 21:01:32 +0000 Subject: [PATCH] merged -r6112:6134 of trunk --- CHANGES | 9 ++++++++- lib/sqlalchemy/orm/identity.py | 9 +++++---- lib/sqlalchemy/sql/expression.py | 3 +-- test/sql/test_generative.py | 12 +++++++++++- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 97bc08b128..c6cb0ff2c7 100644 --- a/CHANGES +++ b/CHANGES @@ -3,7 +3,14 @@ ======= CHANGES ======= - +0.5.6 +===== +- sql + - Fixed a bug in extract() introduced in 0.5.4 whereby + the string "field" argument was getting treated as a + ClauseElement, causing various errors within more + complex SQL transformations. + 0.5.5 ======= - general diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py index 1af0c0c9a9..4f2e8450be 100644 --- a/lib/sqlalchemy/orm/identity.py +++ b/lib/sqlalchemy/orm/identity.py @@ -43,17 +43,18 @@ class IdentityMap(dict): del state._instance_dict self._mutable_attrs.discard(state) self._modified.discard(state) - + def _dirty_states(self): - return self._modified.union(s for s in self._mutable_attrs if s.modified) - + return self._modified.union(s for s in list(self._mutable_attrs) + if s.modified) + def check_modified(self): """return True if any InstanceStates present have been marked as 'modified'.""" if self._modified: return True else: - for state in self._mutable_attrs: + for state in list(self._mutable_attrs): if state.modified: return True return False diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 519c2cacc3..68117ee4b5 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -2424,11 +2424,10 @@ class _Extract(ColumnElement): self.expr = _literal_as_binds(expr, None) def _copy_internals(self, clone=_clone): - self.field = clone(self.field) self.expr = clone(self.expr) def get_children(self, **kwargs): - return self.field, self.expr + return self.expr, @property def _from_objects(self): diff --git a/test/sql/test_generative.py b/test/sql/test_generative.py index ca427ca5f5..7c094c26b0 100644 --- a/test/sql/test_generative.py +++ b/test/sql/test_generative.py @@ -310,7 +310,17 @@ class ClauseTest(TestBase, AssertsCompiledSQL): "table1.col3 AS col3 FROM table1 WHERE table1.col1 = :col1_1) AS anon_1, "\ "(SELECT table1.col1 AS col1, table1.col2 AS col2, table1.col3 AS col3 FROM table1 WHERE table1.col1 = :col1_2) AS anon_2 "\ "WHERE anon_1.col2 = anon_2.col2") - + + def test_extract(self): + s = select([extract('foo', t1.c.col1).label('col1')]) + self.assert_compile(s, "SELECT EXTRACT(foo FROM table1.col1) AS col1 FROM table1") + + s2 = CloningVisitor().traverse(s).alias() + s3 = select([s2.c.col1]) + self.assert_compile(s, "SELECT EXTRACT(foo FROM table1.col1) AS col1 FROM table1") + self.assert_compile(s3, "SELECT anon_1.col1 FROM (SELECT EXTRACT(foo FROM table1.col1) AS col1 FROM table1) AS anon_1") + + @testing.emits_warning('.*replaced by another column with the same key') def test_alias(self): subq = t2.select().alias('subq') -- 2.47.3