From: Mike Bayer Date: Sun, 30 Sep 2012 21:18:14 +0000 (-0400) Subject: - [bug] Fixed bug in over() construct whereby X-Git-Tag: rel_0_8_0b1~93 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=62b7a8133a54a07934153b767a7f755a28beec24;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - [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] --- diff --git a/CHANGES b/CHANGES index a264aa1522..080e9d205c 100644 --- a/CHANGES +++ b/CHANGES @@ -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 3b17c040c5..d97c048a9b 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 3c6e687cac..b09ae1ab00 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -2257,6 +2257,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] @@ -2296,6 +2300,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