]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- [ticket:768] dont assume join criterion consists only of column objects
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Sep 2007 20:09:41 +0000 (20:09 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Sep 2007 20:09:41 +0000 (20:09 +0000)
CHANGES
lib/sqlalchemy/sql.py
test/sql/selectable.py

diff --git a/CHANGES b/CHANGES
index 9395423addd7fa55442618785b66347a3089bc14..ca3f246d025e8ac9877023c560b4eaa042800b4b 100644 (file)
--- 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 
index 3233aad68fbf28e526f08868972e373332cdb9f7..8d9c42abc72c3a1fe74b1a692bb3cf5b02230cfd 100644 (file)
@@ -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)
         
index ecd8253b8ffb60d7415f11956761ea74eb37bc0f..70a83f3c15c89256939c1a595c9b5eb96ddd9787 100755 (executable)
@@ -224,6 +224,15 @@ class PrimaryKeyTest(testbase.AssertMixin):
         j.foreign_keys\r
         assert list(j.primary_key) == [a.c.id]\r
 \r
+    def test_non_column_clause(self):\r
+        meta = MetaData()\r
+        a = Table('a', meta, Column('id', Integer, primary_key=True), Column('x', Integer))\r
+        b = Table('b', meta, Column('id', Integer, ForeignKey('a.id'), primary_key=True), Column('x', Integer, primary_key=True))\r
+\r
+        j = a.join(b, and_(a.c.id==b.c.id, b.c.x==5))\r
+        assert str(j) == "a JOIN b ON a.id = b.id AND b.x = :b_x", str(j)\r
+        assert list(j.primary_key) == [a.c.id, b.c.x]\r
+\r
         \r
         \r
 if __name__ == "__main__":\r