From e82722b4eeb264f4576ea4e162564de283de141f Mon Sep 17 00:00:00 2001 From: larkee Date: Thu, 2 Dec 2021 13:23:59 +1100 Subject: [PATCH 1/2] fix: generate correct max limit when unspecified with offset --- .../sqlalchemy_spanner/sqlalchemy_spanner.py | 3 ++- test/test_suite.py | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index c38a9b8f..d0af218b 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -259,7 +259,8 @@ def limit_clause(self, select, **kw): text += "\n LIMIT " + self.process(select._limit_clause, **kw) if select._offset_clause is not None: if select._limit_clause is None: - text += "\n LIMIT 9223372036854775805" + offset = int(self.process(select._offset_clause, **kw)) + text += f"\n LIMIT {9223372036854775807-offset}" text += " OFFSET " + self.process(select._offset_clause, **kw) return text diff --git a/test/test_suite.py b/test/test_suite.py index 0bc4030c..5b56360c 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1616,6 +1616,31 @@ def test_staleness(self): assert connection.connection.staleness is None +class LimitOffsetTest(fixtures.TestBase): + """ + Check that SQL with an offset and no limit is being generated correctly. + """ + + def setUp(self): + self._engine = create_engine(get_db_url(), pool_size=1) + self._metadata = MetaData(bind=self._engine) + + self._table = Table( + "users", + self._metadata, + Column("user_id", Integer, primary_key=True), + Column("user_name", String(16), nullable=False), + ) + + self._metadata.create_all(self._engine) + + def test_offset_only(self): + for offset in [1, 7, 10, 100, 1000, 10000]: + + with self._engine.connect().execution_options(read_only=True) as connection: + list(connection.execute(self._table.select().offset(offset)).fetchall()) + + class ComputedReflectionFixtureTest(_ComputedReflectionFixtureTest): @classmethod def define_tables(cls, metadata): From ffd79979b60adde69d15ad61e5740c25cf73e0ce Mon Sep 17 00:00:00 2001 From: larkee Date: Thu, 2 Dec 2021 14:29:52 +1100 Subject: [PATCH 2/2] fix: use _offset --- google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index d0af218b..e28ac86d 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -259,8 +259,7 @@ def limit_clause(self, select, **kw): text += "\n LIMIT " + self.process(select._limit_clause, **kw) if select._offset_clause is not None: if select._limit_clause is None: - offset = int(self.process(select._offset_clause, **kw)) - text += f"\n LIMIT {9223372036854775807-offset}" + text += f"\n LIMIT {9223372036854775807-select._offset}" text += " OFFSET " + self.process(select._offset_clause, **kw) return text