]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Repair reduction in Over
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 12 Oct 2020 16:47:38 +0000 (12:47 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 12 Oct 2020 16:48:25 +0000 (12:48 -0400)
Fixed issue where a plain pickle dumps call of the :class:`_sql.Over`
construct didn't work.

Fixes: #5644
Change-Id: I4b07f74ecd5d52f0794128585367012200a38a36
(cherry picked from commit 9322de12f5c5eca397b13cb7db2b6196f58aceb3)

doc/build/changelog/unreleased_13/5644.rst [new file with mode: 0644]
lib/sqlalchemy/sql/elements.py
test/sql/test_functions.py

diff --git a/doc/build/changelog/unreleased_13/5644.rst b/doc/build/changelog/unreleased_13/5644.rst
new file mode 100644 (file)
index 0000000..d0e2049
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: bug, sql
+    :tickets: 5644
+
+    Fixed issue where a plain pickle dumps call of the :class:`_sql.Over`
+    construct didn't work.
index 86cf950000bf44a96d4a744f2e05b27042d085e2..9734bf70c5ffab2bdda0f0240fe37eb89f81e26d 100644 (file)
@@ -3547,6 +3547,15 @@ class Over(ColumnElement):
         else:
             self.rows = self.range_ = None
 
+    def __reduce__(self):
+        return self.__class__, (
+            self.element,
+            self.partition_by,
+            self.order_by,
+            self.range_,
+            self.rows,
+        )
+
     def _interpret_range(self, range_):
         if not isinstance(range_, tuple) or len(range_) != 2:
             raise exc.ArgumentError("2-tuple expected for range/rows")
index c5e9a639ea70add25279bbf2a02e784f83743b6c..a4ff667a7b5192aeb7c2b85610b00017175de22c 100644 (file)
@@ -449,6 +449,21 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
         except AttributeError:
             assert True
 
+    def test_pickle_over(self):
+        # TODO: the test/sql package lacks a comprehensive pickling
+        # test suite even though there are __reduce__ methods in several
+        # places in sql/elements.py.   likely as part of
+        # test/sql/test_compare.py might be a place this can happen but
+        # this still relies upon a strategy for table metadata as we have
+        # in serializer.
+
+        f1 = func.row_number().over()
+
+        self.assert_compile(
+            util.pickle.loads(util.pickle.dumps(f1)),
+            "row_number() OVER ()",
+        )
+
     def test_functions_with_cols(self):
         users = table(
             "users", column("id"), column("name"), column("fullname")