]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Run row value processors up front
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 4 Jun 2019 21:29:20 +0000 (17:29 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 1 Oct 2019 20:52:24 +0000 (16:52 -0400)
as part of a larger series of changes to generalize row-tuples,
RowProxy becomes plain Row and is no longer a "proxy"; the
DBAPI row is now copied directly into the Row when constructed,
result handling occurs at once.

Subsequent changes will break out Row into a new version that
behaves fully a tuple.

Change-Id: I2ffa156afce5d21c38f28e54c3a531f361345dd5

18 files changed:
doc/build/changelog/migration_14.rst
doc/build/changelog/unreleased_14/4710_row.rst [new file with mode: 0644]
doc/build/core/connections.rst
lib/sqlalchemy/cextension/resultproxy.c
lib/sqlalchemy/dialects/mysql/base.py
lib/sqlalchemy/dialects/sqlite/base.py
lib/sqlalchemy/engine/__init__.py
lib/sqlalchemy/engine/result.py
lib/sqlalchemy/exc.py
lib/sqlalchemy/orm/loading.py
lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/sql/compiler.py
test/aaa_profiling/test_memusage.py
test/aaa_profiling/test_resultset.py
test/profiles.txt
test/sql/test_compiler.py
test/sql/test_resultset.py

index 32c055b50b3179672b60bcd199f5c181fe250f41..bd8eca43776d34b6d826be5dbd948a4127ec77c0 100644 (file)
@@ -535,6 +535,63 @@ as::
 
 :ticket:`4753`
 
+.. _change_4710_row:
+
+The "RowProxy" is no longer a "proxy", now called ``Row``
+---------------------------------------------------------
+
+Since the beginning of SQLAlchemy, the Core result objects exposed to the
+user are the :class:`.ResultProxy` and ``RowProxy`` objects.   The name
+"proxy" refers to the `GOF Proxy Pattern <https://en.wikipedia.org/wiki/Proxy_pattern>`_,
+emphasizing that these objects are presenting a facade around the DBAPI
+``cursor`` object and the tuple-like objects returned by methods such
+as ``cursor.fetchone()``; as methods on the result and row proxy objects
+are invoked, the underlying methods or data members of the ``cursor`` and
+the tuple-like objects returned are invoked.
+
+In particular, SQLAlchemy's row-processing functions would be invoked
+as a particular column in a row is accessed.  By row-processing functions,
+we refer to functions such as that of the :class:`.Unicode` datatype, which under
+Python 2 would often convert Python string objects to Python unicode
+objects, as well as numeric functions that produce ``Decimal`` objects,
+SQLite datetime functions that produce ``datetime`` objects from string
+representations, as well as any-number of user-defined functions which can
+be created using :class:`.TypeDecorator`.
+
+The rationale for this pattern was performance, where the anticipated use
+case of fetching a row from a legacy database that contained dozens of
+columns would not need to run, for example, a unicode converter on every
+element of each row, if only a few columns in the row were being fetched.
+SQLAlchemy eventually gained C extensions which allowed for additional
+performance gains within this process.
+
+As part of SQLAlchemy 1.4's goal of migrating towards SQLAlchemy 2.0's updated
+usage patterns, row objects will be made to behave more like tuples.  To
+suit this, the "proxy" behavior of :class:`.Row` has been removed and instead
+the row is populated with its final data values upon construction.  This
+in particular allows an operation such as ``obj in row`` to work as that
+of a tuple where it tests for containment of ``obj`` in the row itself,
+rather than considering it to be a key in a mapping as is the case now.
+For the moment, ``obj in row`` still does a key lookup,
+that is, detects if the row has a particular column name as ``obj``, however
+this behavior is deprecated and in 2.0 the :class:`.Row` will behave fully
+as a tuple-like object; lookup of keys will be via the ``._mapping``
+attribute.
+
+The result of removing the proxy behavior from rows is that the C code has been
+simplified and the performance of many operations is improved both with and
+without the C extensions in use.   Modern Python DBAPIs handle unicode
+conversion natively in most cases, and SQLAlchemy's unicode handlers are
+very fast in any case, so the expense of unicode conversion
+is a non-issue.
+
+This change by itself has no behavioral impact on the row, but is part of
+a larger series of changes in :ticket:`4710` which unifies the Core row/result
+facade with that of the ORM.
+
+:ticket:`4710`
+
+
 .. _change_4449:
 
 Improved column labeling for simple column expressions using CAST or similar
diff --git a/doc/build/changelog/unreleased_14/4710_row.rst b/doc/build/changelog/unreleased_14/4710_row.rst
new file mode 100644 (file)
index 0000000..b9e417b
--- /dev/null
@@ -0,0 +1,13 @@
+.. change::
+    :tags: feature, engine
+
+    The ``RowProxy`` class is no longer a "proxy" object, and is instead
+    directly populated with the post-processed contents of the DBAPI row tuple
+    upon construction.   Now named :class:`.Row`, the mechanics of how the
+    Python-level value processors have been simplified, particularly as it impacts the
+    format of the C code, so that a DBAPI row is processed into a result tuple
+    up front.   See the migration notes for further details.
+
+    .. seealso::
+
+        :ref:`change_4710_row`
index af745ba604c3edd8b999d3d6a3127d5deb016054..c1b2ff398ab4f662c4d0183994a6f0e967bd3a8d 100644 (file)
@@ -657,7 +657,7 @@ Connection / Engine API
     :members:
     :private-members: _soft_close
 
-.. autoclass:: RowProxy
+.. autoclass:: Row
     :members:
 
 .. autoclass:: Transaction
index c804459301d7d3258e8b6c9736c3ab43e9d05926..a94af1b2fa369012d7f4f12a5b363a3d7192339b 100644 (file)
@@ -30,24 +30,23 @@ typedef struct {
     PyObject_HEAD
     PyObject *parent;
     PyObject *row;
-    PyObject *processors;
     PyObject *keymap;
-} BaseRowProxy;
+} BaseRow;
 
 /****************
- * BaseRowProxy *
+ * BaseRow *
  ****************/
 
 static PyObject *
 safe_rowproxy_reconstructor(PyObject *self, PyObject *args)
 {
     PyObject *cls, *state, *tmp;
-    BaseRowProxy *obj;
+    BaseRow *obj;
 
     if (!PyArg_ParseTuple(args, "OO", &cls, &state))
         return NULL;
 
-    obj = (BaseRowProxy *)PyObject_CallMethod(cls, "__new__", "O", cls);
+    obj = (BaseRow *)PyObject_CallMethod(cls, "__new__", "O", cls);
     if (obj == NULL)
         return NULL;
 
@@ -59,10 +58,10 @@ safe_rowproxy_reconstructor(PyObject *self, PyObject *args)
     Py_DECREF(tmp);
 
     if (obj->parent == NULL || obj->row == NULL ||
-        obj->processors == NULL || obj->keymap == NULL) {
+        obj->keymap == NULL) {
         PyErr_SetString(PyExc_RuntimeError,
-            "__setstate__ for BaseRowProxy subclasses must set values "
-            "for parent, row, processors and keymap");
+            "__setstate__ for BaseRow subclasses must set values "
+            "for parent, row, and keymap");
         Py_DECREF(obj);
         return NULL;
     }
@@ -71,30 +70,64 @@ safe_rowproxy_reconstructor(PyObject *self, PyObject *args)
 }
 
 static int
