···11+---
22+'@urql/exchange-graphcache': patch
33+---
44+55+Reset `partial` result marker when reading from selections when a child value sees a cache miss. This only affects resolvers on child values enabling `info.partial` while a parent may abort early instead.
+10-4
exchanges/graphcache/src/operations/query.ts
···388388 );
389389390390 let hasFields = false;
391391- let hasPartials = false;
392391 let hasNext = false;
393392 let hasChanged = InMemoryData.currentForeignData;
394393 let node: FormattedNode<FieldNode> | void;
394394+ const hasPartials = ctx.partial;
395395 const output = InMemoryData.makeData(input);
396396 while ((node = iterate()) !== undefined) {
397397 // Derive the needed data from our node.
···522522 !!getFieldError(ctx))
523523 ) {
524524 // The field is uncached or has errored, so it'll be set to null and skipped
525525- hasPartials = true;
525525+ ctx.partial = true;
526526 dataFieldValue = null;
527527 } else if (dataFieldValue === undefined) {
528528- // If the field isn't deferred or partial then we have to abort
528528+ // If the field isn't deferred or partial then we have to abort and also reset
529529+ // the partial field
530530+ ctx.partial = hasPartials;
529531 ctx.__internal.path.pop();
530532 return undefined;
531533 } else {
···542544543545 ctx.partial = ctx.partial || hasPartials;
544546 ctx.hasNext = ctx.hasNext || hasNext;
545545- return isQuery && hasPartials && !hasFields
547547+ return isQuery && ctx.partial && !hasFields
546548 ? undefined
547549 : hasChanged
548550 ? output
···566568 const _isListNullable = store.schema
567569 ? isListNullable(store.schema, typename, fieldName)
568570 : false;
571571+ const hasPartials = ctx.partial;
569572 const data = InMemoryData.makeData(prevData, true);
570573 let hasChanged =
571574 InMemoryData.currentForeignData ||
···589592 ctx.__internal.path.pop();
590593 // Check the result for cache-missed values
591594 if (childResult === undefined && !_isListNullable) {
595595+ ctx.partial = hasPartials;
592596 return undefined;
593597 } else {
594598 ctx.partial =
···636640 ? isListNullable(store.schema, typename, fieldName)
637641 : false;
638642 const newLink = InMemoryData.makeData(prevData, true);
643643+ const hasPartials = ctx.partial;
639644 let hasChanged =
640645 InMemoryData.currentForeignData ||
641646 !Array.isArray(prevData) ||
···657662 ctx.__internal.path.pop();
658663 // Check the result for cache-missed values
659664 if (childLink === undefined && !_isListNullable) {
665665+ ctx.partial = hasPartials;
660666 return undefined;
661667 } else {
662668 ctx.partial =