Discussion:
[Python-3000-checkins] r66550 - in python/branches/py3k: Lib/sqlite3/test/regression.py Misc/NEWS Modules/_sqlite/statement.c
gerhard.haering
2008-09-22 06:04:51 UTC
Permalink
Author: gerhard.haering
Date: Mon Sep 22 08:04:51 2008
New Revision: 66550

Log:
Issue #3659: Values of string subclasses were not handled correctly when used
as bind parameters.

Reviewed by Bejnamin Peterson.


Modified:
python/branches/py3k/Lib/sqlite3/test/regression.py
python/branches/py3k/Misc/NEWS
python/branches/py3k/Modules/_sqlite/statement.c

Modified: python/branches/py3k/Lib/sqlite3/test/regression.py
==============================================================================
--- python/branches/py3k/Lib/sqlite3/test/regression.py (original)
+++ python/branches/py3k/Lib/sqlite3/test/regression.py Mon Sep 22 08:04:51 2008
@@ -169,6 +169,12 @@
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")

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Mon Sep 22 08:04:51 2008
@@ -20,6 +20,11 @@

- 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
============================================

Modified: python/branches/py3k/Modules/_sqlite/statement.c
==============================================================================
--- python/branches/py3k/Modules/_sqlite/statement.c (original)
+++ python/branches/py3k/Modules/_sqlite/statement.c Mon Sep 22 08:04:51 2008
@@ -43,7 +43,6 @@
typedef enum {
TYPE_LONG,
TYPE_FLOAT,
- TYPE_STRING,
TYPE_UNICODE,
TYPE_BUFFER,
TYPE_UNKNOWN
@@ -96,7 +95,6 @@
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 @@
} 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 */
Loading...