summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_sqlite3/test_dbapi.py13
-rw-r--r--Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst2
-rw-r--r--Modules/_sqlite/clinic/module.c.h6
-rw-r--r--Modules/_sqlite/module.c5
4 files changed, 19 insertions, 7 deletions
diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py
index eaba391..2949e13 100644
--- a/Lib/test/test_sqlite3/test_dbapi.py
+++ b/Lib/test/test_sqlite3/test_dbapi.py
@@ -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
index 0000000..c9df867
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst
@@ -0,0 +1,2 @@
+No longer convert the database argument of :func:`sqlite3.connect` to bytes
+before passing it to the factory.
diff --git a/Modules/_sqlite/clinic/module.c.h b/Modules/_sqlite/clinic/module.c.h
index 8f7008a..b088f4b 100644
--- a/Modules/_sqlite/clinic/module.c.h
+++ b/Modules/_sqlite/clinic/module.c.h
@@ -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]*/
diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c
index fbc57c7..3f69427 100644
--- a/Modules/_sqlite/module.c
+++ b/Modules/_sqlite/module.c
@@ -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;
}