diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2020-09-17 07:35:44 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-17 07:35:44 (GMT) |
commit | 0b419b791077414bbc011a412698ebb362b63761 (patch) | |
tree | ee14bf8c868781a6d75c080acbaf110c94ae6270 /Modules/_sqlite | |
parent | dcfaa520c4638a67052a4ff4a2a820be68750ad7 (diff) | |
download | cpython-0b419b791077414bbc011a412698ebb362b63761.zip cpython-0b419b791077414bbc011a412698ebb362b63761.tar.gz cpython-0b419b791077414bbc011a412698ebb362b63761.tar.bz2 |
bpo-41662: Fix bugs in binding parameters in sqlite3 (GH-21998)
* When the parameters argument is a list, correctly handle the case
of changing it during iteration.
* When the parameters argument is a custom sequence, no longer
override an exception raised in ``__len__()``.
Diffstat (limited to 'Modules/_sqlite')
-rw-r--r-- | Modules/_sqlite/statement.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 26599b4..02e47a0 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -227,6 +227,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para num_params = PyList_GET_SIZE(parameters); } else { num_params = PySequence_Size(parameters); + if (num_params == -1) { + return; + } } if (num_params != num_params_needed) { PyErr_Format(pysqlite_ProgrammingError, @@ -238,9 +241,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para for (i = 0; i < num_params; i++) { if (PyTuple_CheckExact(parameters)) { current_param = PyTuple_GET_ITEM(parameters, i); - Py_XINCREF(current_param); + Py_INCREF(current_param); } else if (PyList_CheckExact(parameters)) { - current_param = PyList_GET_ITEM(parameters, i); + current_param = PyList_GetItem(parameters, i); Py_XINCREF(current_param); } else { current_param = PySequence_GetItem(parameters, i); |