perf(sql): clamp oversized LIMIT / FETCH for result caps (#416) - #430
Merged
ZhuchkaTriplesix merged 1 commit intoJul 27, 2026
Merged
Conversation
Extend injectSqlLimit to clamp LIMIT n, LIMIT ALL, and FETCH FIRST when larger than the UI row cap so Postgres (and SQLite) engines do not buffer more rows than Preferences allow. Document the policy. Closes #416
ZhuchkaTriplesix
merged commit Jul 27, 2026
b8b1752
into
issue/415-sqlite-inject-limit
1 check passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
injectSqlLimitnow clamps authorLIMIT/LIMIT ALL/FETCH FIRST n ROWS ONLYwhen above the Preferences row capinjectSqlLimit— oversizedLIMIT 999999no longer loads a fullResultof that sizeDepends on / stacks on #429 (#415). After #429 merges to
dev, retarget this PR todev(or merge stack).Closes #416
Parent: #414
Notes
True portal/
ResultStreamrow-take without buffering is deferred — thepostgrespackage’sexecute()still materializes aResult; clamping keeps that buffer ≤ cap for typical SELECT.Test plan
flutter test test/core/database/sql_limit_test.dart test/core/database/postgres_sql_test.dartSELECT * FROM big LIMIT 1000000with cap 5000 → capped status, no huge memory spikeLIMIT 10unchanged;LIMIT ALL→ capped