Skip to content
This repository was archived by the owner on Sep 2, 2022. It is now read-only.

Internal server error for specific deleteMany mutation with deep filter #2140

Closed
marktani opened this issue Mar 22, 2018 · 1 comment
Closed

Comments

@marktani
Copy link
Contributor

Bug Report

Current behavior

Running a specific deleteManyXs mutation with deep filters results in an internal server error.

Reproduction

npm install -g [email protected]
prisma local upgrade
prisma init test
cd test

Adjust datamodel.graphql to

type A {
  id: ID! @unique
  title: String!
  b: B! @relation(name: "AB")
}

type B {
  id: ID! @unique
  title: String!
  as: [A!]! @relation(name: "AB" onDelete: CASCADE)
  c: C! @relation(name: "BC")
}

type C {
  id: ID! @unique
  title: String!
  bs: [B!]! @relation(name: "BC")
}
prisma deploy
prisma playground

Add some data:

mutation a {
  yes: createA(data: {
    title: "A"
    b: {
      create: {
        title: "B"
        c: {
          create: {
            title: "yes"
          }
        }
      }
    }
  }) {
    title
    b {
      title
      c {
        title
      }
    }
  }
  no: createA(data: {
    title: "A"
    b: {
      create: {
        title: "B"
        c: {
          create: {
            title: "no"
          }
        }
      }
    }
  }) {
    title
    b {
      title
      c {
        title
      }
    }
  }
}

Try to run the following deleteManyAs mutation:

mutation b {
  deleteManyAs(where: {
    b: {
      c: {
        title: "yes"
      }
    }
  }) {
    count
  }
}

You'll receive an internal server error, with logs similar to this:

{
    "key": "error/unhandled",
    "requestId": "...",
   "clientId": "...",
   "payload": {
       "exception":"java.lang.IllegalArgumentException: Unsupported scalar value in SlickExtensions: ListMap(title -> Some(<--STRING-->))",
       "query":"mutation ($_where: AutomationResultWhereInput!) {\n  deleteManyAutomationResults(where: $_where) {\n    count\n  }\n}\n",
       "variables":"{\"_where\":{\"automationTest\":{\"feature\":{\"title\":\"Patients\"}}}}",
       "code":"0",
       "stack_trace":"com.prisma.api.database.SlickExtensions$.escapeUnsafeParam(SlickExtensions.scala:93)\\n com.prisma.api.database.QueryArguments$.$anonfun$generateFilterConditions$2(QueryArguments.scala:351)\\n scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)\\n scala.collection.immutable.List.foreach(List.scala:389)\\n scala.collection.TraversableLike.map(TraversableLike.scala:234)\\n scala.collection.TraversableLike.map$(TraversableLike.scala:227)\\n scala.collection.immutable.List.map(List.scala:295)\\n com.prisma.api.database.QueryArguments$.generateFilterConditions(QueryArguments.scala:240)\\n com.prisma.api.database.QueryArguments$.filterOnRelation$1(QueryArguments.scala:236)\\n com.prisma.api.database.QueryArguments$.$anonfun$generateFilterConditions$2(QueryArguments.scala:387)\\n scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)\\n scala.collection.immutable.List.foreach(List.scala:389)\\n scala.collection.TraversableLike.map(TraversableLike.scala:234)\\n scala.collection.TraversableLike.map$(TraversableLike.scala:227)\\n scala.collection.immutable.List.map(List.scala:295)\\n com.prisma.api.database.QueryArguments$.generateFilterConditions(QueryArguments.scala:240)\\n com.prisma.api.database.DatabaseQueryBuilder$.$anonfun$countAllFromModel$1(DatabaseQueryBuilder.scala:80)\\n scala.Option.flatMap(Option.scala:171)\\n com.prisma.api.database.DatabaseQueryBuilder$.countAllFromModel(DatabaseQueryBuilder.scala:79)\\n com.prisma.api.database.DataResolver.countByModel(DataResolver.scala:53)\\n com.prisma.api.database.DataResolver.countByModel(DataResolver.scala:50)\\n com.prisma.api.mutations.mutations.DeleteMany.<init>(DeleteMany.scala:23)\\n com.prisma.api.schema.SchemaBuilderImpl.$anonfun$deleteManyField$1(SchemaBuilder.scala:210)\\n sangria.execution.Resolver.resolveField(Resolver.scala:1024)\\n sangria.execution.Resolver.resolveSingleFieldSeq(Resolver.scala:236)\\n sangria.execution.Resolver.$anonfun$resolveSeq$2(Resolver.scala:216)\\n scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:302)\\n scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)\\n scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)\\n akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)\\n akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)\\n scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)\\n scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:81)\\n akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:91)\\n akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)\\n akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:43)\\n akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)\\n akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)\\n akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)\\n akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)",
     
         "message":"Unsupported scalar value in SlickExtensions: ListMap(title -> Some(<--STRING-->))"}
}

Running the same mutation without filters works as expected:

mutation b2 {
  deleteManyAs (where: {}) {
    count
  }
}

You can verify the difference by running this query:

query c {
  as {
    b {
      c {
        title
      }
    }
  }
}

Note the onDelete: CASCADE statement in as: [A!]! @relation(name: "AB" onDelete: CASCADE), that might be related to #2103.

Expected behavior?

deleteManyAs mutation with deep filter works as expected.

@sorenbs
Copy link
Member

sorenbs commented Apr 8, 2018

This fix is available on the unstable channel and will be released Tuesday next week

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants