Comments (2)
@Cito Thanks for your reply! I created an issue and used your examples, but please add more context if you think that something is missing
from graphql-core.
Thanks for the feedback @mat-sop.
Let's first simplify the problematic SDL a bit to get to the core of it:
"""Example 1"""
type Query { field(recursiveInput: RecursiveInput): String }
input RecursiveInput {
self: RecursiveInput = {value: "foo"}
value: String
}
The spec actually says something about such recursions here. Though it does not explicitly mention your example, the spirit of the spec is that recursive definitions are in principle allowed, but only if it is possible to construct valid values from them. This can be possible by breaking the chain with a null value if the definition allows that.
The problem I see in this example is the default value of {value: "foo"}
. Since this is lacking the self
field, the default value for self
is looked up, which leads to a recursion. If you leave out the default value or change it to be = null
, everything is fine:
"""Example 2"""
type Query { field(recursiveInput: RecursiveInput): String }
input RecursiveInput {
self: RecursiveInput
value: String
}
However, the following also looks fine to me but still breaks:
"""Example 3"""
type Query { field(recursiveInput: RecursiveInput): String }
input RecursiveInput {
self: RecursiveInput = {value: "foo", self: null}
value: String
}
On the other hand, the following actually invalid example does not give an error:
"""Example 4"""
type Query { field(recursiveInput: RecursiveInput): String }
input RecursiveInput {
self: RecursiveInput!
value: String
}
I found that the same problems exists in graphql-js. which also throws a "Maximum call stack size exceeded" error in the cases where Python raises a RecursionError. Since the goal of graphql-core is to replicate graphql-js, I do not consider it a bug in graphql-core, but something that might need to be fixed in grapqhl-js.
I currently see three things that could be improved here:
- Example 1 should produce a proper error instead of creating a stack overflow
- Example 3 should not produce an error
- Example 4 should produce an error showing that this is an invalid definition
But this should be discussed in the issue tracker of GraphQL.js.
I would be glad if you could create an issue there. Otherwise I will do it when I find some more time.
from graphql-core.
Related Issues (20)
- Can you inject fields to an operation with a Visitor? HOT 2
- Use type guards for `language.predicates` HOT 1
- Trying to inject `id` field on every `selection_set` HOT 1
- Include name in representation of named nodes HOT 1
- performance issues due to breadth first execution of grapqhl queries in case of async resolvers during calls burst HOT 4
- A
- subscribe breaking change in graphql version 3.3.0a3 HOT 1
- [Question] How to map operation variables to their uses? HOT 2
- Using Relays in Graphql-core raises a TypeError HOT 4
- `out_name` is not respected for input objects used as default argument value
- Segfault during schema parsing HOT 3
- Segfault during schema parsing
- `graphql.utilities.print_schema` module contents are hidden behind `utilities` package
- `deepcopy` fails if the schema has a directive with an enum argument
- Both `typing.ByteString` and `typing.Text` are deprecated and slated for removal in Python 3.14 HOT 3
- Add the ability to specify `GraphQLResolveInfo.context` type HOT 1
- I use middleware for that right now HOT 1
- construction fails for depth around > 200 / resource exhaustion? HOT 9
- Cancel resolver tasks if execution of an operation is terminated HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from graphql-core.