diff --git a/sqlalchemy_trino/compiler.py b/sqlalchemy_trino/compiler.py index b99bf46..9a6809d 100644 --- a/sqlalchemy_trino/compiler.py +++ b/sqlalchemy_trino/compiler.py @@ -80,7 +80,18 @@ class TrinoSQLCompiler(compiler.SQLCompiler): - pass + + def limit_clause(self, select, **kw): + """ + Trino support only OFFSET...LIMIT but not LIMIT...OFFSET syntax. + See https://github.com/trinodb/trino/issues/4335. + """ + text = "" + if select._offset_clause is not None: + text += " OFFSET " + self.process(select._offset_clause, **kw) + if select._limit_clause is not None: + text += "\n LIMIT " + self.process(select._limit_clause, **kw) + return text class TrinoDDLCompiler(compiler.DDLCompiler): diff --git a/tests/test_compiler.py b/tests/test_compiler.py new file mode 100644 index 0000000..443c235 --- /dev/null +++ b/tests/test_compiler.py @@ -0,0 +1,29 @@ +from sqlalchemy import Table, MetaData, Column, Integer, String, select + +from sqlalchemy_trino.dialect import TrinoDialect + +metadata = MetaData() +table = Table( + 'table', + metadata, + Column('id', Integer, primary_key=True), + Column('name', String), +) + + +def test_limit_offset(): + statement = select(table).limit(10).offset(0) + query = statement.compile(dialect=TrinoDialect()) + assert str(query) == 'SELECT "table".id, "table".name \nFROM "table" OFFSET :param_1\n LIMIT :param_2' + + +def test_limit(): + statement = select(table).limit(10) + query = statement.compile(dialect=TrinoDialect()) + assert str(query) == 'SELECT "table".id, "table".name \nFROM "table"\n LIMIT :param_1' + + +def test_offset(): + statement = select(table).offset(0) + query = statement.compile(dialect=TrinoDialect()) + assert str(query) == 'SELECT "table".id, "table".name \nFROM "table" OFFSET :param_1'