1. Victor Olex
  2. sqlalchemy

Commits

Mike Bayer  committed 0d52421

- [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 a709e5e
  • Branches default

Comments (0)

Files changed (3)

File CHANGES

View file
  • Ignore whitespace
     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

View file
  • Ignore whitespace
                     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

View file
  • Ignore whitespace
 
     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')]),