diff --git a/validator/schema.go b/validator/schema.go index 1780ae36..33bf41e2 100644 --- a/validator/schema.go +++ b/validator/schema.go @@ -199,6 +199,14 @@ func validateDefinition(schema *Schema, def *Definition) *gqlerror.Error { } } + for idx, field1 := range def.Fields { + for _, field2 := range def.Fields[idx+1:] { + if field1.Name == field2.Name { + return gqlerror.ErrorPosf(field2.Position, "Field %s.%s can only be defined once.", def.Name, field2.Name) + } + } + } + return validateDirectives(schema, def.Directives, nil) } diff --git a/validator/schema_test.yml b/validator/schema_test.yml index 375fb640..dba1040d 100644 --- a/validator/schema_test.yml +++ b/validator/schema_test.yml @@ -10,6 +10,38 @@ types: error: message: "Cannot redeclare type A." locations: [{line: 4, column: 6}] + - name: cannot be duplicated field at same definition 1 + input: | + type A { + name: String + name: String + } + error: + message: "Field A.name can only be defined once." + locations: [{line: 3, column: 3}] + - name: cannot be duplicated field at same definition 2 + input: | + type A { + name: String + } + extend type A { + name: String + } + error: + message: "Field A.name can only be defined once." + locations: [{line: 5, column: 3}] + - name: cannot be duplicated field at same definition 3 + input: | + type A { + name: String + } + extend type A { + age: Int + age: Int + } + error: + message: "Field A.age can only be defined once." + locations: [{line: 6, column: 3}] object types: - name: must define one or more fields