]> 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:17 +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

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 c8ae1e6b644f9448fa39f001d1016aab05074d74..5fb28f1d1a6e07e22fee60385272deefbcf3ec27 100644 (file)
@@ -3849,6 +3849,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 f9a8f998ed26dc5437ad58b16aa3a2adb67e7d2c..1722a1e690102653dea78b0c58e4fbcbfaad8499 100644 (file)
@@ -483,6 +483,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")