summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-10-24 16:38:07 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-10-24 16:38:07 +0000
commit52b1ace6768a7f00b411d5f8b86ad8d1f84666b8 (patch)
tree844505a47a826b9d37a8717d2b59215493916452 /test
parent2e8b1639f82547b1f6ba3a14aa9bfeb7b505cb91 (diff)
downloadsqlalchemy-52b1ace6768a7f00b411d5f8b86ad8d1f84666b8.tar.gz
- ResultProxy internals have been overhauled to greatly reduce
method call counts when fetching columns that have no type-level processing applied. Provides a 100% speed improvement when fetching large result sets with no unicode conversion. Many thanks to Elixir's Gaƫtan de Menten for this dramatic improvement ! [ticket:1586]
Diffstat (limited to 'test')
-rw-r--r--test/aaa_profiling/test_resultset.py39
-rw-r--r--test/sql/test_query.py19
2 files changed, 57 insertions, 1 deletions
diff --git a/test/aaa_profiling/test_resultset.py b/test/aaa_profiling/test_resultset.py
new file mode 100644
index 000000000..d67f9560c
--- /dev/null
+++ b/test/aaa_profiling/test_resultset.py
@@ -0,0 +1,39 @@
+from sqlalchemy import *
+from sqlalchemy.test import *
+
+NUM_FIELDS = 10
+NUM_RECORDS = 1000
+
+class ResultSetTest(TestBase, AssertsExecutionResults):
+ __only_on__ = 'sqlite'
+
+ @classmethod
+ def setup_class(cls):
+ global t, t2, metadata
+
+ metadata = MetaData(testing.db)
+ t = Table('table', metadata, *[Column("field%d" % fnum, String) for fnum in range(NUM_FIELDS)])
+ t2 = Table('table2', metadata, *[Column("field%d" % fnum, Unicode) for fnum in range(NUM_FIELDS)])
+
+ def setup(self):
+ metadata.create_all()
+ t.insert().execute(
+ [dict(("field%d" % fnum, u"value%d" % fnum)
+ for fnum in range(NUM_FIELDS)) for r_num in range(NUM_RECORDS)]
+ )
+ t2.insert().execute(
+ [dict(("field%d" % fnum, u"value%d" % fnum)
+ for fnum in range(NUM_FIELDS)) for r_num in range(NUM_RECORDS)]
+ )
+
+ def teardown(self):
+ metadata.drop_all()
+
+ @profiling.function_call_count(14416)
+ def test_string(self):
+ [tuple(row) for row in t.select().execute().fetchall()]
+
+ @profiling.function_call_count(44406)
+ def test_unicode(self):
+ [tuple(row) for row in t2.select().execute().fetchall()]
+
diff --git a/test/sql/test_query.py b/test/sql/test_query.py
index 05c61ee47..0e1787e9e 100644
--- a/test/sql/test_query.py
+++ b/test/sql/test_query.py
@@ -2,7 +2,7 @@ from sqlalchemy.test.testing import eq_
import datetime
from sqlalchemy import *
from sqlalchemy import exc, sql, util
-from sqlalchemy.engine import default
+from sqlalchemy.engine import default, base
from sqlalchemy.test import *
from sqlalchemy.test.testing import eq_, assert_raises_message, assert_raises
from sqlalchemy.test.schema import Table, Column
@@ -614,6 +614,23 @@ class QueryTest(TestBase):
lambda: r['user_id']
)
+ r = util.pickle.loads(util.pickle.dumps(r))
+ assert_raises_message(
+ exc.InvalidRequestError,
+ "Ambiguous column name",
+ lambda: r['user_id']
+ )
+
+ result = users.outerjoin(addresses).select().execute()
+ result = base.BufferedColumnResultProxy(result.context)
+ r = result.first()
+ assert isinstance(r, base.BufferedColumnRow)
+ assert_raises_message(
+ exc.InvalidRequestError,
+ "Ambiguous column name",
+ lambda: r['user_id']
+ )
+
@testing.requires.subqueries
def test_column_label_targeting(self):
users.insert().execute(user_id=7, user_name='ed')