From: Mike Bayer Date: Sat, 8 Sep 2007 20:09:41 +0000 (+0000) Subject: - [ticket:768] dont assume join criterion consists only of column objects X-Git-Tag: rel_0_3_11~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92c93755be131a4354db9371594838cacb501a66;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - [ticket:768] dont assume join criterion consists only of column objects --- diff --git a/CHANGES b/CHANGES index 9395423add..ca3f246d02 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,8 @@ - tweak DISTINCT precedence for clauses like `func.count(t.c.col.distinct())` - Fixed detection of internal '$' characters in :bind$params [ticket:719] + - [ticket:768] dont assume join criterion consists only of column objects + - orm - added a check for joining from A->B using join(), along two different m2m tables. this raises an error in 0.3 but is diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 3233aad68f..8d9c42abc7 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -2266,6 +2266,7 @@ class Join(FromClause): encodedname = property(lambda s: s.name.encode('ascii', 'backslashreplace')) def _init_primary_key(self): + from sqlalchemy import schema pkcol = util.Set([c for c in self._adjusted_exportable_columns() if c.primary_key]) equivs = {} @@ -2278,7 +2279,7 @@ class Join(FromClause): class BinaryVisitor(ClauseVisitor): def visit_binary(self, binary): - if binary.operator == '=': + if binary.operator == '=' and isinstance(binary.left, schema.Column) and isinstance(binary.right, schema.Column): add_equiv(binary.left, binary.right) BinaryVisitor().traverse(self.onclause) diff --git a/test/sql/selectable.py b/test/sql/selectable.py index ecd8253b8f..70a83f3c15 100755 --- a/test/sql/selectable.py +++ b/test/sql/selectable.py @@ -224,6 +224,15 @@ class PrimaryKeyTest(testbase.AssertMixin): j.foreign_keys assert list(j.primary_key) == [a.c.id] + def test_non_column_clause(self): + meta = MetaData() + a = Table('a', meta, Column('id', Integer, primary_key=True), Column('x', Integer)) + b = Table('b', meta, Column('id', Integer, ForeignKey('a.id'), primary_key=True), Column('x', Integer, primary_key=True)) + + j = a.join(b, and_(a.c.id==b.c.id, b.c.x==5)) + assert str(j) == "a JOIN b ON a.id = b.id AND b.x = :b_x", str(j) + assert list(j.primary_key) == [a.c.id, b.c.x] + if __name__ == "__main__":