-BaseRowProxy_init(BaseRowProxy *self, PyObject *args, PyObject *kwds)
+BaseRow_init(BaseRow *self, PyObject *args, PyObject *kwds)
 {
-    PyObject *parent, *row, *processors, *keymap;
+    PyObject *parent, *keymap, *row, *processors;
+    Py_ssize_t num_values, num_processors;
+    PyObject **valueptr, **funcptr, **resultptr;
+    PyObject *func, *result, *processed_value, *values_fastseq;
 
-    if (!PyArg_UnpackTuple(args, "BaseRowProxy", 4, 4,
-                           &parent, &row, &processors, &keymap))
+    if (!PyArg_UnpackTuple(args, "BaseRow", 4, 4,
+                           &parent, &processors, &keymap, &row))
         return -1;
 
     Py_INCREF(parent);
     self->parent = parent;
 
-    if (!PySequence_Check(row)) {
-        PyErr_SetString(PyExc_TypeError, "row must be a sequence");
+    values_fastseq = PySequence_Fast(row, "row must be a sequence");
+    if (values_fastseq == NULL)
+        return -1;
+
+    num_values = PySequence_Length(values_fastseq);
+    num_processors = PyList_Size(processors);
+    if (num_values != num_processors) {
+        PyErr_Format(PyExc_RuntimeError,
+            "number of values in row (%d) differ from number of column "
+            "processors (%d)",
+            (int)num_values, (int)num_processors);
         return -1;
     }
-    Py_INCREF(row);
-    self->row = row;
 
-    if (!PyList_CheckExact(processors)) {
-        PyErr_SetString(PyExc_TypeError, "processors must be a list");
+    result = PyTuple_New(num_values);
+    if (result == NULL)
         return -1;
+
+    valueptr = PySequence_Fast_ITEMS(values_fastseq);
+    funcptr = PySequence_Fast_ITEMS(processors);
+    resultptr = PySequence_Fast_ITEMS(result);
+    while (--num_values >= 0) {
+        func = *funcptr;
+        if (func != Py_None) {
+            processed_value = PyObject_CallFunctionObjArgs(
+                func, *valueptr, NULL);
+            if (processed_value == NULL) {
+                Py_DECREF(values_fastseq);
+                Py_DECREF(result);
+                return -1;
+            }
+            *resultptr = processed_value;
+        } else {
+            Py_INCREF(*valueptr);
+            *resultptr = *valueptr;
+        }
+        valueptr++;
+        funcptr++;
+        resultptr++;
     }
-    Py_INCREF(processors);
-    self->processors = processors;
+
+    Py_DECREF(values_fastseq);
+
+    self->row = result;
 
     if (!PyDict_CheckExact(keymap)) {
         PyErr_SetString(PyExc_TypeError, "keymap must be a dict");
@@ -108,10 +141,10 @@ BaseRowProxy_init(BaseRowProxy *self, PyObject *args, PyObject *kwds)
 
 /* We need the reduce method because otherwise the default implementation
  * does very weird stuff for pickle protocol 0 and 1. It calls
- * BaseRowProxy.__new__(RowProxy_instance) upon *pickling*.
+ * BaseRow.__new__(Row_instance) upon *pickling*.
  */
 static PyObject *
-BaseRowProxy_reduce(PyObject *self)
+BaseRow_reduce(PyObject *self)
 {
     PyObject *method, *state;
     PyObject *module, *reconstructor, *cls;
@@ -147,11 +180,10 @@ BaseRowProxy_reduce(PyObject *self)
 }
 
 static void
-BaseRowProxy_dealloc(BaseRowProxy *self)
+BaseRow_dealloc(BaseRow *self)
 {
     Py_XDECREF(self->parent);
     Py_XDECREF(self->row);
-    Py_XDECREF(self->processors);
     Py_XDECREF(self->keymap);
 #if PY_MAJOR_VERSION >= 3
     Py_TYPE(self)->tp_free((PyObject *)self);
@@ -161,73 +193,39 @@ BaseRowProxy_dealloc(BaseRowProxy *self)
 }
 
 static PyObject *
-BaseRowProxy_processvalues(PyObject *values, PyObject *processors, int astuple)
+BaseRow_valuescollection(PyObject *values, int astuple)
 {
-    Py_ssize_t num_values, num_processors;
-    PyObject **valueptr, **funcptr, **resultptr;
-    PyObject *func, *result, *processed_value, *values_fastseq;
-
-    num_values = PySequence_Length(values);
-    num_processors = PyList_Size(processors);
-    if (num_values != num_processors) {
-        PyErr_Format(PyExc_RuntimeError,
-            "number of values in row (%d) differ from number of column "
-            "processors (%d)",
-            (int)num_values, (int)num_processors);
-        return NULL;
-    }
+    PyObject *result;
 
     if (astuple) {
-        result = PyTuple_New(num_values);
+        result = PySequence_Tuple(values);
     } else {
-        result = PyList_New(num_values);
+        result = PySequence_List(values);
     }
     if (result == NULL)
         return NULL;
 
-    values_fastseq = PySequence_Fast(values, "row must be a sequence");
-    if (values_fastseq == NULL)
-        return NULL;
-
-    valueptr = PySequence_Fast_ITEMS(values_fastseq);
-    funcptr = PySequence_Fast_ITEMS(processors);
-    resultptr = PySequence_Fast_ITEMS(result);
-    while (--num_values >= 0) {
-        func = *funcptr;
-        if (func != Py_None) {
-            processed_value = PyObject_CallFunctionObjArgs(func, *valueptr,
-                                                           NULL);
-            if (processed_value == NULL) {
-                Py_DECREF(values_fastseq);
-                Py_DECREF(result);
-                return NULL;
-            }
-            *resultptr = processed_value;
-        } else {
-            Py_INCREF(*valueptr);
-            *resultptr = *valueptr;
-        }
-        valueptr++;
-        funcptr++;
-        resultptr++;
-    }
-    Py_DECREF(values_fastseq);
     return result;
 }
 
 static PyListObject *
-BaseRowProxy_values(BaseRowProxy *self)
+BaseRow_values_impl(BaseRow *self)
+{
+    return (PyListObject *)BaseRow_valuescollection(self->row, 0);
+}
+
+static Py_hash_t
+BaseRow_hash(BaseRow *self)
 {
-    return (PyListObject *)BaseRowProxy_processvalues(self->row,
-                                                      self->processors, 0);
+    return PyObject_Hash(self->row);
 }
 
 static PyObject *
-BaseRowProxy_iter(BaseRowProxy *self)
+BaseRow_iter(BaseRow *self)
 {
     PyObject *values, *result;
 
-    values = BaseRowProxy_processvalues(self->row, self->processors, 1);
+    values = BaseRow_valuescollection(self->row, 1);
     if (values == NULL)
         return NULL;
 
@@ -240,17 +238,34 @@ BaseRowProxy_iter(BaseRowProxy *self)
 }
 
 static Py_ssize_t
-BaseRowProxy_length(BaseRowProxy *self)
+BaseRow_length(BaseRow *self)
 {
     return PySequence_Length(self->row);
 }
 
 static PyObject *
-BaseRowProxy_subscript(BaseRowProxy *self, PyObject *key)
+BaseRow_getitem(BaseRow *self, Py_ssize_t i)
+{
+    PyObject *value;
+    PyObject *row;
+
+    row = self->row;
+
+    // row is a Tuple
+    value = PyTuple_GetItem(row, i);
+
+    if (value == NULL)
+        return NULL;
+
+    Py_INCREF(value);
+
+    return value;
+}
+
+static PyObject *
+BaseRow_getitem_by_object(BaseRow *self, PyObject *key)
 {
-    PyObject *processors, *values;
-    PyObject *processor, *value, *processed_value;
-    PyObject *row, *record, *result, *indexobject;
+    PyObject *record, *indexobject;
     PyObject *exc_module, *exception, *cstr_obj;
 #if PY_MAJOR_VERSION >= 3
     PyObject *bytes;
@@ -258,158 +273,148 @@ BaseRowProxy_subscript(BaseRowProxy *self, PyObject *key)
     char *cstr_key;
     long index;
     int key_fallback = 0;
-    int tuple_check = 0;
 
-#if PY_MAJOR_VERSION < 3
-    if (PyInt_CheckExact(key)) {
-        index = PyInt_AS_LONG(key);
-        if (index < 0)
-            index += BaseRowProxy_length(self);
-    } else
-#endif
+    // if record is non null, it's a borrowed reference
+    record = PyDict_GetItem((PyObject *)self->keymap, key);
 
-    if (PyLong_CheckExact(key)) {
-        index = PyLong_AsLong(key);
-        if ((index == -1) && PyErr_Occurred())
-            /* -1 can be either the actual value, or an error flag. */
-            return NULL;
-        if (index < 0)
-            index += BaseRowProxy_length(self);
-    } else if (PySlice_Check(key)) {
-        values = PyObject_GetItem(self->row, key);
-        if (values == NULL)
+    if (record == NULL) {
+        record = PyObject_CallMethod(self->parent, "_key_fallback",
+                                     "O", key);
+        if (record == NULL)
             return NULL;
+        key_fallback = 1;  // boolean to indicate record is a new reference
+    }
 
-        processors = PyObject_GetItem(self->processors, key);
-        if (processors == NULL) {
-            Py_DECREF(values);
-            return NULL;
-        }
+    indexobject = PyTuple_GetItem(record, 0);
+    if (indexobject == NULL)
+        return NULL;
 
-        result = BaseRowProxy_processvalues(values, processors, 1);
-        Py_DECREF(values);
-        Py_DECREF(processors);
-        return result;
-    } else {
-        record = PyDict_GetItem((PyObject *)self->keymap, key);
-        if (record == NULL) {
-            record = PyObject_CallMethod(self->parent, "_key_fallback",
-                                         "O", key);
-            if (record == NULL)
-                return NULL;
-            key_fallback = 1;
-        }
+    if (key_fallback) {
+        Py_DECREF(record);
+    }
 
-        indexobject = PyTuple_GetItem(record, 2);
-        if (indexobject == NULL)
+    if (indexobject == Py_None) {
+        exc_module = PyImport_ImportModule("sqlalchemy.exc");
+        if (exc_module == NULL)
             return NULL;
 
-        if (key_fallback) {
-            Py_DECREF(record);
-        }
-
-        if (indexobject == Py_None) {
-            exc_module = PyImport_ImportModule("sqlalchemy.exc");
-            if (exc_module == NULL)
-                return NULL;
-
-            exception = PyObject_GetAttrString(exc_module,
-                                               "InvalidRequestError");
-            Py_DECREF(exc_module);
-            if (exception == NULL)
-                return NULL;
+        exception = PyObject_GetAttrString(exc_module,
+                                           "InvalidRequestError");
+        Py_DECREF(exc_module);
+        if (exception == NULL)
+            return NULL;
 
-            cstr_obj = PyTuple_GetItem(record, 1);
-            if (cstr_obj == NULL)
-                return NULL;
+        cstr_obj = PyTuple_GetItem(record, 2);
+        if (cstr_obj == NULL)
+            return NULL;
 
-            cstr_obj = PyObject_Str(cstr_obj);
-            if (cstr_obj == NULL)
-                return NULL;
+        cstr_obj = PyObject_Str(cstr_obj);
+        if (cstr_obj == NULL)
+            return NULL;
 
 /*
-           FIXME: raise encoding error exception (in both versions below)
-           if the key contains non-ascii chars, instead of an
-           InvalidRequestError without any message like in the
-           python version.
+       FIXME: raise encoding error exception (in both versions below)
+       if the key contains non-ascii chars, instead of an
+       InvalidRequestError without any message like in the
+       python version.
 */
 
 
 #if PY_MAJOR_VERSION >= 3
-            bytes = PyUnicode_AsASCIIString(cstr_obj);
-            if (bytes == NULL)
-                return NULL;
-            cstr_key = PyBytes_AS_STRING(bytes);
+        bytes = PyUnicode_AsASCIIString(cstr_obj);
+        if (bytes == NULL)
+            return NULL;
+        cstr_key = PyBytes_AS_STRING(bytes);
 #else
-            cstr_key = PyString_AsString(cstr_obj);
+        cstr_key = PyString_AsString(cstr_obj);
 #endif
-            if (cstr_key == NULL) {
-                Py_DECREF(cstr_obj);
-                return NULL;
-            }
+        if (cstr_key == NULL) {
             Py_DECREF(cstr_obj);
-
-            PyErr_Format(exception,
-                    "Ambiguous column name '%.200s' in "
-                    "result set column descriptions", cstr_key);
             return NULL;
         }
+        Py_DECREF(cstr_obj);
+
+        PyErr_Format(exception,
+                "Ambiguous column name '%.200s' in "
+                "result set column descriptions", cstr_key);
+        return NULL;
+    }
 
 #if PY_MAJOR_VERSION >= 3
-        index = PyLong_AsLong(indexobject);
+    index = PyLong_AsLong(indexobject);
 #else
-        index = PyInt_AsLong(indexobject);
+    index = PyInt_AsLong(indexobject);
 #endif
-        if ((index == -1) && PyErr_Occurred())
-            /* -1 can be either the actual value, or an error flag. */
-            return NULL;
-    }
-    processor = PyList_GetItem(self->processors, index);
-    if (processor == NULL)
+    if ((index == -1) && PyErr_Occurred())
+        /* -1 can be either the actual value, or an error flag. */
         return NULL;
 
-    row = self->row;
-    if (PyTuple_CheckExact(row)) {
-        value = PyTuple_GetItem(row, index);
-        tuple_check = 1;
-    }
-    else {
-        value = PySequence_GetItem(row, index);
-        tuple_check = 0;
-    }
+    return BaseRow_getitem(self, index);
 
-    if (value == NULL)
-        return NULL;
+}
 
-    if (processor != Py_None) {
-        processed_value = PyObject_CallFunctionObjArgs(processor, value, NULL);
-        if (!tuple_check) {
-            Py_DECREF(value);
-        }
-        return processed_value;
+static PyObject *
+BaseRow_subscript_impl(BaseRow *self, PyObject *key, int asmapping)
+{
+    PyObject *values;
+    PyObject *result;
+    long index;
+
+#if PY_MAJOR_VERSION < 3
+    if (PyInt_CheckExact(key)) {
+        index = PyInt_AS_LONG(key);
+        if (index < 0)
+            index += BaseRow_length(self);
+        return BaseRow_getitem(self, index);
+    } else
+#endif
+
+    if (PyLong_CheckExact(key)) {
+        index = PyLong_AsLong(key);
+        if ((index == -1) && PyErr_Occurred())
+            /* -1 can be either the actual value, or an error flag. */
+            return NULL;
+        if (index < 0)
+            index += BaseRow_length(self);
+        return BaseRow_getitem(self, index);
+    } else if (PySlice_Check(key)) {
+        values = PyObject_GetItem(self->row, key);
+        if (values == NULL)
+            return NULL;
+
+        result = BaseRow_valuescollection(values, 1);
+        Py_DECREF(values);
+        return result;
     } else {
-        if (tuple_check) {
-            Py_INCREF(value);
-        }
-        return value;
+        /*
+         // if we want to warn for non-integer access by getitem,
+         // that would happen here.
+         if (!asmapping) {
+            tmp = PyObject_CallMethod(self->parent, "_warn_for_nonint", "");
+            if (tmp == NULL) {
+                return NULL;
+            }
+            Py_DECREF(tmp);
+        }*/
+        return BaseRow_getitem_by_object(self, key);
     }
 }
 
 static PyObject *
-BaseRowProxy_getitem(PyObject *self, Py_ssize_t i)
+BaseRow_subscript(BaseRow *self, PyObject *key)
 {
-    PyObject *index;
+    return BaseRow_subscript_impl(self, key, 0);
+}
 
-#if PY_MAJOR_VERSION >= 3
-    index = PyLong_FromSsize_t(i);
-#else
-    index = PyInt_FromSsize_t(i);
-#endif
-    return BaseRowProxy_subscript((BaseRowProxy*)self, index);
+static PyObject *
+BaseRow_subscript_mapping(BaseRow *self, PyObject *key)
+{
+    return BaseRow_subscript_impl(self, key, 1);
 }
 
+
 static PyObject *
-BaseRowProxy_getattro(BaseRowProxy *self, PyObject *name)
+BaseRow_getattro(BaseRow *self, PyObject *name)
 {
     PyObject *tmp;
 #if PY_MAJOR_VERSION >= 3
@@ -424,7 +429,7 @@ BaseRowProxy_getattro(BaseRowProxy *self, PyObject *name)
     else
         return tmp;
 
-    tmp = BaseRowProxy_subscript(self, name);
+    tmp = BaseRow_subscript_mapping(self, name);
     if (tmp == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
 
 #if PY_MAJOR_VERSION >= 3
@@ -453,14 +458,14 @@ BaseRowProxy_getattro(BaseRowProxy *self, PyObject *name)
  ***********************/
 
 static PyObject *
-BaseRowProxy_getparent(BaseRowProxy *self, void *closure)
+BaseRow_getparent(BaseRow *self, void *closure)
 {
     Py_INCREF(self->parent);
     return self->parent;
 }
 
 static int
-BaseRowProxy_setparent(BaseRowProxy *self, PyObject *value, void *closure)
+BaseRow_setparent(BaseRow *self, PyObject *value, void *closure)
 {
     PyObject *module, *cls;
 
@@ -494,14 +499,14 @@ BaseRowProxy_setparent(BaseRowProxy *self, PyObject *value, void *closure)
 }
 
 static PyObject *
-BaseRowProxy_getrow(BaseRowProxy *self, void *closure)
+BaseRow_getrow(BaseRow *self, void *closure)
 {
     Py_INCREF(self->row);
     return self->row;
 }
 
 static int
-BaseRowProxy_setrow(BaseRowProxy *self, PyObject *value, void *closure)
+BaseRow_setrow(BaseRow *self, PyObject *value, void *closure)
 {
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError,
@@ -522,44 +527,17 @@ BaseRowProxy_setrow(BaseRowProxy *self, PyObject *value, void *closure)
     return 0;
 }
 
-static PyObject *
-BaseRowProxy_getprocessors(BaseRowProxy *self, void *closure)
-{
-    Py_INCREF(self->processors);
-    return self->processors;
-}
-
-static int
-BaseRowProxy_setprocessors(BaseRowProxy *self, PyObject *value, void *closure)
-{
-    if (value == NULL) {
-        PyErr_SetString(PyExc_TypeError,
-                        "Cannot delete the 'processors' attribute");
-        return -1;
-    }
-
-    if (!PyList_CheckExact(value)) {
-        PyErr_SetString(PyExc_TypeError,
-                        "The 'processors' attribute value must be a list");
-        return -1;
-    }
-
-    Py_XDECREF(self->processors);
-    Py_INCREF(value);
-    self->processors = value;
 
-    return 0;
-}
 
 static PyObject *
-BaseRowProxy_getkeymap(BaseRowProxy *self, void *closure)
+BaseRow_getkeymap(BaseRow *self, void *closure)
 {
     Py_INCREF(self->keymap);
     return self->keymap;
 }
 
 static int
-BaseRowProxy_setkeymap(BaseRowProxy *self, PyObject *value, void *closure)
+BaseRow_setkeymap(BaseRow *self, PyObject *value, void *closure)
 {
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError,
@@ -580,39 +558,39 @@ BaseRowProxy_setkeymap(BaseRowProxy *self, PyObject *value, void *closure)
     return 0;
 }
 
-static PyGetSetDef BaseRowProxy_getseters[] = {
+static PyGetSetDef BaseRow_getseters[] = {
     {"_parent",
-     (getter)BaseRowProxy_getparent, (setter)BaseRowProxy_setparent,
+     (getter)BaseRow_getparent, (setter)BaseRow_setparent,
      "ResultMetaData",
      NULL},
-    {"_row",
-     (getter)BaseRowProxy_getrow, (setter)BaseRowProxy_setrow,
-     "Original row tuple",
-     NULL},
-    {"_processors",
-     (getter)BaseRowProxy_getprocessors, (setter)BaseRowProxy_setprocessors,
-     "list of type processors",
+    {"_data",
+     (getter)BaseRow_getrow, (setter)BaseRow_setrow,
+     "processed data list",
      NULL},
     {"_keymap",
-     (getter)BaseRowProxy_getkeymap, (setter)BaseRowProxy_setkeymap,
-     "Key to (processor, index) dict",
+     (getter)BaseRow_getkeymap, (setter)BaseRow_setkeymap,
+     "Key to (obj, index) dict",
      NULL},
     {NULL}
 };
 
-static PyMethodDef BaseRowProxy_methods[] = {
-    {"values", (PyCFunction)BaseRowProxy_values, METH_NOARGS,
-     "Return the values represented by this BaseRowProxy as a list."},
-    {"__reduce__",  (PyCFunction)BaseRowProxy_reduce, METH_NOARGS,
+static PyMethodDef BaseRow_methods[] = {
+    {"_values_impl", (PyCFunction)BaseRow_values_impl, METH_NOARGS,
+     "Return the values represented by this BaseRow as a list."},
+    {"__reduce__",  (PyCFunction)BaseRow_reduce, METH_NOARGS,
      "Pickle support method."},
+    {"_get_by_key_impl", (PyCFunction)BaseRow_subscript, METH_O,
+    "implement mapping-like getitem as well as sequence getitem"},
+    {"_get_by_key_impl_mapping", (PyCFunction)BaseRow_subscript_mapping, METH_O,
+    "implement mapping-like getitem as well as sequence getitem"},
     {NULL}  /* Sentinel */
 };
 
-static PySequenceMethods BaseRowProxy_as_sequence = {
-    (lenfunc)BaseRowProxy_length,   /* sq_length */
+static PySequenceMethods BaseRow_as_sequence = {
+    (lenfunc)BaseRow_length,   /* sq_length */
     0,                              /* sq_concat */
     0,                              /* sq_repeat */
-    (ssizeargfunc)BaseRowProxy_getitem,          /* sq_item */
+    (ssizeargfunc)BaseRow_getitem,  /* sq_item */
     0,                              /* sq_slice */
     0,                              /* sq_ass_item */
     0,                              /* sq_ass_slice */
@@ -621,56 +599,235 @@ static PySequenceMethods BaseRowProxy_as_sequence = {
     0,                              /* sq_inplace_repeat */
 };
 
-static PyMappingMethods BaseRowProxy_as_mapping = {
-    (lenfunc)BaseRowProxy_length,       /* mp_length */
-    (binaryfunc)BaseRowProxy_subscript, /* mp_subscript */
+static PyMappingMethods BaseRow_as_mapping = {
+    (lenfunc)BaseRow_length,       /* mp_length */
+    (binaryfunc)BaseRow_subscript_mapping, /* mp_subscript */
     0                                   /* mp_ass_subscript */
 };
 
-static PyTypeObject BaseRowProxyType = {
+static PyTypeObject BaseRowType = {
     PyVarObject_HEAD_INIT(NULL, 0)
-    "sqlalchemy.cresultproxy.BaseRowProxy",          /* tp_name */
-    sizeof(BaseRowProxy),               /* tp_basicsize */
+    "sqlalchemy.cresultproxy.BaseRow",          /* tp_name */
+    sizeof(BaseRow),               /* tp_basicsize */
     0,                                  /* tp_itemsize */
-    (destructor)BaseRowProxy_dealloc,   /* tp_dealloc */
+    (destructor)BaseRow_dealloc,   /* tp_dealloc */
     0,                                  /* tp_print */
     0,                                  /* tp_getattr */
     0,                                  /* tp_setattr */
     0,                                  /* tp_compare */
     0,                                  /* tp_repr */
     0,                                  /* tp_as_number */
-    &BaseRowProxy_as_sequence,          /* tp_as_sequence */
-    &BaseRowProxy_as_mapping,           /* tp_as_mapping */
-    0,                                  /* tp_hash */
+    &BaseRow_as_sequence,          /* tp_as_sequence */
+    &BaseRow_as_mapping,           /* tp_as_mapping */
+    (hashfunc)BaseRow_hash,             /* tp_hash */
     0,                                  /* tp_call */
     0,                                  /* tp_str */
-    (getattrofunc)BaseRowProxy_getattro,/* tp_getattro */
+    (getattrofunc)BaseRow_getattro,/* tp_getattro */
     0,                                  /* tp_setattro */
     0,                                  /* tp_as_buffer */
     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,               /* tp_flags */
-    "BaseRowProxy is a abstract base class for RowProxy",   /* tp_doc */
+    "BaseRow is a abstract base class for Row",   /* tp_doc */
     0,                                  /* tp_traverse */
     0,                                  /* tp_clear */
     0,                                  /* tp_richcompare */
     0,                                  /* tp_weaklistoffset */
-    (getiterfunc)BaseRowProxy_iter,     /* tp_iter */
+    (getiterfunc)BaseRow_iter,     /* tp_iter */
     0,                                  /* tp_iternext */
-    BaseRowProxy_methods,               /* tp_methods */
+    BaseRow_methods,               /* tp_methods */
     0,                                  /* tp_members */
-    BaseRowProxy_getseters,             /* tp_getset */
+    BaseRow_getseters,             /* tp_getset */
     0,                                  /* tp_base */
     0,                                  /* tp_dict */
     0,                                  /* tp_descr_get */
     0,                                  /* tp_descr_set */
     0,                                  /* tp_dictoffset */
-    (initproc)BaseRowProxy_init,        /* tp_init */
+    (initproc)BaseRow_init,        /* tp_init */
     0,                                  /* tp_alloc */
     0                                   /* tp_new */
 };
 
+
+
+/* _tuplegetter function ************************************************/
+/*
+retrieves segments of a row as tuples.
+
+mostly like operator.itemgetter but calls a fixed method instead,
+returns tuple every time.
+
+*/
+
+typedef struct {
+    PyObject_HEAD
+    Py_ssize_t nitems;
+    PyObject *item;
+} tuplegetterobject;
+
+static PyTypeObject tuplegetter_type;
+
+static PyObject *
+tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    tuplegetterobject *tg;
+    PyObject *item;
+    Py_ssize_t nitems;
+
+    if (!_PyArg_NoKeywords("tuplegetter", kwds))
+        return NULL;
+
+    nitems = PyTuple_GET_SIZE(args);
+    item = args;
+
+    tg = PyObject_GC_New(tuplegetterobject, &tuplegetter_type);
+    if (tg == NULL)
+        return NULL;
+
+    Py_INCREF(item);
+    tg->item = item;
+    tg->nitems = nitems;
+    PyObject_GC_Track(tg);
+    return (PyObject *)tg;
+}
+
+static void
+tuplegetter_dealloc(tuplegetterobject *tg)
+{
+    PyObject_GC_UnTrack(tg);
+    Py_XDECREF(tg->item);
+    PyObject_GC_Del(tg);
+}
+
+static int
+tuplegetter_traverse(tuplegetterobject *tg, visitproc visit, void *arg)
+{
+    Py_VISIT(tg->item);
+    return 0;
+}
+
+static PyObject *
+tuplegetter_call(tuplegetterobject *tg, PyObject *args, PyObject *kw)
+{
+    PyObject *row, *result;
+    Py_ssize_t i, nitems=tg->nitems;
+
+    assert(PyTuple_CheckExact(args));
+
+    // this is normally a BaseRow subclass but we are not doing
+    // strict checking at the moment
+    row = PyTuple_GET_ITEM(args, 0);
+
+    assert(PyTuple_Check(tg->item));
+    assert(PyTuple_GET_SIZE(tg->item) == nitems);
+
+    result = PyTuple_New(nitems);
+    if (result == NULL)
+        return NULL;
+
+    for (i=0 ; i < nitems ; i++) {
+        PyObject *item, *val;
+        item = PyTuple_GET_ITEM(tg->item, i);
+
+        val = PyObject_CallMethod(row, "_get_by_key_impl_mapping", "O", item);
+
+        // generic itemgetter version; if BaseRow __getitem__ is implemented
+        // in C directly then we can use that
+        //val = PyObject_GetItem(row, item);
+        if (val == NULL) {
+            Py_DECREF(result);
+            return NULL;
+        }
+        PyTuple_SET_ITEM(result, i, val);
+    }
+    return result;
+}
+
+static PyObject *
+tuplegetter_repr(tuplegetterobject *tg)
+{
+    PyObject *repr;
+    const char *reprfmt;
+
+    int status = Py_ReprEnter((PyObject *)tg);
+    if (status != 0) {
+        if (status < 0)
+            return NULL;
+        return PyUnicode_FromFormat("%s(...)", Py_TYPE(tg)->tp_name);
+    }
+
+    reprfmt = tg->nitems == 1 ? "%s(%R)" : "%s%R";
+    repr = PyUnicode_FromFormat(reprfmt, Py_TYPE(tg)->tp_name, tg->item);
+    Py_ReprLeave((PyObject *)tg);
+    return repr;
+}
+
+static PyObject *
+tuplegetter_reduce(tuplegetterobject *tg, PyObject *Py_UNUSED(ignored))
+{
+    return PyTuple_Pack(2, Py_TYPE(tg), tg->item);
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling");
+
+static PyMethodDef tuplegetter_methods[] = {
+    {"__reduce__", (PyCFunction)tuplegetter_reduce, METH_NOARGS,
+     reduce_doc},
+    {NULL}
+};
+
+PyDoc_STRVAR(tuplegetter_doc,
+"tuplegetter(item, ...) --> tuplegetter object\n\
+\n\
+Return a callable object that fetches the given item(s) from its operand\n\
+and returns them as a tuple.\n");
+
+static PyTypeObject tuplegetter_type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "sqlalchemy.engine.util..tuplegetter",  /* tp_name */
+    sizeof(tuplegetterobject),           /* tp_basicsize */
+    0,                                  /* tp_itemsize */
+    /* methods */
+    (destructor)tuplegetter_dealloc,     /* tp_dealloc */
+    0,                                  /* tp_vectorcall_offset */
+    0,                                  /* tp_getattr */
+    0,                                  /* tp_setattr */
+    0,                                  /* tp_as_async */
+    (reprfunc)tuplegetter_repr,          /* tp_repr */
+    0,                                  /* tp_as_number */
+    0,                                  /* tp_as_sequence */
+    0,                                  /* tp_as_mapping */
+    0,                                  /* tp_hash */
+    (ternaryfunc)tuplegetter_call,       /* tp_call */
+    0,                                  /* tp_str */
+    PyObject_GenericGetAttr,            /* tp_getattro */
+    0,                                  /* tp_setattro */
+    0,                                  /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,            /* tp_flags */
+    tuplegetter_doc,                     /* tp_doc */
+    (traverseproc)tuplegetter_traverse,          /* tp_traverse */
+    0,                                  /* tp_clear */
+    0,                                  /* tp_richcompare */
+    0,                                  /* tp_weaklistoffset */
+    0,                                  /* tp_iter */
+    0,                                  /* tp_iternext */
+    tuplegetter_methods,                 /* tp_methods */
+    0,                                  /* tp_members */
+    0,                                  /* tp_getset */
+    0,                                  /* tp_base */
+    0,                                  /* tp_dict */
+    0,                                  /* tp_descr_get */
+    0,                                  /* tp_descr_set */
+    0,                                  /* tp_dictoffset */
+    0,                                  /* tp_init */
+    0,                                  /* tp_alloc */
+    tuplegetter_new,                     /* tp_new */
+    0,                                  /* tp_free */
+};
+
+
+
 static PyMethodDef module_methods[] = {
     {"safe_rowproxy_reconstructor", safe_rowproxy_reconstructor, METH_VARARGS,
-     "reconstruct a RowProxy instance from its pickled form."},
+     "reconstruct a Row instance from its pickled form."},
     {NULL, NULL, 0, NULL}        /* Sentinel */
 };
 
@@ -706,10 +863,13 @@ initcresultproxy(void)
 {
     PyObject *m;
 
-    BaseRowProxyType.tp_new = PyType_GenericNew;
-    if (PyType_Ready(&BaseRowProxyType) < 0)
+    BaseRowType.tp_new = PyType_GenericNew;
+    if (PyType_Ready(&BaseRowType) < 0)
         INITERROR;
 
+    if (PyType_Ready(&tuplegetter_type) < 0)
+        return NULL;
+
 #if PY_MAJOR_VERSION >= 3
     m = PyModule_Create(&module_def);
 #else
@@ -718,8 +878,11 @@ initcresultproxy(void)
     if (m == NULL)
         INITERROR;
 
-    Py_INCREF(&BaseRowProxyType);
-    PyModule_AddObject(m, "BaseRowProxy", (PyObject *)&BaseRowProxyType);
+    Py_INCREF(&BaseRowType);
+    PyModule_AddObject(m, "BaseRow", (PyObject *)&BaseRowType);
+
+    Py_INCREF(&tuplegetter_type);
+    PyModule_AddObject(m, "tuplegetter", (PyObject *)&tuplegetter_type);
 
 #if PY_MAJOR_VERSION >= 3
     return m;
index 13012a4f20954845aaf66675467e1aa275045b37..73484aea1981603fa96eb6559965ab71ac63b495 100644 (file)
@@ -2309,7 +2309,7 @@ class MySQLDialect(default.DefaultDialect):
         """Proxy result rows to smooth over MySQL-Python driver
         inconsistencies."""
 
-        return [_DecodingRowProxy(row, charset) for row in rp.fetchall()]
+        return [_DecodingRow(row, charset) for row in rp.fetchall()]
 
     def _compat_fetchone(self, rp, charset=None):
         """Proxy a result row to smooth over MySQL-Python driver
@@ -2317,7 +2317,7 @@ class MySQLDialect(default.DefaultDialect):
 
         row = rp.fetchone()
         if row:
-            return _DecodingRowProxy(row, charset)
+            return _DecodingRow(row, charset)
         else:
             return None
 
@@ -2327,7 +2327,7 @@ class MySQLDialect(default.DefaultDialect):
 
         row = rp.first()
         if row:
-            return _DecodingRowProxy(row, charset)
+            return _DecodingRow(row, charset)
         else:
             return None
 
@@ -2916,7 +2916,7 @@ class MySQLDialect(default.DefaultDialect):
         return rows
 
 
-class _DecodingRowProxy(object):
+class _DecodingRow(object):
     """Return unicode-decoded values based on type inspection.
 
     Smooth over data type issues (esp. with alpha driver versions) and
index 7be0e06dc384507dd157b9bc0ccb37c75573c2c6..defb64ec05f9e81ccb28c975e17a004392a8a8d2 100644 (file)
@@ -546,10 +546,10 @@ names are still addressable*::
     1
 
 Therefore, the workaround applied by SQLAlchemy only impacts
-:meth:`.ResultProxy.keys` and :meth:`.RowProxy.keys()` in the public API. In
+:meth:`.ResultProxy.keys` and :meth:`.Row.keys()` in the public API. In
 the very specific case where an application is forced to use column names that
 contain dots, and the functionality of :meth:`.ResultProxy.keys` and
-:meth:`.RowProxy.keys()` is required to return these dotted names unmodified,
+:meth:`.Row.keys()` is required to return these dotted names unmodified,
 the ``sqlite_raw_colnames`` execution option may be provided, either on a
 per-:class:`.Connection` basis::
 
index 77db0a449fae19aad5b5ddb7c3a593b8918a3ac2..77f9a1648cead4a85547b1868fd218ba43867f89 100644 (file)
@@ -32,13 +32,13 @@ from .interfaces import ExceptionContext  # noqa
 from .interfaces import ExecutionContext  # noqa
 from .interfaces import TypeCompiler  # noqa
 from .mock import create_mock_engine
-from .result import BaseRowProxy  # noqa
+from .result import BaseRow  # noqa
 from .result import BufferedColumnResultProxy  # noqa
 from .result import BufferedColumnRow  # noqa
 from .result import BufferedRowResultProxy  # noqa
 from .result import FullyBufferedResultProxy  # noqa
 from .result import ResultProxy  # noqa
-from .result import RowProxy  # noqa
+from .result import Row  # noqa
 from .util import connection_memoize  # noqa
 from ..sql import ddl  # noqa
 
index 480d086ff3e944a2a3efbc8d066b7d6ea2bcb8a7..90c884f943c6bd993a7e6ccff42d98384f922cee 100644 (file)
@@ -6,7 +6,7 @@
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
 
 """Define result set constructs including :class:`.ResultProxy`
-and :class:`.RowProxy."""
+and :class:`.Row."""
 
 
 import collections
@@ -17,8 +17,15 @@ from .. import util
 from ..sql import expression
 from ..sql import sqltypes
 from ..sql import util as sql_util
+from ..sql.compiler import RM_NAME
+from ..sql.compiler import RM_OBJECTS
+from ..sql.compiler import RM_RENDERED_NAME
+from ..sql.compiler import RM_TYPE
+from ..util.compat import collections_abc
 
 
+_UNPICKLED = util.symbol("unpickled")
+
 # This reconstructor is necessary so that pickles with the C extension or
 # without use the same Binary format.
 try:
@@ -43,21 +50,27 @@ except ImportError:
 
 
 try:
-    from sqlalchemy.cresultproxy import BaseRowProxy
+    from sqlalchemy.cresultproxy import BaseRow
+    from sqlalchemy.cresultproxy import tuplegetter as _tuplegetter
 
-    _baserowproxy_usecext = True
+    _baserow_usecext = True
 except ImportError:
-    _baserowproxy_usecext = False
+    _baserow_usecext = False
 
-    class BaseRowProxy(object):
-        __slots__ = ("_parent", "_row", "_processors", "_keymap")
+    class BaseRow(object):
+        __slots__ = ("_parent", "_data", "_keymap")
 
-        def __init__(self, parent, row, processors, keymap):
-            """RowProxy objects are constructed by ResultProxy objects."""
+        def __init__(self, parent, processors, keymap, data):
+            """Row objects are constructed by ResultProxy objects."""
 
             self._parent = parent
-            self._row = row
-            self._processors = processors
+
+            self._data = tuple(
+                [
+                    proc(value) if proc else value
+                    for proc, value in zip(processors, data)
+                ]
+            )
             self._keymap = keymap
 
         def __reduce__(self):
@@ -66,63 +79,70 @@ except ImportError:
                 (self.__class__, self.__getstate__()),
             )
 
-        def values(self):
-            """Return the values represented by this RowProxy as a list."""
+        def _values_impl(self):
             return list(self)
 
         def __iter__(self):
-            for processor, value in zip(self._processors, self._row):
-                if processor is None:
-                    yield value
-                else:
-                    yield processor(value)
+            return iter(self._data)
 
         def __len__(self):
-            return len(self._row)
+            return len(self._data)
+
+        def __hash__(self):
+            return hash(self._data)
 
-        def __getitem__(self, key):
+        def _get_by_key_impl(self, key):
             try:
-                processor, obj, index = self._keymap[key]
+                rec = self._keymap[key]
             except KeyError:
-                processor, obj, index = self._parent._key_fallback(key)
+                rec = self._parent._key_fallback(key)
             except TypeError:
+                # the non-C version detects a slice using TypeError.
+                # this is pretty inefficient for the slice use case
+                # but is more efficient for the integer use case since we
+                # don't have to check it up front.
                 if isinstance(key, slice):
-                    l = []
-                    for processor, value in zip(
-                        self._processors[key], self._row[key]
-                    ):
-                        if processor is None:
-                            l.append(value)
-                        else:
-                            l.append(processor(value))
-                    return tuple(l)
+                    return tuple(self._data[key])
                 else:
                     raise
-            if index is None:
+            if rec[MD_INDEX] is None:
                 raise exc.InvalidRequestError(
                     "Ambiguous column name '%s' in "
-                    "result set column descriptions" % obj
+                    "result set column descriptions" % rec[MD_LOOKUP_KEY]
                 )
-            if processor is not None:
-                return processor(self._row[index])
-            else:
-                return self._row[index]
+
+            return self._data[rec[MD_INDEX]]
+
+        def _get_by_key_impl_mapping(self, key):
+            # the C code has two different methods so that we can distinguish
+            # between tuple-like keys (integers, slices) and mapping-like keys
+            # (strings, objects)
+            return self._get_by_key_impl(key)
 
         def __getattr__(self, name):
             try:
-                return self[name]
+                return self._get_by_key_impl_mapping(name)
             except KeyError as e:
                 raise AttributeError(e.args[0])
 
 
-class RowProxy(BaseRowProxy):
-    """Proxy values from a single cursor row.
+class Row(BaseRow, collections_abc.Sequence):
+    """Represent a single result row.
+
+    The :class:`.Row` object seeks to act mostly like a Python named
+    tuple, but also provides for mapping-oriented access via the
+    :attr:`.Row._mapping` attribute.
+
+    .. seealso::
+
+        :ref:`coretutorial_selecting` - includes examples of selecting
+        rows from SELECT statements.
+
+    .. versionchanged 1.4::
+
+        Renamed ``RowProxy`` to :class:`.Row`.  :class:`.Row` is no longer a
+        "proxy" object in that it contains the final form of data within it.
 
-    Mostly follows "ordered dictionary" behavior, mapping result
-    values to the string-based column name, the integer position of
-    the result in the row, as well as Column instances which can be
-    mapped to the original Columns that produced this result set (for
-    results that correspond to constructed SQL expressions).
     """
 
     __slots__ = ()
@@ -131,23 +151,22 @@ class RowProxy(BaseRowProxy):
         return self._parent._has_key(key)
 
     def __getstate__(self):
-        return {"_parent": self._parent, "_row": tuple(self)}
+        return {"_parent": self._parent, "_data": self._data}
 
     def __setstate__(self, state):
         self._parent = parent = state["_parent"]
-        self._row = state["_row"]
-        self._processors = parent._processors
+        self._data = state["_data"]
         self._keymap = parent._keymap
 
-    __hash__ = None
-
     def _op(self, other, op):
         return (
             op(tuple(self), tuple(other))
-            if isinstance(other, RowProxy)
+            if isinstance(other, Row)
             else op(tuple(self), other)
         )
 
+    __hash__ = BaseRow.__hash__
+
     def __lt__(self, other):
         return self._op(other, operator.lt)
 
@@ -170,19 +189,22 @@ class RowProxy(BaseRowProxy):
         return repr(sql_util._repr_row(self))
 
     def has_key(self, key):
-        """Return True if this RowProxy contains the given key."""
+        """Return True if this Row contains the given key."""
 
         return self._parent._has_key(key)
 
+    def __getitem__(self, key):
+        return self._get_by_key_impl(key)
+
     def items(self):
         """Return a list of tuples, each tuple containing a key/value pair."""
         # TODO: no coverage here
         return [(key, self[key]) for key in self.keys()]
 
     def keys(self):
-        """Return the list of keys as strings represented by this RowProxy."""
+        """Return the list of keys as strings represented by this Row."""
 
-        return self._parent.keys
+        return [k for k in self._parent.keys if k is not None]
 
     def iterkeys(self):
         return iter(self._parent.keys)
@@ -190,13 +212,23 @@ class RowProxy(BaseRowProxy):
     def itervalues(self):
         return iter(self)
 
+    def values(self):
+        """Return the values represented by this Row as a list."""
+        return self._values_impl()
 
-try:
-    # Register RowProxy with Sequence,
-    # so sequence protocol is implemented
-    util.collections_abc.Sequence.register(RowProxy)
-except ImportError:
-    pass
+
+BaseRowProxy = BaseRow
+RowProxy = Row
+
+
+# metadata entry tuple indexes.
+# using raw tuple is faster than namedtuple.
+MD_INDEX = 0  # integer index in cursor.description
+MD_OBJECTS = 1  # other string keys and ColumnElement obj that can match
+MD_LOOKUP_KEY = 2  # string key we usually expect for key-based lookup
+MD_RENDERED_NAME = 3  # name that is usually in cursor.description
+MD_PROCESSOR = 4  # callable to process a result value into a row
+MD_UNTRANSLATED = 5  # raw name from cursor.description
 
 
 class ResultMetaData(object):
@@ -209,7 +241,6 @@ class ResultMetaData(object):
         "matched_on_name",
         "_processors",
         "keys",
-        "_orig_processors",
     )
 
     def __init__(self, parent, cursor_description):
@@ -217,12 +248,13 @@ class ResultMetaData(object):
         dialect = context.dialect
         self.case_sensitive = dialect.case_sensitive
         self.matched_on_name = False
-        self._orig_processors = None
 
         if context.result_column_struct:
-            result_columns, cols_are_ordered, textual_ordered = (
-                context.result_column_struct
-            )
+            (
+                result_columns,
+                cols_are_ordered,
+                textual_ordered,
+            ) = context.result_column_struct
             num_ctx_cols = len(result_columns)
         else:
             result_columns = (
@@ -241,9 +273,9 @@ class ResultMetaData(object):
         )
 
         self._keymap = {}
-        if not _baserowproxy_usecext:
+        if not _baserow_usecext:
             # keymap indexes by integer index: this is only used
-            # in the pure Python BaseRowProxy.__getitem__
+            # in the pure Python BaseRow.__getitem__
             # implementation to avoid an expensive
             # isinstance(key, util.int_types) in the most common
             # case path
@@ -251,19 +283,29 @@ class ResultMetaData(object):
             len_raw = len(raw)
 
             self._keymap.update(
-                [(elem[0], (elem[3], elem[4], elem[0])) for elem in raw]
+                [
+                    (metadata_entry[MD_INDEX], metadata_entry)
+                    for metadata_entry in raw
+                ]
                 + [
-                    (elem[0] - len_raw, (elem[3], elem[4], elem[0]))
-                    for elem in raw
+                    (metadata_entry[MD_INDEX] - len_raw, metadata_entry)
+                    for metadata_entry in raw
                 ]
             )
 
         # processors in key order for certain per-row
         # views like __iter__ and slices
-        self._processors = [elem[3] for elem in raw]
+        self._processors = [
+            metadata_entry[MD_PROCESSOR] for metadata_entry in raw
+        ]
 
         # keymap by primary string...
-        by_key = dict([(elem[2], (elem[3], elem[4], elem[0])) for elem in raw])
+        by_key = dict(
+            [
+                (metadata_entry[MD_LOOKUP_KEY], metadata_entry)
+                for metadata_entry in raw
+            ]
+        )
 
         # for compiled SQL constructs, copy additional lookup keys into
         # the key lookup map, such as Column objects, labels,
@@ -276,13 +318,13 @@ class ResultMetaData(object):
             # ambiguous column exception when accessed.
             if len(by_key) != num_ctx_cols:
                 seen = set()
-                for rec in raw:
-                    key = rec[1]
+                for metadata_entry in raw:
+                    key = metadata_entry[MD_RENDERED_NAME]
                     if key in seen:
                         # this is an "ambiguous" element, replacing
                         # the full record in the map
                         key = key.lower() if not self.case_sensitive else key
-                        by_key[key] = (None, key, None)
+                        by_key[key] = (None, (), key)
                     seen.add(key)
 
                 # copy secondary elements from compiled columns
@@ -290,10 +332,10 @@ class ResultMetaData(object):
                 # element
                 self._keymap.update(
                     [
-                        (obj_elem, by_key[elem[2]])
-                        for elem in raw
-                        if elem[4]
-                        for obj_elem in elem[4]
+                        (obj_elem, by_key[metadata_entry[MD_LOOKUP_KEY]])
+                        for metadata_entry in raw
+                        if metadata_entry[MD_OBJECTS]
+                        for obj_elem in metadata_entry[MD_OBJECTS]
                     ]
                 )
 
@@ -304,9 +346,9 @@ class ResultMetaData(object):
                 if not self.matched_on_name:
                     self._keymap.update(
                         [
-                            (elem[4][0], (elem[3], elem[4], elem[0]))
-                            for elem in raw
-                            if elem[4]
+                            (metadata_entry[MD_OBJECTS][0], metadata_entry)
+                            for metadata_entry in raw
+                            if metadata_entry[MD_OBJECTS]
                         ]
                     )
             else:
@@ -314,10 +356,10 @@ class ResultMetaData(object):
                 # columns into self._keymap
                 self._keymap.update(
                     [
-                        (obj_elem, (elem[3], elem[4], elem[0]))
-                        for elem in raw
-                        if elem[4]
-                        for obj_elem in elem[4]
+                        (obj_elem, metadata_entry)
+                        for metadata_entry in raw
+                        if metadata_entry[MD_OBJECTS]
+                        for obj_elem in metadata_entry[MD_OBJECTS]
                     ]
                 )
 
@@ -328,7 +370,14 @@ class ResultMetaData(object):
         # update keymap with "translated" names (sqlite-only thing)
         if not num_ctx_cols and context._translate_colname:
             self._keymap.update(
-                [(elem[5], self._keymap[elem[2]]) for elem in raw if elem[5]]
+                [
+                    (
+                        metadata_entry[MD_UNTRANSLATED],
+                        self._keymap[metadata_entry[MD_LOOKUP_KEY]],
+                    )
+                    for metadata_entry in raw
+                    if metadata_entry[MD_UNTRANSLATED]
+                ]
             )
 
     def _merge_cursor_description(
@@ -407,15 +456,19 @@ class ResultMetaData(object):
             return [
                 (
                     idx,
-                    key,
-                    name.lower() if not case_sensitive else name,
+                    rmap_entry[RM_OBJECTS],
+                    rmap_entry[RM_NAME].lower()
+                    if not case_sensitive
+                    else rmap_entry[RM_NAME],
+                    rmap_entry[RM_RENDERED_NAME],
                     context.get_result_processor(
-                        type_, key, cursor_description[idx][1]
+                        rmap_entry[RM_TYPE],
+                        rmap_entry[RM_RENDERED_NAME],
+                        cursor_description[idx][1],
                     ),
-                    obj,
                     None,
                 )
-                for idx, (key, name, obj, type_) in enumerate(result_columns)
+                for idx, rmap_entry in enumerate(result_columns)
             ]
         else:
             # name-based or text-positional cases, where we need
@@ -440,12 +493,12 @@ class ResultMetaData(object):
             return [
                 (
                     idx,
+                    obj,
                     colname,
                     colname,
                     context.get_result_processor(
                         mapped_type, colname, coltype
                     ),
-                    obj,
                     untranslated,
                 )
                 for (
@@ -520,8 +573,8 @@ class ResultMetaData(object):
         ) in self._colnames_from_description(context, cursor_description):
             if idx < num_ctx_cols:
                 ctx_rec = result_columns[idx]
-                obj = ctx_rec[2]
-                mapped_type = ctx_rec[3]
+                obj = ctx_rec[RM_OBJECTS]
+                mapped_type = ctx_rec[RM_TYPE]
                 if obj[0] in seen:
                     raise exc.InvalidRequestError(
                         "Duplicate column expression requested "
@@ -537,7 +590,9 @@ class ResultMetaData(object):
     def _merge_cols_by_name(self, context, cursor_description, result_columns):
         dialect = context.dialect
         case_sensitive = dialect.case_sensitive
-        result_map = self._create_result_map(result_columns, case_sensitive)
+        match_map = self._create_description_match_map(
+            result_columns, case_sensitive
+        )
 
         self.matched_on_name = True
         for (
@@ -547,7 +602,7 @@ class ResultMetaData(object):
             coltype,
         ) in self._colnames_from_description(context, cursor_description):
             try:
-                ctx_rec = result_map[colname]
+                ctx_rec = match_map[colname]
             except KeyError:
                 mapped_type = sqltypes.NULLTYPE
                 obj = None
@@ -566,10 +621,20 @@ class ResultMetaData(object):
             yield idx, colname, sqltypes.NULLTYPE, coltype, None, untranslated
 
     @classmethod
-    def _create_result_map(cls, result_columns, case_sensitive=True):
+    def _create_description_match_map(
+        cls, result_columns, case_sensitive=True
+    ):
+        """when matching cursor.description to a set of names that are present
+        in a Compiled object, as is the case with TextualSelect, get all the
+        names we expect might match those in cursor.description.
+        """
+
         d = {}
         for elem in result_columns:
-            key, rec = elem[0], elem[1:]
+            key, rec = (
+                elem[RM_RENDERED_NAME],
+                (elem[RM_NAME], elem[RM_OBJECTS], elem[RM_TYPE]),
+            )
             if not case_sensitive:
                 key = key.lower()
             if key in d:
@@ -581,17 +646,16 @@ class ResultMetaData(object):
                 d[key] = e_name, e_obj + rec[1], e_type
             else:
                 d[key] = rec
+
         return d
 
     def _key_fallback(self, key, raiseerr=True):
         map_ = self._keymap
         result = None
+        # lowercase col support will be deprecated, at the
+        # create_engine() / dialect level
         if isinstance(key, util.string_types):
             result = map_.get(key if self.case_sensitive else key.lower())
-        # fallback for targeting a ColumnElement to a textual expression
-        # this is a rare use case which only occurs when matching text()
-        # or colummn('name') constructs to ColumnElements, or after a
-        # pickle/unpickle roundtrip
         elif isinstance(key, expression.ColumnElement):
             if (
                 key._label
@@ -610,12 +674,16 @@ class ResultMetaData(object):
                 result = map_[
                     key.name if self.case_sensitive else key.name.lower()
                 ]
+
             # search extra hard to make sure this
             # isn't a column/label name overlap.
             # this check isn't currently available if the row
             # was unpickled.
-            if result is not None and result[1] is not None:
-                for obj in result[1]:
+            if result is not None and result[MD_OBJECTS] not in (
+                None,
+                _UNPICKLED,
+            ):
+                for obj in result[MD_OBJECTS]:
                     if key._compare_name_for_result(obj):
                         break
                 else:
@@ -639,13 +707,14 @@ class ResultMetaData(object):
             return self._key_fallback(key, False) is not None
 
     def _getter(self, key, raiseerr=True):
-        if key in self._keymap:
-            processor, obj, index = self._keymap[key]
-        else:
-            ret = self._key_fallback(key, raiseerr)
-            if ret is None:
+        try:
+            rec = self._keymap[key]
+        except KeyError:
+            rec = self._key_fallback(key, raiseerr)
+            if rec is None:
                 return None
-            processor, obj, index = ret
+
+        index, obj = rec[0:2]
 
         if index is None:
             raise exc.InvalidRequestError(
@@ -653,29 +722,66 @@ class ResultMetaData(object):
                 "result set column descriptions" % obj
             )
 
-        return operator.itemgetter(index)
+        return operator.methodcaller("_get_by_key_impl", index)
+
+    def _tuple_getter(self, keys, raiseerr=True):
+        """Given a list of keys, return a callable that will deliver a tuple.
+
+        This is strictly used by the ORM and the keys are Column objects.
+        However, this might be some nice-ish feature if we could find a very
+        clean way of presenting it.
+
+        note that in the new world of "row._mapping", this is a mapping-getter.
+        maybe the name should indicate that somehow.
+
+
+        """
+        indexes = []
+        for key in keys:
+            try:
+                rec = self._keymap[key]
+            except KeyError:
+                rec = self._key_fallback(key, raiseerr)
+                if rec is None:
+                    return None
+
+            index, obj = rec[0:2]
+
+            if index is None:
+                raise exc.InvalidRequestError(
+                    "Ambiguous column name '%s' in "
+                    "result set column descriptions" % obj
+                )
+            indexes.append(index)
+
+        if _baserow_usecext:
+            return _tuplegetter(*indexes)
+        else:
+            return self._pure_py_tuplegetter(*indexes)
+
+    def _pure_py_tuplegetter(self, *indexes):
+        getters = [
+            operator.methodcaller("_get_by_key_impl", index)
+            for index in indexes
+        ]
+        return lambda rec: tuple(getter(rec) for getter in getters)
 
     def __getstate__(self):
         return {
-            "_pickled_keymap": dict(
-                (key, index)
-                for key, (processor, obj, index) in self._keymap.items()
+            "_keymap": {
+                key: (rec[MD_INDEX], _UNPICKLED, key)
+                for key, rec in self._keymap.items()
                 if isinstance(key, util.string_types + util.int_types)
-            ),
+            },
             "keys": self.keys,
             "case_sensitive": self.case_sensitive,
             "matched_on_name": self.matched_on_name,
         }
 
     def __setstate__(self, state):
-        # the row has been processed at pickling time so we don't need any
-        # processor anymore
         self._processors = [None for _ in range(len(state["keys"]))]
-        self._keymap = keymap = {}
-        for key, index in state["_pickled_keymap"].items():
-            # not preserving "obj" here, unfortunately our
-            # proxy comparison fails with the unpickle
-            keymap[key] = (None, None, index)
+        self._keymap = state["_keymap"]
+
         self.keys = state["keys"]
         self.case_sensitive = state["case_sensitive"]
         self.matched_on_name = state["matched_on_name"]
@@ -702,7 +808,7 @@ class ResultProxy(object):
 
     """
 
-    _process_row = RowProxy
+    _process_row = Row
     out_parameters = None
     _autoclose_connection = False
     _metadata = None
@@ -727,6 +833,14 @@ class ResultProxy(object):
         else:
             return getter(key, raiseerr)
 
+    def _tuple_getter(self, key, raiseerr=True):
+        try:
+            getter = self._metadata._tuple_getter
+        except AttributeError:
+            return self._non_result(None)
+        else:
+            return getter(key, raiseerr)
+
     def _has_key(self, key):
         try:
             has_key = self._metadata._has_key
@@ -745,6 +859,9 @@ class ResultProxy(object):
                 if self.context.compiled._cached_metadata:
                     self._metadata = self.context.compiled._cached_metadata
                 else:
+                    # TODO: what we hope to do here is have "Legacy" be
+                    # the default in 1.4 but a flag (somewhere?) will have it
+                    # use non-legacy. ORM should be able to use non-legacy
                     self._metadata = (
                         self.context.compiled._cached_metadata
                     ) = ResultMetaData(self, cursor_description)
@@ -1054,7 +1171,7 @@ class ResultProxy(object):
         """Return the values of default columns that were fetched using
         the :meth:`.ValuesBase.return_defaults` feature.
 
-        The value is an instance of :class:`.RowProxy`, or ``None``
+        The value is an instance of :class:`.Row`, or ``None``
         if :meth:`.ValuesBase.return_defaults` was not used or if the
         backend does not support RETURNING.
 
@@ -1178,16 +1295,17 @@ class ResultProxy(object):
         metadata = self._metadata
         keymap = metadata._keymap
         processors = metadata._processors
+
         if self._echo:
             log = self.context.engine.logger.debug
             l = []
             for row in rows:
                 log("Row %r", sql_util._repr_row(row))
-                l.append(process_row(metadata, row, processors, keymap))
+                l.append(process_row(metadata, processors, keymap, row))
             return l
         else:
             return [
-                process_row(metadata, row, processors, keymap) for row in rows
+                process_row(metadata, processors, keymap, row) for row in rows
             ]
 
     def fetchall(self):
@@ -1456,76 +1574,16 @@ class FullyBufferedResultProxy(ResultProxy):
         return ret
 
 
-class BufferedColumnRow(RowProxy):
-    def __init__(self, parent, row, processors, keymap):
-        # preprocess row
-        row = list(row)
-        # this is a tad faster than using enumerate
-        index = 0
-        for processor in parent._orig_processors:
-            if processor is not None:
-                row[index] = processor(row[index])
-            index += 1
-        row = tuple(row)
-        super(BufferedColumnRow, self).__init__(
-            parent, row, processors, keymap
-        )
+class BufferedColumnRow(Row):
+    """Row is now BufferedColumn in all cases"""
 
 
 class BufferedColumnResultProxy(ResultProxy):
     """A ResultProxy with column buffering behavior.
 
-    ``ResultProxy`` that loads all columns into memory each time
-    fetchone() is called.  If fetchmany() or fetchall() are called,
-    the full grid of results is fetched.  This is to operate with
-    databases where result rows contain "live" results that fall out
-    of scope unless explicitly fetched.
-
-    .. versionchanged:: 1.2  This :class:`.ResultProxy` is not used by
-       any SQLAlchemy-included dialects.
+    .. versionchanged:: 1.4   This is now the default behavior of the Row
+       and this class does not change behavior in any way.
 
     """
 
     _process_row = BufferedColumnRow
-
-    def _init_metadata(self):
-        super(BufferedColumnResultProxy, self)._init_metadata()
-
-        metadata = self._metadata
-
-        # don't double-replace the processors, in the case
-        # of a cached ResultMetaData
-        if metadata._orig_processors is None:
-            # orig_processors will be used to preprocess each row when
-            # they are constructed.
-            metadata._orig_processors = metadata._processors
-            # replace the all type processors by None processors.
-            metadata._processors = [None for _ in range(len(metadata.keys))]
-            keymap = {}
-            for k, (func, obj, index) in metadata._keymap.items():
-                keymap[k] = (None, obj, index)
-            metadata._keymap = keymap
-
-    def fetchall(self):
-        # can't call cursor.fetchall(), since rows must be
-        # fully processed before requesting more from the DBAPI.
-        l = []
-        while True:
-            row = self.fetchone()
-            if row is None:
-                break
-            l.append(row)
-        return l
-
-    def fetchmany(self, size=None):
-        # can't call cursor.fetchmany(), since rows must be
-        # fully processed before requesting more from the DBAPI.
-        if size is None:
-            return self.fetchall()
-        l = []
-        for i in range(size):
-            row = self.fetchone()
-            if row is None:
-                break
-            l.append(row)
-        return l
index efee58d991643d9cdf2356c7b31debfe0d441c81..1b3ac7ce2cb9b3dd0d8736694b41d1762bb8571f 100644 (file)
@@ -229,7 +229,7 @@ class ResourceClosedError(InvalidRequestError):
 
 
 class NoSuchColumnError(KeyError, InvalidRequestError):
-    """A nonexistent column is requested from a ``RowProxy``."""
+    """A nonexistent column is requested from a ``Row``."""
 
 
 class NoReferenceError(InvalidRequestError):
index 94a9b8d2205c04c72f567c325edfc7a0c0c62942..53b901689d54a20532dfb0fb1200e4bb74b1a81c 100644 (file)
@@ -358,11 +358,6 @@ def _instance_processor(
     # call overhead.  _instance() is the most
     # performance-critical section in the whole ORM.
 
-    pk_cols = mapper.primary_key
-
-    if adapter:
-        pk_cols = [adapter.columns[c] for c in pk_cols]
-
     identity_class = mapper._identity_class
 
     populators = collections.defaultdict(list)
@@ -488,6 +483,12 @@ def _instance_processor(
     else:
         refresh_identity_key = None
 
+        pk_cols = mapper.primary_key
+
+        if adapter:
+            pk_cols = [adapter.columns[c] for c in pk_cols]
+        tuple_getter = result._tuple_getter(pk_cols, True)
+
     if mapper.allow_partial_pks:
         is_not_primary_key = _none_set.issuperset
     else:
@@ -507,11 +508,7 @@ def _instance_processor(
         else:
             # look at the row, see if that identity is in the
             # session, or we have to create a new one
-            identitykey = (
-                identity_class,
-                tuple([row[column] for column in pk_cols]),
-                identity_token,
-            )
+            identitykey = (identity_class, tuple_getter(row), identity_token)
 
             instance = session_identity_map.get(identitykey)
 
@@ -853,8 +850,10 @@ def _decorate_polymorphic_switch(
 
     polymorphic_instances = util.PopulateDict(configure_subclass_mapper)
 
+    getter = result._getter(polymorphic_on)
+
     def polymorphic_instance(row):
-        discriminator = row[polymorphic_on]
+        discriminator = getter(row)
         if discriminator is not None:
             _instance = polymorphic_instances[discriminator]
             if _instance:
index 1f2f657285e4bb4f21afe0ff9557583714d34ab1..d8e5997c1c728d764ea82b87923956bdedb87ed0 100644 (file)
@@ -1383,20 +1383,20 @@ class SubqueryLoader(PostLoader):
 
         if self.uselist:
             self._create_collection_loader(
-                context, collections, local_cols, populators
+                context, result, collections, local_cols, populators
             )
         else:
             self._create_scalar_loader(
-                context, collections, local_cols, populators
+                context, result, collections, local_cols, populators
             )
 
     def _create_collection_loader(
-        self, context, collections, local_cols, populators
+        self, context, result, collections, local_cols, populators
     ):
+        tuple_getter = result._tuple_getter(local_cols)
+
         def load_collection_from_subq(state, dict_, row):
-            collection = collections.get(
-                tuple([row[col] for col in local_cols]), ()
-            )
+            collection = collections.get(tuple_getter(row), ())
             state.get_impl(self.key).set_committed_value(
                 state, dict_, collection
             )
@@ -1414,12 +1414,12 @@ class SubqueryLoader(PostLoader):
             populators["eager"].append((self.key, collections.loader))
 
     def _create_scalar_loader(
-        self, context, collections, local_cols, populators
+        self, context, result, collections, local_cols, populators
     ):
+        tuple_getter = result._tuple_getter(local_cols)
+
         def load_scalar_from_subq(state, dict_, row):
-            collection = collections.get(
-                tuple([row[col] for col in local_cols]), (None,)
-            )
+            collection = collections.get(tuple_getter(row), (None,))
             if len(collection) > 1:
                 util.warn(
                     "Multiple rows returned with "
index 747ec7e658f0b1a5f06d4519956a9143483c5ef5..5f0f41e8d95dfe13b9162bdbbd717badbdd3a75b 100644 (file)
@@ -297,7 +297,7 @@ def identity_key(*args, **kwargs):
     * ``identity_key(class, row=row, identity_token=token)``
 
       This form is similar to the class/tuple form, except is passed a
-      database result row as a :class:`.RowProxy` object.
+      database result row as a :class:`.Row` object.
 
       E.g.::
 
@@ -307,7 +307,7 @@ first()
         (<class '__main__.MyClass'>, (1, 2), None)
 
       :param class: mapped class (must be a positional argument)
-      :param row: :class:`.RowProxy` row returned by a :class:`.ResultProxy`
+      :param row: :class:`.Row` row returned by a :class:`.ResultProxy`
        (must be given as a keyword arg)
       :param identity_token: optional identity token
 
index 8df93a60b8fde3dee89b7f817a8d504d006a9220..5e432a74ca64fd5a74140fededa51730f7089ece 100644 (file)
@@ -251,6 +251,12 @@ COMPOUND_KEYWORDS = {
 }
 
 
+RM_RENDERED_NAME = 0
+RM_NAME = 1
+RM_OBJECTS = 2
+RM_TYPE = 3
+
+
 class Compiled(object):
 
     """Represent a compiled SQL or DDL expression.
@@ -710,7 +716,9 @@ class SQLCompiler(Compiled):
     @util.dependencies("sqlalchemy.engine.result")
     def _create_result_map(self, result):
         """utility method used for unit tests only."""
-        return result.ResultMetaData._create_result_map(self._result_columns)
+        return result.ResultMetaData._create_description_match_map(
+            self._result_columns
+        )
 
     def default_from(self):
         """Called when a SELECT statement has no froms, and no FROM clause is
index 56d8b4ff88a975ebc2971b29a406cd3f0abd12bc..cbfbc63ee5778e6efc87823a0943ca40f794390b 100644 (file)
@@ -84,7 +84,18 @@ def profile_memory(
                 if until_maxtimes >= maxtimes // 5:
                     break
                 for x in range(5):
-                    func(*func_args)
+                    try:
+                        func(*func_args)
+                    except Exception as err:
+                        queue.put(
+                            (
+                                "result",
+                                False,
+                                "Test raised an exception: %r" % err,
+                            )
+                        )
+
+                        raise
                     gc_collect()
                     samples.append(
                         get_num_objects()
@@ -910,6 +921,7 @@ class MemUsageWBackendTest(EnsureZeroed):
             metadata.drop_all()
         assert_no_mappers()
 
+    @testing.expect_deprecated
     @testing.provide_metadata
     def test_key_fallback_result(self):
         e = self.engine
index 8085d5e23ac83781d38e2d38132ef8b4dcba77b7..51fcbde651240925fb2ebe24ea7856bc3baad3ee 100644 (file)
@@ -8,7 +8,7 @@ from sqlalchemy import String
 from sqlalchemy import Table
 from sqlalchemy import testing
 from sqlalchemy import Unicode
-from sqlalchemy.engine.result import RowProxy
+from sqlalchemy.engine.result import Row
 from sqlalchemy.testing import AssertsExecutionResults
 from sqlalchemy.testing import eq_
 from sqlalchemy.testing import fixtures
@@ -149,11 +149,11 @@ class ExecutionTest(fixtures.TestBase):
         go()
 
 
-class RowProxyTest(fixtures.TestBase):
+class RowTest(fixtures.TestBase):
     __requires__ = ("cpython",)
     __backend__ = True
 
-    def _rowproxy_fixture(self, keys, processors, row):
+    def _rowproxy_fixture(self, keys, processors, row, row_cls):
         class MockMeta(object):
             def __init__(self):
                 pass
@@ -161,13 +161,11 @@ class RowProxyTest(fixtures.TestBase):
         metadata = MockMeta()
 
         keymap = {}
-        for index, (keyobjs, processor, values) in enumerate(
-            list(zip(keys, processors, row))
-        ):
+        for index, (keyobjs, values) in enumerate(list(zip(keys, row))):
             for key in keyobjs:
-                keymap[key] = (processor, key, index)
-            keymap[index] = (processor, key, index)
-        return RowProxy(metadata, row, processors, keymap)
+                keymap[key] = (index, key)
+            keymap[index] = (index, key)
+        return row_cls(metadata, processors, keymap, row)
 
     def _test_getitem_value_refcounts(self, seq_factory):
         col1, col2 = object(), object()
@@ -180,6 +178,7 @@ class RowProxyTest(fixtures.TestBase):
             [(col1, "a"), (col2, "b")],
             [proc1, None],
             seq_factory([value1, value2]),
+            Row,
         )
 
         v1_refcount = sys.getrefcount(value1)
index e4b99ba6806f859fbee2955558ff26c0f0418d41..980b47634c079cd91a51e8b72a4c624d1c629824 100644 (file)
 
 test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_mssql_pyodbc_dbapiunicode_cextensions 66
 test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_mssql_pyodbc_dbapiunicode_nocextensions 66
-test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_mysql_mysqldb_dbapiunicode_cextensions 66
-test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_mysql_mysqldb_dbapiunicode_nocextensions 66
 test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_mysql_pymysql_dbapiunicode_cextensions 66
 test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_mysql_pymysql_dbapiunicode_nocextensions 66
 test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_oracle_cx_oracle_dbapiunicode_cextensions 66
 test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 66
-test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_postgresql_psycopg2_dbapiunicode_cextensions 67
-test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 67
-test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_sqlite_pysqlite_dbapiunicode_cextensions 67
-test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 67
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_mysqldb_dbapiunicode_cextensions 73
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_mysqldb_dbapiunicode_nocextensions 73
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_pymysql_dbapiunicode_cextensions 73
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_pymysql_dbapiunicode_nocextensions 73
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_oracle_cx_oracle_dbapiunicode_cextensions 73
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 73
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_postgresql_psycopg2_dbapiunicode_cextensions 72
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 72
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_sqlite_pysqlite_dbapiunicode_cextensions 72
-test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 72
+test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_postgresql_psycopg2_dbapiunicode_cextensions 66
+test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 66
+test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_sqlite_pysqlite_dbapiunicode_cextensions 66
+test.aaa_profiling.test_compiler.CompileTest.test_insert 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 66
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mssql_pyodbc_dbapiunicode_cextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mssql_pyodbc_dbapiunicode_nocextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_mysqldb_dbapiunicode_cextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_mysqldb_dbapiunicode_nocextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_pymysql_dbapiunicode_cextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_mysql_pymysql_dbapiunicode_nocextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_oracle_cx_oracle_dbapiunicode_cextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_postgresql_psycopg2_dbapiunicode_cextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_sqlite_pysqlite_dbapiunicode_cextensions 71
+test.aaa_profiling.test_compiler.CompileTest.test_insert 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 71
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_select
 
 test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mssql_pyodbc_dbapiunicode_cextensions 161,161
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mssql_pyodbc_dbapiunicode_nocextensions 161,161
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mysql_mysqldb_dbapiunicode_cextensions 163,163,163,163
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mysql_mysqldb_dbapiunicode_nocextensions 163,163,163,163
+test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mssql_pyodbc_dbapiunicode_nocextensions 161
 test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mysql_pymysql_dbapiunicode_cextensions 163,163
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mysql_pymysql_dbapiunicode_nocextensions 163,163
+test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_mysql_pymysql_dbapiunicode_nocextensions 161
 test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_oracle_cx_oracle_dbapiunicode_cextensions 163,161
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 163,161
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_postgresql_psycopg2_dbapiunicode_cextensions 164
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 164
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_sqlite_pysqlite_dbapiunicode_cextensions 164
-test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 164
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_mysqldb_dbapiunicode_cextensions 176,176,176,176
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_mysqldb_dbapiunicode_nocextensions 176,176,176,176
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_pymysql_dbapiunicode_cextensions 176,176
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_pymysql_dbapiunicode_nocextensions 176,176
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_oracle_cx_oracle_dbapiunicode_cextensions 176
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 176
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_postgresql_psycopg2_dbapiunicode_cextensions 177
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 177
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_sqlite_pysqlite_dbapiunicode_cextensions 177
-test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 177
+test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 161
+test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_postgresql_psycopg2_dbapiunicode_cextensions 161
+test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 161
+test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_sqlite_pysqlite_dbapiunicode_cextensions 161
+test.aaa_profiling.test_compiler.CompileTest.test_select 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 161
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mssql_pyodbc_dbapiunicode_cextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mssql_pyodbc_dbapiunicode_nocextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_mysqldb_dbapiunicode_cextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_mysqldb_dbapiunicode_nocextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_pymysql_dbapiunicode_cextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_mysql_pymysql_dbapiunicode_nocextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_oracle_cx_oracle_dbapiunicode_cextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_postgresql_psycopg2_dbapiunicode_cextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_sqlite_pysqlite_dbapiunicode_cextensions 174
+test.aaa_profiling.test_compiler.CompileTest.test_select 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 174
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_select_labels
 
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mssql_pyodbc_dbapiunicode_cextensions 194,194
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mssql_pyodbc_dbapiunicode_nocextensions 194,194
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mysql_mysqldb_dbapiunicode_cextensions 196,196,196,196
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mysql_mysqldb_dbapiunicode_nocextensions 196,196,196,196
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mssql_pyodbc_dbapiunicode_nocextensions 194
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mysql_pymysql_dbapiunicode_cextensions 196,196
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mysql_pymysql_dbapiunicode_nocextensions 196,196
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_mysql_pymysql_dbapiunicode_nocextensions 194
 test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_oracle_cx_oracle_dbapiunicode_cextensions 196,194
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 196,194
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_postgresql_psycopg2_dbapiunicode_cextensions 197
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 197
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_sqlite_pysqlite_dbapiunicode_cextensions 197
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 197
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_mysqldb_dbapiunicode_cextensions 209,209,209,209
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_mysqldb_dbapiunicode_nocextensions 209,209,209,209
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_pymysql_dbapiunicode_cextensions 209,209
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_pymysql_dbapiunicode_nocextensions 209,209
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_oracle_cx_oracle_dbapiunicode_cextensions 209
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 209
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_postgresql_psycopg2_dbapiunicode_cextensions 210
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 210
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_sqlite_pysqlite_dbapiunicode_cextensions 210
-test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 210
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 194
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_postgresql_psycopg2_dbapiunicode_cextensions 194
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 194
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_sqlite_pysqlite_dbapiunicode_cextensions 194
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 194
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mssql_pyodbc_dbapiunicode_cextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mssql_pyodbc_dbapiunicode_nocextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_mysqldb_dbapiunicode_cextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_mysqldb_dbapiunicode_nocextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_pymysql_dbapiunicode_cextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_mysql_pymysql_dbapiunicode_nocextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_oracle_cx_oracle_dbapiunicode_cextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_postgresql_psycopg2_dbapiunicode_cextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_sqlite_pysqlite_dbapiunicode_cextensions 207
+test.aaa_profiling.test_compiler.CompileTest.test_select_labels 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 207
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_update
 
 test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mssql_pyodbc_dbapiunicode_cextensions 82,80
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mssql_pyodbc_dbapiunicode_nocextensions 82,80
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mysql_mysqldb_dbapiunicode_cextensions 82,80,80,80
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mysql_mysqldb_dbapiunicode_nocextensions 82,80,80,80
+test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mssql_pyodbc_dbapiunicode_nocextensions 78
 test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mysql_pymysql_dbapiunicode_cextensions 80,80
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mysql_pymysql_dbapiunicode_nocextensions 80,80
+test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_mysql_pymysql_dbapiunicode_nocextensions 76
 test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_oracle_cx_oracle_dbapiunicode_cextensions 82,80
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 82,80
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_postgresql_psycopg2_dbapiunicode_cextensions 79
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 79
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_sqlite_pysqlite_dbapiunicode_cextensions 79
-test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 79
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_mysqldb_dbapiunicode_cextensions 83,81,81,81
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_mysqldb_dbapiunicode_nocextensions 83,81,81,81
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_pymysql_dbapiunicode_cextensions 81,81
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_pymysql_dbapiunicode_nocextensions 81,81
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_oracle_cx_oracle_dbapiunicode_cextensions 83
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 83
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_postgresql_psycopg2_dbapiunicode_cextensions 82
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 82
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_sqlite_pysqlite_dbapiunicode_cextensions 82
-test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 78
+test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_postgresql_psycopg2_dbapiunicode_cextensions 78
+test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 78
+test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_sqlite_pysqlite_dbapiunicode_cextensions 78
+test.aaa_profiling.test_compiler.CompileTest.test_update 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 78
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mssql_pyodbc_dbapiunicode_cextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mssql_pyodbc_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_mysqldb_dbapiunicode_cextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_mysqldb_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_pymysql_dbapiunicode_cextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_mysql_pymysql_dbapiunicode_nocextensions 79
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_oracle_cx_oracle_dbapiunicode_cextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_postgresql_psycopg2_dbapiunicode_cextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_sqlite_pysqlite_dbapiunicode_cextensions 81
+test.aaa_profiling.test_compiler.CompileTest.test_update 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 81
 
 # TEST: test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause
 
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mssql_pyodbc_dbapiunicode_cextensions 156,156
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mssql_pyodbc_dbapiunicode_nocextensions 156,156
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mysql_mysqldb_dbapiunicode_cextensions 158,158,158,158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mysql_mysqldb_dbapiunicode_nocextensions 158,158,158,158
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mssql_pyodbc_dbapiunicode_nocextensions 157
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mysql_pymysql_dbapiunicode_cextensions 158,158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mysql_pymysql_dbapiunicode_nocextensions 158,158
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_mysql_pymysql_dbapiunicode_nocextensions 157
 test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_oracle_cx_oracle_dbapiunicode_cextensions 158,156
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 158,156
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_postgresql_psycopg2_dbapiunicode_cextensions 160
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 160
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_sqlite_pysqlite_dbapiunicode_cextensions 160
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 160
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_mysqldb_dbapiunicode_cextensions 158,158,158,158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_mysqldb_dbapiunicode_nocextensions 158,158,158,158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_pymysql_dbapiunicode_cextensions 158,158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_pymysql_dbapiunicode_nocextensions 158,158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_oracle_cx_oracle_dbapiunicode_cextensions 158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 158
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_postgresql_psycopg2_dbapiunicode_cextensions 165
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 165
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_sqlite_pysqlite_dbapiunicode_cextensions 165
-test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 165
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 157
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_postgresql_psycopg2_dbapiunicode_cextensions 157
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 157
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_sqlite_pysqlite_dbapiunicode_cextensions 157
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 157
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mssql_pyodbc_dbapiunicode_cextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mssql_pyodbc_dbapiunicode_nocextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_mysqldb_dbapiunicode_cextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_mysqldb_dbapiunicode_nocextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_pymysql_dbapiunicode_cextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_mysql_pymysql_dbapiunicode_nocextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_oracle_cx_oracle_dbapiunicode_cextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_postgresql_psycopg2_dbapiunicode_cextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_sqlite_pysqlite_dbapiunicode_cextensions 162
+test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 162
 
 # 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 2.7_mssql_pyodbc_dbapiunicode_nocextensions 1325
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 2.7_mysql_pymysql_dbapiunicode_nocextensions 1325
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 1325
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1325
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1325
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 2.7_sqlite_pysqlite_dbapiunicode_cextensions 1325
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1325
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_mssql_pyodbc_dbapiunicode_cextensions 925
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_mssql_pyodbc_dbapiunicode_nocextensions 925
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_mysql_pymysql_dbapiunicode_cextensions 925
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_mysql_pymysql_dbapiunicode_nocextensions 925
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_oracle_cx_oracle_dbapiunicode_cextensions 925
+test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 925
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_postgresql_psycopg2_dbapiunicode_cextensions 925
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 925
 test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_members 3.7_sqlite_pysqlite_dbapiunicode_cextensions 925
@@ -149,173 +158,230 @@ test.aaa_profiling.test_misc.EnumTest.test_create_enum_from_pep_435_w_expensive_
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_mysql_mysqldb_dbapiunicode_cextensions 51975
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_mysql_mysqldb_dbapiunicode_nocextensions 54975
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_mssql_pyodbc_dbapiunicode_nocextensions 55503
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_mysql_pymysql_dbapiunicode_nocextensions 101008
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_oracle_cx_oracle_dbapiunicode_cextensions 52014
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 48598
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 51502
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_sqlite_pysqlite_dbapiunicode_cextensions 48088
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 51088
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 58824
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 53903
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 54203
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_sqlite_pysqlite_dbapiunicode_cextensions 53489
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 53789
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_mssql_pyodbc_dbapiunicode_cextensions 52706
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_mssql_pyodbc_dbapiunicode_nocextensions 57706
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_mysql_mysqldb_dbapiunicode_cextensions 54378
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_mysql_mysqldb_dbapiunicode_nocextensions 57978
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 57517
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 51805
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 55005
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_sqlite_pysqlite_dbapiunicode_cextensions 50899
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 53699
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_mysql_pymysql_dbapiunicode_cextensions 88111
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_mysql_pymysql_dbapiunicode_nocextensions 93511
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_oracle_cx_oracle_dbapiunicode_cextensions 53827
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 59227
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 51906
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 57306
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_sqlite_pysqlite_dbapiunicode_cextensions 51000
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_w_annotation 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 56400
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_mysql_mysqldb_dbapiunicode_cextensions 51972
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_mysql_mysqldb_dbapiunicode_nocextensions 54972
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_mssql_pyodbc_dbapiunicode_nocextensions 54873
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_mysql_pymysql_dbapiunicode_nocextensions 100372
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_oracle_cx_oracle_dbapiunicode_cextensions 51972
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 48572
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 51473
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_sqlite_pysqlite_dbapiunicode_cextensions 48057
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 51057
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 58173
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 53273
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 53573
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_sqlite_pysqlite_dbapiunicode_cextensions 52857
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 53157
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_mssql_pyodbc_dbapiunicode_cextensions 52065
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_mssql_pyodbc_dbapiunicode_nocextensions 57065
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_mysql_mysqldb_dbapiunicode_cextensions 54364
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_mysql_mysqldb_dbapiunicode_nocextensions 57964
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 57464
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 51765
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 54965
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_sqlite_pysqlite_dbapiunicode_cextensions 50857
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 53657
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_mysql_pymysql_dbapiunicode_cextensions 87464
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_mysql_pymysql_dbapiunicode_nocextensions 92864
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_oracle_cx_oracle_dbapiunicode_cextensions 53165
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 58565
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 51265
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 56665
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_sqlite_pysqlite_dbapiunicode_cextensions 50357
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_bundle_wo_annotation 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 55757
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_mysql_mysqldb_dbapiunicode_cextensions 49677
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_mysql_mysqldb_dbapiunicode_nocextensions 52677
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_mssql_pyodbc_dbapiunicode_nocextensions 53178
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_mysql_pymysql_dbapiunicode_nocextensions 98677
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_oracle_cx_oracle_dbapiunicode_cextensions 49677
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 46277
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 49178
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 45762
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 48762
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 56478
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 51578
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 51878
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 51162
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 51462
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_mssql_pyodbc_dbapiunicode_cextensions 49773
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_mssql_pyodbc_dbapiunicode_nocextensions 54773
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_mysql_mysqldb_dbapiunicode_cextensions 51472
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_mysql_mysqldb_dbapiunicode_nocextensions 55072
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 54572
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48873
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 52073
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 47965
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 50765
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_mysql_pymysql_dbapiunicode_cextensions 85172
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_mysql_pymysql_dbapiunicode_nocextensions 90572
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_cextensions 50873
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 56273
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48973
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 54373
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 48065
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 53465
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_mysql_mysqldb_dbapiunicode_cextensions 49772
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_mysql_mysqldb_dbapiunicode_nocextensions 52772
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_mssql_pyodbc_dbapiunicode_nocextensions 52673
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_mysql_pymysql_dbapiunicode_nocextensions 98172
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_oracle_cx_oracle_dbapiunicode_cextensions 49772
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 46372
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 49273
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 45857
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 48857
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 55973
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 51073
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 51373
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 50657
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 50957
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_mssql_pyodbc_dbapiunicode_cextensions 49265
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_mssql_pyodbc_dbapiunicode_nocextensions 54265
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_mysql_mysqldb_dbapiunicode_cextensions 51564
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_mysql_mysqldb_dbapiunicode_nocextensions 55164
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 54664
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48965
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 52165
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 48057
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 50857
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_mysql_pymysql_dbapiunicode_cextensions 84664
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_mysql_pymysql_dbapiunicode_nocextensions 90064
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_cextensions 50365
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 55765
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48465
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 53865
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 47557
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 52957
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_mysql_mysqldb_dbapiunicode_cextensions 41972
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_mysql_mysqldb_dbapiunicode_nocextensions 44472
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_mssql_pyodbc_dbapiunicode_nocextensions 45273
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_mysql_pymysql_dbapiunicode_nocextensions 90772
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_oracle_cx_oracle_dbapiunicode_cextensions 41972
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_postgresql_psycopg2_dbapiunicode_cextensions 39472
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 41873
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_sqlite_pysqlite_dbapiunicode_cextensions 38957
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 41457
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 48573
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_postgresql_psycopg2_dbapiunicode_cextensions 43673
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 43973
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_sqlite_pysqlite_dbapiunicode_cextensions 43257
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 43557
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_mssql_pyodbc_dbapiunicode_cextensions 42865
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_mssql_pyodbc_dbapiunicode_nocextensions 47765
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_mysql_mysqldb_dbapiunicode_cextensions 44664
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_mysql_mysqldb_dbapiunicode_nocextensions 47364
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 47264
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_postgresql_psycopg2_dbapiunicode_cextensions 42565
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 45265
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_sqlite_pysqlite_dbapiunicode_cextensions 41657
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 44357
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_mysql_pymysql_dbapiunicode_cextensions 78664
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_mysql_pymysql_dbapiunicode_nocextensions 83564
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_oracle_cx_oracle_dbapiunicode_cextensions 44365
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 49265
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_postgresql_psycopg2_dbapiunicode_cextensions 42065
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 46965
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_sqlite_pysqlite_dbapiunicode_cextensions 41157
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 46057
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_mysql_mysqldb_dbapiunicode_cextensions 49677
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_mysql_mysqldb_dbapiunicode_nocextensions 52677
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_mssql_pyodbc_dbapiunicode_nocextensions 53178
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_mysql_pymysql_dbapiunicode_nocextensions 98677
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_oracle_cx_oracle_dbapiunicode_cextensions 49677
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 46277
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 49178
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 45762
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 48762
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 56478
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 51578
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 51878
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 51162
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 51462
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_mssql_pyodbc_dbapiunicode_cextensions 49773
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_mssql_pyodbc_dbapiunicode_nocextensions 54773
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_mysql_mysqldb_dbapiunicode_cextensions 51472
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_mysql_mysqldb_dbapiunicode_nocextensions 55072
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 54572
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48873
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 52073
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 47965
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 50765
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_mysql_pymysql_dbapiunicode_cextensions 85172
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_mysql_pymysql_dbapiunicode_nocextensions 90572
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_cextensions 50873
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 56273
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48973
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 54373
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 48065
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 53465
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_mysql_mysqldb_dbapiunicode_cextensions 49772
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_mysql_mysqldb_dbapiunicode_nocextensions 52772
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_mssql_pyodbc_dbapiunicode_nocextensions 52673
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_mysql_pymysql_dbapiunicode_nocextensions 98172
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_oracle_cx_oracle_dbapiunicode_cextensions 49772
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 46372
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 49273
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 45857
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 48857
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 55973
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 51073
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 51373
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 50657
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 50957
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_mssql_pyodbc_dbapiunicode_cextensions 49265
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_mssql_pyodbc_dbapiunicode_nocextensions 54265
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_mysql_mysqldb_dbapiunicode_cextensions 51564
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_mysql_mysqldb_dbapiunicode_nocextensions 55164
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 54664
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48965
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 52165
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 48057
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 50857
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_mysql_pymysql_dbapiunicode_cextensions 84664
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_mysql_pymysql_dbapiunicode_nocextensions 90064
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_cextensions 50365
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 55765
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 48465
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 53865
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 47557
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_bundle_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 52957
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_mysql_mysqldb_dbapiunicode_cextensions 28919
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_mysql_mysqldb_dbapiunicode_nocextensions 30419
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_mssql_pyodbc_dbapiunicode_nocextensions 29720
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_mysql_pymysql_dbapiunicode_nocextensions 63819
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_oracle_cx_oracle_dbapiunicode_cextensions 27319
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 26319
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 27720
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 25804
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 27304
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 31620
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 28320
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 28620
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 27904
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 28204
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_mssql_pyodbc_dbapiunicode_cextensions 30210
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_mssql_pyodbc_dbapiunicode_nocextensions 32010
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_mysql_mysqldb_dbapiunicode_cextensions 31009
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_mysql_mysqldb_dbapiunicode_nocextensions 33109
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 31009
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 29010
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 30710
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 28302
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 29602
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_mysql_pymysql_dbapiunicode_cextensions 56509
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_mysql_pymysql_dbapiunicode_nocextensions 58709
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_cextensions 29910
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 32110
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 29410
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 31610
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 28702
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_w_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 30902
 
 # TEST: test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations
 
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_mysql_mysqldb_dbapiunicode_cextensions 29019
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_mysql_mysqldb_dbapiunicode_nocextensions 30519
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_mssql_pyodbc_dbapiunicode_nocextensions 29220
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_mysql_pymysql_dbapiunicode_nocextensions 63319
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_oracle_cx_oracle_dbapiunicode_cextensions 27419
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 26419
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 27820
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 25904
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 27404
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 31120
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_cextensions 27820
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 28120
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_cextensions 27404
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 27704
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_mssql_pyodbc_dbapiunicode_cextensions 29710
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_mssql_pyodbc_dbapiunicode_nocextensions 31510
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_mysql_mysqldb_dbapiunicode_cextensions 31109
 test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_mysql_mysqldb_dbapiunicode_nocextensions 33209
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 31109
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 29110
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 30810
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 28402
-test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 29702
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_mysql_pymysql_dbapiunicode_cextensions 56009
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_mysql_pymysql_dbapiunicode_nocextensions 58209
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_cextensions 29410
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 31610
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_cextensions 28910
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 31110
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_cextensions 28202
+test.aaa_profiling.test_orm.AnnotatedOverheadTest.test_no_entity_wo_annotations 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 30402
 
 # TEST: test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set
 
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_mssql_pyodbc_dbapiunicode_cextensions 3927
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_mssql_pyodbc_dbapiunicode_nocextensions 3927
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_mysql_mysqldb_dbapiunicode_cextensions 3926
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_mysql_mysqldb_dbapiunicode_nocextensions 3926
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_mssql_pyodbc_dbapiunicode_nocextensions 3812
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_mysql_pymysql_dbapiunicode_nocextensions 3812
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_oracle_cx_oracle_dbapiunicode_cextensions 3927
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 3927
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_postgresql_psycopg2_dbapiunicode_cextensions 3932
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 3812
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_postgresql_psycopg2_dbapiunicode_cextensions 3812
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 3812
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_sqlite_pysqlite_dbapiunicode_cextensions 3812
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 3812
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_mssql_pyodbc_dbapiunicode_cextensions 3933
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_mssql_pyodbc_dbapiunicode_nocextensions 3933
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_mysql_mysqldb_dbapiunicode_cextensions 4047
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_mysql_mysqldb_dbapiunicode_nocextensions 4047
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_oracle_cx_oracle_dbapiunicode_cextensions 3927
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 3927
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_mysql_pymysql_dbapiunicode_cextensions 3933
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_mysql_pymysql_dbapiunicode_nocextensions 3933
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_oracle_cx_oracle_dbapiunicode_cextensions 3933
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 3933
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_postgresql_psycopg2_dbapiunicode_cextensions 3933
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 3933
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_sqlite_pysqlite_dbapiunicode_cextensions 3933
@@ -324,19 +390,22 @@ test.aaa_profiling.test_orm.AttributeOverheadTest.test_attribute_set 3.7_sqlite_
 # TEST: test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove
 
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_mssql_pyodbc_dbapiunicode_cextensions 6222
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_mssql_pyodbc_dbapiunicode_nocextensions 6222
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_mysql_mysqldb_dbapiunicode_cextensions 6020
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_mysql_mysqldb_dbapiunicode_nocextensions 6020
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_mssql_pyodbc_dbapiunicode_nocextensions 6026
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_mysql_pymysql_dbapiunicode_nocextensions 6026
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_oracle_cx_oracle_dbapiunicode_cextensions 6222
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 6222
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 6026
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6026
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6026
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_sqlite_pysqlite_dbapiunicode_cextensions 6026
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6026
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_mssql_pyodbc_dbapiunicode_cextensions 6228
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_mssql_pyodbc_dbapiunicode_nocextensions 6228
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_mysql_mysqldb_dbapiunicode_cextensions 6222
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_mysql_mysqldb_dbapiunicode_nocextensions 6222
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_oracle_cx_oracle_dbapiunicode_cextensions 6222
-test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 6222
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_mysql_pymysql_dbapiunicode_cextensions 6228
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_mysql_pymysql_dbapiunicode_nocextensions 6228
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_oracle_cx_oracle_dbapiunicode_cextensions 6228
+test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 6228
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_postgresql_psycopg2_dbapiunicode_cextensions 6228
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6228
 test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove 3.7_sqlite_pysqlite_dbapiunicode_cextensions 6228
@@ -344,10 +413,19 @@ test.aaa_profiling.test_orm.AttributeOverheadTest.test_collection_append_remove
 
 # TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching
 
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 104
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_mysql_pymysql_dbapiunicode_nocextensions 104
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 104
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 104
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 104
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 104
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 104
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_mssql_pyodbc_dbapiunicode_cextensions 81
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_mssql_pyodbc_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_mysql_pymysql_dbapiunicode_cextensions 81
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_mysql_pymysql_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 81
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 81
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 81
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 81
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 81
@@ -355,10 +433,19 @@ test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_bra
 
 # TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching
 
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 718
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_mysql_pymysql_dbapiunicode_nocextensions 718
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 718
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 718
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 718
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 718
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 718
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_mssql_pyodbc_dbapiunicode_cextensions 695
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_mssql_pyodbc_dbapiunicode_nocextensions 695
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_mysql_pymysql_dbapiunicode_cextensions 695
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_mysql_pymysql_dbapiunicode_nocextensions 695
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 695
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 695
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 695
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 695
 test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 695
@@ -366,10 +453,19 @@ test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_b
 
 # TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching
 
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 45
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_mysql_pymysql_dbapiunicode_nocextensions 45
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 45
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 45
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 45
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 45
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 45
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_mssql_pyodbc_dbapiunicode_cextensions 58
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_mssql_pyodbc_dbapiunicode_nocextensions 58
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_mysql_pymysql_dbapiunicode_cextensions 58
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_mysql_pymysql_dbapiunicode_nocextensions 58
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 58
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 58
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 58
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 58
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 58
@@ -377,10 +473,19 @@ test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branchi
 
 # TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching
 
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 518
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_mysql_pymysql_dbapiunicode_nocextensions 518
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 518
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 518
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 518
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 518
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 518
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_mssql_pyodbc_dbapiunicode_cextensions 528
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_mssql_pyodbc_dbapiunicode_nocextensions 528
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_mysql_pymysql_dbapiunicode_cextensions 528
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_mysql_pymysql_dbapiunicode_nocextensions 528
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 528
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 528
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 528
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 528
 test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 528
@@ -389,73 +494,106 @@ test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching
 # TEST: test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline
 
 test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_mssql_pyodbc_dbapiunicode_cextensions 17207
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_mssql_pyodbc_dbapiunicode_nocextensions 26212
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_mysql_mysqldb_dbapiunicode_cextensions 17199
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_mysql_mysqldb_dbapiunicode_nocextensions 26204
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_mssql_pyodbc_dbapiunicode_nocextensions 30224
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_mysql_pymysql_dbapiunicode_nocextensions 119888
 test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_oracle_cx_oracle_dbapiunicode_cextensions 17299
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 44316
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_postgresql_psycopg2_dbapiunicode_cextensions 17210
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 26215
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_sqlite_pysqlite_dbapiunicode_cextensions 17190
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26195
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 48328
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_postgresql_psycopg2_dbapiunicode_cextensions 30198
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 30201
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_sqlite_pysqlite_dbapiunicode_cextensions 30178
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 30181
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_mssql_pyodbc_dbapiunicode_cextensions 17237
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_mssql_pyodbc_dbapiunicode_nocextensions 30246
 test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_mysql_mysqldb_dbapiunicode_cextensions 18218
 test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_mysql_mysqldb_dbapiunicode_nocextensions 27225
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_oracle_cx_oracle_dbapiunicode_cextensions 18306
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 27313
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_postgresql_psycopg2_dbapiunicode_cextensions 18244
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 27251
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_sqlite_pysqlite_dbapiunicode_cextensions 18217
-test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 27224
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_mysql_pymysql_dbapiunicode_cextensions 83754
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_mysql_pymysql_dbapiunicode_nocextensions 96763
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_oracle_cx_oracle_dbapiunicode_cextensions 17323
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 30332
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_postgresql_psycopg2_dbapiunicode_cextensions 17229
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 30238
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_sqlite_pysqlite_dbapiunicode_cextensions 17202
+test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 30211
 
 # TEST: test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols
 
 test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mssql_pyodbc_dbapiunicode_cextensions 23235
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mssql_pyodbc_dbapiunicode_nocextensions 26240
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mysql_mysqldb_dbapiunicode_cextensions 23255
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mysql_mysqldb_dbapiunicode_nocextensions 26260
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mssql_pyodbc_dbapiunicode_nocextensions 30256
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mysql_pymysql_dbapiunicode_nocextensions 59444
 test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_oracle_cx_oracle_dbapiunicode_cextensions 23247
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 26252
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_cextensions 23242
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 26247
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_cextensions 23222
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26227
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 30268
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_cextensions 30242
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 30245
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_cextensions 30222
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 30225
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_mssql_pyodbc_dbapiunicode_cextensions 23282
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_mssql_pyodbc_dbapiunicode_nocextensions 30291
 test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_mysql_mysqldb_dbapiunicode_cextensions 24287
 test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_mysql_mysqldb_dbapiunicode_nocextensions 27294
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_oracle_cx_oracle_dbapiunicode_cextensions 24279
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 27286
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_postgresql_psycopg2_dbapiunicode_cextensions 24277
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 27284
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_sqlite_pysqlite_dbapiunicode_cextensions 24262
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 27269
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_mysql_pymysql_dbapiunicode_cextensions 47431
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_mysql_pymysql_dbapiunicode_nocextensions 54440
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_oracle_cx_oracle_dbapiunicode_cextensions 23294
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 30303
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_postgresql_psycopg2_dbapiunicode_cextensions 23274
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 30283
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_sqlite_pysqlite_dbapiunicode_cextensions 23259
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 30268
 
 # TEST: test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query
 
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_cextensions 449362
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 449973
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_cextensions 449968
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 449963
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_postgresql_psycopg2_dbapiunicode_cextensions 489110
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 489110
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_sqlite_pysqlite_dbapiunicode_cextensions 489110
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 489110
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_mssql_pyodbc_dbapiunicode_nocextensions 439163
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_mysql_pymysql_dbapiunicode_nocextensions 439268
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 439273
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_cextensions 439268
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 439268
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_cextensions 439268
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 439263
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_mssql_pyodbc_dbapiunicode_cextensions 478305
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_mssql_pyodbc_dbapiunicode_nocextensions 478305
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_mysql_pymysql_dbapiunicode_cextensions 478410
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_mysql_pymysql_dbapiunicode_nocextensions 478410
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_oracle_cx_oracle_dbapiunicode_cextensions 478410
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 478410
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_postgresql_psycopg2_dbapiunicode_cextensions 478410
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 478410
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_sqlite_pysqlite_dbapiunicode_cextensions 478410
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 478410
 
 # TEST: test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results
 
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_cextensions 447788
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 459988
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_cextensions 443502
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 456302
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_postgresql_psycopg2_dbapiunicode_cextensions 469298
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 482298
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_sqlite_pysqlite_dbapiunicode_cextensions 450512
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 463512
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_mssql_pyodbc_dbapiunicode_nocextensions 490606
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_mysql_pymysql_dbapiunicode_nocextensions 1211948
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 577188
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_cextensions 466806
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 467106
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_cextensions 463120
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 463420
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_mssql_pyodbc_dbapiunicode_cextensions 476716
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_mssql_pyodbc_dbapiunicode_nocextensions 495516
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_mysql_pymysql_dbapiunicode_cextensions 1028258
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_mysql_pymysql_dbapiunicode_nocextensions 1047058
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_oracle_cx_oracle_dbapiunicode_cextensions 563298
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 582098
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_postgresql_psycopg2_dbapiunicode_cextensions 469916
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 488716
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_sqlite_pysqlite_dbapiunicode_cextensions 451130
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 469930
 
 # TEST: test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity
 
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 2.7_mssql_pyodbc_dbapiunicode_nocextensions 19986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 2.7_mysql_pymysql_dbapiunicode_nocextensions 19986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 19986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 2.7_postgresql_psycopg2_dbapiunicode_cextensions 19986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 19986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 2.7_sqlite_pysqlite_dbapiunicode_cextensions 19986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 19986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_mssql_pyodbc_dbapiunicode_cextensions 20986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_mssql_pyodbc_dbapiunicode_nocextensions 20986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_mysql_pymysql_dbapiunicode_cextensions 20986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_mysql_pymysql_dbapiunicode_nocextensions 20986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_oracle_cx_oracle_dbapiunicode_cextensions 20986
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 20986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_postgresql_psycopg2_dbapiunicode_cextensions 20986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 20986
 test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity 3.7_sqlite_pysqlite_dbapiunicode_cextensions 20986
@@ -463,59 +601,87 @@ test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_
 
 # 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 2.7_postgresql_psycopg2_dbapiunicode_cextensions 91469
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 90972
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_cextensions 87971
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 89774
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_postgresql_psycopg2_dbapiunicode_cextensions 92297
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 94051
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_sqlite_pysqlite_dbapiunicode_cextensions 90048
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 91802
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_mssql_pyodbc_dbapiunicode_nocextensions 91736
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_mysql_pymysql_dbapiunicode_nocextensions 173266
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 101273
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_postgresql_psycopg2_dbapiunicode_cextensions 91765
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 92515
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_cextensions 90467
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 91217
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_mssql_pyodbc_dbapiunicode_cextensions 90559
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_mssql_pyodbc_dbapiunicode_nocextensions 93813
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_mysql_pymysql_dbapiunicode_cextensions 154290
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_mysql_pymysql_dbapiunicode_nocextensions 157544
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_oracle_cx_oracle_dbapiunicode_cextensions 98547
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 101801
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_postgresql_psycopg2_dbapiunicode_cextensions 92289
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 95543
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_sqlite_pysqlite_dbapiunicode_cextensions 90040
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 93294
 
 # 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 2.7_postgresql_psycopg2_dbapiunicode_cextensions 18297
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 18575
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_cextensions 18265
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 18438
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_postgresql_psycopg2_dbapiunicode_cextensions 19042
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 19286
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_sqlite_pysqlite_dbapiunicode_cextensions 18908
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 19152
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_mssql_pyodbc_dbapiunicode_nocextensions 18882
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_mysql_pymysql_dbapiunicode_nocextensions 24379
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 19476
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_postgresql_psycopg2_dbapiunicode_cextensions 18666
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 18714
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_cextensions 18530
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 18628
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_mssql_pyodbc_dbapiunicode_cextensions 19077
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_mssql_pyodbc_dbapiunicode_nocextensions 19513
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_mysql_pymysql_dbapiunicode_cextensions 23402
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_mysql_pymysql_dbapiunicode_nocextensions 23838
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_oracle_cx_oracle_dbapiunicode_cextensions 19671
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 20107
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_postgresql_psycopg2_dbapiunicode_cextensions 18965
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 19401
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_sqlite_pysqlite_dbapiunicode_cextensions 18831
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 19267
 
 # TEST: test.aaa_profiling.test_orm.MergeTest.test_merge_load
 
 test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mssql_pyodbc_dbapiunicode_cextensions 1045
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mssql_pyodbc_dbapiunicode_nocextensions 1062
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mssql_pyodbc_dbapiunicode_nocextensions 1089
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mysql_pymysql_dbapiunicode_nocextensions 2121
 test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_oracle_cx_oracle_dbapiunicode_cextensions 1111
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 1128
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1143
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1162
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_cextensions 1001
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1018
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 1166
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1152
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1158
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_cextensions 1020
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1026
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_mssql_pyodbc_dbapiunicode_cextensions 1089
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_mssql_pyodbc_dbapiunicode_nocextensions 1120
 test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_mysql_mysqldb_dbapiunicode_cextensions 1242
 test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_mysql_mysqldb_dbapiunicode_nocextensions 1261
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_oracle_cx_oracle_dbapiunicode_cextensions 1138
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 1157
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_postgresql_psycopg2_dbapiunicode_cextensions 1167
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_mysql_pymysql_dbapiunicode_cextensions 1921
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_mysql_pymysql_dbapiunicode_nocextensions 1952
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_oracle_cx_oracle_dbapiunicode_cextensions 1154
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 1185
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_postgresql_psycopg2_dbapiunicode_cextensions 1155
 test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 1186
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_sqlite_pysqlite_dbapiunicode_cextensions 1038
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 1057
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_sqlite_pysqlite_dbapiunicode_cextensions 1034
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 1065
 
 # TEST: test.aaa_profiling.test_orm.MergeTest.test_merge_no_load
 
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_mssql_pyodbc_dbapiunicode_cextensions 93,19
-test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_mssql_pyodbc_dbapiunicode_nocextensions 93,19
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_mssql_pyodbc_dbapiunicode_nocextensions 99,19
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_mysql_pymysql_dbapiunicode_nocextensions 99,19
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_oracle_cx_oracle_dbapiunicode_cextensions 93,19
-test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 93,19
-test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_postgresql_psycopg2_dbapiunicode_cextensions 100,19
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 99,19
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_postgresql_psycopg2_dbapiunicode_cextensions 99,19
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 99,19
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_sqlite_pysqlite_dbapiunicode_cextensions 99,19
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 99,19
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_mssql_pyodbc_dbapiunicode_cextensions 103,20
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_mssql_pyodbc_dbapiunicode_nocextensions 103,20
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_mysql_mysqldb_dbapiunicode_cextensions 97,20
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_mysql_mysqldb_dbapiunicode_nocextensions 97,20
-test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_oracle_cx_oracle_dbapiunicode_cextensions 97,20
-test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 97,20
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_mysql_pymysql_dbapiunicode_cextensions 103,20
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_mysql_pymysql_dbapiunicode_nocextensions 103,20
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_oracle_cx_oracle_dbapiunicode_cextensions 103,20
+test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 103,20
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_postgresql_psycopg2_dbapiunicode_cextensions 103,20
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 103,20
 test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_sqlite_pysqlite_dbapiunicode_cextensions 103,20
@@ -523,73 +689,91 @@ test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.7_sqlite_pysqlite_dba
 
 # TEST: test.aaa_profiling.test_orm.QueryTest.test_query_cols
 
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_postgresql_psycopg2_dbapiunicode_cextensions 5900
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6441
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_sqlite_pysqlite_dbapiunicode_cextensions 5900
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6585
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_postgresql_psycopg2_dbapiunicode_cextensions 6138
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6800
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_sqlite_pysqlite_dbapiunicode_cextensions 6226
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 6506
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_mssql_pyodbc_dbapiunicode_nocextensions 6677
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_mysql_pymysql_dbapiunicode_nocextensions 16916
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 8087
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6477
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6507
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_sqlite_pysqlite_dbapiunicode_cextensions 6421
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6451
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_mssql_pyodbc_dbapiunicode_cextensions 6310
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_mssql_pyodbc_dbapiunicode_nocextensions 6890
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_mysql_pymysql_dbapiunicode_cextensions 13929
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_mysql_pymysql_dbapiunicode_nocextensions 14599
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_oracle_cx_oracle_dbapiunicode_cextensions 6310
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 6980
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_postgresql_psycopg2_dbapiunicode_cextensions 6230
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6900
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_sqlite_pysqlite_dbapiunicode_cextensions 6092
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 6762
 
 # TEST: test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results
 
 test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_mssql_pyodbc_dbapiunicode_cextensions 168601
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_mssql_pyodbc_dbapiunicode_nocextensions 172907
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_mysql_mysqldb_dbapiunicode_cextensions 177949
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_mysql_mysqldb_dbapiunicode_nocextensions 182353
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_mssql_pyodbc_dbapiunicode_nocextensions 178063
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_mysql_pymysql_dbapiunicode_nocextensions 327425
 test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_oracle_cx_oracle_dbapiunicode_cextensions 188198
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 192504
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_postgresql_psycopg2_dbapiunicode_cextensions 169005
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 173737
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_sqlite_pysqlite_dbapiunicode_cextensions 165041
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 169545
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 193545
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_postgresql_psycopg2_dbapiunicode_cextensions 175705
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 176705
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_sqlite_pysqlite_dbapiunicode_cextensions 171413
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 172313
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_mssql_pyodbc_dbapiunicode_cextensions 175530
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_mssql_pyodbc_dbapiunicode_nocextensions 182638
 test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_mysql_mysqldb_dbapiunicode_cextensions 183039
 test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_mysql_mysqldb_dbapiunicode_nocextensions 187847
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_oracle_cx_oracle_dbapiunicode_cextensions 192818
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 197426
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_postgresql_psycopg2_dbapiunicode_cextensions 176410
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 181018
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_sqlite_pysqlite_dbapiunicode_cextensions 171518
-test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 175926
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_mysql_pymysql_dbapiunicode_cextensions 291992
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_mysql_pymysql_dbapiunicode_nocextensions 299300
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_oracle_cx_oracle_dbapiunicode_cextensions 190812
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 198120
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_postgresql_psycopg2_dbapiunicode_cextensions 176372
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 183680
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_sqlite_pysqlite_dbapiunicode_cextensions 171480
+test.aaa_profiling.test_orm.SelectInEagerLoadTest.test_round_trip_results 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 178788
 
 # TEST: test.aaa_profiling.test_orm.SessionTest.test_expire_lots
 
 test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mssql_pyodbc_dbapiunicode_cextensions 1141
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mssql_pyodbc_dbapiunicode_nocextensions 1136
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mysql_mysqldb_dbapiunicode_cextensions 1151
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mysql_mysqldb_dbapiunicode_nocextensions 1147
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mssql_pyodbc_dbapiunicode_nocextensions 1125
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mysql_pymysql_dbapiunicode_nocextensions 1146
 test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_oracle_cx_oracle_dbapiunicode_cextensions 1156
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 1142
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1154
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1138
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_dbapiunicode_cextensions 1155
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1140
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 1164
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1142
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1142
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_dbapiunicode_cextensions 1146
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1139
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_mssql_pyodbc_dbapiunicode_cextensions 1232
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_mssql_pyodbc_dbapiunicode_nocextensions 1260
 test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_mysql_mysqldb_dbapiunicode_cextensions 1256
 test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_mysql_mysqldb_dbapiunicode_nocextensions 1258
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_oracle_cx_oracle_dbapiunicode_cextensions 1257
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 1242
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_postgresql_psycopg2_dbapiunicode_cextensions 1255
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 1249
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_sqlite_pysqlite_dbapiunicode_cextensions 1260
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 1267
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_mysql_pymysql_dbapiunicode_cextensions 1241
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_mysql_pymysql_dbapiunicode_nocextensions 1263
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_oracle_cx_oracle_dbapiunicode_cextensions 1287
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 1265
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_postgresql_psycopg2_dbapiunicode_cextensions 1271
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 1274
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_sqlite_pysqlite_dbapiunicode_cextensions 1261
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 1254
 
 # TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect
 
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mssql_pyodbc_dbapiunicode_cextensions 96
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 96
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mysql_mysqldb_dbapiunicode_cextensions 96
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mysql_mysqldb_dbapiunicode_nocextensions 96
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 97
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mysql_pymysql_dbapiunicode_nocextensions 97
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_oracle_cx_oracle_dbapiunicode_cextensions 96
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 96
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 96
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 97
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 97
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 97
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_sqlite_pysqlite_dbapiunicode_cextensions 97
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 97
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mssql_pyodbc_dbapiunicode_cextensions 82
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mssql_pyodbc_dbapiunicode_nocextensions 82
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_mysqldb_dbapiunicode_cextensions 81
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_mysqldb_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_cextensions 81
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_pymysql_dbapiunicode_cextensions 82
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_pymysql_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_cextensions 82
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 82
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_postgresql_psycopg2_dbapiunicode_cextensions 82
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 82
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_sqlite_pysqlite_dbapiunicode_cextensions 82
@@ -599,16 +783,19 @@ test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_sqlite_pysqlit
 
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mssql_pyodbc_dbapiunicode_cextensions 31
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mysql_mysqldb_dbapiunicode_cextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mysql_mysqldb_dbapiunicode_nocextensions 31
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mysql_pymysql_dbapiunicode_nocextensions 31
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_oracle_cx_oracle_dbapiunicode_cextensions 31
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 31
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 31
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 31
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_sqlite_pysqlite_dbapiunicode_cextensions 31
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 31
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mssql_pyodbc_dbapiunicode_cextensions 23
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mssql_pyodbc_dbapiunicode_nocextensions 23
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_mysqldb_dbapiunicode_cextensions 23
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_mysqldb_dbapiunicode_nocextensions 23
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_pymysql_dbapiunicode_cextensions 23
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_pymysql_dbapiunicode_nocextensions 23
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_oracle_cx_oracle_dbapiunicode_cextensions 23
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 23
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_postgresql_psycopg2_dbapiunicode_cextensions 23
@@ -620,8 +807,6 @@ test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_sqlite_pysqli
 
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 2.7_mssql_pyodbc_dbapiunicode_cextensions 8
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 8
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 2.7_mysql_mysqldb_dbapiunicode_cextensions 8
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 2.7_mysql_mysqldb_dbapiunicode_nocextensions 8
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 2.7_oracle_cx_oracle_dbapiunicode_cextensions 8
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 8
 test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 8
@@ -640,23 +825,23 @@ test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect 3.7_sq
 # TEST: test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute
 
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mssql_pyodbc_dbapiunicode_cextensions 47
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mssql_pyodbc_dbapiunicode_nocextensions 51
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mysql_mysqldb_dbapiunicode_cextensions 47
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mysql_mysqldb_dbapiunicode_nocextensions 51
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mssql_pyodbc_dbapiunicode_nocextensions 52
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mysql_pymysql_dbapiunicode_cextensions 47
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mysql_pymysql_dbapiunicode_nocextensions 51
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_mysql_pymysql_dbapiunicode_nocextensions 52
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_oracle_cx_oracle_dbapiunicode_cextensions 47
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 51
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_postgresql_psycopg2_dbapiunicode_cextensions 48
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 52
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_postgresql_psycopg2_dbapiunicode_cextensions 50
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 52
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_sqlite_pysqlite_dbapiunicode_cextensions 48
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_sqlite_pysqlite_dbapiunicode_cextensions 50
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 52
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_mysqldb_dbapiunicode_cextensions 51
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_mysqldb_dbapiunicode_nocextensions 55
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_pymysql_dbapiunicode_cextensions 51
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_pymysql_dbapiunicode_nocextensions 55
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_oracle_cx_oracle_dbapiunicode_cextensions 51
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 55
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mssql_pyodbc_dbapiunicode_cextensions 52
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mssql_pyodbc_dbapiunicode_nocextensions 56
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_mysqldb_dbapiunicode_cextensions 52
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_mysqldb_dbapiunicode_nocextensions 56
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_pymysql_dbapiunicode_cextensions 52
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_mysql_pymysql_dbapiunicode_nocextensions 56
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_oracle_cx_oracle_dbapiunicode_cextensions 52
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 56
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_postgresql_psycopg2_dbapiunicode_cextensions 52
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 56
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute 3.7_sqlite_pysqlite_dbapiunicode_cextensions 52
@@ -665,23 +850,23 @@ test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_connection_execute
 # TEST: test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute
 
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mssql_pyodbc_dbapiunicode_cextensions 86
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mssql_pyodbc_dbapiunicode_nocextensions 90
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mysql_mysqldb_dbapiunicode_cextensions 86
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mysql_mysqldb_dbapiunicode_nocextensions 90
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mssql_pyodbc_dbapiunicode_nocextensions 92
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mysql_pymysql_dbapiunicode_cextensions 86
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mysql_pymysql_dbapiunicode_nocextensions 90
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_mysql_pymysql_dbapiunicode_nocextensions 92
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_oracle_cx_oracle_dbapiunicode_cextensions 86
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 90
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_postgresql_psycopg2_dbapiunicode_cextensions 87
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 92
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_postgresql_psycopg2_dbapiunicode_cextensions 90
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 92
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_sqlite_pysqlite_dbapiunicode_cextensions 88
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_sqlite_pysqlite_dbapiunicode_cextensions 90
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 92
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_mysqldb_dbapiunicode_cextensions 88
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_mysqldb_dbapiunicode_nocextensions 92
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_pymysql_dbapiunicode_cextensions 88
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_pymysql_dbapiunicode_nocextensions 92
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_oracle_cx_oracle_dbapiunicode_cextensions 88
-test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 92
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mssql_pyodbc_dbapiunicode_cextensions 90
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mssql_pyodbc_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_mysqldb_dbapiunicode_cextensions 90
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_mysqldb_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_pymysql_dbapiunicode_cextensions 90
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_mysql_pymysql_dbapiunicode_nocextensions 94
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_oracle_cx_oracle_dbapiunicode_cextensions 90
+test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 94
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_postgresql_psycopg2_dbapiunicode_cextensions 90
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 94
 test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_sqlite_pysqlite_dbapiunicode_cextensions 90
@@ -691,8 +876,6 @@ test.aaa_profiling.test_resultset.ExecutionTest.test_minimal_engine_execute 3.7_
 
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_mssql_pyodbc_dbapiunicode_cextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_mssql_pyodbc_dbapiunicode_nocextensions 15
-test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_mysql_mysqldb_dbapiunicode_cextensions 15
-test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_mysql_mysqldb_dbapiunicode_nocextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_mysql_pymysql_dbapiunicode_cextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_mysql_pymysql_dbapiunicode_nocextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_oracle_cx_oracle_dbapiunicode_cextensions 15
@@ -701,6 +884,8 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_sqlite_pysqlite_dbapiunicode_cextensions 15
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 15
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 3.7_mssql_pyodbc_dbapiunicode_cextensions 16
+test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 3.7_mssql_pyodbc_dbapiunicode_nocextensions 16
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 3.7_mysql_mysqldb_dbapiunicode_cextensions 16
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 3.7_mysql_mysqldb_dbapiunicode_nocextensions 16
 test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 3.7_mysql_pymysql_dbapiunicode_cextensions 16
@@ -715,113 +900,113 @@ test.aaa_profiling.test_resultset.ResultSetTest.test_contains_doesnt_compile 3.7
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string
 
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mssql_pyodbc_dbapiunicode_cextensions 256
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mssql_pyodbc_dbapiunicode_nocextensions 15258
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mysql_mysqldb_dbapiunicode_cextensions 299
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mysql_mysqldb_dbapiunicode_nocextensions 15321
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mssql_pyodbc_dbapiunicode_nocextensions 6260
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mysql_pymysql_dbapiunicode_cextensions 122257
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mysql_pymysql_dbapiunicode_nocextensions 137259
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_mysql_pymysql_dbapiunicode_nocextensions 128259
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_oracle_cx_oracle_dbapiunicode_cextensions 375
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 45417
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_postgresql_psycopg2_dbapiunicode_cextensions 270
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 15293
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_sqlite_pysqlite_dbapiunicode_cextensions 248
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 15270
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mysql_mysqldb_dbapiunicode_cextensions 277
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mysql_mysqldb_dbapiunicode_nocextensions 14281
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36419
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6273
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6293
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_sqlite_pysqlite_dbapiunicode_cextensions 6250
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6270
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mssql_pyodbc_dbapiunicode_cextensions 245
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mssql_pyodbc_dbapiunicode_nocextensions 6249
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mysql_mysqldb_dbapiunicode_cextensions 281
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mysql_mysqldb_dbapiunicode_nocextensions 6285
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mysql_pymysql_dbapiunicode_cextensions 88034
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mysql_pymysql_dbapiunicode_nocextensions 102038
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_oracle_cx_oracle_dbapiunicode_cextensions 322
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 14326
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_mysql_pymysql_dbapiunicode_nocextensions 94038
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_oracle_cx_oracle_dbapiunicode_cextensions 334
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 6338
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_postgresql_psycopg2_dbapiunicode_cextensions 269
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 14273
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6273
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_sqlite_pysqlite_dbapiunicode_cextensions 242
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 14246
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_string 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 6246
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode
 
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mssql_pyodbc_dbapiunicode_cextensions 256
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mssql_pyodbc_dbapiunicode_nocextensions 15258
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mysql_mysqldb_dbapiunicode_cextensions 299
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mysql_mysqldb_dbapiunicode_nocextensions 15321
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mssql_pyodbc_dbapiunicode_nocextensions 6260
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mysql_pymysql_dbapiunicode_cextensions 122257
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mysql_pymysql_dbapiunicode_nocextensions 137259
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_mysql_pymysql_dbapiunicode_nocextensions 128259
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_oracle_cx_oracle_dbapiunicode_cextensions 375
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 45417
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_postgresql_psycopg2_dbapiunicode_cextensions 270
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 15293
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_sqlite_pysqlite_dbapiunicode_cextensions 248
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 15270
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mysql_mysqldb_dbapiunicode_cextensions 277
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mysql_mysqldb_dbapiunicode_nocextensions 14281
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36419
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6273
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6293
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_sqlite_pysqlite_dbapiunicode_cextensions 6250
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6270
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mssql_pyodbc_dbapiunicode_cextensions 245
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mssql_pyodbc_dbapiunicode_nocextensions 6249
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mysql_mysqldb_dbapiunicode_cextensions 281
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mysql_mysqldb_dbapiunicode_nocextensions 6285
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mysql_pymysql_dbapiunicode_cextensions 88034
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mysql_pymysql_dbapiunicode_nocextensions 102038
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_oracle_cx_oracle_dbapiunicode_cextensions 322
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 14326
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_mysql_pymysql_dbapiunicode_nocextensions 94038
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_oracle_cx_oracle_dbapiunicode_cextensions 334
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 6338
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_postgresql_psycopg2_dbapiunicode_cextensions 269
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 14273
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6273
 test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_sqlite_pysqlite_dbapiunicode_cextensions 242
-test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 14246
+test.aaa_profiling.test_resultset.ResultSetTest.test_raw_unicode 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 6246
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_string
 
 test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mssql_pyodbc_dbapiunicode_cextensions 526
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mssql_pyodbc_dbapiunicode_nocextensions 15528
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mysql_mysqldb_dbapiunicode_cextensions 528
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mysql_mysqldb_dbapiunicode_nocextensions 15530
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mssql_pyodbc_dbapiunicode_nocextensions 6520
 test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mysql_pymysql_dbapiunicode_cextensions 122496
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mysql_pymysql_dbapiunicode_nocextensions 137498
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_mysql_pymysql_dbapiunicode_nocextensions 128488
 test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_oracle_cx_oracle_dbapiunicode_cextensions 555
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 45577
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_postgresql_psycopg2_dbapiunicode_cextensions 489
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 15492
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_sqlite_pysqlite_dbapiunicode_cextensions 453
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 15455
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_mysqldb_dbapiunicode_cextensions 530
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_mysqldb_dbapiunicode_nocextensions 14534
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_pymysql_dbapiunicode_cextensions 88288
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_pymysql_dbapiunicode_nocextensions 102292
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_oracle_cx_oracle_dbapiunicode_cextensions 537
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 14541
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_postgresql_psycopg2_dbapiunicode_cextensions 512
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 14516
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_sqlite_pysqlite_dbapiunicode_cextensions 470
-test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 14474
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36569
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6491
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6491
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_sqlite_pysqlite_dbapiunicode_cextensions 6454
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6454
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mssql_pyodbc_dbapiunicode_cextensions 519
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mssql_pyodbc_dbapiunicode_nocextensions 6523
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_mysqldb_dbapiunicode_cextensions 523
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_mysqldb_dbapiunicode_nocextensions 6527
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_pymysql_dbapiunicode_cextensions 88277
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_mysql_pymysql_dbapiunicode_nocextensions 94281
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_oracle_cx_oracle_dbapiunicode_cextensions 538
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 6542
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_postgresql_psycopg2_dbapiunicode_cextensions 511
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6515
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_sqlite_pysqlite_dbapiunicode_cextensions 469
+test.aaa_profiling.test_resultset.ResultSetTest.test_string 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 6473
 
 # TEST: test.aaa_profiling.test_resultset.ResultSetTest.test_unicode
 
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mssql_pyodbc_dbapiunicode_cextensions 526
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mssql_pyodbc_dbapiunicode_nocextensions 15528
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mysql_mysqldb_dbapiunicode_cextensions 528
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mysql_mysqldb_dbapiunicode_nocextensions 15530
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mssql_pyodbc_dbapiunicode_nocextensions 6520
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mysql_pymysql_dbapiunicode_cextensions 122496
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mysql_pymysql_dbapiunicode_nocextensions 137498
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_mysql_pymysql_dbapiunicode_nocextensions 128488
 test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_oracle_cx_oracle_dbapiunicode_cextensions 555
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 45577
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_postgresql_psycopg2_dbapiunicode_cextensions 489
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 15492
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_sqlite_pysqlite_dbapiunicode_cextensions 453
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 15455
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_mysqldb_dbapiunicode_cextensions 530
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_mysqldb_dbapiunicode_nocextensions 14534
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_pymysql_dbapiunicode_cextensions 88288
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_pymysql_dbapiunicode_nocextensions 102292
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_oracle_cx_oracle_dbapiunicode_cextensions 537
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 14541
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_postgresql_psycopg2_dbapiunicode_cextensions 512
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 14516
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_sqlite_pysqlite_dbapiunicode_cextensions 470
-test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 14474
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 36569
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6491
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6491
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_sqlite_pysqlite_dbapiunicode_cextensions 6454
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 6454
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mssql_pyodbc_dbapiunicode_cextensions 519
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mssql_pyodbc_dbapiunicode_nocextensions 6523
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_mysqldb_dbapiunicode_cextensions 523
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_mysqldb_dbapiunicode_nocextensions 6527
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_pymysql_dbapiunicode_cextensions 88277
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_mysql_pymysql_dbapiunicode_nocextensions 94281
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_oracle_cx_oracle_dbapiunicode_cextensions 538
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 6542
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_postgresql_psycopg2_dbapiunicode_cextensions 511
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6515
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_sqlite_pysqlite_dbapiunicode_cextensions 469
+test.aaa_profiling.test_resultset.ResultSetTest.test_unicode 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 6473
 
 # TEST: test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation
 
-test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6472,328,3905,12599,1208,2183,2632
-test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6463,326,4049,13990,1323,2203,2876
-test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 6245,310,3913,12692,1204,2148,2705
-test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6311,310,4041,13956,1314,2167,2917
+test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 6412,322,3969,13151,1340,2187,2770
+test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6429,322,3969,13149,1341,2187,2766
+test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 6177,306,3889,12597,1233,2133,2650
+test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 6260,306,3969,13203,1344,2151,2840
 
 # TEST: test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation
 
-test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 7056,415,7170,18831,1225,2853
-test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 7134,421,7306,19962,1331,2886
-test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 7092,409,7406,19587,1222,2939
-test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 7189,414,7542,20698,1324,2980
+test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_cextensions 7085,420,7205,19938,1345,2846
+test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 7130,423,7229,20001,1346,2864
+test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_cextensions 7090,411,7281,19190,1247,2897
+test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 7186,416,7465,20675,1350,2957
index 7eda0207a2bc48c8c540b6cf1dde6f869eb264fb..cda22a5ac1cf7fd1700f3b17a0771324bf67dcd4 100644 (file)
@@ -4590,7 +4590,9 @@ class ResultMapTest(fixtures.TestBase):
 
         comp = MyCompiler(default.DefaultDialect(), stmt1)
         eq_(
-            ResultMetaData._create_result_map(contexts[stmt2.element][0]),
+            ResultMetaData._create_description_match_map(
+                contexts[stmt2.element][0]
+            ),
             {
                 "otherid": (
                     "otherid",
index 5289ddb77a370675e754bf832a877dbcdafefe59..36d442ed7d922ce76cee1bc6a998309b9e55822a 100644 (file)
@@ -1,4 +1,5 @@
 from contextlib import contextmanager
+import csv
 import operator
 
 from sqlalchemy import CHAR
@@ -24,6 +25,7 @@ from sqlalchemy import util
 from sqlalchemy import VARCHAR
 from sqlalchemy.engine import default
 from sqlalchemy.engine import result as _result
+from sqlalchemy.engine import Row
 from sqlalchemy.testing import assert_raises
 from sqlalchemy.testing import assert_raises_message
 from sqlalchemy.testing import assertions
@@ -32,6 +34,7 @@ from sqlalchemy.testing import eq_
 from sqlalchemy.testing import fixtures
 from sqlalchemy.testing import in_
 from sqlalchemy.testing import is_
+from sqlalchemy.testing import is_true
 from sqlalchemy.testing import le_
 from sqlalchemy.testing import ne_
 from sqlalchemy.testing import not_in_
@@ -39,6 +42,7 @@ from sqlalchemy.testing.mock import Mock
 from sqlalchemy.testing.mock import patch
 from sqlalchemy.testing.schema import Column
 from sqlalchemy.testing.schema import Table
+from sqlalchemy.util import collections_abc
 
 
 class ResultProxyTest(fixtures.TablesTest):
@@ -1043,10 +1047,13 @@ class ResultProxyTest(fixtures.TablesTest):
         eq_(r["_row"], "Hidden row")
 
     def test_nontuple_row(self):
-        """ensure the C version of BaseRowProxy handles
-        duck-type-dependent rows."""
+        """ensure the C version of BaseRow handles
+        duck-type-dependent rows.
 
-        from sqlalchemy.engine import RowProxy
+
+        As of 1.4 they are converted internally to tuples in any case.
+
+        """
 
         class MyList(object):
             def __init__(self, data):
@@ -1058,11 +1065,11 @@ class ResultProxyTest(fixtures.TablesTest):
             def __getitem__(self, i):
                 return list.__getitem__(self.internal_list, i)
 
-        proxy = RowProxy(
+        proxy = Row(
             object(),
-            MyList(["value"]),
             [None],
-            {"key": (None, None, 0), 0: (None, None, 0)},
+            {"key": (0, None, "key"), 0: (0, None, "key")},
+            MyList(["value"]),
         )
         eq_(list(proxy), ["value"])
         eq_(proxy[0], "value")
@@ -1108,20 +1115,25 @@ class ResultProxyTest(fixtures.TablesTest):
             engine.execute(t.delete())
             eq_(len(mock_rowcount.__get__.mock_calls), 2)
 
-    def test_rowproxy_is_sequence(self):
-        from sqlalchemy.util import collections_abc
-        from sqlalchemy.engine import RowProxy
+    def test_row_is_sequence(self):
 
-        row = RowProxy(
+        row = Row(
+            object(), [None], {"key": (None, 0), 0: (None, 0)}, ["value"]
+        )
+        is_true(isinstance(row, collections_abc.Sequence))
+
+    def test_row_is_hashable(self):
+
+        row = Row(
             object(),
-            ["value"],
-            [None],
-            {"key": (None, None, 0), 0: (None, None, 0)},
+            [None, None, None],
+            {"key": (None, 0), 0: (None, 0)},
+            (1, "value", "foo"),
         )
-        assert isinstance(row, collections_abc.Sequence)
+        eq_(hash(row), hash((1, "value", "foo")))
 
     @testing.provide_metadata
-    def test_rowproxy_getitem_indexes_compiled(self):
+    def test_row_getitem_indexes_compiled(self):
         values = Table(
             "rp",
             self.metadata,
@@ -1141,7 +1153,7 @@ class ResultProxyTest(fixtures.TablesTest):
         eq_(row[1:0:-1], ("Uno",))
 
     @testing.only_on("sqlite")
-    def test_rowproxy_getitem_indexes_raw(self):
+    def test_row_getitem_indexes_raw(self):
         row = testing.db.execute("select 'One' as key, 'Uno' as value").first()
         eq_(row["key"], "One")
         eq_(row["value"], "Uno")
@@ -1153,7 +1165,6 @@ class ResultProxyTest(fixtures.TablesTest):
 
     @testing.requires.cextensions
     def test_row_c_sequence_check(self):
-        import csv
 
         metadata = MetaData()
         metadata.bind = "sqlite://"