]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix LegacyRow/Row index access
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 7 Apr 2021 17:57:39 +0000 (13:57 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 8 Apr 2021 20:06:41 +0000 (16:06 -0400)
Fixed up the behavior of the :class:`_result.Row` object when dictionary
access is used upon it, meaning converting to a dict via ``dict(row)`` or
accessing members using strings or other objects i.e. ``row["some_key"]``
works as it would with a dictionary, rather than raising ``TypeError`` as
would be the case with a tuple, whether or not the C extensions are in
place. This was originally supposed to emit a 2.0 deprecation warning for
the "non-future" case using :class:`_result.LegacyRow`, and was to raise
``TypeError`` for the "future" :class:`_result.Row` class. However, the C
version of :class:`_result.Row` was failing to raise this ``TypeError``,
and to complicate matters, the :meth:`_orm.Session.execute` method now
returns :class:`_result.Row` in all cases to maintain consistency with the
ORM result case, so users who didn't have C extensions installed would
see different behavior in this one case for existing pre-1.4 style
code.

Therefore, in order to soften the overall upgrade scheme as most users have
not been exposed to the more strict behavior of :class:`_result.Row` up
through 1.4.6, :class:`_result.LegacyRow` and :class:`_result.Row` both
provide for string-key access as well as support for ``dict(row)``, in all
cases emitting the 2.0 deprecation warning when ``SQLALCHEMY_WARN_20`` is
enabled. The :class:`_result.Row` object still uses tuple-like behavior for
``__contains__``, which is probably the only noticeable behavioral change
compared to :class:`_result.LegacyRow`, other than the removal of
dictionary-style methods ``values()`` and ``items()``.

Also remove filters for result set warnings.

callcounts updated for 2.7/ 3.9, am pushing jenkins to use python 3.9
now

Fixes: #6218
Change-Id: Ia69b974f3dbc46943c57423f57ec82323c8ae63b

doc/build/changelog/unreleased_14/6218.rst [new file with mode: 0644]
lib/sqlalchemy/cextension/resultproxy.c
lib/sqlalchemy/engine/result.py
lib/sqlalchemy/engine/row.py
lib/sqlalchemy/testing/warnings.py
regen_callcounts.tox.ini
test/dialect/oracle/test_types.py
test/orm/test_query.py
test/profiles.txt
test/sql/test_resultset.py

diff --git a/doc/build/changelog/unreleased_14/6218.rst b/doc/build/changelog/unreleased_14/6218.rst
new file mode 100644 (file)
index 0000000..47621da
--- /dev/null
@@ -0,0 +1,28 @@
+.. change::
+    :tags: bug, engine, regression
+    :tickets: 6218
+
+    Fixed up the behavior of the :class:`_result.Row` object when dictionary
+    access is used upon it, meaning converting to a dict via ``dict(row)`` or
+    accessing members using strings or other objects i.e. ``row["some_key"]``
+    works as it would with a dictionary, rather than raising ``TypeError`` as
+    would be the case with a tuple, whether or not the C extensions are in
+    place. This was originally supposed to emit a 2.0 deprecation warning for
+    the "non-future" case using :class:`_result.LegacyRow`, and was to raise
+    ``TypeError`` for the "future" :class:`_result.Row` class. However, the C
+    version of :class:`_result.Row` was failing to raise this ``TypeError``,
+    and to complicate matters, the :meth:`_orm.Session.execute` method now
+    returns :class:`_result.Row` in all cases to maintain consistency with the
+    ORM result case, so users who didn't have C extensions installed would
+    see different behavior in this one case for existing pre-1.4 style
+    code.
+
+    Therefore, in order to soften the overall upgrade scheme as most users have
+    not been exposed to the more strict behavior of :class:`_result.Row` up
+    through 1.4.6, :class:`_result.LegacyRow` and :class:`_result.Row` both
+    provide for string-key access as well as support for ``dict(row)``, in all
+    cases emitting the 2.0 deprecation warning when ``SQLALCHEMY_WARN_20`` is
+    enabled. The :class:`_result.Row` object still uses tuple-like behavior for
+    ``__contains__``, which is probably the only noticeable behavioral change
+    compared to :class:`_result.LegacyRow`, other than the removal of
+    dictionary-style methods ``values()`` and ``items()``.
index 89fd6947a95286b16a63c581d181cc896b96ad07..596b264d03d3a623865fe1eab99c22a822cf0266 100644 (file)
@@ -53,7 +53,7 @@ static PyObject *sqlalchemy_engine_row = NULL;
 static PyObject *sqlalchemy_engine_result = NULL;
 
 
-//static int KEY_INTEGER_ONLY = 0;
+static int KEY_INTEGER_ONLY = 0;
 static int KEY_OBJECTS_ONLY = 1;
 static int KEY_OBJECTS_BUT_WARN = 2;
 //static int KEY_OBJECTS_NO_WARN = 3;
@@ -415,6 +415,7 @@ BaseRow_subscript_impl(BaseRow *self, PyObject *key, int asmapping)
     PyObject *values;
     PyObject *result;
     long index;
+    PyObject *tmp;
 
 #if PY_MAJOR_VERSION < 3
     if (PyInt_CheckExact(key)) {
@@ -466,6 +467,14 @@ BaseRow_subscript_impl(BaseRow *self, PyObject *key, int asmapping)
         result = BaseRow_valuescollection(values, 1);
         Py_DECREF(values);
         return result;
+    }
+    else if (!asmapping && self->key_style == KEY_INTEGER_ONLY) {
+        tmp = PyObject_CallMethod(self->parent, "_raise_for_nonint", "(O)", key);
+        if (tmp == NULL) {
+            return NULL;
+        }
+        Py_DECREF(tmp);
+        return NULL;
     } else {
         return BaseRow_getitem_by_object(self, key, asmapping);
     }
@@ -480,7 +489,7 @@ BaseRow_subscript(BaseRow *self, PyObject *key)
 static PyObject *
 BaseRow_subscript_mapping(BaseRow *self, PyObject *key)
 {
-    if (self->key_style == KEY_OBJECTS_BUT_WARN) {
+    if (self->key_style == KEY_OBJECTS_BUT_WARN || self->key_style == KEY_INTEGER_ONLY) {
         return BaseRow_subscript_impl(self, key, 0);
     }
     else {
index 10dfaa904e53ce84001ab10b2e5a1286d704aad5..205efe441587b7c2c2cbb6ee327d7429e8ffad88 100644 (file)
@@ -80,6 +80,13 @@ class ResultMetaData(object):
         util.raise_(KeyError(key), replace_context=err)
 
     def _warn_for_nonint(self, key):
+        util.warn_deprecated_20(
+            "Retrieving row members using strings or other non-integers is "
+            "deprecated; use row._mapping for a dictionary interface "
+            "to the row"
+        )
+
+    def _raise_for_nonint(self, key):
         raise TypeError(
             "TypeError: tuple indices must be integers or slices, not %s"
             % type(key).__name__
index b870e6534ad3916faa5437b448e446402a9e0f56..7c15b7f6e42d1d6942e4744362190840549ee057 100644 (file)
@@ -40,9 +40,18 @@ except ImportError:
 
 
 KEY_INTEGER_ONLY = 0
+"""__getitem__ only allows integer values, raises TypeError otherwise"""
+
 KEY_OBJECTS_ONLY = 1
+"""__getitem__ only allows string/object values, raises TypeError otherwise"""
+
 KEY_OBJECTS_BUT_WARN = 2
+"""__getitem__ allows integer or string/object values, but emits a 2.0
+deprecation warning if string/object is passed"""
+
 KEY_OBJECTS_NO_WARN = 3
+"""__getitem__ allows integer or string/object values with no warnings
+or errors."""
 
 try:
     from sqlalchemy.cresultproxy import BaseRow
@@ -100,15 +109,16 @@ except ImportError:
         def __hash__(self):
             return hash(self._data)
 
-        def __getitem__(self, key):
+        def _get_by_int_impl(self, key):
             return self._data[key]
 
-        _get_by_int_impl = __getitem__
-
         def _get_by_key_impl(self, key):
             if int in key.__class__.__mro__:
                 return self._data[key]
 
+            if self._key_style == KEY_INTEGER_ONLY:
+                self._parent._raise_for_nonint(key)
+
             # the following is all LegacyRow support.   none of this
             # should be called if not LegacyRow
             # assert isinstance(self, LegacyRow)
@@ -132,6 +142,12 @@ except ImportError:
 
             return self._data[mdindex]
 
+        # The original 1.4 plan was that Row would not allow row["str"]
+        # access, however as the C extensions were inadvertently allowing
+        # this coupled with the fact that orm Session sets future=True,
+        # this allows a softer upgrade path.  see #6218
+        __getitem__ = _get_by_key_impl
+
         def _get_by_key_impl_mapping(self, key):
             try:
                 rec = self._keymap[key]
@@ -192,7 +208,8 @@ class Row(BaseRow, collections_abc.Sequence):
 
     __slots__ = ()
 
-    _default_key_style = KEY_INTEGER_ONLY
+    # in 2.0, this should be KEY_INTEGER_ONLY
+    _default_key_style = KEY_OBJECTS_BUT_WARN
 
     @property
     def _mapping(self):
@@ -384,8 +401,11 @@ class LegacyRow(Row):
     def __contains__(self, key):
         return self._parent._contains(key, self)
 
-    if not _baserow_usecext:
-        __getitem__ = BaseRow._get_by_key_impl
+    # prior to #6218, LegacyRow would redirect the behavior of __getitem__
+    # for the non C version of BaseRow. This is now set up by Python BaseRow
+    # in all cases
+    # if not _baserow_usecext:
+    #    __getitem__ = BaseRow._get_by_key_impl
 
     @util.deprecated(
         "1.4",
index 5699cd035d3c86fbcb7378a179dfc5ada98cacb7..3236ecf8934581e549eb2d58820715269c0d1e64 100644 (file)
@@ -60,10 +60,6 @@ def setup_filters():
         #        r".*DefaultGenerator.execute\(\)",
         #
         #
-        # result sets
-        #
-        r"The Row.keys\(\) method",
-        r"Using non-integer/slice indices on Row ",
         #
         # Core SQL constructs
         #
index f162220c4fd0ff12fb08fd53cc3f01e707a90b65..80d88aa45445323eed8d81dcdfc9425ab19d1616 100644 (file)
@@ -1,5 +1,5 @@
 [tox]
-envlist = py{27,38}-sqla_{cext,nocext}-db_{sqlite,postgresql,mysql,oracle,mssql}
+envlist = py{27,39}-sqla_{cext,nocext}-db_{sqlite,postgresql,mysql,oracle,mssql}
 
 [testenv]
 deps=pytest
index 45a0fd4375d5e2bd36aad3b6cdf5e8d2dbcf9ac2..f3f8ef7c2d05127e5b3af58f0bdef6f270bfe695 100644 (file)
@@ -291,7 +291,10 @@ class TypesTest(fixtures.TestBase):
             dict(day_interval=datetime.timedelta(days=35, seconds=5743)),
         )
         row = connection.execute(interval_table.select()).first()
-        eq_(row["day_interval"], datetime.timedelta(days=35, seconds=5743))
+        eq_(
+            row._mapping["day_interval"],
+            datetime.timedelta(days=35, seconds=5743),
+        )
 
     def test_numerics(self, metadata, connection):
         m = metadata
@@ -919,19 +922,19 @@ class LOBFetchTest(fixtures.TablesTest):
         t = self.tables.z_test
         with engine.begin() as conn:
             row = conn.execute(t.select().where(t.c.id == 1)).first()
-            eq_(row["data"].read(), "this is text 1")
-            eq_(row["bindata"].read(), b("this is binary 1"))
+            eq_(row._mapping["data"].read(), "this is text 1")
+            eq_(row._mapping["bindata"].read(), b("this is binary 1"))
 
     def test_lobs_with_convert(self, connection):
         t = self.tables.z_test
         row = connection.execute(t.select().where(t.c.id == 1)).first()
-        eq_(row["data"], "this is text 1")
-        eq_(row["bindata"], b("this is binary 1"))
+        eq_(row._mapping["data"], "this is text 1")
+        eq_(row._mapping["bindata"], b("this is binary 1"))
 
     def test_lobs_with_convert_raw(self, connection):
         row = exec_sql(connection, "select data, bindata from z_test").first()
-        eq_(row["data"], "this is text 1")
-        eq_(row["bindata"], b("this is binary 1"))
+        eq_(row._mapping["data"], "this is text 1")
+        eq_(row._mapping["bindata"], b("this is binary 1"))
 
     def test_lobs_without_convert_many_rows(self):
         engine = testing_engine(
@@ -947,9 +950,9 @@ class LOBFetchTest(fixtures.TablesTest):
             eq_(
                 [
                     dict(
-                        id=row["id"],
-                        data=row["data"].read(),
-                        bindata=row["bindata"].read(),
+                        id=row._mapping["id"],
+                        data=row._mapping["data"].read(),
+                        bindata=row._mapping["bindata"].read(),
                     )
                     for row in results
                 ],
@@ -982,7 +985,9 @@ class LOBFetchTest(fixtures.TablesTest):
             eq_(
                 [
                     dict(
-                        id=row["id"], data=row["data"], bindata=row["bindata"]
+                        id=row._mapping["id"],
+                        data=row._mapping["data"],
+                        bindata=row._mapping["bindata"],
                     )
                     for row in results
                 ],
index 9abe20e8a4f2cde0eaa298b3cb8b373350defd6e..d1723bcf162baa0080faa1de5169a805ca30494e 100644 (file)
@@ -560,7 +560,7 @@ class RowLabelingTest(QueryTest):
 
                 row = s.execute(stmt).first()
 
-            eq_(row.keys(), expected)
+            eq_(row._mapping.keys(), expected)
 
             if selected_columns is None:
                 selected_columns = expected
@@ -638,7 +638,7 @@ class RowLabelingTest(QueryTest):
         q = s.query(User.id, User.name)
         row = q.first()
 
-        eq_(row.keys(), ("id", "name"))
+        eq_(row._mapping.keys(), ("id", "name"))
 
         eq_(
             [entity["name"] for entity in q.column_descriptions],
@@ -762,7 +762,7 @@ class RowLabelingTest(QueryTest):
 
         s = fixture_session()
         row = s.query(u1, u2).from_statement(stmt).first()
-        eq_(row.keys(), expected)
+        eq_(row._mapping.keys(), expected)
 
     def test_explicit_ambiguous_orm_cols_legacy(self):
         User = self.classes.User
@@ -772,7 +772,7 @@ class RowLabelingTest(QueryTest):
 
         s = fixture_session()
         row = s.query(u1, u2).join(u2, u1.c.id == u2.c.id).first()
-        eq_(row.keys(), ["id", "name", "id", "name"])
+        eq_(row._mapping.keys(), ["id", "name", "id", "name"])
 
     @testing.fixture
     def uname_fixture(self):
index a5f06b5c9f93b996680aa433bb9b322882458c15..f1dab165e0ac7e47c907e5541c698667571a6934 100644 (file)
@@ -1,15 +1,15 @@
 # /home/classic/dev/sqlalchemy/test/profiles.txt
 # This file is written out on a per-environment basis.
-# For each test in aaa_profiling, the corresponding function and
+# For each test in aaa_profiling, the corresponding function and 
 # environment is located within this file.  If it doesn't exist,
 # the test is skipped.
-# If a callcount does exist, it is compared to what we received.
+# If a callcount does exist, it is compared to what we received. 
 # assertions are raised if the counts do not match.
-#
-# To add a new callcount test, apply the function_call_count
-# decorator and re-run the tests using the --write-profiles
+# 
+# To add a new callcount test, apply the function_call_count 
+# decorator and re-run the tests using the --write-profiles 
 # option - this file will be rewritten including the new count.
-#
+# 
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_insert
 
@@ -45,9 +45,29 @@ test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.
 test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 73
 test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 73
 test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 73
+test.aaa_profiling.test_compiler.CompileTest.test_insert x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 73
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_select
 
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 181
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 181
 test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 183
 test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 183
 test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 183
@@ -64,25 +84,35 @@ test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.
 test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 183
 test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 183
 test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 183
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 196
+test.aaa_profiling.test_compiler.CompileTest.test_select x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 196
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_select_labels
 
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 185
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 197
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 179
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 179
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 179
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 179
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 170
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 182
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 185
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 185
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 197
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 197
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 200
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 200
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 200
@@ -99,25 +129,35 @@ test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpy
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 200
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 200
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 200
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 212
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 212
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_update
 
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 69
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 79
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 69
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 69
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 69
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 69
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 79
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 79
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 69
-test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 69
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 79
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 72
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 72
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 72
@@ -134,9 +174,25 @@ test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 72
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 72
 test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 72
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 82
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause
 
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 169
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 169
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 169
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 169
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 169
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 169
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 169
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 169
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 169
@@ -145,86 +201,120 @@ test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linu
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 175
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 175
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 175
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 175
 
 # TEST: test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_cached
 
 test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_cached x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 303
 test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_cached x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 303
+test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_cached x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 303
+test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_cached x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 303
 
 # TEST: test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_not_cached
 
 test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_not_cached x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 5003
 test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_not_cached x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 5003
+test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_not_cached x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 5403
+test.aaa_profiling.test_misc.CacheKeyTest.test_statement_key_is_not_cached x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 5403
 
 # TEST: test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members
 
-test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1326
-test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1326
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1328
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1328
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 926
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 926
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 929
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 929
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 46905
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 58305
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 47205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 58405
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 50805
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 63005
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 50905
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 63005
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 46205
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 57605
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 46005
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 57205
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 50105
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 62305
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 49705
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 61805
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations
 
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 45305
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 54205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 54005
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 48505
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 58205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 48405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 58005
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations
 
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 44505
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 53405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 53205
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 47705
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 57405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 47605
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 57205
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 43405
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 47305
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 43305
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 47005
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 46005
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 50705
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 45805
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 50405
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations
 
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 45305
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 54205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 54005
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 48505
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 58205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 48405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 58005
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations
 
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 44505
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 53405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 53205
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 47705
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 57405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 47605
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 57205
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 29405
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 32205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 29205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 31805
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 32305
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 35305
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 32005
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 34905
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 28605
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 31405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 28405
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 31005
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 31505
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 34505
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 31205
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 34105
 
 # TEST: test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set
 
@@ -232,6 +322,8 @@ test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set x86_64_linu
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 3567
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 3688
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 3688
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 3688
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 3688
 
 # TEST: test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove
 
@@ -239,6 +331,8 @@ test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 5626
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 5828
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 5828
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 5828
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 5828
 
 # TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching
 
@@ -246,27 +340,35 @@ test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branchi
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 60
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 61
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 61
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 61
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 61
 
 # TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching
 
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 408
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 408
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 399
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 399
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 414
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 414
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 400
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 400
 
 # TEST: test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline
 
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 15083
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26098
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 15199
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26212
 test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 15115
 test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 27133
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 15229
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 27246
 
 # TEST: test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols
 
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 21326
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26341
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 21341
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26354
 test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 21371
 test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 27389
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 21378
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 27395
 
 # TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased
 
@@ -274,6 +376,8 @@ test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased x86_64_linux_c
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 10003
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 10304
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 10454
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 10304
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_aliased x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 10454
 
 # TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain
 
@@ -281,34 +385,44 @@ test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain x86_64_linux_cpy
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 4203
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 4054
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 4204
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 4054
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_b_plain x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 4204
 
 # TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d
 
-test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 94638
-test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 94788
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 95638
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 95788
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 102054
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 102204
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 103239
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 103389
 
 # TEST: test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased
 
-test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 92688
-test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 92838
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 93688
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 93838
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 100404
 test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 100569
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 101589
+test.aaa_profiling.test_orm.JoinConditionTest.test_a_to_d_aliased x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 101739
 
 # TEST: test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query
 
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 473059
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 474896
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 472614
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 474456
 test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 505420
 test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 507262
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 504380
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 506222
 
 # TEST: test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results
 
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 390474
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 406881
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 408605
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 426205
 test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 395087
 test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 414201
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 415105
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 433605
 
 # TEST: test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity
 
@@ -316,27 +430,35 @@ test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 19986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 20986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 20986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 20986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 20986
 
 # TEST: test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity
 
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 81002
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 84067
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 90562
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 93130
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 84836
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 89106
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 94242
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 98273
 
 # TEST: test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks
 
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 20142
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 20628
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 20899
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 21353
 test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 21185
 test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 21784
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 21763
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 22331
 
 # TEST: test.aaa_profiling.test_orm.MergeTest.test_merge_load
 
-test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1320
-test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1358
+test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1374
+test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1408
 test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 1391
 test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 1438
+test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 1446
+test.aaa_profiling.test_orm.MergeTest.test_merge_load x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 1491
 
 # TEST: test.aaa_profiling.test_orm.MergeTest.test_merge_no_load
 
@@ -344,32 +466,44 @@ test.aaa_profiling.test_orm.MergeTest.test_merge_no_load x86_64_linux_cpython_2.
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 101,17
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 105,18
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 105,18
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 103,18
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 103,18
 
 # TEST: test.aaa_profiling.test_orm.QueryTest.test_query_cols
 
-test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 5425
-test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6205
+test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 5597
+test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6357
 test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 5763
 test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 6563
+test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 5925
+test.aaa_profiling.test_orm.QueryTest.test_query_cols x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 6715
 
 # TEST: test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results
 
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 244405
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 261205
 test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 246134
 test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 264752
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 255605
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 273705
 
 # TEST: test.aaa_profiling.test_orm.SessionTest.test_expire_lots
 
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1159
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1146
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1169
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1138
 test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 1253
 test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 1267
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 1255
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 1252
 
 # TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect
 
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 101
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 101
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 102
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 102
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 84
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 84
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 86
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 86
 
 # TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect
 
@@ -377,6 +511,8 @@ test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect x86_64_linux_cpyt
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 33
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 24
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 24
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 24
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 24
 
 # TEST: test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute
 
@@ -412,25 +548,35 @@ test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 55
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 55
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 55
 
 # TEST: test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute
 
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 91
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 93
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 91
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 93
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 91
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 93
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 92
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 92
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 92
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 94
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 89
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 91
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 89
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 91
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 89
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 91
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 91
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 93
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 91
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 93
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 92
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 92
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 94
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 93
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 93
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 93
@@ -447,6 +593,16 @@ test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 93
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 93
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 93
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 94
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile
 
@@ -482,25 +638,35 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 17
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 17
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 17
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy
 
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 1552
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 13554
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 122503
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 134505
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 1545
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 13547
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 1583
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 13585
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 122534
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 134536
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 1576
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 13578
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 1535
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 13537
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 123501
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 135503
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 1541
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 43564
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 1520
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 13522
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1473
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 13475
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 1551
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 13553
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 1506
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 13508
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 1552
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 13556
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 88292
@@ -517,25 +683,35 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 13544
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 1491
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 13495
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 1584
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 13588
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 88324
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 100328
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 1577
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 13581
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 1572
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 13576
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 1525
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_legacy x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 13529
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings
 
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 2555
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 15557
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 123506
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 136508
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 2548
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 15550
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 2586
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 15588
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 123537
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 136539
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 2579
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 15581
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 2542
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 15544
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 124508
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 137510
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 2548
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 45571
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 2523
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 15525
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 2478
-test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 15480
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 2554
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 15556
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 2509
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 15511
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 2556
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 15560
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 89296
@@ -552,6 +728,16 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_6
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 15548
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 2497
 test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 15501
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 2588
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 15592
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 89328
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 102332
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 2581
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 15585
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 2576
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 15580
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 2529
+test.aaa_profiling.test_resultset.ResultSetTest.test_fetch_by_key_mappings x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 15533
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0]
 
@@ -587,6 +773,16 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 23
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 23
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 20
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 20
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-0] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 15
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1]
 
@@ -622,6 +818,16 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 17
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 23
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 25
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 20
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 22
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-1] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 17
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2]
 
@@ -657,6 +863,16 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 17
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 23
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 25
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 20
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 22
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 17
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[False-2] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 17
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1]
 
@@ -692,25 +908,35 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 20
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 18
 test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 20
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 28
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 30
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 25
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 27
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 18
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 20
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 18
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 20
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 18
+test.aaa_profiling.test_resultset.ResultSetTest.test_one_or_none[True-1] x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 20
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string
 
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 288
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6308
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121229
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127229
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 247
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6247
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 293
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6313
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121234
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127234
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 252
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6252
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 312
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 6332
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 122268
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 128268
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 380
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36420
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 258
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6278
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 228
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6248
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 263
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6283
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 233
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6253
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 264
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 6264
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 87004
@@ -727,25 +953,35 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpy
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 6254
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 222
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 6222
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 269
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 6269
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 87009
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 93009
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 237
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 6237
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 259
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 6259
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 227
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 6227
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode
 
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 288
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6308
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121229
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127229
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 247
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6247
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 293
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6313
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121234
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127234
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 252
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6252
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 312
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 6332
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 122268
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 128268
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 380
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36420
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 258
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6278
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 228
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6248
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 263
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6283
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 233
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6253
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 264
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 6264
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 87004
@@ -762,25 +998,35 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cp
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 6254
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 222
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 6222
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 269
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 6269
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 87009
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 93009
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 237
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 6237
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 259
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 6259
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 227
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 6227
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_string
 
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 550
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6552
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121501
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127503
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 543
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6545
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 581
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6583
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121532
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127534
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 574
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6576
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 535
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 6537
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 122501
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 128503
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 550
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36570
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 518
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6520
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 473
-test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6475
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 549
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6551
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 504
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6506
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 551
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 6555
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 87291
@@ -797,25 +1043,35 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 6543
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 492
 test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 6496
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 583
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 6587
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 87323
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 93327
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 576
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 6580
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 571
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 6575
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 524
+test.aaa_profiling.test_resultset.ResultSetTest.test_string x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 6528
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_unicode
 
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 550
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6552
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121501
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127503
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 543
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6545
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_cextensions 581
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_mysqldb_dbapiunicode_nocextensions 6583
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_cextensions 121532
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mariadb_pymysql_dbapiunicode_nocextensions 127534
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_cextensions 574
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mssql_pyodbc_dbapiunicode_nocextensions 6576
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_cextensions 535
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mysql_mysqldb_dbapiunicode_nocextensions 6537
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_cextensions 122501
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_mysql_pymysql_dbapiunicode_nocextensions 128503
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_cextensions 550
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36570
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 518
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6520
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 473
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6475
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_cextensions 549
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6551
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_cextensions 504
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6506
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_cextensions 551
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.8_mariadb_mysqldb_dbapiunicode_nocextensions 6555
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.8_mariadb_pymysql_dbapiunicode_cextensions 87291
@@ -832,3 +1088,13 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpytho
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.8_postgresql_psycopg2_dbapiunicode_nocextensions 6543
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_cextensions 492
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.8_sqlite_pysqlite_dbapiunicode_nocextensions 6496
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_cextensions 583
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_mariadb_mysqldb_dbapiunicode_nocextensions 6587
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_cextensions 87323
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_mariadb_pymysql_dbapiunicode_nocextensions 93327
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_cextensions 576
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_mssql_pyodbc_dbapiunicode_nocextensions 6580
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_cextensions 571
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_postgresql_psycopg2_dbapiunicode_nocextensions 6575
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_cextensions 524
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode x86_64_linux_cpython_3.9_sqlite_pysqlite_dbapiunicode_nocextensions 6528
index 67bd7785bf8a3ff0283f179a4c7f30653e7cb1c1..c0c16512cd17daf573e8ad431c52d8d28e6c2f1e 100644 (file)
@@ -29,6 +29,8 @@ from sqlalchemy.engine import cursor as _cursor
 from sqlalchemy.engine import default
 from sqlalchemy.engine import Row
 from sqlalchemy.engine.result import SimpleResultMetaData
+from sqlalchemy.engine.row import KEY_INTEGER_ONLY
+from sqlalchemy.engine.row import KEY_OBJECTS_BUT_WARN
 from sqlalchemy.engine.row import LegacyRow
 from sqlalchemy.ext.compiler import compiles
 from sqlalchemy.sql import ColumnElement
@@ -1047,10 +1049,18 @@ class CursorResultTest(fixtures.TablesTest):
         (lambda result: result.first()._mapping),
         argnames="get_object",
     )
-    def test_keys(self, connection, get_object):
+    @testing.combinations(
+        (True,),
+        (False,),
+        argnames="future",
+    )
+    def test_keys(self, connection, get_object, future):
         users = self.tables.users
         addresses = self.tables.addresses
 
+        if future:
+            connection = connection.execution_options(future_result=True)
+
         connection.execute(users.insert(), dict(user_id=1, user_name="foo"))
         result = connection.execute(users.select())
 
@@ -1059,7 +1069,11 @@ class CursorResultTest(fixtures.TablesTest):
         # Row still has a .keys() method as well as LegacyRow
         # as in 1.3.x, the KeyedTuple object also had a keys() method.
         # it emits a 2.0 deprecation warning.
-        keys = obj.keys()
+        if isinstance(obj, Row):
+            with assertions.expect_deprecated_20("The Row.keys()"):
+                keys = obj.keys()
+        else:
+            keys = obj.keys()
 
         # in 1.4, keys() is now a view that includes support for testing
         # of columns and other objects
@@ -1087,9 +1101,12 @@ class CursorResultTest(fixtures.TablesTest):
         eq_(list(row._mapping.keys()), ["user_id", "user_name"])
         eq_(row._fields, ("user_id", "user_name"))
 
-        in_("user_id", row.keys())
-        not_in("foo", row.keys())
-        in_(users.c.user_id, row.keys())
+        with assertions.expect_deprecated_20("The Row.keys()"):
+            in_("user_id", row.keys())
+        with assertions.expect_deprecated_20("The Row.keys()"):
+            not_in("foo", row.keys())
+        with assertions.expect_deprecated_20("The Row.keys()"):
+            in_(users.c.user_id, row.keys())
 
     def test_row_keys_legacy_dont_warn(self, connection):
         users = self.tables.users
@@ -1098,8 +1115,12 @@ class CursorResultTest(fixtures.TablesTest):
         result = connection.execute(users.select())
         row = result.first()
         # DO NOT WARN DEPRECATED IN 1.x, ONLY 2.0 WARNING
-        eq_(dict(row), {"user_id": 1, "user_name": "foo"})
-        eq_(row.keys(), ["user_id", "user_name"])
+
+        with assertions.expect_deprecated_20("The Row.keys()"):
+            eq_(dict(row), {"user_id": 1, "user_name": "foo"})
+
+        with assertions.expect_deprecated_20("The Row.keys()"):
+            eq_(row.keys(), ["user_id", "user_name"])
 
     def test_row_namedtuple_legacy_ok(self, connection):
         users = self.tables.users
@@ -1329,13 +1350,13 @@ class CursorResultTest(fixtures.TablesTest):
 
     @testing.combinations((Row,), (LegacyRow,))
     def test_row_special_names(self, row_cls):
-        metadata = SimpleResultMetaData(["key", "count", "index"])
+        metadata = SimpleResultMetaData(["key", "count", "index", "foo"])
         row = row_cls(
             metadata,
-            [None, None, None],
+            [None, None, None, None],
             metadata._keymap,
-            Row._default_key_style,
-            ["kv", "cv", "iv"],
+            row_cls._default_key_style,
+            ["kv", "cv", "iv", "f"],
         )
         is_true(isinstance(row, collections_abc.Sequence))
 
@@ -1343,7 +1364,12 @@ class CursorResultTest(fixtures.TablesTest):
         eq_(row.count, "cv")
         eq_(row.index, "iv")
 
-        if isinstance(row, LegacyRow):
+        with assertions.expect_deprecated_20(
+            "Retrieving row members using strings or other non-integers "
+            "is deprecated; use row._mapping for a dictionary interface "
+            "to the row"
+        ):
+            eq_(row["foo"], "f")
             eq_(row["count"], "cv")
             eq_(row["index"], "iv")
 
@@ -1368,6 +1394,85 @@ class CursorResultTest(fixtures.TablesTest):
         eq_(row.count("cv"), 1)
         eq_(row.count("x"), 0)
 
+    @testing.combinations((Row,), (LegacyRow,))
+    def test_row_dict_behaviors_warn_mode(self, row_cls):
+        metadata = SimpleResultMetaData(
+            [
+                "a",
+                "b",
+                "count",
+            ]
+        )
+        row = row_cls(
+            metadata,
+            [None, None, None],
+            metadata._keymap,
+            KEY_OBJECTS_BUT_WARN,
+            ["av", "bv", "cv"],
+        )
+
+        # as of #6218, dict(row) and row["x"] work for
+        # both LegacyRow and Row, with 2.0 deprecation warnings
+        # for both
+        with assertions.expect_deprecated_20(
+            "Retrieving row members using strings or other non-integers "
+            "is deprecated; use row._mapping for a dictionary interface "
+            "to the row"
+        ):
+            eq_(dict(row), {"a": "av", "b": "bv", "count": "cv"})
+
+        with assertions.expect_deprecated_20(
+            "Retrieving row members using strings or other non-integers "
+            "is deprecated; use row._mapping for a dictionary interface "
+            "to the row"
+        ):
+            eq_(row["a"], "av")
+            eq_(row["count"], "cv")
+
+        # keys is keys
+        with assertions.expect_deprecated_20("The Row.keys()"):
+            eq_(list(row.keys()), ["a", "b", "count"])
+
+    def test_new_row_no_dict_behaviors(self):
+        """This mode is not used currently but will be once we are in 2.0."""
+        metadata = SimpleResultMetaData(
+            [
+                "a",
+                "b",
+                "count",
+            ]
+        )
+        row = Row(
+            metadata,
+            [None, None, None],
+            metadata._keymap,
+            KEY_INTEGER_ONLY,
+            ["av", "bv", "cv"],
+        )
+
+        with assertions.expect_raises_message(
+            TypeError,
+            "TypeError: tuple indices must be integers or slices, not str",
+        ):
+            with assertions.expect_deprecated_20("The Row.keys()"):
+                eq_(dict(row), {"a": "av", "b": "bv", "count": "cv"})
+
+        with assertions.expect_raises_message(
+            TypeError,
+            "TypeError: tuple indices must be integers or slices, not str",
+        ):
+            eq_(row["a"], "av")
+
+        with assertions.expect_raises_message(
+            TypeError,
+            "TypeError: tuple indices must be integers or slices, not str",
+        ):
+            eq_(row["count"], "cv")
+
+        # keys is keys
+        with assertions.expect_deprecated_20("The Row.keys()"):
+            eq_(list(row.keys()), ["a", "b", "count"])
+
     def test_row_is_hashable(self):
 
         row = Row(