From: | "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
---|---|
To: | Jeff Davis <pgsql(at)j-davis(dot)com> |
Cc: | Yugo NAGATA <nagata(at)sraoss(dot)co(dot)jp>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Peter Eisentraut <peter(at)eisentraut(dot)org>, David Rowley <dgrowleyml(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Document NULL |
Date: | 2024-12-09 22:27:02 |
Message-ID: | CAKFQuwZoeWrM0WuH2io+MoiFKtQjp+Y+8gO1PUDRs8iEzwj16w@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Thank you for the review. Changes noted below will be part of v5.
On Fri, Nov 22, 2024 at 12:00 PM Jeff Davis <pgsql(at)j-davis(dot)com> wrote:
>
> 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).
I haven't explicitly included such an example but have expanded in this
direction a bit.
Using COALESCE() can be a good
> strategy here.
>
>
I have now mentioned coalesce and nullif.
<para>
When dealing with null values it is often useful to explicitly to
convert
data to and from a null value given a known non-null representation
(e.g., the empty string, the numbers 0 or 1, or boolean false).
The <link>COALESCE</link> and <link>NULLIF</link> functions are useful
for this purpose.
</para>
> 2.
>
> It would be helpful to go through a combined example that shows how
> these varous behaviors interact.
>
I have not done this. This is already a large patch and this kind of
example doesn't seem like our norm. I'm not opposed to more content like
this but for now would leave considering it as something an interested
party can propose once this goes in.
>
> 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:
Agreed. This isn't the place for that presentation and material.
<para>
The presence of null values in the system results in three-valued logic.
In conventional two-valued (binary) logic every outcome is either true
or false.
In three-valued logic the concept of unknown, represented using the
null value, is
also an outcome. This results in falsifying the common-sense notion
that "p OR NOT p" is always true.
</para>
> 4. COUNT() with no input is a special case that returns zero, and I
> think that's worth mentioning somewhere.
>
>
I added a parenthetical to the following sentence to address this point:
When executing an aggregate or window function the state tracking component
(which may be initialized to a non-null value, e.g., 0 for the count
function)
will remain unchanged even if the underlying processing
function returns a null value, whether from being defined strict
or it simply returns a null value upon execution.
I'm hesitant to add an example for it though...the implication of the note
seems sufficiently clear - if there are zero rows providing non-null inputs
to an aggregate its concept of initialized non-null value will be
returned. Since count doesn't have an input function to check the only way
to see zero such rows is if the underlying thing being counted is empty.
David J.
From | Date | Subject | |
---|---|---|---|
Next Message | Nathan Bossart | 2024-12-09 22:28:36 | Re: unused-but-set-variable warning on REL_13_STABLE |
Previous Message | Andres Freund | 2024-12-09 22:23:25 | Re: Unmark gen_random_uuid() function leakproof |