From e7f1b6feed42ec94f7447fae1ca810e101309c10 Mon Sep 17 00:00:00 2001 From: Liu Husong Date: Tue, 16 Dec 2025 21:52:38 +0800 Subject: [PATCH 1/2] fix(firestore): ensure limit(0) is properly serialized in query requests Previously, calling .limit(0) on a Firestore Query did not serialize the zero value to the wire protocol, causing queries to be sent without a limit constraint. This change explicitly includes limit(0) in the query proto. Fixes #7382 --- handwritten/firestore/dev/test/query.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/handwritten/firestore/dev/test/query.ts b/handwritten/firestore/dev/test/query.ts index cce2ebe4837b..df105e7d4637 100644 --- a/handwritten/firestore/dev/test/query.ts +++ b/handwritten/firestore/dev/test/query.ts @@ -1957,6 +1957,23 @@ describe('limit() interface', () => { query = query.limit(1).limit(2).limit(3); await query.get(); }); + + // Regression test: This test currently fails because limit(0) is not + // serialized in the query proto (limit(0) is falsy in JavaScript). + // This test is expected to fail until the fix is applied. + it('handles limit(0) correctly', async () => { + const overrides: ApiOverride = { + runQuery: request => { + queryEquals(request, limit(0)); + return emptyQueryStream(); + }, + }; + + firestore = await createInstance(overrides); + let query: Query = firestore.collection('collectionId'); + query = query.limit(0); + await query.get(); + }); }); describe('limitToLast() interface', () => { From d8aecde12fe1a75787f56b83d07ae724520e2df7 Mon Sep 17 00:00:00 2001 From: Liu Husong Date: Tue, 16 Dec 2025 21:53:05 +0800 Subject: [PATCH 2/2] test(firestore): add regression test for limit(0) serialization For #7382 --- handwritten/firestore/dev/src/reference/query-util.ts | 2 +- handwritten/firestore/dev/src/reference/query.ts | 2 +- handwritten/firestore/dev/test/query.ts | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/handwritten/firestore/dev/src/reference/query-util.ts b/handwritten/firestore/dev/src/reference/query-util.ts index c05e84b3972f..a5aa0c24f5a3 100644 --- a/handwritten/firestore/dev/src/reference/query-util.ts +++ b/handwritten/firestore/dev/src/reference/query-util.ts @@ -344,7 +344,7 @@ export class QueryUtil< // call to `requestStream()` will backoff should the restart // fail before delivering any results. let newQuery: Query; - if (!this._queryOptions.limit) { + if (this._queryOptions.limit === undefined) { newQuery = query; } else { const newLimit = diff --git a/handwritten/firestore/dev/src/reference/query.ts b/handwritten/firestore/dev/src/reference/query.ts index ec2678ef7188..696f5fa6ff1d 100644 --- a/handwritten/firestore/dev/src/reference/query.ts +++ b/handwritten/firestore/dev/src/reference/query.ts @@ -1608,7 +1608,7 @@ export class Query< structuredQuery.startAt = this.toCursor(this._queryOptions.startAt); structuredQuery.endAt = this.toCursor(this._queryOptions.endAt); - if (this._queryOptions.limit) { + if (this._queryOptions.limit !== undefined) { structuredQuery.limit = {value: this._queryOptions.limit}; } diff --git a/handwritten/firestore/dev/test/query.ts b/handwritten/firestore/dev/test/query.ts index df105e7d4637..897173096cd2 100644 --- a/handwritten/firestore/dev/test/query.ts +++ b/handwritten/firestore/dev/test/query.ts @@ -1958,9 +1958,6 @@ describe('limit() interface', () => { await query.get(); }); - // Regression test: This test currently fails because limit(0) is not - // serialized in the query proto (limit(0) is falsy in JavaScript). - // This test is expected to fail until the fix is applied. it('handles limit(0) correctly', async () => { const overrides: ApiOverride = { runQuery: request => {