-
Notifications
You must be signed in to change notification settings - Fork 257
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Query planner generates invalid fetch node selection sets when reuseQueryFragments=true #2952
Comments
a better approach is to programmatically create fragments, instead of attempting to reuse fragments from the original incoming operation. I believe Apollo will copy/paste the |
The query planner took necessary precautions to generate logically sound subgraph queries. But, unfortunately, the GraphQL type system is not strong enough to admit them in some cases. A related GraphQL spec discussion is here (graphql/graphql-spec#1085). I created PR (#2963) to avoid the issue for now. |
- updated computeExpandedSelectionSetAtType function not to trim fragment's validators if the fragment's type condition is not an object type. - This change is necessary because `FieldsInSetCanMerge` rule is more restrictive in that case. - The untrimmed validator should avoid generating invalid queries, but it may be less efficient. apollographql#2952
… with `reuseQueryFragments` set true (#2963) Fixed #2952. ### Summary of changes - updated computeExpandedSelectionSetAtType function not to trim fragment's validators if the fragment's type condition is not an object type. - This change is necessary because `FieldsInSetCanMerge` rule is more restrictive in that case. - The untrimmed validator should avoid generating invalid queries, but it may be less efficient. ### Test plan - The operations.test.ts confirms the changes of named fragments' validators. - Added a new test (based on the github issue's reproducer) confirming that subgraph queries are no longer invalid.
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @apollo/composition@2.7.3 ### Patch Changes - Fix a query planning bug where invalid subgraph queries are generated with `reuseQueryFragments` set true. ([#2952](#2952)) ([#2963](#2963)) - Updated dependencies \[[`ec04c50b4fb832bfd281ecf9c0c2dd7656431b96`](ec04c50), [`a494631918156f0431ceace74281c076cf1d5d51`](a494631)]: - @apollo/federation-internals@2.7.3 - @apollo/query-graphs@2.7.3 ## @apollo/gateway@2.7.3 ### Patch Changes - Updated dependencies \[[`ec04c50b4fb832bfd281ecf9c0c2dd7656431b96`](ec04c50), [`3e2c845c74407a136b9e0066e44c1ad1467d3013`](3e2c845), [`a494631918156f0431ceace74281c076cf1d5d51`](a494631)]: - @apollo/query-planner@2.7.3 - @apollo/composition@2.7.3 - @apollo/federation-internals@2.7.3 ## @apollo/federation-internals@2.7.3 ### Patch Changes - Fix a query planning bug where invalid subgraph queries are generated with `reuseQueryFragments` set true. ([#2952](#2952)) ([#2963](#2963)) - Fixed query planner to pass the directives from original query to subgraph operations (#2961) ([#2967](#2967)) ## @apollo/query-graphs@2.7.3 ### Patch Changes - Updated dependencies \[[`ec04c50b4fb832bfd281ecf9c0c2dd7656431b96`](ec04c50), [`a494631918156f0431ceace74281c076cf1d5d51`](a494631)]: - @apollo/federation-internals@2.7.3 ## @apollo/query-planner@2.7.3 ### Patch Changes - Fix a query planning bug where invalid subgraph queries are generated with `reuseQueryFragments` set true. ([#2952](#2952)) ([#2963](#2963)) - Type conditioned fetching ([#2949](#2949)) When querying a field that is in a path of 2 or more unions, the query planner was not able to handle different selections and would aggressively collapse selections in fetches yielding an incorrect plan. This change introduces new syntax to express type conditions in (key and flatten) paths. Type conditioned fetching can be enabled through a flag, and execution is supported in the router only. (#2938) - Fixed query planner to pass the directives from original query to subgraph operations (#2961) ([#2967](#2967)) - Updated dependencies \[[`ec04c50b4fb832bfd281ecf9c0c2dd7656431b96`](ec04c50), [`a494631918156f0431ceace74281c076cf1d5d51`](a494631)]: - @apollo/federation-internals@2.7.3 - @apollo/query-graphs@2.7.3 ## @apollo/subgraph@2.7.3 ### Patch Changes - Updated dependencies \[[`ec04c50b4fb832bfd281ecf9c0c2dd7656431b96`](ec04c50), [`a494631918156f0431ceace74281c076cf1d5d51`](a494631)]: - @apollo/federation-internals@2.7.3 ## apollo-federation-integration-testsuite@2.7.3 Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Issue Description
Issue Description
When
reuseQueryFragments=true
(the default config), in certain cases the query planner will generate a fetch that will fail GraphQL validation (Field Selection Merging - overlapping fields can be merged rule) at the subgraph GraphQL server. Specifically, this happens when a fragment from the query is reused and the query planner also queries the same field separately but the two aren't identical. The example below specifically showcases when field arguments mismatch.Steps to Reproduce
I built a minimum viable example unit test that reproduces building an incorrect plan.
Subgraph
discoveryDgs
schema:and subgraph
gusto
schema:Executing the following query:
The plan that is currently generated is as follow:
The problem here is the selection set of the second fetch:
It's not obvious, but the
taglineMessage
is selected across two spreads... on GenericContainer
and fragmentBillboardDataVideoSummary on Video
and although there is no type on the schema that can be both aGenericContainer
and aVideo
, the GraphQL spec Field Selection Merging validates against fields having differing sets of arguments.Hence, the selection set produces will error at subgraph GraphQL server validation.
The unit test proves this by calling graphql-js validation on every operation of every fetchNode on the query plan.
The test fails with the following error:
Impact
Impacts (some) queries using fragments.
Link to Reproduction
https://github.com/apollographql/federation/compare/main...tinnou:federation:query-planner-fragment-invalid-bfg-822?expand=1
Reproduction Steps
No response
Link to Reproduction
https://github.com/apollographql/federation/compare/main...tinnou:federation:query-planner-fragment-invalid-bfg-822?expand=1
Reproduction Steps
No response
The text was updated successfully, but these errors were encountered: