[rql2sql] fix bad sql generated when outer joining 'identity' relation and lhs var comes from a subquery. Closes #3099418 stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 30 Aug 2013 09:57:38 +0200
branchstable
changeset 9230 a68b2fe8a800
parent 9229 739ae5366bed
child 9231 d2edd8ac5f33
[rql2sql] fix bad sql generated when outer joining 'identity' relation and lhs var comes from a subquery. Closes #3099418 The generated SQL was attempting to access table.cw_eid which doesn't exist.
server/sources/rql2sql.py
server/test/unittest_rql2sql.py
--- a/server/sources/rql2sql.py	Thu Aug 29 16:21:52 2013 +0200
+++ b/server/sources/rql2sql.py	Fri Aug 30 09:57:38 2013 +0200
@@ -1248,6 +1248,8 @@
         except KeyError:
             if lhsalias is None:
                 lhssql = lhsconst.accept(self)
+            elif attr == 'eid':
+                lhssql = lhsvar.accept(self)
             else:
                 lhssql = '%s.%s%s' % (lhsalias, SQL_PREFIX, attr)
         condition = '%s=%s' % (lhssql, (rhsconst or rhsvar).accept(self))
--- a/server/test/unittest_rql2sql.py	Thu Aug 29 16:21:52 2013 +0200
+++ b/server/test/unittest_rql2sql.py	Fri Aug 30 09:57:38 2013 +0200
@@ -1541,6 +1541,16 @@
 FROM (SELECT MAX(_A.cw_ordernum) AS C0
 FROM cw_CWAttribute AS _A) AS _T0 LEFT OUTER JOIN (SELECT MAX(_A.cw_ordernum) AS C0
 FROM cw_CWRelation AS _A) AS _T1 ON (_T0.C0=_T1.C0)'''),
+
+            ('''Any TT1,STD,STDD WHERE TT2 identity TT1?
+ WITH TT1,STDD BEING (Any T,SUM(TD) GROUPBY T WHERE T is Affaire, T duration TD, TAG? tags T, TAG name "t"),
+      TT2,STD BEING (Any T,SUM(TD) GROUPBY T WHERE T is Affaire, T duration TD)''',
+             '''SELECT _T0.C0, _T1.C1, _T0.C1
+FROM (SELECT _T.cw_eid AS C0, SUM(_T.cw_duration) AS C1
+FROM cw_Affaire AS _T
+GROUP BY _T.cw_eid) AS _T1 LEFT OUTER JOIN (SELECT _T.cw_eid AS C0, SUM(_T.cw_duration) AS C1
+FROM cw_Affaire AS _T LEFT OUTER JOIN tags_relation AS rel_tags0 ON (rel_tags0.eid_to=_T.cw_eid) LEFT OUTER JOIN cw_Tag AS _TAG ON (rel_tags0.eid_from=_TAG.cw_eid AND _TAG.cw_name=t)
+GROUP BY _T.cw_eid) AS _T0 ON (_T1.C0=_T0.C0)'''),
             )):
             yield t