summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-04-07 14:18:22 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2017-04-13 14:22:59 -0400
commitb7644319e85ce38c1a576802317a9058a6aed82d (patch)
tree12db3074d79d0c54deb247a7e79424312e183cf3 /test
parent755da1797432ee98dd3d1d309026a21529b45f75 (diff)
downloadsqlalchemy-b7644319e85ce38c1a576802317a9058a6aed82d.tar.gz
Use baked lazyloading by default
The ``lazy="select"`` loader strategy now makes used of the :class:`.BakedQuery` query caching system in all cases. This removes most overhead of generating a :class:`.Query` object and running it into a :func:`.select` and then string SQL statement from the process of lazy-loading related collections and objects. The "baked" lazy loader has also been improved such that it can now cache in most cases where query load options are used. Change-Id: Ic96792fffaa045ae9aa0a4657d6d29235d3efb85 Fixes: #3954
Diffstat (limited to 'test')
-rw-r--r--test/aaa_profiling/test_memusage.py3
-rw-r--r--test/ext/test_baked.py255
-rw-r--r--test/orm/test_options.py399
-rw-r--r--test/profiles.txt174
4 files changed, 598 insertions, 233 deletions
diff --git a/test/aaa_profiling/test_memusage.py b/test/aaa_profiling/test_memusage.py
index e038d5c38..4a378d77d 100644
--- a/test/aaa_profiling/test_memusage.py
+++ b/test/aaa_profiling/test_memusage.py
@@ -263,7 +263,8 @@ class MemUsageWBackendTest(EnsureZeroed):
del sessmaker
go()
- @testing.emits_warning("Compiled statement cache for.*")
+ @testing.emits_warning("Compiled statement cache for mapper.*")
+ @testing.emits_warning("Compiled statement cache for lazy loader.*")
@testing.crashes('sqlite', ':memory: connection not suitable here')
def test_orm_many_engines(self):
metadata = MetaData(self.engine)
diff --git a/test/ext/test_baked.py b/test/ext/test_baked.py
index a5eb31495..263a1bb6c 100644
--- a/test/ext/test_baked.py
+++ b/test/ext/test_baked.py
@@ -1,10 +1,12 @@
from sqlalchemy.orm import Session, subqueryload, \
- mapper, relationship, lazyload, clear_mappers, backref
+ mapper, relationship, lazyload, clear_mappers, backref, aliased, \
+ Load, defaultload
from sqlalchemy.testing import eq_, is_, is_not_
from sqlalchemy.testing import assert_raises, assert_raises_message
from sqlalchemy import testing
+from sqlalchemy import inspect
from test.orm import _fixtures
-from sqlalchemy.ext.baked import BakedQuery, baked_lazyload, BakedLazyLoader
+from sqlalchemy.ext.baked import BakedQuery
from sqlalchemy.ext import baked
from sqlalchemy import bindparam, func, literal_column
from sqlalchemy.orm import exc as orm_exc
@@ -719,6 +721,22 @@ class LazyLoaderTest(testing.AssertsCompiledSQL, BakedTest):
mapper(Address, self.tables.addresses)
return User, Address
+ def _o2m_twolevel_fixture(self, lazy="select", **kw):
+ User = self.classes.User
+ Address = self.classes.Address
+ Dingaling = self.classes.Dingaling
+
+ mapper(User, self.tables.users, properties={
+ 'addresses': relationship(
+ Address, order_by=self.tables.addresses.c.id,
+ lazy=lazy, **kw)
+ })
+ mapper(Address, self.tables.addresses, properties={
+ "dingalings": relationship(Dingaling, lazy=lazy)
+ })
+ mapper(Dingaling, self.tables.dingalings)
+ return User, Address, Dingaling
+
def _m2o_fixture(self):
User = self.classes.User
Address = self.classes.Address
@@ -729,124 +747,81 @@ class LazyLoaderTest(testing.AssertsCompiledSQL, BakedTest):
})
return User, Address
- def test_strategy_lookup(self):
- """test that the lazy loader strategies aren't getting mixed up
- with BakedLazyLoader as a subclass.
-
- """
- User, Address = self._o2m_fixture()
-
- ll = User.addresses.property._get_strategy((('lazy', 'select'),))
- assert not isinstance(ll, BakedLazyLoader)
- eq_(ll._strategy_keys, [(('lazy', 'select'),), (('lazy', True),)])
-
- ll = User.addresses.property._get_strategy((('lazy', True),))
- assert not isinstance(ll, BakedLazyLoader)
- eq_(ll._strategy_keys, [(('lazy', 'select'),), (('lazy', True),)])
-
- bl = User.addresses.property._get_strategy((('lazy', 'baked_select'),))
- assert isinstance(bl, BakedLazyLoader)
- eq_(bl._strategy_keys, [(('lazy', 'baked_select'),)])
-
- def test_invocation_per_state(self):
- """test that BakedLazyLoader is getting invoked with the
- baked_lazyload() loader.
-
- """
- User, Address = self._o2m_fixture()
-
- sess = Session()
- q = sess.query(User)
-
- with mock.patch.object(BakedLazyLoader, "_emit_lazyload") as el:
- u1 = q.first()
- u1.addresses
- # not invoked
- eq_(el.mock_calls, [])
-
- sess = Session()
- q = sess.query(User).options(baked_lazyload(User.addresses))
- with mock.patch.object(BakedLazyLoader, "_emit_lazyload") as el:
- u1 = q.first()
- u1.addresses
- # invoked
- is_(
- el.mock_calls[0][1][1],
- u1._sa_instance_state
- )
-
- def test_invocation_per_mapper(self):
- """test that BakedLazyLoader is getting invoked with the
- "baked_select" lazy setting.
-
- """
- User, Address = self._o2m_fixture(lazy="baked_select")
+ def test_unsafe_unbound_option_cancels_bake(self):
+ User, Address, Dingaling = self._o2m_twolevel_fixture(lazy="joined")
- sess = Session()
- q = sess.query(User).options(lazyload(User.addresses))
-
- with mock.patch.object(BakedLazyLoader, "_emit_lazyload") as el:
- u1 = q.first()
- u1.addresses
- # not invoked
- eq_(el.mock_calls, [])
-
- sess = Session()
- q = sess.query(User)
- with mock.patch.object(BakedLazyLoader, "_emit_lazyload") as el:
- u1 = q.first()
- u1.addresses
- # invoked
- is_(
- el.mock_calls[0][1][1],
- u1._sa_instance_state
- )
-
- def test_systemwide_loaders_loadable_via_lazyloader(self):
- from sqlalchemy.orm import configure_mappers
-
- baked.bake_lazy_loaders()
- try:
- User, Address = self._o2m_fixture(lazy='joined')
-
- configure_mappers()
-
- is_(
- User.addresses.property.
- _get_strategy((('lazy', 'select'), )).__class__,
- BakedLazyLoader
- )
- finally:
- baked.unbake_lazy_loaders()
-
- def test_invocation_systemwide_loaders(self):
- baked.bake_lazy_loaders()
- try:
- User, Address = self._o2m_fixture()
+ class SubDingaling(Dingaling):
+ pass
+ mapper(SubDingaling, None, inherits=Dingaling)
+ lru = Address.dingalings.property._lazy_strategy._bakery(
+ lambda q: None)._bakery
+ l1 = len(lru)
+ for i in range(5):
sess = Session()
- q = sess.query(User).options(lazyload(User.addresses))
- with mock.patch.object(BakedLazyLoader, "_emit_lazyload") as el:
- u1 = q.first()
- u1.addresses
- # invoked
- is_(
- el.mock_calls[0][1][1],
- u1._sa_instance_state
- )
- finally:
- baked.unbake_lazy_loaders()
-
- clear_mappers()
- User, Address = self._o2m_fixture()
- sess = Session()
- q = sess.query(User).options(lazyload(User.addresses))
+ u1 = sess.query(User).options(
+ defaultload(User.addresses).lazyload(
+ Address.dingalings.of_type(aliased(SubDingaling)))).first()
+ for ad in u1.addresses:
+ ad.dingalings
+ l2 = len(lru)
+ eq_(l1, 0)
+ eq_(l2, 1)
+
+ def test_unsafe_bound_option_cancels_bake(self):
+ User, Address, Dingaling = self._o2m_twolevel_fixture(lazy="joined")
+
+ class SubDingaling(Dingaling):
+ pass
+ mapper(SubDingaling, None, inherits=Dingaling)
- with mock.patch.object(BakedLazyLoader, "_emit_lazyload") as el:
- u1 = q.first()
- u1.addresses
- # not invoked
- eq_(el.mock_calls, [])
+ lru = Address.dingalings.property._lazy_strategy._bakery(
+ lambda q: None)._bakery
+ l1 = len(lru)
+ for i in range(5):
+ sess = Session()
+ u1 = sess.query(User).options(
+ Load(User).defaultload(User.addresses).lazyload(
+ Address.dingalings.of_type(aliased(SubDingaling)))).first()
+ for ad in u1.addresses:
+ ad.dingalings
+ l2 = len(lru)
+ eq_(l1, 0)
+ eq_(l2, 1)
+
+ def test_safe_unbound_option_allows_bake(self):
+ User, Address, Dingaling = self._o2m_twolevel_fixture(lazy="joined")
+
+ lru = Address.dingalings.property._lazy_strategy._bakery(
+ lambda q: None)._bakery
+ l1 = len(lru)
+ for i in range(5):
+ sess = Session()
+ u1 = sess.query(User).options(
+ defaultload(User.addresses).lazyload(
+ Address.dingalings)).first()
+ for ad in u1.addresses:
+ ad.dingalings
+ l2 = len(lru)
+ eq_(l1, 0)
+ eq_(l2, 2)
+
+ def test_safe_bound_option_allows_bake(self):
+ User, Address, Dingaling = self._o2m_twolevel_fixture(lazy="joined")
+
+ lru = Address.dingalings.property._lazy_strategy._bakery(
+ lambda q: None)._bakery
+ l1 = len(lru)
+ for i in range(5):
+ sess = Session()
+ u1 = sess.query(User).options(
+ Load(User).defaultload(User.addresses).lazyload(
+ Address.dingalings)).first()
+ for ad in u1.addresses:
+ ad.dingalings
+ l2 = len(lru)
+ eq_(l1, 0)
+ eq_(l2, 2)
def test_baked_lazy_loading_relationship_flag_true(self):
self._test_baked_lazy_loading_relationship_flag(True)
@@ -855,37 +830,33 @@ class LazyLoaderTest(testing.AssertsCompiledSQL, BakedTest):
self._test_baked_lazy_loading_relationship_flag(False)
def _test_baked_lazy_loading_relationship_flag(self, flag):
- baked.bake_lazy_loaders()
- try:
- User, Address = self._o2m_fixture(bake_queries=flag)
+ User, Address = self._o2m_fixture(bake_queries=flag)
- sess = Session()
- u1 = sess.query(User).first()
+ sess = Session()
+ u1 = sess.query(User).first()
- from sqlalchemy.orm import Query
+ from sqlalchemy.orm import Query
- canary = mock.Mock()
+ canary = mock.Mock()
- # I would think Mock can do this but apparently
- # it cannot (wrap / autospec don't work together)
- real_compile_context = Query._compile_context
+ # I would think Mock can do this but apparently
+ # it cannot (wrap / autospec don't work together)
+ real_compile_context = Query._compile_context
- def _my_compile_context(*arg, **kw):
- if arg[0].column_descriptions[0]['entity'] is Address:
- canary()
- return real_compile_context(*arg, **kw)
+ def _my_compile_context(*arg, **kw):
+ if arg[0].column_descriptions[0]['entity'] is Address:
+ canary()
+ return real_compile_context(*arg, **kw)
- with mock.patch.object(
- Query,
- "_compile_context",
- _my_compile_context
- ):
- u1.addresses
+ with mock.patch.object(
+ Query,
+ "_compile_context",
+ _my_compile_context
+ ):
+ u1.addresses
- sess.expire(u1)
- u1.addresses
- finally:
- baked.unbake_lazy_loaders()
+ sess.expire(u1)
+ u1.addresses
if flag:
eq_(canary.call_count, 1)
@@ -907,7 +878,7 @@ class LazyLoaderTest(testing.AssertsCompiledSQL, BakedTest):
lambda s: s.query(User))
if set_option:
- base_bq += lambda q: q.options(baked_lazyload(User.addresses))
+ base_bq += lambda q: q.options(lazyload(User.addresses))
base_bq += lambda q: q.order_by(User.id)
@@ -965,7 +936,7 @@ class LazyLoaderTest(testing.AssertsCompiledSQL, BakedTest):
base_bq = self.bakery(
lambda s: s.query(Address))
- base_bq += lambda q: q.options(baked_lazyload(Address.user))
+ base_bq += lambda q: q.options(lazyload(Address.user))
base_bq += lambda q: q.order_by(Address.id)
assert_result = self.static.address_user_result
diff --git a/test/orm/test_options.py b/test/orm/test_options.py
index b7c574e2a..e29a63e08 100644
--- a/test/orm/test_options.py
+++ b/test/orm/test_options.py
@@ -2,7 +2,7 @@ from sqlalchemy import inspect
from sqlalchemy.orm import attributes, mapper, relationship, backref, \
configure_mappers, create_session, synonym, Session, class_mapper, \
aliased, column_property, joinedload_all, joinedload, Query,\
- util as orm_util, Load, defer
+ util as orm_util, Load, defer, defaultload
from sqlalchemy.orm.query import QueryContext
from sqlalchemy.orm import strategy_options
import sqlalchemy as sa
@@ -20,6 +20,11 @@ class QueryTest(_fixtures.FixtureTest):
def setup_mappers(cls):
cls._setup_stock_mapping()
+ class SubItem(cls.classes.Item):
+ pass
+
+ mapper(SubItem, None, inherits=cls.classes.Item)
+
class PathTest(object):
def _make_path(self, path):
@@ -42,7 +47,9 @@ class PathTest(object):
attr = {}
for val in opt._to_bind:
- val._bind_loader(q, attr, False)
+ val._bind_loader(
+ [ent.entity_zero for ent in q._mapper_entities],
+ q._current_path, attr, False)
assert_paths = [k[1] for k in attr]
eq_(
@@ -868,7 +875,9 @@ class LocalOptsTest(PathTest, QueryTest):
for opt in opts:
if isinstance(opt, strategy_options._UnboundLoad):
for tb in opt._to_bind:
- tb._bind_loader(query, attr, False)
+ tb._bind_loader(
+ [ent.entity_zero for ent in query._mapper_entities],
+ query._current_path, attr, False)
else:
attr.update(opt.context)
@@ -951,3 +960,387 @@ class LocalOptsTest(PathTest, QueryTest):
),
]
self._assert_attrs(opts, {"foo": "bar", "bat": "hoho"})
+
+
+class CacheKeyTest(PathTest, QueryTest):
+
+ run_create_tables = False
+ run_inserts = None
+ run_deletes = None
+
+ def test_unbound_cache_key_included_safe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders"])
+
+ opt = joinedload(User.orders).joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ ((Order, 'items', Item, ('lazy', 'joined')),)
+ )
+ )
+
+ def test_bound_cache_key_included_safe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders"])
+
+ opt = Load(User).joinedload(User.orders).joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ ((Order, 'items', Item, ('lazy', 'joined')),)
+ )
+ )
+
+ def test_unbound_cache_key_excluded_on_other(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry(
+ [User, "addresses"])
+
+ opt = joinedload(User.orders).joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
+ def test_bound_cache_key_excluded_on_other(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry(
+ [User, "addresses"])
+
+ opt = Load(User).joinedload(User.orders).joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
+ def test_unbound_cache_key_excluded_on_aliased(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ # query of:
+ #
+ # query(User).options(
+ # joinedload(aliased(User).orders).joinedload(Order.items))
+ #
+ # we are lazy loading Order objects from User.orders
+ # the path excludes our option so cache key should
+ # be None
+
+ query_path = self._make_path_registry(
+ [User, "orders"])
+
+ opt = joinedload(aliased(User).orders).joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
+ def test_unbound_cache_key_included_of_type_safe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders"])
+
+ opt = joinedload(User.orders).joinedload(Order.items.of_type(SubItem))
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ (Order, 'items', SubItem, ('lazy', 'joined')),
+ )
+ )
+
+ def test_bound_cache_key_included_of_type_safe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders"])
+
+ opt = Load(User).joinedload(User.orders).\
+ joinedload(Order.items.of_type(SubItem))
+
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ (Order, 'items', SubItem, ('lazy', 'joined')),
+ )
+ )
+
+ def test_unbound_cache_key_included_unsafe_option_one(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders"])
+
+ opt = joinedload(User.orders).\
+ joinedload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+ def test_unbound_cache_key_included_unsafe_option_two(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders", Order])
+
+ opt = joinedload(User.orders).\
+ joinedload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+ def test_unbound_cache_key_included_unsafe_option_three(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders", Order, "items"])
+
+ opt = joinedload(User.orders).\
+ joinedload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+ def test_unbound_cache_key_included_unsafe_query(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ au = aliased(User)
+ query_path = self._make_path_registry([inspect(au), "orders"])
+
+ opt = joinedload(au.orders).\
+ joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+ def test_unbound_cache_key_included_safe_w_deferred(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = joinedload(User.addresses).\
+ defer(Address.email_address).defer(Address.user_id)
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ (
+ Address, "email_address",
+ ('deferred', True),
+ ('instrument', True)
+ ),
+ (
+ Address, "user_id",
+ ('deferred', True),
+ ('instrument', True)
+ ),
+ )
+ )
+
+ def test_bound_cache_key_included_safe_w_deferred(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = Load(User).joinedload(User.addresses).\
+ defer(Address.email_address).defer(Address.user_id)
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ (
+ Address, "email_address",
+ ('deferred', True),
+ ('instrument', True)
+ ),
+ (
+ Address, "user_id",
+ ('deferred', True),
+ ('instrument', True)
+ ),
+ )
+ )
+
+ def test_unbound_cache_key_included_safe_w_option(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ opt = defaultload("orders").joinedload(
+ "items", innerjoin=True).defer("description")
+ query_path = self._make_path_registry([User, "orders"])
+
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ (Order, 'items', Item,
+ ('lazy', 'joined'), ('innerjoin', True)),
+ (Order, 'items', Item, 'description',
+ ('deferred', True), ('instrument', True))
+ )
+ )
+
+ def test_bound_cache_key_excluded_on_aliased(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry(
+ [User, "orders"])
+
+ au = aliased(User)
+ opt = Load(au).joinedload(au.orders).joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
+ def test_bound_cache_key_included_unsafe_option_one(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders"])
+
+ opt = Load(User).joinedload(User.orders).\
+ joinedload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+ def test_bound_cache_key_included_unsafe_option_two(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders", Order])
+
+ opt = Load(User).joinedload(User.orders).\
+ joinedload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+ def test_bound_cache_key_included_unsafe_option_three(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "orders", Order, "items"])
+
+ opt = Load(User).joinedload(User.orders).\
+ joinedload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+ def test_bound_cache_key_included_unsafe_query(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ au = aliased(User)
+ query_path = self._make_path_registry([inspect(au), "orders"])
+
+ opt = Load(au).joinedload(au.orders).\
+ joinedload(Order.items)
+ eq_(
+ opt._generate_cache_key(query_path),
+ False
+ )
+
+
+ def test_bound_cache_key_included_safe_w_option(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ opt = Load(User).defaultload("orders").joinedload(
+ "items", innerjoin=True).defer("description")
+ query_path = self._make_path_registry([User, "orders"])
+
+ eq_(
+ opt._generate_cache_key(query_path),
+ (
+ (Order, 'items', Item,
+ ('lazy', 'joined'), ('innerjoin', True)),
+ (Order, 'items', Item, 'description',
+ ('deferred', True), ('instrument', True))
+ )
+ )
+
+ def test_unbound_cache_key_included_safe_w_loadonly_strs(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = defaultload(User.addresses).load_only("id", "email_address")
+ eq_(
+ opt._generate_cache_key(query_path),
+
+ (
+ (Address, 'id',
+ ('deferred', False), ('instrument', True)),
+ (Address, 'email_address',
+ ('deferred', False), ('instrument', True)),
+ (Address, 'column:*',
+ ('deferred', True), ('instrument', True),
+ ('undefer_pks', True))
+ )
+ )
+
+ def test_unbound_cache_key_included_safe_w_loadonly_props(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = defaultload(User.addresses).load_only(
+ Address.id, Address.email_address)
+ eq_(
+ opt._generate_cache_key(query_path),
+
+ (
+ (Address, 'id',
+ ('deferred', False), ('instrument', True)),
+ (Address, 'email_address',
+ ('deferred', False), ('instrument', True)),
+ (Address, 'column:*',
+ ('deferred', True), ('instrument', True),
+ ('undefer_pks', True))
+ )
+ )
+
+ def test_bound_cache_key_included_safe_w_loadonly(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = Load(User).defaultload(User.addresses).\
+ load_only("id", "email_address")
+ eq_(
+ opt._generate_cache_key(query_path),
+
+ (
+ (Address, 'id',
+ ('deferred', False), ('instrument', True)),
+ (Address, 'email_address',
+ ('deferred', False), ('instrument', True)),
+ (Address, 'column:*',
+ ('deferred', True), ('instrument', True),
+ ('undefer_pks', True))
+ )
+ )
+
diff --git a/test/profiles.txt b/test/profiles.txt
index 720c26b80..8af5f9b1b 100644
--- a/test/profiles.txt
+++ b/test/profiles.txt
@@ -211,60 +211,60 @@ test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline 3.5_sqlite_pysqlite_d
# TEST: test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mysql_mysqldb_dbapiunicode_cextensions 23231
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mysql_mysqldb_dbapiunicode_nocextensions 26236
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_cextensions 23198
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 26203
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_cextensions 23175
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26180
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mysql_mysqldb_dbapiunicode_cextensions 23237
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_mysql_mysqldb_dbapiunicode_nocextensions 26242
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_cextensions 23204
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 26209
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_cextensions 23181
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 26186
test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.4_mysql_mysqldb_dbapiunicode_cextensions 24260
test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.4_mysql_mysqldb_dbapiunicode_nocextensions 27267
test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.4_postgresql_psycopg2_dbapiunicode_cextensions 24225
test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.4_postgresql_psycopg2_dbapiunicode_nocextensions 27232
test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.4_sqlite_pysqlite_dbapiunicode_cextensions 24211
test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.4_sqlite_pysqlite_dbapiunicode_nocextensions 27218
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_mysql_mysqldb_dbapiunicode_cextensions 24253
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_mysql_mysqldb_dbapiunicode_nocextensions 27260
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_postgresql_psycopg2_dbapiunicode_cextensions 24222
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 27229
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_sqlite_pysqlite_dbapiunicode_cextensions 24204
-test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 27211
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_mysql_mysqldb_dbapiunicode_cextensions 24259
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_mysql_mysqldb_dbapiunicode_nocextensions 27266
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_postgresql_psycopg2_dbapiunicode_cextensions 24228
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 27235
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_sqlite_pysqlite_dbapiunicode_cextensions 24210
+test.aaa_profiling.test_orm.DeferOptionsTest.test_defer_many_cols 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 27217
# TEST: test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_mysql_mysqldb_dbapiunicode_cextensions 406489
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_mysql_mysqldb_dbapiunicode_nocextensions 406475
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_cextensions 406489
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 406468
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_cextensions 406482
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 406482
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_mysql_mysqldb_dbapiunicode_cextensions 413452
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_mysql_mysqldb_dbapiunicode_nocextensions 413431
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_cextensions 413445
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 413438
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_cextensions 413438
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 413438
test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.4_mysql_mysqldb_dbapiunicode_cextensions 532398
test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.4_mysql_mysqldb_dbapiunicode_nocextensions 532398
test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.4_postgresql_psycopg2_dbapiunicode_cextensions 532398
test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.4_postgresql_psycopg2_dbapiunicode_nocextensions 532398
test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.4_sqlite_pysqlite_dbapiunicode_cextensions 532398
test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.4_sqlite_pysqlite_dbapiunicode_nocextensions 532398
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_mysql_mysqldb_dbapiunicode_cextensions 434497
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_mysql_mysqldb_dbapiunicode_nocextensions 434504
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_postgresql_psycopg2_dbapiunicode_cextensions 434504
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 434490
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_sqlite_pysqlite_dbapiunicode_cextensions 434497
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 434504
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_mysql_mysqldb_dbapiunicode_cextensions 440781
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_mysql_mysqldb_dbapiunicode_nocextensions 440774
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_postgresql_psycopg2_dbapiunicode_cextensions 440774
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 440781
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_sqlite_pysqlite_dbapiunicode_cextensions 440788
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_build_query 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 440781
# TEST: test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_mysql_mysqldb_dbapiunicode_cextensions 567666
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_mysql_mysqldb_dbapiunicode_nocextensions 580466
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_cextensions 578324
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 591124
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_cextensions 557938
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 570738
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_mysql_mysqldb_dbapiunicode_cextensions 570849
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_mysql_mysqldb_dbapiunicode_nocextensions 583849
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_postgresql_psycopg2_dbapiunicode_cextensions 598107
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 611107
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_sqlite_pysqlite_dbapiunicode_cextensions 562621
-test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 575621
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_mysql_mysqldb_dbapiunicode_cextensions 567786
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_mysql_mysqldb_dbapiunicode_nocextensions 580586
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_cextensions 578444
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 591244
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_cextensions 558058
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 570760
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_mysql_mysqldb_dbapiunicode_cextensions 570897
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_mysql_mysqldb_dbapiunicode_nocextensions 583897
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_postgresql_psycopg2_dbapiunicode_cextensions 598155
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 611155
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_sqlite_pysqlite_dbapiunicode_cextensions 562571
+test.aaa_profiling.test_orm.JoinedEagerLoadTest.test_fetch_results 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 575669
# TEST: test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_identity
@@ -289,66 +289,66 @@ 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_mysql_mysqldb_dbapiunicode_cextensions 137052
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_mysql_mysqldb_dbapiunicode_nocextensions 139302
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_postgresql_psycopg2_dbapiunicode_cextensions 127552
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 129802
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_cextensions 125302
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 127552
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_mysql_mysqldb_dbapiunicode_cextensions 94694
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_mysql_mysqldb_dbapiunicode_nocextensions 96493
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_postgresql_psycopg2_dbapiunicode_cextensions 85692
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 87444
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_cextensions 83193
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 84945
test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.4_mysql_mysqldb_dbapiunicode_cextensions 143106
test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.4_mysql_mysqldb_dbapiunicode_nocextensions 145856
test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.4_postgresql_psycopg2_dbapiunicode_cextensions 133056
test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.4_postgresql_psycopg2_dbapiunicode_nocextensions 135806
test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.4_sqlite_pysqlite_dbapiunicode_cextensions 131306
test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.4_sqlite_pysqlite_dbapiunicode_nocextensions 134056
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_mysql_mysqldb_dbapiunicode_cextensions 143054
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_mysql_mysqldb_dbapiunicode_nocextensions 145854
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_postgresql_psycopg2_dbapiunicode_cextensions 134604
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 137304
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_sqlite_pysqlite_dbapiunicode_cextensions 131304
-test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 134054
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_mysql_mysqldb_dbapiunicode_cextensions 97011
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_mysql_mysqldb_dbapiunicode_nocextensions 98765
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_postgresql_psycopg2_dbapiunicode_cextensions 89009
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 90763
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_sqlite_pysqlite_dbapiunicode_cextensions 85510
+test.aaa_profiling.test_orm.LoadManyToOneFromIdentityTest.test_many_to_one_load_no_identity 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 87264
# 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_mysql_mysqldb_dbapiunicode_cextensions 19549
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_mysql_mysqldb_dbapiunicode_nocextensions 19797
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_postgresql_psycopg2_dbapiunicode_cextensions 19028
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 19264
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_cextensions 18904
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 19122
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_mysql_mysqldb_dbapiunicode_cextensions 18601
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_mysql_mysqldb_dbapiunicode_nocextensions 18872
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_postgresql_psycopg2_dbapiunicode_cextensions 18080
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 18257
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_cextensions 17950
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 18126
test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.4_mysql_mysqldb_dbapiunicode_cextensions 20210
test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.4_mysql_mysqldb_dbapiunicode_nocextensions 20428
test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.4_postgresql_psycopg2_dbapiunicode_cextensions 19528
test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.4_postgresql_psycopg2_dbapiunicode_nocextensions 19834
test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.4_sqlite_pysqlite_dbapiunicode_cextensions 19494
test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.4_sqlite_pysqlite_dbapiunicode_nocextensions 19700
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_mysql_mysqldb_dbapiunicode_cextensions 20152
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_mysql_mysqldb_dbapiunicode_nocextensions 20465
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_postgresql_psycopg2_dbapiunicode_cextensions 19641
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 19921
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_sqlite_pysqlite_dbapiunicode_cextensions 19412
-test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 19687
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_mysql_mysqldb_dbapiunicode_cextensions 19155
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_mysql_mysqldb_dbapiunicode_nocextensions 19399
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_postgresql_psycopg2_dbapiunicode_cextensions 18573
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 18805
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_sqlite_pysqlite_dbapiunicode_cextensions 18382
+test.aaa_profiling.test_orm.MergeBackrefsTest.test_merge_pending_with_all_pks 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 18627
# TEST: test.aaa_profiling.test_orm.MergeTest.test_merge_load
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mysql_mysqldb_dbapiunicode_cextensions 1446
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mysql_mysqldb_dbapiunicode_nocextensions 1465
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1330
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1349
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_cextensions 1213
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1231
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mysql_mysqldb_dbapiunicode_cextensions 1190
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_mysql_mysqldb_dbapiunicode_nocextensions 1207
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1083
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1100
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_cextensions 958
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 975
test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.4_mysql_mysqldb_dbapiunicode_cextensions 1494
test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.4_mysql_mysqldb_dbapiunicode_nocextensions 1517
test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.4_postgresql_psycopg2_dbapiunicode_cextensions 1365
test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.4_postgresql_psycopg2_dbapiunicode_nocextensions 1388
test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.4_sqlite_pysqlite_dbapiunicode_cextensions 1257
test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.4_sqlite_pysqlite_dbapiunicode_nocextensions 1280
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_mysql_mysqldb_dbapiunicode_cextensions 1495
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_mysql_mysqldb_dbapiunicode_nocextensions 1519
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_postgresql_psycopg2_dbapiunicode_cextensions 1375
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 1398
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_sqlite_pysqlite_dbapiunicode_cextensions 1256
-test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 1280
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_mysql_mysqldb_dbapiunicode_cextensions 1226
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_mysql_mysqldb_dbapiunicode_nocextensions 1245
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_postgresql_psycopg2_dbapiunicode_cextensions 1114
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 1133
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_sqlite_pysqlite_dbapiunicode_cextensions 988
+test.aaa_profiling.test_orm.MergeTest.test_merge_load 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 1007
# TEST: test.aaa_profiling.test_orm.MergeTest.test_merge_no_load
@@ -390,28 +390,28 @@ test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.5_mysql_mysqldb_dbapiuni
test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.5_postgresql_psycopg2_dbapiunicode_cextensions 6324
test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 6894
test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.5_sqlite_pysqlite_dbapiunicode_cextensions 6096
-test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 6756
+test.aaa_profiling.test_orm.QueryTest.test_query_cols 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 6666
# TEST: test.aaa_profiling.test_orm.SessionTest.test_expire_lots
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mysql_mysqldb_dbapiunicode_cextensions 1147
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mysql_mysqldb_dbapiunicode_nocextensions 1152
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1148
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1134
-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 1152
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mysql_mysqldb_dbapiunicode_cextensions 1138
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_mysql_mysqldb_dbapiunicode_nocextensions 1156
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_cextensions 1147
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 1140
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_dbapiunicode_cextensions 1154
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 1168
test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.4_mysql_mysqldb_dbapiunicode_cextensions 1256
test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.4_mysql_mysqldb_dbapiunicode_nocextensions 1252
test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.4_postgresql_psycopg2_dbapiunicode_cextensions 1235
test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.4_postgresql_psycopg2_dbapiunicode_nocextensions 1278
test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.4_sqlite_pysqlite_dbapiunicode_cextensions 1258
test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.4_sqlite_pysqlite_dbapiunicode_nocextensions 1252
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_mysql_mysqldb_dbapiunicode_cextensions 1264
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_mysql_mysqldb_dbapiunicode_nocextensions 1254
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_postgresql_psycopg2_dbapiunicode_cextensions 1250
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 1265
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_sqlite_pysqlite_dbapiunicode_cextensions 1235
-test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 1242
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_mysql_mysqldb_dbapiunicode_cextensions 1302
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_mysql_mysqldb_dbapiunicode_nocextensions 1258
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_postgresql_psycopg2_dbapiunicode_cextensions 1257
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 1259
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_sqlite_pysqlite_dbapiunicode_cextensions 1286
+test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.5_sqlite_pysqlite_dbapiunicode_nocextensions 1251
# TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect
@@ -623,8 +623,8 @@ test.aaa_profiling.test_zoomark.ZooMarkTest.test_invocation 3.5_postgresql_psyco
# 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 6462,410,6777,17745,1170,2657
-test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6552,415,6897,18814,1276,2692
+test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 6558,415,6897,18814,1276,2692
test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.4_postgresql_psycopg2_dbapiunicode_cextensions 6430,401,6925,18147,1169,2705
test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.4_postgresql_psycopg2_dbapiunicode_nocextensions 6520,406,7061,19258,1271,2746
-test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.5_postgresql_psycopg2_dbapiunicode_cextensions 6430,401,6909,18147,1169,2705
+test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.5_postgresql_psycopg2_dbapiunicode_cextensions 6435,401,6909,18147,1169,2705
test.aaa_profiling.test_zoomark_orm.ZooMarkTest.test_invocation 3.5_postgresql_psycopg2_dbapiunicode_nocextensions 6527,406,7045,19258,1271,2746