summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-05-16 15:33:39 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-05-16 15:33:39 -0400
commit81959af6d37be503a13ce9c53317d443e14ae570 (patch)
tree98cf5d471114a6b14c91e7bd037009e04f604609 /lib/sqlalchemy/testing
parent8414c9f00b9ddf972d6b78c6883c315beaf29822 (diff)
downloadsqlalchemy-81959af6d37be503a13ce9c53317d443e14ae570.tar.gz
- more tests, including backend tests
- implement for SQL server, use window functions when simple limit/offset not available
Diffstat (limited to 'lib/sqlalchemy/testing')
-rw-r--r--lib/sqlalchemy/testing/requirements.py6
-rw-r--r--lib/sqlalchemy/testing/suite/test_select.py80
2 files changed, 85 insertions, 1 deletions
diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py
index 04e8ad272..e1669e952 100644
--- a/lib/sqlalchemy/testing/requirements.py
+++ b/lib/sqlalchemy/testing/requirements.py
@@ -98,6 +98,12 @@ class SuiteRequirements(Requirements):
return exclusions.open()
@property
+ def bound_limit_offset(self):
+ """target database can render LIMIT and/or OFFSET using a bound parameter"""
+
+ return exclusions.open()
+
+ @property
def boolean_col_expressions(self):
"""Target database must support boolean expressions as columns"""
diff --git a/lib/sqlalchemy/testing/suite/test_select.py b/lib/sqlalchemy/testing/suite/test_select.py
index 2ccff61ea..3461b1e94 100644
--- a/lib/sqlalchemy/testing/suite/test_select.py
+++ b/lib/sqlalchemy/testing/suite/test_select.py
@@ -2,7 +2,8 @@ from .. import fixtures, config
from ..assertions import eq_
from sqlalchemy import util
-from sqlalchemy import Integer, String, select, func
+from sqlalchemy import Integer, String, select, func, bindparam
+from sqlalchemy import testing
from ..schema import Table, Column
@@ -84,3 +85,80 @@ class OrderByLabelTest(fixtures.TablesTest):
select([lx]).order_by(lx.desc()),
[(7, ), (5, ), (3, )]
)
+
+class LimitOffsetTest(fixtures.TablesTest):
+ __backend__ = True
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table("some_table", metadata,
+ Column('id', Integer, primary_key=True),
+ Column('x', Integer),
+ Column('y', Integer))
+
+ @classmethod
+ def insert_data(cls):
+ config.db.execute(
+ cls.tables.some_table.insert(),
+ [
+ {"id": 1, "x": 1, "y": 2},
+ {"id": 2, "x": 2, "y": 3},
+ {"id": 3, "x": 3, "y": 4},
+ {"id": 4, "x": 4, "y": 5},
+ ]
+ )
+
+ def _assert_result(self, select, result, params=()):
+ eq_(
+ config.db.execute(select, params).fetchall(),
+ result
+ )
+
+ def test_simple_limit(self):
+ table = self.tables.some_table
+ self._assert_result(
+ select([table]).order_by(table.c.id).limit(2),
+ [(1, 1, 2), (2, 2, 3)]
+ )
+
+ def test_simple_offset(self):
+ table = self.tables.some_table
+ self._assert_result(
+ select([table]).order_by(table.c.id).offset(2),
+ [(3, 3, 4), (4, 4, 5)]
+ )
+
+ def test_simple_limit_offset(self):
+ table = self.tables.some_table
+ self._assert_result(
+ select([table]).order_by(table.c.id).limit(2).offset(1),
+ [(2, 2, 3), (3, 3, 4)]
+ )
+
+ @testing.requires.bound_limit_offset
+ def test_bound_limit(self):
+ table = self.tables.some_table
+ self._assert_result(
+ select([table]).order_by(table.c.id).limit(bindparam('l')),
+ [(1, 1, 2), (2, 2, 3)],
+ params={"l": 2}
+ )
+
+ @testing.requires.bound_limit_offset
+ def test_bound_offset(self):
+ table = self.tables.some_table
+ self._assert_result(
+ select([table]).order_by(table.c.id).offset(bindparam('o')),
+ [(3, 3, 4), (4, 4, 5)],
+ params={"o": 2}
+ )
+
+ @testing.requires.bound_limit_offset
+ def test_bound_limit_offset(self):
+ table = self.tables.some_table
+ self._assert_result(
+ select([table]).order_by(table.c.id).\
+ limit(bindparam("l")).offset(bindparam("o")),
+ [(2, 2, 3), (3, 3, 4)],
+ params={"l": 2, "o": 1}
+ )