Skip to content

Commit 25365e9

Browse files
Add NEWS
1 parent eb49d32 commit 25365e9

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

Lib/test/test_sqlite3/test_dbapi.py

+14
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,20 @@ def __getitem__(slf, x):
861861
with self.assertRaises(ZeroDivisionError):
862862
self.cu.execute("select name from test where name=?", L())
863863

864+
def test_execute_named_param_and_sequence(self):
865+
dataset = (
866+
("select :a", (1,)),
867+
("select :a, ?, ?", (1, 2, 3)),
868+
("select ?, :b, ?", (1, 2, 3)),
869+
("select ?, ?, :c", (1, 2, 3)),
870+
)
871+
msg = "Binding.*is a named parameter"
872+
for query, params in dataset:
873+
with self.subTest(query=query, params=params):
874+
with self.assertWarnsRegex(DeprecationWarning, msg) as cm:
875+
self.cu.execute(query, params)
876+
self.assertEqual(cm.filename, __file__)
877+
864878
def test_execute_too_many_params(self):
865879
category = sqlite.SQLITE_LIMIT_VARIABLE_NUMBER
866880
msg = "too many SQL variables"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
In :meth:`~sqlite3.Cursor.execute`, deprecate using named placeholders with
2+
parameters supplied as a :term:`sequence`. Patch by Erlend E. Aasland.

Modules/_sqlite/cursor.c

+11
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,17 @@ bind_parameters(pysqlite_state *state, pysqlite_Statement *self,
662662
return;
663663
}
664664
for (i = 0; i < num_params; i++) {
665+
const char *name = sqlite3_bind_parameter_name(self->st, i+1);
666+
if (name != NULL) {
667+
PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
668+
"Binding %d ('%s') is a named parameter, "
669+
"but you supplied a sequence which requires "
670+
"nameless (qmark) placeholders. "
671+
"Starting with Python 3.14 an "
672+
"sqlite3.ProgrammingError will be raised.",
673+
i+1, name);
674+
}
675+
665676
if (PyTuple_CheckExact(parameters)) {
666677
PyObject *item = PyTuple_GET_ITEM(parameters, i);
667678
current_param = Py_NewRef(item);

0 commit comments

Comments
 (0)