diff --git a/schema/parse.go b/schema/parse.go index 10faabd14b9..1cc1299e83c 100644 --- a/schema/parse.go +++ b/schema/parse.go @@ -322,6 +322,16 @@ func parseTypeDeclaration(it *lex.ItemIterator) (*pb.TypeUpdate, error) { } it.Prev() + fieldSet := make(map[string]struct{}) + for _, field := range fields { + if _, ok := fieldSet[field.GetPredicate()]; ok { + return nil, it.Item().Errorf("Duplicate fields with name: %s", + field.GetPredicate()) + } + + fieldSet[field.GetPredicate()] = struct{}{} + } + typeUpdate.Fields = fields return typeUpdate, nil case itemText: diff --git a/schema/parse_test.go b/schema/parse_test.go index 78f60e5eb23..ab8ff1eec27 100644 --- a/schema/parse_test.go +++ b/schema/parse_test.go @@ -672,6 +672,18 @@ func TestParseNonNullableScalarAndList(t *testing.T) { }, result.Types[0]) } +func TestParseTypeDuplicateFields(t *testing.T) { + reset() + _, err := Parse(` + type Person { + Name: string! + Name: string + } + `) + require.Error(t, err) + require.Contains(t, err.Error(), "Duplicate fields with name: Name") +} + func TestParseTypeErrMissingNewLine(t *testing.T) { reset() _, err := Parse(`