"""
if start is not None and stop is not None:
- self._offset = (self._offset or 0) + start
+ self._offset = self._offset if self._offset is not None else 0
+ if start != 0:
+ self._offset += start
self._limit = stop - start
elif start is None and stop is not None:
self._limit = stop
elif start is not None and stop is None:
- self._offset = (self._offset or 0) + start
+ self._offset = self._offset if self._offset is not None else 0
+ if start != 0:
+ self._offset += start
- if self._offset == 0:
+ if isinstance(self._offset, int) and self._offset == 0:
self._offset = None
@_generative(_no_statement_condition)
# more slice tests are available in test/orm/generative.py
class SliceTest(QueryTest):
+ __dialect__ = "default"
+
def test_first(self):
User = self.classes.User
],
)
+ def test_first_against_expression_offset(self):
+ User = self.classes.User
+
+ sess = create_session()
+ q = sess.query(User).order_by(User.id).offset(literal_column("2"))
+
+ self.assert_sql(
+ testing.db,
+ q.first,
+ [
+ (
+ "SELECT users.id AS users_id, users.name AS users_name "
+ "FROM users ORDER BY users.id "
+ "LIMIT :param_1 OFFSET 2",
+ [{"param_1": 1}],
+ )
+ ],
+ )
+
+ @testing.requires.sql_expression_limit_offset
+ def test_full_slice_against_expression_offset(self):
+ User = self.classes.User
+
+ sess = create_session()
+ q = sess.query(User).order_by(User.id).offset(literal_column("2"))
+
+ self.assert_sql(
+ testing.db,
+ lambda: q[2:5],
+ [
+ (
+ "SELECT users.id AS users_id, users.name AS users_name "
+ "FROM users ORDER BY users.id "
+ "LIMIT :param_1 OFFSET 2 + :2_1",
+ [{"param_1": 3, "2_1": 2}],
+ )
+ ],
+ )
+
+ def test_full_slice_against_integer_offset(self):
+ User = self.classes.User
+
+ sess = create_session()
+ q = sess.query(User).order_by(User.id).offset(2)
+
+ self.assert_sql(
+ testing.db,
+ lambda: q[2:5],
+ [
+ (
+ "SELECT users.id AS users_id, users.name AS users_name "
+ "FROM users ORDER BY users.id "
+ "LIMIT :param_1 OFFSET :param_2",
+ [{"param_1": 3, "param_2": 4}],
+ )
+ ],
+ )
+
+ @testing.requires.sql_expression_limit_offset
+ def test_start_slice_against_expression_offset(self):
+ User = self.classes.User
+
+ sess = create_session()
+ q = sess.query(User).order_by(User.id).offset(literal_column("2"))
+
+ self.assert_sql(
+ testing.db,
+ lambda: q[2:],
+ [
+ (
+ "SELECT users.id AS users_id, users.name AS users_name "
+ "FROM users ORDER BY users.id "
+ "LIMIT -1 OFFSET 2 + :2_1",
+ [{"2_1": 2}],
+ )
+ ],
+ )
+
class FilterTest(QueryTest, AssertsCompiledSQL):
__dialect__ = "default"