summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-09-08 20:08:41 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-09-08 20:08:41 +0000
commit0ebccb4abd0eb39e6d8ecc9a9445cfcba0e10f9a (patch)
treed346390eb2689c7cdc60034a1161a4ff834ccc7a
parentfc753a06475c2fa571d09d73d3169b66c272c8d6 (diff)
downloadsqlalchemy-0ebccb4abd0eb39e6d8ecc9a9445cfcba0e10f9a.tar.gz
[ticket:768] dont assume join criterion consists only of column objects
-rw-r--r--CHANGES2
-rw-r--r--lib/sqlalchemy/sql/expression.py3
-rwxr-xr-xtest/sql/selectable.py8
3 files changed, 12 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 7e470d861..fe4327300 100644
--- 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
----------
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py
index f3c17236d..b1a5bf96f 100644
--- a/lib/sqlalchemy/sql/expression.py
+++ b/lib/sqlalchemy/sql/expression.py
@@ -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)
diff --git a/test/sql/selectable.py b/test/sql/selectable.py
index dcc855074..d2f89fdee 100755
--- a/test/sql/selectable.py
+++ b/test/sql/selectable.py
@@ -221,6 +221,14 @@ class PrimaryKeyTest(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__":
testbase.main()