# HG changeset patch # User Sylvain Thénault # Date 1306219798 -7200 # Node ID 5115daeeb2ffd2878a121ea704e4f07b6b450c9b # Parent 9b9905be9c1525d126e83451a6e0b6c741436608 [rql2sql] closes #1697862: ORDERBY SUM(C) cancel GROUPBY by wrongly adding C to grouped variables diff -r 9b9905be9c15 -r 5115daeeb2ff server/sources/rql2sql.py --- a/server/sources/rql2sql.py Mon May 23 13:24:54 2011 +0200 +++ b/server/sources/rql2sql.py Tue May 24 08:49:58 2011 +0200 @@ -72,7 +72,9 @@ stack.append(self.source_execute) FunctionDescr.update_cb_stack = default_update_cb_stack -LENGTH = SQL_FUNCTIONS_REGISTRY.get_function('LENGTH') +get_func_descr = SQL_FUNCTIONS_REGISTRY.get_function + +LENGTH = get_func_descr('LENGTH') def length_source_execute(source, session, value): return len(value.getvalue()) LENGTH.source_execute = length_source_execute @@ -271,7 +273,9 @@ # when a query is grouped, ensure sort terms are grouped as well for sortterm in sorts: term = sortterm.term - if not isinstance(term, Constant): + if not (isinstance(term, Constant) or \ + (isinstance(term, Function) and + get_func_descr(term.name).aggregat)): for vref in term.iget_nodes(VariableRef): if not vref in groups: groups.append(vref) @@ -308,12 +312,12 @@ break if not isinstance(node, Function): raise QueryError() - func = SQL_FUNCTIONS_REGISTRY.get_function(node.name) - if func.source_execute is None: + funcd = get_func_descr(node.name) + if funcd.source_execute is None: raise QueryError('%s can not be called on mapped attribute' % node.name) state.source_cb_funcs.add(node) - func.update_cb_stack(stack) + funcd.update_cb_stack(stack) # IGenerator implementation for RQL->SQL ####################################### diff -r 9b9905be9c15 -r 5115daeeb2ff server/test/unittest_rql2sql.py --- a/server/test/unittest_rql2sql.py Mon May 23 13:24:54 2011 +0200 +++ b/server/test/unittest_rql2sql.py Tue May 24 08:49:58 2011 +0200 @@ -536,6 +536,14 @@ '''SELECT _X.cw_eid FROM cw_CWEType AS _X WHERE _X.cw_description!=parent AND _X.cw_description!=_X.cw_name'''), + + ('DISTINCT Any X, SUM(C) GROUPBY X ORDERBY SUM(C) DESC WHERE H todo_by X, H duration C', + '''SELECT DISTINCT rel_todo_by0.eid_to, SUM(_H.cw_duration) +FROM cw_Affaire AS _H, todo_by_relation AS rel_todo_by0 +WHERE rel_todo_by0.eid_from=_H.cw_eid +GROUP BY rel_todo_by0.eid_to +ORDER BY 2 DESC'''), + ] ADVANCED_WITH_GROUP_CONCAT = [