Commits

Mike Bayer  committed 586df63

- [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]

  • Participants
  • Parent commits 68cce38
  • Branches rel_0_7

Comments (0)

Files changed (3)

     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

File lib/sqlalchemy/sql/compiler.py

                     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)

File test/sql/test_compiler.py

 
     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]
             ),
         )
 
         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')]),