summaryrefslogtreecommitdiff
path: root/test/sql
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-09-03 16:53:05 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-09-03 16:53:05 +0000
commit9eafb43c0ff761fa43425d329d281bb8fbece80e (patch)
treee016611c5b30c6ec921e43b46a371b0a5def2956 /test/sql
parent920281ab55b407c9674759fa885797e1a9fff908 (diff)
downloadsqlalchemy-9eafb43c0ff761fa43425d329d281bb8fbece80e.tar.gz
- limit/offset no longer uses ROW NUMBER OVER to limit rows,
and instead uses subqueries in conjunction with a special Oracle optimization comment. Allows LIMIT/OFFSET to work in conjunction with DISTINCT. [ticket:536]
Diffstat (limited to 'test/sql')
-rw-r--r--test/sql/query.py94
1 files changed, 69 insertions, 25 deletions
diff --git a/test/sql/query.py b/test/sql/query.py
index 6bed07a9b..fa247a7b2 100644
--- a/test/sql/query.py
+++ b/test/sql/query.py
@@ -317,31 +317,7 @@ class QueryTest(TestBase):
print repr(users.select().execute().fetchall())
- def test_select_limit(self):
- users.insert().execute(user_id=1, user_name='john')
- users.insert().execute(user_id=2, user_name='jack')
- users.insert().execute(user_id=3, user_name='ed')
- users.insert().execute(user_id=4, user_name='wendy')
- users.insert().execute(user_id=5, user_name='laura')
- users.insert().execute(user_id=6, user_name='ralph')
- users.insert().execute(user_id=7, user_name='fido')
- r = users.select(limit=3, order_by=[users.c.user_id]).execute().fetchall()
- self.assert_(r == [(1, 'john'), (2, 'jack'), (3, 'ed')], repr(r))
- @testing.crashes('mssql', 'FIXME: guessing')
- @testing.fails_on('maxdb')
- def test_select_limit_offset(self):
- users.insert().execute(user_id=1, user_name='john')
- users.insert().execute(user_id=2, user_name='jack')
- users.insert().execute(user_id=3, user_name='ed')
- users.insert().execute(user_id=4, user_name='wendy')
- users.insert().execute(user_id=5, user_name='laura')
- users.insert().execute(user_id=6, user_name='ralph')
- users.insert().execute(user_id=7, user_name='fido')
- r = users.select(limit=3, offset=2, order_by=[users.c.user_id]).execute().fetchall()
- self.assert_(r==[(3, 'ed'), (4, 'wendy'), (5, 'laura')])
- r = users.select(offset=5, order_by=[users.c.user_id]).execute().fetchall()
- self.assert_(r==[(6, 'ralph'), (7, 'fido')])
@testing.exclude('mysql', '<', (5, 0, 37), 'database bug')
def test_scalar_select(self):
@@ -556,7 +532,7 @@ class QueryTest(TestBase):
finally:
shadowed.drop(checkfirst=True)
- @testing.fails_on('firebird', 'maxdb')
+ @testing.fails_on('firebird', 'maxdb', 'oracle')
def test_in_filtering(self):
"""test the behavior of the in_() function."""
@@ -608,6 +584,74 @@ class QueryTest(TestBase):
assert len(r) == 1
+class LimitTest(TestBase):
+
+ def setUpAll(self):
+ global users, addresses, metadata
+ metadata = MetaData(testing.db)
+ users = Table('query_users', metadata,
+ Column('user_id', INT, primary_key = True),
+ Column('user_name', VARCHAR(20)),
+ )
+ addresses = Table('query_addresses', metadata,
+ Column('address_id', Integer, primary_key=True),
+ Column('user_id', Integer, ForeignKey('query_users.user_id')),
+ Column('address', String(30)))
+ metadata.create_all()
+ self._data()
+
+ def _data(self):
+ users.insert().execute(user_id=1, user_name='john')
+ addresses.insert().execute(address_id=1, user_id=1, address='addr1')
+ users.insert().execute(user_id=2, user_name='jack')
+ addresses.insert().execute(address_id=2, user_id=2, address='addr1')
+ users.insert().execute(user_id=3, user_name='ed')
+ addresses.insert().execute(address_id=3, user_id=3, address='addr2')
+ users.insert().execute(user_id=4, user_name='wendy')
+ addresses.insert().execute(address_id=4, user_id=4, address='addr3')
+ users.insert().execute(user_id=5, user_name='laura')
+ addresses.insert().execute(address_id=5, user_id=5, address='addr4')
+ users.insert().execute(user_id=6, user_name='ralph')
+ addresses.insert().execute(address_id=6, user_id=6, address='addr5')
+ users.insert().execute(user_id=7, user_name='fido')
+ addresses.insert().execute(address_id=7, user_id=7, address='addr5')
+
+ def tearDownAll(self):
+ metadata.drop_all()
+
+ def test_select_limit(self):
+ r = users.select(limit=3, order_by=[users.c.user_id]).execute().fetchall()
+ self.assert_(r == [(1, 'john'), (2, 'jack'), (3, 'ed')], repr(r))
+
+ @testing.crashes('mssql', 'FIXME: guessing')
+ @testing.fails_on('maxdb')
+ def test_select_limit_offset(self):
+ r = users.select(limit=3, offset=2, order_by=[users.c.user_id]).execute().fetchall()
+ self.assert_(r==[(3, 'ed'), (4, 'wendy'), (5, 'laura')])
+ r = users.select(offset=5, order_by=[users.c.user_id]).execute().fetchall()
+ self.assert_(r==[(6, 'ralph'), (7, 'fido')])
+
+ def test_select_distinct_limit(self):
+ """Test the interaction between limit and distinct"""
+
+ r = sorted([x[0] for x in select([addresses.c.address]).distinct().limit(3).execute().fetchall()])
+ self.assert_(len(r) == 3, repr(r))
+ self.assert_(r[0] != r[1] and r[1] != r[2], repr(r))
+
+ def test_select_distinct_offset(self):
+ """Test the interaction between limit and offset"""
+
+ r = sorted([x[0] for x in select([addresses.c.address]).distinct().offset(1).execute().fetchall()])
+ self.assert_(len(r) == 4, repr(r))
+ self.assert_(r[0] != r[1] and r[1] != r[2] and r[2] != [3], repr(r))
+
+ def test_select_distinct_limit_offset(self):
+ """Test the interaction between limit and limit/offset"""
+
+ r = select([addresses.c.address]).order_by(addresses.c.address).distinct().offset(2).limit(3).execute().fetchall()
+ self.assert_(len(r) == 3, repr(r))
+ self.assert_(r[0] != r[1] and r[1] != r[2], repr(r))
+
class CompoundTest(TestBase):
"""test compound statements like UNION, INTERSECT, particularly their ability to nest on
different databases."""