diff options
author | mike bayer <mike_mp@zzzcomputing.com> | 2020-10-12 17:45:10 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2020-10-12 17:45:10 +0000 |
commit | a3e2eb7c3c3fe6b2bebd14a7e9d661b2b4519d1f (patch) | |
tree | eb77a32a75e9a040ef466aa2cc3fdbc4577742aa | |
parent | 286fe9b0b165e46099066cc16552b93a0b853a7e (diff) | |
parent | 9322de12f5c5eca397b13cb7db2b6196f58aceb3 (diff) | |
download | sqlalchemy-a3e2eb7c3c3fe6b2bebd14a7e9d661b2b4519d1f.tar.gz |
Merge "Repair reduction in Over"
-rw-r--r-- | doc/build/changelog/unreleased_13/5644.rst | 6 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/elements.py | 9 | ||||
-rw-r--r-- | test/sql/test_functions.py | 15 |
3 files changed, 30 insertions, 0 deletions
diff --git a/doc/build/changelog/unreleased_13/5644.rst b/doc/build/changelog/unreleased_13/5644.rst new file mode 100644 index 000000000..d0e20492b --- /dev/null +++ b/doc/build/changelog/unreleased_13/5644.rst @@ -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. diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index c8ae1e6b6..5fb28f1d1 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -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") diff --git a/test/sql/test_functions.py b/test/sql/test_functions.py index f9a8f998e..1722a1e69 100644 --- a/test/sql/test_functions.py +++ b/test/sql/test_functions.py @@ -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") |