On Fri, 2024-06-28 at 13:39 -0700, David G. Johnston wrote: > The attached are complete and ready for review. I did some file > structure reformatting at the end and left that as the second patch. > The first contains all of the content.
I read through v4-0001. Thank you for working on this! I really like the overall feel of the document: outlines the various interpretations, behaviors, nuances and rationales; practical and not philosophical. Comments: 1. One idea is to have a brief guidance section to help users know how to use nulls in their data model effectively. For instance, if you allow nulls for middle_name to mean "no middle name", then you have to be careful when concatenating it as part of a larger string (otherwise it will make the entire result null). Using COALESCE() can be a good strategy here. 2. It would be helpful to go through a combined example that shows how these varous behaviors interact. For instance: SELECT r.a, SUM(s.b) FROM r LEFT JOIN s ON r.id = s.id GROUP BY r.a HAVING SUM(s.b) < 123; Assume that there are no null values in r or s, and there's one record in r with no match in s. First, a null value comes into existence from the outer join when there's no match. Then, the GROUP BY creates a group with a single null value. Then the SUM aggregates it and returns null. Then the less-than expression evaluates to null (due to 3VL), then the HAVING clause excludes the record because it's distinct from true. That's probably not what the user intended -- the sum of no records is intuitively less than 123. 3. "...more formally, the Law of the Excluded Middle does not hold: i.e., p OR NOT(p) != true; for all p." Switching to formal language here is confusing (and wrong, I think). I suggest rewording and I don't think you need formal language here: what you are highlighting is that, when p is the null value, the expression "p OR NOT p" evaluates to null, which is surprising to someone who is used to thinking in 2VL. 4. COUNT() with no input is a special case that returns zero, and I think that's worth mentioning somewhere. Regards, Jeff Davis