From 6117f423c4754a4626c99eb3998db7282b1aa36b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerhard=20H=C3=A4ring?= Date: Mon, 22 Sep 2008 06:04:51 +0000 Subject: Issue #3659: Values of string subclasses were not handled correctly when used as bind parameters. Reviewed by Bejnamin Peterson. --- Lib/sqlite3/test/regression.py | 6 ++++++ Misc/NEWS | 5 +++++ Modules/_sqlite/statement.c | 15 +-------------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 433cae2..d056aae 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -169,6 +169,12 @@ class RegressionTests(unittest.TestCase): con = sqlite.connect(":memory:") setattr(con, "isolation_level", "\xe9") + def CheckStrSubclass(self): + """ + The Python 3.0 port of the module didn't cope with values of subclasses of str. + """ + class MyStr(str): pass + self.con.execute("select ?", (MyStr("abc"),)) def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") diff --git a/Misc/NEWS b/Misc/NEWS index c08c8a7..ac2dda8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -20,6 +20,11 @@ Library - Bug #3884: Make the turtle module toplevel again. +Extension Modules +----------------- + +- Issue #3659: Subclasses of str didn't work as SQL parameters. + What's New in Python 3.0 release candidate 1 ============================================ diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index af6d5cb..f1c0e7c 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -43,7 +43,6 @@ typedef enum { typedef enum { TYPE_LONG, TYPE_FLOAT, - TYPE_STRING, TYPE_UNICODE, TYPE_BUFFER, TYPE_UNKNOWN @@ -96,7 +95,6 @@ int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObjec char* string; Py_ssize_t buflen; parameter_type paramtype; - char* c; if (parameter == Py_None) { rc = sqlite3_bind_null(self->st, pos); @@ -114,24 +112,13 @@ int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObjec } else if (PyFloat_Check(parameter)) { paramtype = TYPE_FLOAT; } else if (PyUnicode_Check(parameter)) { - paramtype = TYPE_STRING; + paramtype = TYPE_UNICODE; } else if (PyObject_CheckBuffer(parameter)) { paramtype = TYPE_BUFFER; } else { paramtype = TYPE_UNKNOWN; } - if (paramtype == TYPE_STRING && !allow_8bit_chars) { - string = PyBytes_AS_STRING(parameter); - for (c = string; *c != 0; c++) { - if (*c & 0x80) { - PyErr_SetString(pysqlite_ProgrammingError, "You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings."); - rc = -1; - goto final; - } - } - } - switch (paramtype) { case TYPE_LONG: /* in the overflow error case, longval/longlongval is -1, and an exception is set */ -- cgit v0.12