Summary
When query_items(feed_range=..., max_item_count=N) is invoked with a feed_range that overlaps multiple physical partition key (PK) ranges (for example, after a server-side split), __QueryFeed issues one POST per overlapping inner range and merges the partial results.
PR #46469 fixed the page-size bug (the merged page is now truncated to max_item_count). However, the continuation token surfaced to the caller is still only the last inner range's x-ms-continuation. Round-tripping that token on the next page sends it to every inner range — which is undefined server-side and would produce duplicates, missing documents, or non-terminating iteration.
As a safety mitigation in PR #46469, when the merged page is actually truncated the continuation header is suppressed so callers observe the truncated page as terminal rather than experiencing data loss. This makes the broken pagination case visible (pagination ends early) instead of silently corrupting results, but it also means only the first page of a multi-range feed_range query is reliable.
Proposed fix
Implement a composite continuation token that spans all overlapping inner PK ranges for a feed_range query:
- Track per-inner-range continuation tokens and remaining-cap state.
- Encode them into a single opaque continuation string surfaced to the caller.
- On resume, decode and route each per-range token to its corresponding inner POST.
- Stop issuing inner POSTs once the user-requested
max_item_count cap is reached for the current page; carry the unconsumed inner range continuations forward.
Related
Affected SDK area
Azure.Cosmos
Summary
When
query_items(feed_range=..., max_item_count=N)is invoked with afeed_rangethat overlaps multiple physical partition key (PK) ranges (for example, after a server-side split),__QueryFeedissues one POST per overlapping inner range and merges the partial results.PR #46469 fixed the page-size bug (the merged page is now truncated to
max_item_count). However, the continuation token surfaced to the caller is still only the last inner range'sx-ms-continuation. Round-tripping that token on the next page sends it to every inner range — which is undefined server-side and would produce duplicates, missing documents, or non-terminating iteration.As a safety mitigation in PR #46469, when the merged page is actually truncated the continuation header is suppressed so callers observe the truncated page as terminal rather than experiencing data loss. This makes the broken pagination case visible (pagination ends early) instead of silently corrupting results, but it also means only the first page of a multi-range
feed_rangequery is reliable.Proposed fix
Implement a composite continuation token that spans all overlapping inner PK ranges for a
feed_rangequery:max_item_countcap is reached for the current page; carry the unconsumed inner range continuations forward.Related
sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py,sdk/cosmos/azure-cosmos/azure/cosmos/aio/_cosmos_client_connection_async.py(__QueryFeed, feed_range_epk branch)Affected SDK area
Azure.Cosmos