# HG changeset patch # User Sylvain Thénault # Date 1303889525 -7200 # Node ID adb1673efa5f79c8d84c19b751222b47f3713237 # Parent 163a2eab0e55534e0be50f93d5fea266c3164a8f [sql generation] fix crash on outer join + ambiguous inlined relation + attribute selection diff -r 163a2eab0e55 -r adb1673efa5f server/sources/rql2sql.py --- a/server/sources/rql2sql.py Tue Apr 26 16:14:43 2011 +0200 +++ b/server/sources/rql2sql.py Wed Apr 27 09:32:05 2011 +0200 @@ -84,6 +84,7 @@ newvar.prepare_annotation() newvar.stinfo['scope'] = select newvar._q_invariant = False + select.selection.append(VariableRef(newvar)) return newvar def _fill_to_wrap_rel(var, newselect, towrap, schema): @@ -93,10 +94,12 @@ towrap.add( (var, rel) ) for vref in rel.children[1].iget_nodes(VariableRef): newivar = _new_var(newselect, vref.name) - newselect.selection.append(VariableRef(newivar)) _fill_to_wrap_rel(vref.variable, newselect, towrap, schema) elif rschema.final: towrap.add( (var, rel) ) + for vref in rel.children[1].iget_nodes(VariableRef): + newivar = _new_var(newselect, vref.name) + newivar.stinfo['attrvar'] = (var, rel.r_type) def rewrite_unstable_outer_join(select, solutions, unstable, schema): """if some optional variables are unstable, they should be selected in a @@ -116,11 +119,6 @@ # extract aliases / selection newvar = _new_var(newselect, var.name) newselect.selection = [VariableRef(newvar)] - for avar in select.defined_vars.itervalues(): - if avar.stinfo['attrvar'] is var: - newavar = _new_var(newselect, avar.name) - newavar.stinfo['attrvar'] = newvar - newselect.selection.append(VariableRef(newavar)) towrap_rels = set() _fill_to_wrap_rel(var, newselect, towrap_rels, schema) # extract relations diff -r 163a2eab0e55 -r adb1673efa5f server/test/data/schema.py --- a/server/test/data/schema.py Tue Apr 26 16:14:43 2011 +0200 +++ b/server/test/data/schema.py Wed Apr 27 09:32:05 2011 +0200 @@ -237,3 +237,9 @@ subject = 'Personne' object = 'CWUser' cardinality = '??' + +class ambiguous_inlined(RelationDefinition): + subject = ('Affaire', 'Note') + object = 'CWUser' + inlined = True + cardinality = '?*' diff -r 163a2eab0e55 -r adb1673efa5f server/test/unittest_rql2sql.py --- a/server/test/unittest_rql2sql.py Tue Apr 26 16:14:43 2011 +0200 +++ b/server/test/unittest_rql2sql.py Wed Apr 27 09:32:05 2011 +0200 @@ -909,7 +909,28 @@ ('Any O,AD WHERE NOT S inline1 O, S eid 123, O todo_by AD?', '''SELECT _O.cw_eid, rel_todo_by0.eid_to FROM cw_Note AS _S, cw_Affaire AS _O LEFT OUTER JOIN todo_by_relation AS rel_todo_by0 ON (rel_todo_by0.eid_from=_O.cw_eid) -WHERE (_S.cw_inline1 IS NULL OR _S.cw_inline1!=_O.cw_eid) AND _S.cw_eid=123''') +WHERE (_S.cw_inline1 IS NULL OR _S.cw_inline1!=_O.cw_eid) AND _S.cw_eid=123'''), + + ('Any X,AE WHERE X multisource_inlined_rel S?, S ambiguous_inlined A, A modification_date AE', + '''SELECT _X.cw_eid, _T0.C2 +FROM cw_Card AS _X LEFT OUTER JOIN (SELECT _S.cw_eid AS C0, _A.cw_eid AS C1, _A.cw_modification_date AS C2 +FROM cw_Affaire AS _S, cw_CWUser AS _A +WHERE _S.cw_ambiguous_inlined=_A.cw_eid +UNION ALL +SELECT _S.cw_eid AS C0, _A.cw_eid AS C1, _A.cw_modification_date AS C2 +FROM cw_CWUser AS _A, cw_Note AS _S +WHERE _S.cw_ambiguous_inlined=_A.cw_eid) AS _T0 ON (_X.cw_multisource_inlined_rel=_T0.C0) +UNION ALL +SELECT _X.cw_eid, _T0.C2 +FROM cw_Note AS _X LEFT OUTER JOIN (SELECT _S.cw_eid AS C0, _A.cw_eid AS C1, _A.cw_modification_date AS C2 +FROM cw_Affaire AS _S, cw_CWUser AS _A +WHERE _S.cw_ambiguous_inlined=_A.cw_eid +UNION ALL +SELECT _S.cw_eid AS C0, _A.cw_eid AS C1, _A.cw_modification_date AS C2 +FROM cw_CWUser AS _A, cw_Note AS _S +WHERE _S.cw_ambiguous_inlined=_A.cw_eid) AS _T0 ON (_X.cw_multisource_inlined_rel=_T0.C0)''' + ), + ] VIRTUAL_VARS = [