]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-93044: No longer convert the database argument of sqlite3.connect() to...
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 21 May 2022 13:53:58 +0000 (16:53 +0300)
committerGitHub <noreply@github.com>
Sat, 21 May 2022 13:53:58 +0000 (16:53 +0300)
Just pass it to the factory as is.
(cherry picked from commit 14c0d33016a967a98155f2e1615660e9328aef5d)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/test/test_sqlite3/test_dbapi.py
Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst [new file with mode: 0644]
Modules/_sqlite/clinic/module.c.h
Modules/_sqlite/module.c

index eaba39186e9a714d5f8f3a842e37ef93a44a616a..2949e13e3566741d6d5705a6f48b0cb652dae03e 100644 (file)
@@ -685,6 +685,19 @@ class OpenTests(unittest.TestCase):
             with managed_connect(f"file:{TESTFN}?mode=ro", uri=True) as cx:
                 cx.execute(self._sql)
 
+    def test_factory_database_arg(self):
+        def factory(database, *args, **kwargs):
+            nonlocal database_arg
+            database_arg = database
+            return sqlite.Connection(":memory:", *args, **kwargs)
+
+        for database in (TESTFN, os.fsencode(TESTFN),
+                         FakePath(TESTFN), FakePath(os.fsencode(TESTFN))):
+            database_arg = None
+            with sqlite.connect(database, factory=factory):
+                pass
+            self.assertEqual(database_arg, database)
+
     def test_database_keyword(self):
         with sqlite.connect(database=":memory:") as cx:
             self.assertEqual(type(cx), sqlite.Connection)
diff --git a/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst b/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst
new file mode 100644 (file)
index 0000000..c9df867
--- /dev/null
@@ -0,0 +1,2 @@
+No longer convert the database argument of :func:`sqlite3.connect` to bytes
+before passing it to the factory.
index 8f7008adef2b1d5304ee390387150ba04c5399a2..b088f4b8cfcd72355eca65ba3d8a97854f61eeb6 100644 (file)
@@ -43,9 +43,7 @@ pysqlite_connect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb
     if (!args) {
         goto exit;
     }
-    if (!PyUnicode_FSConverter(args[0], &database)) {
-        goto exit;
-    }
+    database = args[0];
     if (!noptargs) {
         goto skip_optional_pos;
     }
@@ -334,4 +332,4 @@ skip_optional:
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=d846459943008a9c input=a9049054013a1b77]*/
+/*[clinic end generated code: output=10c4f942dc9f0c79 input=a9049054013a1b77]*/
index fbc57c7cc739eef132ec736fc6dd6f0b1f5bb397..3f69427916ab819851b9f939ac4bd0774cf58788 100644 (file)
@@ -46,7 +46,7 @@ module _sqlite3
 /*[clinic input]
 _sqlite3.connect as pysqlite_connect
 
-    database: object(converter='PyUnicode_FSConverter')
+    database: object
     timeout: double = 5.0
     detect_types: int = 0
     isolation_level: object = NULL
@@ -66,7 +66,7 @@ pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout,
                       int detect_types, PyObject *isolation_level,
                       int check_same_thread, PyObject *factory,
                       int cached_statements, int uri)
-/*[clinic end generated code: output=450ac9078b4868bb input=ea6355ba55a78e12]*/
+/*[clinic end generated code: output=450ac9078b4868bb input=e16914663ddf93ce]*/
 {
     if (isolation_level == NULL) {
         isolation_level = PyUnicode_FromString("");
@@ -81,7 +81,6 @@ pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout,
                                           timeout, detect_types,
                                           isolation_level, check_same_thread,
                                           factory, cached_statements, uri);
-    Py_DECREF(database);  // needed bco. the AC FSConverter
     Py_DECREF(isolation_level);
     return res;
 }