# HG changeset patch # User Sylvain Thénault # Date 1263983398 -3600 # Node ID 1c85c916fa136742daf55b799bdb3d3c0e9a750c # Parent 8e5dcb54fd8e49967502654ca56fcba1970b88e4# Parent 15499a46c00916251778f4cb04e2538ae8bbd1f7 backport stable diff -r 8e5dcb54fd8e -r 1c85c916fa13 server/rqlannotation.py --- a/server/rqlannotation.py Wed Jan 20 11:23:27 2010 +0100 +++ b/server/rqlannotation.py Wed Jan 20 11:29:58 2010 +0100 @@ -189,7 +189,6 @@ return rel principal = rel if principal is None: - print iter(relations).next().root raise BadRQLQuery('unable to find principal in %s' % ', '.join( r.as_string() for r in relations)) return principal @@ -310,7 +309,7 @@ # apply relation restriction self.maydeambrels = maydeambrels = {} for rel in rqlst.iget_nodes(Relation): - if rel.is_types_restriction() or rel.r_type == 'eid': + if rel.r_type == 'eid' or rel.is_types_restriction(): continue lhs, rhs = rel.get_variable_parts() if isinstance(lhs, VariableRef) or isinstance(rhs, VariableRef): @@ -366,6 +365,10 @@ # we know variable won't be invariant, try to use # it to deambguify the current variable otheretypes = self.varsols[deambiguifier] + if not deambiguifier.stinfo['typerels']: + # if deambiguifier has no type restriction using 'is', + # don't record it + deambiguifier = None elif isinstance(other, Constant) and other.uidtype: otheretypes = (other.uidtype,) deambiguifier = None @@ -381,9 +384,8 @@ for otheretype in otheretypes: reltypes = frozenset(rtypefunc(otheretype)) if var.stinfo['possibletypes'] != reltypes: - break - else: - self.restrict(var, var.stinfo['possibletypes']) - self.deambification_map[var] = deambiguifier - return True + return False + self.restrict(var, var.stinfo['possibletypes']) + self.deambification_map[var] = deambiguifier + return True return False diff -r 8e5dcb54fd8e -r 1c85c916fa13 server/sources/rql2sql.py --- a/server/sources/rql2sql.py Wed Jan 20 11:23:27 2010 +0100 +++ b/server/sources/rql2sql.py Wed Jan 20 11:29:58 2010 +0100 @@ -1212,13 +1212,13 @@ def _update_outer_tables(self, table, actualtables, oldalias, newalias): actualtables.remove(oldalias) actualtables.append(newalias) + self._state.outer_tables[table] = newalias # some tables which have already been used as outer table and replaced # by may not be reused here, though their associated value # in the outer_tables dict has to be updated as well for table, outerexpr in self._state.outer_tables.iteritems(): if outerexpr == oldalias: self._state.outer_tables[table] = newalias - self._state.outer_tables[table] = newalias def _var_table(self, var): var.accept(self)#.visit_variable(var) diff -r 8e5dcb54fd8e -r 1c85c916fa13 server/test/unittest_rql2sql.py --- a/server/test/unittest_rql2sql.py Wed Jan 20 11:23:27 2010 +0100 +++ b/server/test/unittest_rql2sql.py Wed Jan 20 11:29:58 2010 +0100 @@ -1581,9 +1581,12 @@ FROM (SELECT 1) AS _T WHERE EXISTS(SELECT 1 FROM owned_by_relation AS rel_owned_by0, cw_Affaire AS _P WHERE rel_owned_by0.eid_from=_P.cw_eid AND rel_owned_by0.eid_to=1 UNION SELECT 1 FROM owned_by_relation AS rel_owned_by1, cw_Note AS _P WHERE rel_owned_by1.eid_from=_P.cw_eid AND rel_owned_by1.eid_to=1)''') - def test_groupby_multiple_outerjoins(self): - self._check('Any A,U,P,group_concat(TN) GROUPBY A,U,P WHERE A is Affaire, A concerne N, N todo_by U?, T? tags A, T name TN, A todo_by P?', - "SHOULD NOT CRASH") + def test_groupby_multiple_outerjoins(self): + self._check('Any A,U,P,group_concat(TN) GROUPBY A,U,P WHERE A is Affaire, A concerne N, N todo_by U?, T? tags A, T name TN, A todo_by P?', + '''SELECT _A.cw_eid, rel_todo_by1.eid_to, rel_todo_by3.eid_to, GROUP_CONCAT(_T.cw_name) +FROM concerne_relation AS rel_concerne0, cw_Affaire AS _A LEFT OUTER JOIN tags_relation AS rel_tags2 ON (rel_tags2.eid_to=_A.cw_eid) LEFT OUTER JOIN cw_Tag AS _T ON (rel_tags2.eid_from=_T.cw_eid) LEFT OUTER JOIN todo_by_relation AS rel_todo_by3 ON (rel_todo_by3.eid_from=_A.cw_eid), cw_Note AS _N LEFT OUTER JOIN todo_by_relation AS rel_todo_by1 ON (rel_todo_by1.eid_from=_N.cw_eid) +WHERE rel_concerne0.eid_from=_A.cw_eid AND rel_concerne0.eid_to=_N.cw_eid +GROUP BY _A.cw_eid,rel_todo_by1.eid_to,rel_todo_by3.eid_to''') class removeUnsusedSolutionsTC(TestCase):