]> granicus.if.org Git - python/commitdiff
Issue #3659: Values of string subclasses were not handled correctly when used
authorGerhard Häring <gh@ghaering.de>
Mon, 22 Sep 2008 06:04:51 +0000 (06:04 +0000)
committerGerhard Häring <gh@ghaering.de>
Mon, 22 Sep 2008 06:04:51 +0000 (06:04 +0000)
as bind parameters.

Reviewed by Bejnamin Peterson.

Lib/sqlite3/test/regression.py
Misc/NEWS
Modules/_sqlite/statement.c

index 433cae27b298f66491db9106eedd083f5dab9706..d056aaef07d5470e2faed2944020acc5dc5d6a01 100644 (file)
@@ -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")
index c08c8a73954a139c805f66d42024db622ed64b1f..ac2dda80c5956a1e76930e5f28b060708157c7d6 100644 (file)
--- 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
 ============================================
index af6d5cb3cb8d407798a1a9073692fb62accfb3e0..f1c0e7ca7a9a72a321148ae08090cbcf442393f9 100644 (file)
@@ -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 */