From: Erlend E. Aasland Date: Wed, 30 Aug 2023 20:12:10 +0000 (+0200) Subject: [3.11] gh-108590: Revert gh-108657 (commit 400a1cebc) (#108686) (#108694) X-Git-Tag: v3.11.6~165 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6f24420cbf1fe31d212497fea024965b36987307;p=thirdparty%2FPython%2Fcpython.git [3.11] gh-108590: Revert gh-108657 (commit 400a1cebc) (#108686) (#108694) (cherry picked from commit 2a3926fa51b7264787d5988abf083d8c4328f4ad) Reverted per Serhiy's request. --- diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py index cd5fd7925855..1cf8759f8970 100644 --- a/Lib/sqlite3/dump.py +++ b/Lib/sqlite3/dump.py @@ -7,28 +7,6 @@ # future enhancements, you should normally quote any identifier that # is an English language word, even if you do not have to." - -from contextlib import contextmanager - - -def _force_decode(bs, *args, **kwargs): - # gh-108590: Don't fail if the database contains invalid Unicode data. - try: - return bs.decode(*args, **kwargs) - except UnicodeDecodeError: - return "".join([chr(c) for c in bs]) - - -@contextmanager -def _text_factory(con, factory): - saved_factory = con.text_factory - con.text_factory = factory - try: - yield - finally: - con.text_factory = saved_factory - - def _iterdump(connection): """ Returns an iterator to the dump of the database in an SQL text format. @@ -85,9 +63,8 @@ def _iterdump(connection): table_name_ident, ",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names)) query_res = cu.execute(q) - with _text_factory(connection, bytes): - for row in query_res: - yield("{0};".format(_force_decode(row[0]))) + for row in query_res: + yield("{0};".format(row[0])) # Now when the type is 'index', 'trigger', or 'view' q = """ diff --git a/Lib/test/test_sqlite3/test_dump.py b/Lib/test/test_sqlite3/test_dump.py index 3f6de925368e..c3ed3aefef04 100644 --- a/Lib/test/test_sqlite3/test_dump.py +++ b/Lib/test/test_sqlite3/test_dump.py @@ -137,21 +137,6 @@ class DumpTests(unittest.TestCase): actual = list(self.cx.iterdump()) self.assertEqual(expected, actual) - def test_dump_unicode_invalid(self): - # gh-108590 - expected = [ - "BEGIN TRANSACTION;", - "CREATE TABLE foo (data TEXT);", - "INSERT INTO \"foo\" VALUES('a\x9f');", - "COMMIT;", - ] - self.cu.executescript(""" - CREATE TABLE foo (data TEXT); - INSERT INTO foo VALUES (CAST(X'619f' AS TEXT)); - """) - actual = list(self.cx.iterdump()) - self.assertEqual(expected, actual) - if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2023-08-29-22-53-48.gh-issue-108590.6k0pOl.rst b/Misc/NEWS.d/next/Library/2023-08-29-22-53-48.gh-issue-108590.6k0pOl.rst deleted file mode 100644 index 50b41f2a94d9..000000000000 --- a/Misc/NEWS.d/next/Library/2023-08-29-22-53-48.gh-issue-108590.6k0pOl.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed an issue where :meth:`sqlite3.Connection.iterdump` would fail and leave an incomplete SQL dump if a table includes invalid Unicode sequences. Patch by Corvin McPherson