diff --git a/dgraph/cmd/alpha/upsert_test.go b/dgraph/cmd/alpha/upsert_test.go index 0bf39b0eda4..d046ecc7569 100644 --- a/dgraph/cmd/alpha/upsert_test.go +++ b/dgraph/cmd/alpha/upsert_test.go @@ -693,6 +693,12 @@ upsert { uid(u2) "user2" . uid(u1) uid(u2) . } + + delete { + uid(u3) uid(u1) . + uid(u1) uid(u3) . + uid(u3) * . + } } query { @@ -703,6 +709,10 @@ upsert { user2(func: eq(email, "user2@dgraph.io")) { u2 as uid } + + user3(func: eq(email, "user3@dgraph.io")) { + u3 as uid + } } }` doUpsert := func(wg *sync.WaitGroup) { @@ -755,3 +765,32 @@ upsert { }` z.CompareJSON(t, expected, res) } + +func TestUpsertDeleteNonExistent(t *testing.T) { + require.NoError(t, dropAll()) + require.NoError(t, alterSchema(` +email: string @index(exact) @upsert . +name: string @index(exact) @lang . +friend: uid @reverse .`)) + + m := ` +upsert { + mutation { + delete { + uid (u1) uid ( u2 ) . + } + } + + query { + user1(func: eq(name@en, "user1")) { + u1 as uid + } + + user2(func: eq(name@en, "user2")) { + u2 as uid + } + } +}` + _, _, _, err := mutationWithTs(m, "application/rdf", false, true, true, 0) + require.NoError(t, err) +} diff --git a/edgraph/server.go b/edgraph/server.go index de538b93a56..c3ee310aa8d 100644 --- a/edgraph/server.go +++ b/edgraph/server.go @@ -524,8 +524,22 @@ func (s *Server) doMutate(ctx context.Context, mu *api.Mutation, authorize bool) return s } + // Remove the mutations from gmu.Del when no UID was found + gmuDel := make([]*api.NQuad, 0, len(gmu.Del)) + for _, nq := range gmu.Del { + nq.Subject = getNewVal(nq.Subject) + nq.ObjectId = getNewVal(nq.ObjectId) + + if !strings.HasPrefix(nq.Subject, "_:uid(") && + !strings.HasPrefix(nq.ObjectId, "_:uid(") { + + gmuDel = append(gmuDel, nq) + } + } + gmu.Del = gmuDel + // update the values in mutation block from the query block. - for _, nq := range append(gmu.Set, gmu.Del...) { + for _, nq := range gmu.Set { nq.Subject = getNewVal(nq.Subject) nq.ObjectId = getNewVal(nq.ObjectId) }