@@ -419,7 +419,7 @@ fragment directFieldSelectionOnUnion on CatOrDog {
419419FieldsInSetCanMerge(set):
420420
421421- Let {visitedSelections} be the selections in {set} including visiting
422- fragments and inline fragments an applying any supplied fragment arguments.
422+ fragments and inline fragments and applying any supplied fragment spread arguments.
423423- Let {spreadsForName} be the set of fragment spreads with a given name in
424424 {visitedSelections}.
425425- Given each pair of members {spreadA} and {spreadB} in {spreadsForName}:
@@ -576,7 +576,7 @@ fragment conflictingDifferingResponses on Pet {
576576}
577577```
578578
579- Fragment arguments can also cause fields to fail to merge.
579+ Fragment spread arguments can also cause fields to fail to merge.
580580
581581While the following is valid:
582582
@@ -599,11 +599,11 @@ fragment safeFragmentArguments on Dog {
599599```
600600
601601it is only valid because ` safeFragmentArguments ` uses
602- ` potentiallyConflictingArguments ` with the same value for ` commandOne ` and
602+ ` potentiallyConflictingArguments ` with the same value for the fragment-defined variables ` commandOne ` and
603603` commandTwo ` . Therefore ` commandFragment ` resolves ` doesKnowCommand ` 's
604- ` dogCommand: ` arg to ` SIT ` in both cases.
604+ ` dogCommand ` argument value to ` SIT ` in both cases.
605605
606- However, by changing the argument values:
606+ However, by changing the fragment spread argument values:
607607
608608``` graphql counter-example
609609fragment conflictingFragmentArguments on Dog {
@@ -706,14 +706,15 @@ validation rules apply in each case.
706706
707707- For each {argument} in the document:
708708 - Let {argumentName} be the Name of {argument}.
709- - Let {argumentDefinition} be the argument definition provided by the parent
710- field, fragment definition or directive definition named {argumentName}.
709+ - If the parent is a field or directive:
710+ - Let {argumentDefinition} be the argument or variable definition named {argumentName} provided by the parent
711+ field definition, directive definition or fragment definition.
711712 - {argumentDefinition} must exist.
712713
713714** Explanatory Text**
714715
715- Every argument provided to a field or directive must be defined in the set of
716- possible arguments of that field or directive .
716+ Every argument provided to a field or directive or fragment spread must be defined in the set of
717+ possible arguments of that field, directive or fragment .
717718
718719For example the following are valid:
719720
@@ -744,7 +745,7 @@ fragment invalidArgName on Dog {
744745}
745746```
746747
747- and this is also invalid as the argument ` dogCommand ` is not defined on fragment
748+ and this is also invalid as the variable ` dogCommand ` is not defined on fragment
748749` withFragmentArg ` .
749750
750751``` graphql counter-example
@@ -810,10 +811,9 @@ ambiguous and invalid.
810811#### Required Arguments
811812
812813- For each Field, Fragment Spread or Directive in the document:
813- - Let {arguments} be the arguments provided by the Field, Fragment Spread or
814- Directive.
815- - Let {argumentDefinitions} be the set of argument definitions of that Field,
816- Fragment Spread or Directive.
814+ - Let {arguments} be the arguments provided by the Field,
815+ Directive or Fragment Spread.
816+ - Let {argumentDefinitions} be the set of argument definitions of that Field or Directive, or the variable definitions of that Fragment.
817817 - For each {argumentDefinition} in {argumentDefinitions}:
818818 - Let {type} be the expected type of {argumentDefinition}.
819819 - Let {defaultValue} be the default value of {argumentDefinition}.
@@ -1592,16 +1592,16 @@ query ($foo: Boolean = true, $bar: Boolean = false) {
15921592
15931593** Formal Specification**
15941594
1595- - For every {operation} in the document:
1596- - For every {variable} defined on {operation}:
1595+ - For every {operation} and {fragment} in the document:
1596+ - For every {variable} defined on that {operation} or {fragment }:
15971597 - Let {variableName} be the name of {variable}.
15981598 - Let {variables} be the set of all variables named {variableName} on
15991599 {operation}.
16001600 - {variables} must be a set of one.
16011601
16021602** Explanatory Text**
16031603
1604- If any operation defines more than one variable with the same name, it is
1604+ If any operation or fragment defines more than one variable with the same name, it is
16051605ambiguous and invalid. It is invalid even if the type of the duplicate variable
16061606is the same.
16071607
@@ -1632,12 +1632,28 @@ fragment HouseTrainedFragment on Query {
16321632}
16331633```
16341634
1635+ Likewise, it is valid for both an operation and a fragment to define a variable with the same name:
1636+ ``` graphql example
1637+ query C ($atOtherHomes : Boolean ) {
1638+ ... HouseTrainedFragment
1639+ aDog : dog {
1640+ ... HouseTrainedDog
1641+ }
1642+ }
1643+
1644+ fragment HouseTrainedDog ($atOtherHomes : Boolean ) on Dog {
1645+ isHouseTrained (atOtherHomes : $atOtherHomes )
1646+ }
1647+ ```
1648+
1649+ Fragment-defined variables are scoped locally to the fragment that defines them, and override any operation-defined variable values, so there is never ambiguity about which value to use. In this case, the value of the argument ` atOtherHomes ` within ` HouseTrainedFragment ` will be the operation-set value, and within ` HouseTrainedDog ` will resolve to ` null ` , as the argument is not set by the fragment spread in the query ` C ` .
1650+
16351651### Variables Are Input Types
16361652
16371653** Formal Specification**
16381654
1639- - For every {operation} in a {document}:
1640- - For every {variable} on each {operation}:
1655+ - For every {operation} and {fragment} in a {document}:
1656+ - For every {variable} defined on each {operation} or {fragment }:
16411657 - Let {variableType} be the type of {variable}.
16421658 - {IsInputType(variableType)} must be {true}.
16431659
@@ -1704,14 +1720,14 @@ query takesCatOrDog($catOrDog: CatOrDog) {
17041720 - Let {fragments} be every fragment referenced by that {operation}
17051721 transitively.
17061722 - For each {fragment} in {fragments}:
1707- - For each {variableUsage} in scope of {fragment}, variable must be in
1723+ - For each {variableUsage} in scope of {fragment}, variable must be in {fragment}'s or
17081724 {operation}'s variable list.
17091725
17101726** Explanatory Text**
17111727
1712- Variables are scoped on a per-operation basis. That means that any variable used
1713- within the context of an operation must be defined at the top level of that
1714- operation
1728+ Operation-defined Variables are scoped on a per-operation basis, while Fragment-defined Variables are scoped locally to the fragment . That means that any variable used
1729+ within the context of an operation must either be defined at the top level of that
1730+ operation or on the fragment that uses that variable.
17151731
17161732For example:
17171733
@@ -1738,8 +1754,8 @@ query variableIsNotDefined {
17381754${atOtherHomes} is not defined by the operation.
17391755
17401756Fragments complicate this rule. Any fragment transitively included by an
1741- operation has access to the variables defined by that operation. Fragments can
1742- appear within multiple operations and therefore variable usages must correspond
1757+ operation has access to the variables defined by that operation and defined on the fragment . Fragments can
1758+ appear within multiple operations and therefore variable usages not defined on the fragment must correspond
17431759to variable definitions in all of those operations.
17441760
17451761For example the following is valid:
@@ -1837,7 +1853,7 @@ This is because {houseTrainedQueryTwoNotDefined} does not define a variable
18371853${atOtherHomes} but that variable is used by {isHouseTrainedFragment} which is
18381854included in that operation.
18391855
1840- ### All Variables Used
1856+ ### All Operation Variables Used
18411857
18421858** Formal Specification**
18431859
@@ -1945,20 +1961,20 @@ fragment isHouseTrainedFragment on Dog {
19451961This document is not valid because {queryWithExtraVar} defines an extraneous
19461962variable.
19471963
1948- ### All Fragment Arguments Used
1964+ ### All Fragment Variables Used
19491965
19501966** Formal Specification**
19511967
19521968- For every {fragment} in the document:
1953- - Let {arguments } be the arguments defined by that {fragment}.
1954- - Each {argument } in {arguments } must be used at least once in the fragment's
1969+ - Let {variables } be the variables defined by that {fragment}.
1970+ - Each {variable } in {variables } must be used at least once in the fragment's
19551971 scope.
19561972
19571973** Explanatory Text**
19581974
1959- All arguments defined by a fragment must be used in that same fragment. Because
1960- fragment arguments are scoped to the fragment they are defined on, if the
1961- fragment does not use the argument , then the argument is superfluous.
1975+ All variables defined by a fragment must be used in that same fragment. Because
1976+ fragment-defined variables are scoped to the fragment they are defined on, if the
1977+ fragment does not use the variable , then the variable definition is superfluous.
19621978
19631979For example, the following is invalid:
19641980
@@ -1974,8 +1990,8 @@ fragment fragmentArgUnused($atOtherHomes: Boolean) on Dog {
19741990}
19751991```
19761992
1977- This document is invalid because even though ` fragmentArgUnused ` is spread with
1978- the argument ` atOtherHomes ` , and even though ` $atOtherHomes ` is defined as an
1993+ This document is invalid: even though ` fragmentArgUnused ` is spread with
1994+ the argument ` atOtherHomes ` and ` $atOtherHomes ` is defined as an
19791995operation variable, there is never a variable ` $atOtherHomes ` used within the
19801996scope of ` fragmentArgUnused ` .
19811997
@@ -1987,9 +2003,9 @@ scope of `fragmentArgUnused`.
19872003 - Let {variableUsages} be all usages transitively included in the {operation}.
19882004 - For each {variableUsage} in {variableUsages}:
19892005 - Let {variableName} be the name of {variableUsage}.
1990- - If the usage is within a {fragment} that defines an argument of
2006+ - If the usage is within a {fragment} that defines a {variableDefinition} for
19912007 {variableName}:
1992- - Let {variableDefinition} be the {ArgumentDefinition } named
2008+ - Let {variableDefinition} be the {VariableDefinition } named
19932009 {variableName} defined within {fragment}.
19942010 - Otherwise, let {variableDefinition} be the {VariableDefinition} named
19952011 {variableName} defined within {operation}.
0 commit comments