diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-05-27 19:22:59 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-05-27 19:22:59 -0400 |
| commit | a9ed16f80d5e6d96d800004953b555b9cf1a592e (patch) | |
| tree | 253f56891eea6e9edcd333d03daac6cbb5dfb600 /lib/sqlalchemy | |
| parent | e2b8c893ca98bb0141405a7d7d40c4024d5bdf41 (diff) | |
| download | sqlalchemy-a9ed16f80d5e6d96d800004953b555b9cf1a592e.tar.gz | |
attempt number one, doesn't detect though if the label in the order by is not directly present there.
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/engine/default.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 22 |
2 files changed, 21 insertions, 3 deletions
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index daa9fe085..dc45e12b1 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -52,6 +52,8 @@ class DefaultDialect(interfaces.Dialect): supports_native_enum = False supports_native_boolean = False + supports_simple_order_by_label = True + # if the NUMERIC type # returns decimal.Decimal. # *not* the FLOAT type however. diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index b902f9ffc..8eb8c5fd8 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -389,16 +389,24 @@ class SQLCompiler(engine.Compiled): def visit_label(self, label, add_to_result_map=None, within_label_clause=False, - within_columns_clause=False, **kw): + within_columns_clause=False, + order_by_labels=None, **kw): # only render labels within the columns clause # or ORDER BY clause of a select. dialect-specific compilers # can modify this behavior. - if within_columns_clause and not within_label_clause: +# if order_by_labels: +# import pdb +# pdb.set_trace() + render_label_with_as = within_columns_clause and not within_label_clause + render_label_only = order_by_labels and label in order_by_labels + + if render_label_only or render_label_with_as: if isinstance(label.name, sql._truncated_label): labelname = self._truncated_identifier("colident", label.name) else: labelname = label.name + if render_label_with_as: if add_to_result_map is not None: add_to_result_map( labelname, @@ -413,6 +421,8 @@ class SQLCompiler(engine.Compiled): **kw) + \ OPERATORS[operators.as_] + \ self.preparer.format_label(label, labelname) + elif render_label_only: + return labelname else: return label.element._compiler_dispatch(self, within_columns_clause=False, @@ -1181,7 +1191,13 @@ class SQLCompiler(engine.Compiled): text += " \nHAVING " + t if select._order_by_clause.clauses: - text += self.order_by_clause(select, **kwargs) + if self.dialect.supports_simple_order_by_label: + order_by_labels = set(c for k, c in select._columns_plus_names) + else: + order_by_labels = None + + text += self.order_by_clause(select, + order_by_labels=order_by_labels, **kwargs) if select._limit is not None or select._offset is not None: text += self.limit_clause(select) if select.for_update: |
