diff options
-rw-r--r-- | CHANGES | 7 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 22 | ||||
-rw-r--r-- | test/sql/test_compiler.py | 28 |
3 files changed, 46 insertions, 11 deletions
@@ -805,6 +805,13 @@ are also present in 0.8. an Index associated with a Table in a remote schema. [ticket:2571] + - [bug] Fixed bug in over() construct whereby + passing an empty list for either partition_by + or order_by, as opposed to None, would fail + to generate correctly. + Courtesy Gunnlaugur Þór Briem. + [ticket:2574] + - [bug] Fixed CTE bug whereby positional bound parameters present in the CTEs themselves would corrupt the overall ordering of diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 3b17c040c..d97c048a9 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -530,17 +530,17 @@ class SQLCompiler(engine.Compiled): cast.typeclause._compiler_dispatch(self, **kwargs)) def visit_over(self, over, **kwargs): - x = "%s OVER (" % over.func._compiler_dispatch(self, **kwargs) - if over.partition_by is not None: - x += "PARTITION BY %s" % \ - over.partition_by._compiler_dispatch(self, **kwargs) - if over.order_by is not None: - x += " " - if over.order_by is not None: - x += "ORDER BY %s" % \ - over.order_by._compiler_dispatch(self, **kwargs) - x += ")" - return x + return "%s OVER (%s)" % ( + over.func._compiler_dispatch(self, **kwargs), + ' '.join( + '%s BY %s' % (word, clause._compiler_dispatch(self, **kwargs)) + for word, clause in ( + ('PARTITION', over.partition_by), + ('ORDER', over.order_by) + ) + if clause is not None and len(clause) + ) + ) def visit_extract(self, extract, **kwargs): field = self.extract_map.get(extract.field, extract.field) diff --git a/test/sql/test_compiler.py b/test/sql/test_compiler.py index 3c6e687ca..b09ae1ab0 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -2258,6 +2258,10 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL): def test_over(self): self.assert_compile( + func.row_number().over(), + "row_number() OVER ()" + ) + self.assert_compile( func.row_number().over( order_by=[table1.c.name, table1.c.description] ), @@ -2297,6 +2301,30 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL): ) self.assert_compile( + func.row_number().over( + partition_by=[], + order_by=[table1.c.name, table1.c.description] + ), + "row_number() OVER (ORDER BY mytable.name, mytable.description)" + ) + + self.assert_compile( + func.row_number().over( + partition_by=[table1.c.name, table1.c.description], + order_by=[] + ), + "row_number() OVER (PARTITION BY mytable.name, " + "mytable.description)" + ) + + self.assert_compile( + func.row_number().over( + partition_by=[], + order_by=[] + ), + "row_number() OVER ()" + ) + self.assert_compile( select([func.row_number().over( order_by=table1.c.description ).label('foo')]), |