mirror of
https://github.com/python/cpython.git
synced 2025-09-16 05:36:29 +00:00
bpo-43296: Handle sqlite3_value_blob() errors (GH-24674)
This commit is contained in:
parent
e07f4ab26a
commit
5cb601f956
3 changed files with 24 additions and 7 deletions
|
@ -276,6 +276,10 @@ class FunctionTests(unittest.TestCase):
|
||||||
val = cur.fetchone()[0]
|
val = cur.fetchone()[0]
|
||||||
self.assertEqual(val, 2)
|
self.assertEqual(val, 2)
|
||||||
|
|
||||||
|
def test_empty_blob(self):
|
||||||
|
cur = self.con.execute("select isblob(x'')")
|
||||||
|
self.assertTrue(cur.fetchone()[0])
|
||||||
|
|
||||||
# Regarding deterministic functions:
|
# Regarding deterministic functions:
|
||||||
#
|
#
|
||||||
# Between 3.8.3 and 3.15.0, deterministic functions were only used to
|
# Between 3.8.3 and 3.15.0, deterministic functions were only used to
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Improve :mod:`sqlite3` error handling: ``sqlite3_value_blob()`` errors that
|
||||||
|
set ``SQLITE_NOMEM`` now raise :exc:`MemoryError`. Patch by Erlend E.
|
||||||
|
Aasland.
|
|
@ -546,7 +546,6 @@ _pysqlite_build_py_params(sqlite3_context *context, int argc,
|
||||||
sqlite3_value* cur_value;
|
sqlite3_value* cur_value;
|
||||||
PyObject* cur_py_value;
|
PyObject* cur_py_value;
|
||||||
const char* val_str;
|
const char* val_str;
|
||||||
Py_ssize_t buflen;
|
|
||||||
|
|
||||||
args = PyTuple_New(argc);
|
args = PyTuple_New(argc);
|
||||||
if (!args) {
|
if (!args) {
|
||||||
|
@ -571,19 +570,26 @@ _pysqlite_build_py_params(sqlite3_context *context, int argc,
|
||||||
cur_py_value = Py_NewRef(Py_None);
|
cur_py_value = Py_NewRef(Py_None);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SQLITE_BLOB:
|
case SQLITE_BLOB: {
|
||||||
buflen = sqlite3_value_bytes(cur_value);
|
sqlite3 *db = sqlite3_context_db_handle(context);
|
||||||
cur_py_value = PyBytes_FromStringAndSize(
|
const void *blob = sqlite3_value_blob(cur_value);
|
||||||
sqlite3_value_blob(cur_value), buflen);
|
|
||||||
|
if (blob == NULL && sqlite3_errcode(db) == SQLITE_NOMEM) {
|
||||||
|
PyErr_NoMemory();
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_ssize_t size = sqlite3_value_bytes(cur_value);
|
||||||
|
cur_py_value = PyBytes_FromStringAndSize(blob, size);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case SQLITE_NULL:
|
case SQLITE_NULL:
|
||||||
default:
|
default:
|
||||||
cur_py_value = Py_NewRef(Py_None);
|
cur_py_value = Py_NewRef(Py_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cur_py_value) {
|
if (!cur_py_value) {
|
||||||
Py_DECREF(args);
|
goto error;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyTuple_SetItem(args, i, cur_py_value);
|
PyTuple_SetItem(args, i, cur_py_value);
|
||||||
|
@ -591,6 +597,10 @@ _pysqlite_build_py_params(sqlite3_context *context, int argc,
|
||||||
}
|
}
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
|
|
||||||
|
error:
|
||||||
|
Py_DECREF(args);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue