diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-05-10 12:49:56 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-05-10 12:55:23 -0400 |
| commit | 0604116814a862d4d9dbc1a8866a2a3b0126caf1 (patch) | |
| tree | 1ddc470c634b5fb4cf474767b0d728817df5a142 /lib/sqlalchemy | |
| parent | 743e9d4589946f1a29cdec7f2f1a2e4ec0853db7 (diff) | |
| download | sqlalchemy-0604116814a862d4d9dbc1a8866a2a3b0126caf1.tar.gz | |
Fix label referencing in SQL Server OFFSET logic
Fixed bug where by ROW_NUMBER OVER clause applied for OFFSET
selects in SQL Server would inappropriately substitute a plain column
from the local statement that overlaps with a label name used by
the ORDER BY criteria of the statement.
Change-Id: Ic2500c886cbfc83a1ad5a2681783f008b9f23838
Fixes: #3711
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/dialects/mssql/base.py | 6 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/util.py | 10 |
2 files changed, 15 insertions, 1 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 051efa719..966700420 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -1155,7 +1155,11 @@ class MSSQLCompiler(compiler.SQLCompiler): 'using an OFFSET or a non-simple ' 'LIMIT clause') - _order_by_clauses = select._order_by_clause.clauses + _order_by_clauses = [ + sql_util.unwrap_label_reference(elem) + for elem in select._order_by_clause.clauses + ] + limit_clause = select._limit_clause offset_clause = select._offset_clause kwargs['select_wraps_for'] = select diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py index 5f180646c..24c6f5441 100644 --- a/lib/sqlalchemy/sql/util.py +++ b/lib/sqlalchemy/sql/util.py @@ -176,6 +176,16 @@ def unwrap_order_by(clause): return result +def unwrap_label_reference(element): + def replace(elem): + if isinstance(elem, (_label_reference, _textual_label_reference)): + return elem.element + + return visitors.replacement_traverse( + element, {}, replace + ) + + def expand_column_list_from_order_by(collist, order_by): """Given the columns clause and ORDER BY of a selectable, return a list of column expressions that can be added to the collist |
