[Python-3000-checkins] r66550 - in python/branches/py3k: Lib/sqlite3/test/regression.py Misc/NEWS Modules/_sqlite/statement.c

gerhard.haering python-3000-checkins at python.org
Mon Sep 22 08:04:51 CEST 2008


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 */


More information about the Python-3000-checkins mailing list