]> 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:08:41 +0000 (20:08 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Sep 2007 20:08:41 +0000 (20:08 +0000)
CHANGES
lib/sqlalchemy/sql/expression.py
test/sql/selectable.py

diff --git a/CHANGES b/CHANGES
index 7e470d86127e5b8a041097b2a85f0f1691e24a2b..fe43273003a1fb57768737d1d5f0e331b747df40 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -31,6 +31,8 @@ CHANGES
   and can be used to determine correct shard id (since execute() doesn't
   take an instance) 
 
+- other tickets: [ticket:768]
+
 0.4.0beta5
 ----------
 
index f3c17236d87c77f9887fbf6757e136b126c6aad0..b1a5bf96f189dc85f8062b4af4721386bcd8542e 100644 (file)
@@ -2188,6 +2188,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._flatten_exportable_columns() if c.primary_key])
 
         equivs = {}
@@ -2200,7 +2201,7 @@ class Join(FromClause):
 
         class BinaryVisitor(visitors.ClauseVisitor):
             def visit_binary(self, binary):
-                if binary.operator == operators.eq:
+                if binary.operator == operators.eq and isinstance(binary.left, schema.Column) and isinstance(binary.right, schema.Column):
                     add_equiv(binary.left, binary.right)
         BinaryVisitor().traverse(self.onclause)
 
index dcc8550747b1b9f122aaf8dee9354575a66011cf..d2f89fdee84b0ac1efe8cdb976a0efd0322f765e 100755 (executable)
@@ -221,6 +221,14 @@ class PrimaryKeyTest(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
 if __name__ == "__main__":\r
     testbase.main()\r