]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
SYBASE: Added offset support
authorsnowman2 <alansnow21@gmail.com>
Wed, 6 May 2020 14:49:13 +0000 (09:49 -0500)
committersnowman2 <alansnow21@gmail.com>
Wed, 6 May 2020 14:51:33 +0000 (09:51 -0500)
lib/sqlalchemy/dialects/sybase/base.py
test/dialect/test_sybase.py

index 634cf0da4ecba1dc92b52a5eb5d4567ce1878b29..3765bd553a12556239085b29cba826f0cc7f7dd6 100644 (file)
@@ -516,13 +516,9 @@ class SybaseSQLCompiler(compiler.SQLCompiler):
 
     def get_select_precolumns(self, select, **kw):
         s = select._distinct and "DISTINCT " or ""
-
-        if select._simple_int_limit and not select._offset:
+        if select._limit_clause is not None and select._offset_clause is None:
             kw["literal_execute"] = True
             s += "TOP %s " % self.process(select._limit_clause, **kw)
-
-        if select._offset:
-            raise NotImplementedError("Sybase ASE does not support OFFSET")
         return s
 
     def get_from_hint_text(self, table, text):
@@ -530,7 +526,20 @@ class SybaseSQLCompiler(compiler.SQLCompiler):
 
     def limit_clause(self, select, **kw):
         # Limit in sybase is after the select keyword
-        return ""
+        text = ""
+        if (
+            select._limit_clause is not None
+            and select._offset_clause is not None
+        ):
+            text = " ROWS OFFSET %s LIMIT %s " % (
+                self.process(select._offset_clause, **kw),
+                self.process(select._limit_clause, **kw),
+            )
+        elif select._offset_clause is not None:
+            raise NotImplementedError(
+                "Sybase ASE does not support OFFSET without LIMIT"
+            )
+        return text
 
     def visit_extract(self, extract, **kw):
         field = self.extract_map.get(extract.field, extract.field)
index b49c8cfb369a02eba4fa0d9cfc7f120e073cb345..98310609493b910f714e659ff6ee68ccf8e9d5ab 100644 (file)
@@ -28,11 +28,18 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
                 'SELECT DATEPART("%s", t.col1) AS anon_1 FROM t' % subst,
             )
 
+    def test_limit_offset(self):
+        stmt = select([1]).limit(5).offset(6)
+        assert stmt.compile().params == {"param_1": 5, "param_2": 6}
+        self.assert_compile(
+            stmt, "SELECT 1 ROWS OFFSET :param_1 LIMIT :param_2 "
+        )
+
     def test_offset_not_supported(self):
         stmt = select([1]).offset(10)
         assert_raises_message(
             NotImplementedError,
-            "Sybase ASE does not support OFFSET",
+            "Sybase ASE does not support OFFSET without LIMIT",
             stmt.compile,
             dialect=self.__dialect__,
         )