bpo-43258: Don't allocate sqlite3 aggregate context for empty queries (GH-24569)

This commit is contained in:
Erlend Egeberg Aasland 2021-02-19 12:20:32 +01:00 committed by GitHub
parent e92d67dfbb
commit 979b23cbe4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 2 deletions

View File

@ -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):

View File

@ -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.

View File

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