# Bug 3569: We got our first QoD

- Status: closed
- Project: Zero
- Creator: @aboodman
- Created: 2025-02-18T02:28:59Z
- Modified: 2025-05-15T23:03:04Z
- URL: https://bugs.rocicorp.dev/p/zero/issue/3569

## Description

https://discord.com/channels/830183651022471199/1341029637236461568/1341154411228954734

Run this reproduction, refresh page a few time, zero-cache crashes.

## Comments (4)

### @grgbkr — 2025-02-18T23:18:20Z

This [query](https://github.com/meesvandongen/hello-zero/blob/main/src/App.tsx#L16) which starts off with 27 subqueries, when combined with these [permissions](https://github.com/meesvandongen/hello-zero/blob/main/src/schema.ts#L197) is transformed into a query with 183,939 subqueries!  The resulting AST is 500 MBs.  Oh my.

```
greg tmp3 [grgbkr/dbg]$ grep -o -i \"subquery\" 1qwcqvi0zoenn.txt | wc -l
      27
greg tmp3 [grgbkr/dbg]$ grep -o -i \"subquery\" 1qwcqvi0zoenn.transformed.txt | wc -l
  183939
greg tmp3 [grgbkr/dbg]$ ls -lah 1qwcqvi0zoenn*
-rw-r--r--  1 greg  staff   499M Feb 18 15:51 1qwcqvi0zoenn.transformed.txt
-rw-r--r--  1 greg  staff    35K Feb 18 15:51 1qwcqvi0zoenn.txt
```

### @grgbkr — 2025-02-19T18:10:39Z

It's not obvious why the blow up is so large.  Sure the query has quite a lot of subqueries and the permission rules do as well, but I would expect a final number of subqueries in the 100s, not 184k.  

Part of the problem is DNF conversion causing condition blow up.

```
== Start transformQuery

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2176,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":1954,"numSubqueries":6} 
---- updated where {"length":21260,"numSubqueries":68} 
---- updated dnf where {"length":142522,"numSubqueries":456}

---- transformQueryInternal 
---- orig where {"length":4139,"numSubqueries":13} 
---- updated where {"length":164013,"numSubqueries":525} 
---- updated dnf where {"length":1148777,"numSubqueries":3675}

---- transformQueryInternal 
---- orig where {"length":6324,"numSubqueries":20} 
---- updated where {"length":1170268,"numSubqueries":3744} 
---- updated dnf where {"length":8192562,"numSubqueries":26208}

---- transformQueryInternal 
---- orig where {"length":8509,"numSubqueries":27} 
---- updated where {"length":8214053,"numSubqueries":26277} 
---- updated dnf where {"length":57499057,"numSubqueries":183939}

== End transformQuery 
== orig {"length":8567,"numSubqueries":27} 
== transformed {"length":55864769,"numSubqueries":183939}
```

### @grgbkr — 2025-02-19T18:25:39Z

Actually it seems DNF conversion blowing up the query is the whole problem, if I remove DNF conversion at all layers we end up with a transformed query with 275 subqueries.

```
== Start transformQuery

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":102,"numSubqueries":0} 
---- updated where {"length":2205,"numSubqueries":7} 
---- updated dnf where {"length":2205,"numSubqueries":7}

---- transformQueryInternal 
---- orig where {"length":1954,"numSubqueries":6} 
---- updated where {"length":21434,"numSubqueries":68} 
---- updated dnf where {"length":21434,"numSubqueries":68}

---- transformQueryInternal 
---- orig where {"length":4139,"numSubqueries":13} 
---- updated where {"length":43099,"numSubqueries":137} 
---- updated dnf where {"length":43099,"numSubqueries":137}

---- transformQueryInternal 
---- orig where {"length":6324,"numSubqueries":20} 
---- updated where {"length":64764,"numSubqueries":206} 
---- updated dnf where {"length":64764,"numSubqueries":206}

---- transformQueryInternal 
---- orig where {"length":8509,"numSubqueries":27} 
---- updated where {"length":86429,"numSubqueries":275} 
---- updated dnf where {"length":86429,"numSubqueries":275}

== End transformQuery 
== orig {"length":8567,"numSubqueries":27} 
== transformed {"length":83967,"numSubqueries":275}
```

### @grgbkr — 2025-05-15T20:05:15Z

Fixed in https://github.com/rocicorp/mono/pull/4386
