mirror of https://github.com/python/cpython
bpo-43853: Handle sqlite3_value_text() errors (GH-25422)
This commit is contained in:
parent
8363ac8607
commit
006fd869e4
|
@ -236,9 +236,11 @@ class FunctionTests(unittest.TestCase):
|
|||
|
||||
def test_param_string(self):
|
||||
cur = self.con.cursor()
|
||||
cur.execute("select isstring(?)", ("foo",))
|
||||
val = cur.fetchone()[0]
|
||||
self.assertEqual(val, 1)
|
||||
for text in ["foo", str()]:
|
||||
with self.subTest(text=text):
|
||||
cur.execute("select isstring(?)", (text,))
|
||||
val = cur.fetchone()[0]
|
||||
self.assertEqual(val, 1)
|
||||
|
||||
def test_param_int(self):
|
||||
cur = self.con.cursor()
|
||||
|
@ -391,9 +393,9 @@ class AggregateTests(unittest.TestCase):
|
|||
|
||||
def test_aggr_check_param_str(self):
|
||||
cur = self.con.cursor()
|
||||
cur.execute("select checkType('str', ?)", ("foo",))
|
||||
cur.execute("select checkTypes('str', ?, ?)", ("foo", str()))
|
||||
val = cur.fetchone()[0]
|
||||
self.assertEqual(val, 1)
|
||||
self.assertEqual(val, 2)
|
||||
|
||||
def test_aggr_check_param_int(self):
|
||||
cur = self.con.cursor()
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Improve :mod:`sqlite3` error handling: ``sqlite3_value_text()`` errors that
|
||||
set ``SQLITE_NOMEM`` now raise :exc:`MemoryError`. Patch by Erlend E.
|
||||
Aasland.
|
|
@ -550,7 +550,6 @@ _pysqlite_build_py_params(sqlite3_context *context, int argc,
|
|||
int i;
|
||||
sqlite3_value* cur_value;
|
||||
PyObject* cur_py_value;
|
||||
const char* val_str;
|
||||
|
||||
args = PyTuple_New(argc);
|
||||
if (!args) {
|
||||
|
@ -566,15 +565,19 @@ _pysqlite_build_py_params(sqlite3_context *context, int argc,
|
|||
case SQLITE_FLOAT:
|
||||
cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value));
|
||||
break;
|
||||
case SQLITE_TEXT:
|
||||
val_str = (const char*)sqlite3_value_text(cur_value);
|
||||
cur_py_value = PyUnicode_FromString(val_str);
|
||||
/* TODO: have a way to show errors here */
|
||||
if (!cur_py_value) {
|
||||
PyErr_Clear();
|
||||
cur_py_value = Py_NewRef(Py_None);
|
||||
case SQLITE_TEXT: {
|
||||
sqlite3 *db = sqlite3_context_db_handle(context);
|
||||
const char *text = (const char *)sqlite3_value_text(cur_value);
|
||||
|
||||
if (text == NULL && sqlite3_errcode(db) == SQLITE_NOMEM) {
|
||||
PyErr_NoMemory();
|
||||
goto error;
|
||||
}
|
||||
|
||||
Py_ssize_t size = sqlite3_value_bytes(cur_value);
|
||||
cur_py_value = PyUnicode_FromStringAndSize(text, size);
|
||||
break;
|
||||
}
|
||||
case SQLITE_BLOB: {
|
||||
sqlite3 *db = sqlite3_context_db_handle(context);
|
||||
const void *blob = sqlite3_value_blob(cur_value);
|
||||
|
|
Loading…
Reference in New Issue