Subject: boolean states

From: Jack Douglas <[email-masked]>
Date: Wed, 27 Apr 2011 09:46:27 +0100

Hi

http://www.postgresql.org/docs/current/static/datatype-boolean.html states:

         The boolean type can have one of only two states: "true" or 
"false". A third state, "unknown", is represented by the SQL null value.

This sounds like an oxymoron to me. Perhaps that sentence should be 
changed to:

         The boolean type can have one of three states: "true" or 
"false" and "unknown". The third state, "unknown", is represented by the 
SQL null value.
or:

         The boolean type can have one of three states: "true" or 
"false" and null. The third state, null, represents the logical value 
"unknown".

Best regards
Jack Douglas

---

From: Josh Kupershmidt <[email-masked]>
Date: Thu, 28 Apr 2011 21:20:39 -0400

On Wed, Apr 27, 2011 at 4:46 AM, Jack Douglas
<[email-masked]> wrote:
>        The boolean type can have one of only two states: "true" or "false".
> A third state, "unknown", is represented by the SQL null value.
>
> This sounds like an oxymoron to me.

I'm not crazy about that paragraph's confusion between two and three
states either, but..

> Perhaps that sentence should be changed
> to:
>
>        The boolean type can have one of three states: "true" or "false" and
> "unknown". The third state, "unknown", is represented by the SQL null value.
> or:
>
>        The boolean type can have one of three states: "true" or "false" and
> null. The third state, null, represents the logical value "unknown".

I don't think either of these suggested replacements are any better.
First, a boolean column can be declared NOT NULL. Second, I don't like
the idea of misleading people into thinking that NULL is on equal
footing with the other values of a given datatype, particularly as
your first alternative implies.

I'd vote for just ripping out the:
|  A third state, "unknown", is represented by the SQL null value.

sentence entirely. I see no reason why NULL should be talked about in
particular on the page about boolean data types; there are many data
types, any of which might be NULL.

I almost think it would be worthwhile to have a section in the docs on
the (counterintuitive) behaviors of NULL, such as this great post:
<http://thoughts.j-davis.com/2009/08/02/what-is-the-deal-with-nulls/>
-- or maybe just a link to that page.

Josh

---

From: Jack Douglas <[email-masked]>
Date: Fri, 29 Apr 2011 08:29:45 +0100

> types, any of which might be NULL.
NULL is not unique to boolean, but UNKNOWN is - it would surely be wrong 
to have no mention of it at all on this page. This is because the 
boolean type is the only one used to represent truth (or logical) 
values. One of the comments from the link you provided:

> What’s even more interesting is that for BOOLEAN they invented the 
> keyword UNKNOWN and the 2003 standard states “The null value of the 
> boolean data type is equivalent to the Unknown truth value.” So for 
> BOOLEAN (and only BOOLEAN AFAICT) you’re supposed to say WHERE 
> <boolean primary> IS [NOT] UNKNOWN. And in the definition of 
> “literal”, which is supposed to “Specify a non-null value”, “boolean 
> literal” is equated to TRUE, FALSE or UNKNOWN (but the latter is 
> equivalent to a “null value” a few pages later).

---

From: Josh Kupershmidt <[email-masked]>
Date: Sun, 1 May 2011 19:07:10 -0400

On Fri, Apr 29, 2011 at 3:29 AM, Jack Douglas
<[email-masked]> wrote:
> NULL is not unique to boolean, but UNKNOWN is - it would surely be wrong to
> have no mention of it at all on this page. This is because the boolean type
> is the only one used to represent truth (or logical) values. One of the
> comments from the link you provided:
>
>> What’s even more interesting is that for BOOLEAN they invented the keyword
>> UNKNOWN and the 2003 standard states “The null value of the boolean data
>> type is equivalent to the Unknown truth value.” So for BOOLEAN (and only
>> BOOLEAN AFAICT) you’re supposed to say WHERE <boolean primary> IS [NOT]
>> UNKNOWN. And in the definition of “literal”, which is supposed to “Specify a
>> non-null value”, “boolean literal” is equated to TRUE, FALSE or UNKNOWN (but
>> the latter is equivalent to a “null value” a few pages later).

Ah, OK - I had forgotten about that SQL syntax. I do agree that this sentence:
| A third state, "unknown", is represented by the SQL null value.

is particularly confusing, suggesting that "unknown" is a valid
boolean literal, on equal footing with "true" and "false".

We do document the use of IS [NOT] UNKNOWN already, see:
<http://www.postgresql.org/docs/current/interactive/functions-comparison.html>

and IMO that page is the appropriate place for such discussion. So
maybe we just need a link to that page, and should strip out the
confusing sentence about "third state" entirely? Patch attached.

Josh

---

From: Jaime Casanova <[email-masked]>
Date: Mon, 2 May 2011 17:18:27 -0500

On Wed, Apr 27, 2011 at 3:46 AM, Jack Douglas
<[email-masked]> wrote:
>
> This sounds like an oxymoron to me. Perhaps that sentence should be changed
> to:
>

if my boolean arithmetic is not wrong the above expression is bad.
better expressed is: "true", "false" or "unknown"...

-- 
Jaime Casanova         www.2ndQuadrant.com
Professional PostgreSQL: Soporte y capacitación de PostgreSQL

---

From: Jack Douglas <[email-masked]>
Date: Wed, 04 May 2011 07:28:23 +0100

> better expressed is: "true", "false" or "unknown"...
There are two kinds of people on this earth, those who understand 
boolean arithmatic and those who don't. I'm not one of them.