From 2205d49fe700954846a23f5f8694f20f3dadb253 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 30 Sep 2012 17:20:04 -0400 Subject: [PATCH] - [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 Por Briem. [ticket:2574] --- CHANGES | 7 +++++++ lib/sqlalchemy/sql/compiler.py | 22 +++++++++++----------- test/sql/test_compiler.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 1cc2eee98f..9543c0a5fd 100644 --- a/CHANGES +++ b/CHANGES @@ -50,6 +50,13 @@ CHANGES 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 f45c9c8967..40f09da8ba 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -520,17 +520,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 dda9f73469..a5e0874495 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -2253,6 +2253,10 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL): dialect=sqlite.dialect()) 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] @@ -2292,6 +2296,30 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL): "ORDER BY mytable.name, mytable.description)" ) + 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 -- 2.47.2