If the value does not match any non-NULL candidate and the list contains NULL, NOT IN becomes UNKNOWN.
no match plus NULL gives UNKNOWN
Read UNKNOWN rows
The NULL-list run has 4 UNKNOWN rows, including 3 non-matches made UNKNOWN by the list NULL.
UNKNOWN rows=4
NOT IN examples are tiny finite WHERE-style filters with SQL-style TRUE/FALSE/UNKNOWN behavior; correlation, optimizer behavior, execution cost, indexing, SQL dialect completeness, and database-product claims are out of scope.
Non-match is not enough
Blue, green, and yellow do not match red, but the NULL candidate prevents TRUE.