Kaydet (Commit) 873d9ff8 authored tarafından Gerhard Häring's avatar Gerhard Häring

Make sure we get usable error messages when text could not be decoded when…

Make sure we get usable error messages when text could not be decoded when fetched from the database.
üst 20c892db
...@@ -79,6 +79,20 @@ class RegressionTests(unittest.TestCase): ...@@ -79,6 +79,20 @@ class RegressionTests(unittest.TestCase):
cur.fetchone() cur.fetchone()
cur.fetchone() cur.fetchone()
def CheckErrorMsgDecodeError(self):
# When porting the module to Python 3.0, the error message about
# decoding errors disappeared. This verifies they're back again.
failure = None
try:
self.con.execute("select 'xxx' || ? || 'yyy' colname", (bytes(bytearray([250])),)).fetchone()
failure = "should have raised an OperationalError with detailed description"
except sqlite.OperationalError as e:
msg = e.args[0]
if not msg.startswith("Could not decode to UTF-8 column 'colname' with text 'xxx"):
failure = "OperationalError did not have expected description text"
if failure:
self.fail(failure)
def suite(): def suite():
regression_suite = unittest.makeSuite(RegressionTests, "Check") regression_suite = unittest.makeSuite(RegressionTests, "Check")
return unittest.TestSuite((regression_suite,)) return unittest.TestSuite((regression_suite,))
......
...@@ -295,6 +295,8 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self) ...@@ -295,6 +295,8 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self)
const char* val_str; const char* val_str;
char buf[200]; char buf[200];
const char* colname; const char* colname;
PyObject* buf_bytes;
PyObject* error_obj;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
numcols = sqlite3_data_count(self->statement->st); numcols = sqlite3_data_count(self->statement->st);
...@@ -363,7 +365,19 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self) ...@@ -363,7 +365,19 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self)
} }
PyOS_snprintf(buf, sizeof(buf) - 1, "Could not decode to UTF-8 column '%s' with text '%s'", PyOS_snprintf(buf, sizeof(buf) - 1, "Could not decode to UTF-8 column '%s' with text '%s'",
colname , val_str); colname , val_str);
PyErr_SetString(pysqlite_OperationalError, buf); buf_bytes = PyBytes_FromStringAndSize(buf, strlen(buf));
if (!buf_bytes) {
PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8");
} else {
error_obj = PyUnicode_FromEncodedObject(buf_bytes, "ascii", "replace");
if (!error_obj) {
PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8");
Py_DECREF(error_obj);
} else {
PyErr_SetObject(pysqlite_OperationalError, error_obj);
}
Py_DECREF(buf_bytes);
}
} }
} else if (self->connection->text_factory == (PyObject*)&PyString_Type) { } else if (self->connection->text_factory == (PyObject*)&PyString_Type) {
converted = PyString_FromString(val_str); converted = PyString_FromString(val_str);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment