]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- relation primaryjoin and secondaryjoin now check that they
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 25 Nov 2009 17:34:25 +0000 (17:34 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 25 Nov 2009 17:34:25 +0000 (17:34 +0000)
are column-expressions, not just clause elements.  this prohibits
things like FROM expressions being placed there directly.
[ticket:1622]

CHANGES
lib/sqlalchemy/orm/properties.py
test/orm/test_relationships.py

diff --git a/CHANGES b/CHANGES
index 0f19a1f0e446d72e8b5ac9610d5f91532f2123ee..2c2995f09dac9de46c702d9fbdfc80d8c32f6cd1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -99,6 +99,11 @@ CHANGES
     may break queries with literal expressions that do not have labels
     applied (i.e. literal('foo'), etc.)
     [ticket:1568]
+  
+  - relation primaryjoin and secondaryjoin now check that they
+    are column-expressions, not just clause elements.  this prohibits
+    things like FROM expressions being placed there directly.
+    [ticket:1622]
     
   - the "dont_load=True" flag on Session.merge() is deprecated
     and is now "load=False".
index 1fd7d48a997ab2c600e37e78d2d16bb2de12ac7b..190be8d6602304f1d2a5b6b6a076500ebe1508ac 100644 (file)
@@ -743,7 +743,7 @@ class RelationProperty(StrategizedProperty):
         for attr in ('primaryjoin', 'secondaryjoin'):
             val = getattr(self, attr)
             if val is not None:
-                util.assert_arg_type(val, sql.ClauseElement, attr)
+                util.assert_arg_type(val, sql.ColumnElement, attr)
                 setattr(self, attr, _orm_deannotate(val))
         
         if self.order_by is not False and self.order_by is not None:
index aa1565794f55cbc1f963e882435515779ec3afa2..63d66b7428882ff19a5823aad262818cd07c1447 100644 (file)
@@ -886,7 +886,24 @@ class JoinConditionErrorTest(testing.TestBase):
             c2 = relation(C1, primaryjoin="x"=="y")
 
         assert_raises(sa.exc.ArgumentError, compile_mappers)
-        
+    
+    def test_only_column_elements(self):
+        m = MetaData()
+        t1 = Table('t1', m, 
+            Column('id', Integer, primary_key=True),
+            Column('foo_id', Integer, ForeignKey('t2.id')),
+        )
+        t2 = Table('t2', m,
+            Column('id', Integer, primary_key=True),
+            )
+        class C1(object):
+            pass
+        class C2(object):
+            pass
+
+        mapper(C1, t1, properties={'c2':relation(C2,  primaryjoin=t1.join(t2))})
+        mapper(C2, t2)
+        assert_raises(sa.exc.ArgumentError, compile_mappers)
     
     def test_fk_error_raised(self):
         m = MetaData()