mirror of https://github.com/python/cpython
bpo-43258: Don't allocate sqlite3 aggregate context for empty queries (GH-24569)
This commit is contained in:
parent
e92d67dfbb
commit
979b23cbe4
|
@ -429,6 +429,11 @@ class AggregateTests(unittest.TestCase):
|
|||
val = cur.fetchone()[0]
|
||||
self.assertEqual(val, 60)
|
||||
|
||||
def test_aggr_no_match(self):
|
||||
cur = self.con.execute("select mysum(i) from (select 1 as i) where i == 0")
|
||||
val = cur.fetchone()[0]
|
||||
self.assertIsNone(val)
|
||||
|
||||
class AuthorizerTests(unittest.TestCase):
|
||||
@staticmethod
|
||||
def authorizer_cb(action, arg1, arg2, dbname, source):
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Prevent needless allocation of :mod:`sqlite3` aggregate function context
|
||||
when no rows match an aggregate query. Patch by Erlend E. Aasland.
|
|
@ -708,8 +708,12 @@ void _pysqlite_final_callback(sqlite3_context* context)
|
|||
|
||||
threadstate = PyGILState_Ensure();
|
||||
|
||||
aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
|
||||
if (!*aggregate_instance) {
|
||||
aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, 0);
|
||||
if (aggregate_instance == NULL) {
|
||||
/* No rows matched the query; the step handler was never called. */
|
||||
goto error;
|
||||
}
|
||||
else if (!*aggregate_instance) {
|
||||
/* this branch is executed if there was an exception in the aggregate's
|
||||
* __init__ */
|
||||
|
||||
|
|
Loading…
Reference in New Issue