Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Zoltan Boszormenyi

Alexander Staubo írta:

On 6/4/07, Andrew Sullivan <[EMAIL PROTECTED]> wrote:

On Mon, Jun 04, 2007 at 12:37:42AM +0200, PFC wrote:
> NULL usually means "unknown" or "not applicable"

Aaaargh!  No, it doesn't.  It means NULL.  Nothing else.

If it meant unknown or not applicable or anything else, then

SELECT * FROM nulltbl a, othernulltbl b
WHERE a.nullcol = b.nullcol

would return rows where a.nullcol contained NULL and b.nullcol
contained NULL.  But it doesn't, because !(NULL = NULL).


I don't disagree with the principle, but that's a specious argument.
Who says (unknown = unknown) should equal true?


NULL means "value doesn't exist" and for your amusement,
here's an analogy why !(NULL = NULL).
Prove the following statement: every fairy has black hair.
For proving it, let's suppose that there exists a fairy that's hair
isn't black. But fairies don't exist. QED.
Now replace the above statement with another one,
possibly with one that contradicts with the statement above.
Along the same lines, every statements can be proven about
non-existing things, even contradicting ones.

Best regards

--
--
Zoltán Böszörményi
Cybertec Geschwinde & Schönig GmbH
http://www.postgresql.at/


---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread PFC



Aaaargh!  No, it doesn't.  It means NULL.  Nothing else.


Well, x = UNKNOWN doesn't make any sense... the answer is UNKNOWN.
	x IS UNKNOWN does make sense, the answer is true or false. Replace  
UNKNOWN with NULL...


	Actually it means what the DBA wants it to mean (which opens the door to  
many a misguided design...)


	I hereby light a candle to the pgsql designers who didn't inflict  
00-00- 00:00:00 upon us besides NULL dates.


---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Andrew Sullivan
On Mon, Jun 04, 2007 at 03:38:01PM +0100, Richard Huxton wrote:
> Well, a strict "unknown" is fine - so long as it means just that.
>   How tall is Andrew? Unknown
>   How tall is Richard? Unknown
>   Are Andrew and Richard the same height? Unknown
> 
> The problem is the slippery-slope from "unknown" to "not applicable" to 
> "user refused to answer" to ...whatever

While you do well to point out that I have equivocated on "unknown"
(in my usual twitchy way whenever NULLs come up, I am told), your
example actually illustrates part of the problem.  There are NULLs
that are actually just local absences of data (you don't know how
tall I am), NULLs that are in fact cases of 'no such data' (the full
name that 'S' stands for in Harry S Truman -- Truman's middle name
was in fact just S), NULLs that are data nobody knows (unlike the
mere locally-unknown data: "When the tree fell in the woods with
nobody around to hear it, did it make a sound?"), and NULLs that are
the data in response to questions that can't be answered, ("What
exists after the end of the universe?")

See, this is what happens when you study the wrong things in school. 
You start to think that logic and metaphysics are somehow related to
one another. :-/

A

-- 
Andrew Sullivan  | [EMAIL PROTECTED]
The fact that technology doesn't work is no bar to success in the marketplace.
--Philip Greenspun

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org/


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Alexander Staubo

On 6/4/07, Andrew Sullivan <[EMAIL PROTECTED]> wrote:

On Mon, Jun 04, 2007 at 12:37:42AM +0200, PFC wrote:
> NULL usually means "unknown" or "not applicable"

Aaaargh!  No, it doesn't.  It means NULL.  Nothing else.

If it meant unknown or not applicable or anything else, then

SELECT * FROM nulltbl a, othernulltbl b
WHERE a.nullcol = b.nullcol

would return rows where a.nullcol contained NULL and b.nullcol
contained NULL.  But it doesn't, because !(NULL = NULL).


I don't disagree with the principle, but that's a specious argument.
Who says (unknown = unknown) should equal true?

Alexander.

---(end of broadcast)---
TIP 4: Have you searched our list archives?

  http://archives.postgresql.org/


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Greg Smith

On Mon, 4 Jun 2007, Ian Harding wrote:


The hazard with doing stuff like that is some joker could name their
kid Billy NMN Simpson.  Or this
http://www.snopes.com/autos/law/noplate.asp


That settles it; I'm getting custom plates with NULL on them just to see 
if it makes it impossible for me to be sent a ticket.


--
* Greg Smith [EMAIL PROTECTED] http://www.gregsmith.com Baltimore, MD

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
  choose an index scan if your joining column's datatypes do not
  match


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Richard Huxton

Andrew Sullivan wrote:

On Mon, Jun 04, 2007 at 12:37:42AM +0200, PFC wrote:

NULL usually means "unknown" or "not applicable"


Aaaargh!  No, it doesn't.  It means NULL.  Nothing else.  

If it meant unknown or not applicable or anything else, then 


SELECT * FROM nulltbl a, othernulltbl b
WHERE a.nullcol = b.nullcol

would return rows where a.nullcol contained NULL and b.nullcol
contained NULL.  But it doesn't, because !(NULL = NULL).  


Well, a strict "unknown" is fine - so long as it means just that.
  How tall is Andrew? Unknown
  How tall is Richard? Unknown
  Are Andrew and Richard the same height? Unknown

The problem is the slippery-slope from "unknown" to "not applicable" to 
"user refused to answer" to ...whatever



Part of it is the poor support for out-of-band values. In many cases 
what people want is the ability to have a value of type 'number in range 
1-20 or text "n/a"' and there's not a simple way to provide that, so 
they use null.


--
  Richard Huxton
  Archonet Ltd

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

  http://www.postgresql.org/docs/faq


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Owen Hartnett

At 12:37 AM +0200 6/4/07, PFC wrote:

Yeah, it is awful ;^)  However the existing system is equally awful
because there is no way to enter NULL!


Consider this form :

First name :Edgar
Middle name :   J.
Last name : Hoover

Now, if someone has no middle name, like "John Smith", should we use 
NULL or "" for the middle name ?
NULL usually means "unknown" or "not applicable", so I believe we 
have to use the empty string here. It makes sense to be able to 
concatenate the three parts of the name, without having to put 
COALESCE() everywhere.


Now consider this form :

City:
State   :
Country :

If the user doesn't live in the US, "State" makes no sense, so it 
should be NULL, not the empty string. There is no unnamed state. 
Also, if the user does not enter his city name, this does not mean 
he lives in a city whose name is "". So NULL should be used, too.


It is very context-dependent.


My take on the NULL philosophy is that NULL should indicate that no 
data has been entered.  If the data for the record is not applicable, 
then it should have a zero length string, indicating that the field 
has been considered by the user, and that a blank value is 
appropriate.  A NULL field on an entered record should indicate an 
error condition, rather than that the field is not appropriate to the 
context.


Thus, NULL fields on a completed record would mean either that they 
were never presented to the user (thus, did not appear in the UI), or 
an error condition.


The advantages to this is that, if enforced, a count of the non-null 
records will show those operated on by a user, vs. those untouched by 
a user.


-Owen

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] so that your
  message can get through to the mailing list cleanly


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Ian Harding

On 6/3/07, PFC <[EMAIL PROTECTED]> wrote:


> Yeah, it is awful ;^)  However the existing system is equally awful
> because there is no way to enter NULL!

Consider this form :

First name :Edgar
Middle name :   J.
Last name : Hoover

Now, if someone has no middle name, like "John Smith", should we use NULL
or "" for the middle name ?


"NMN"  for No Middle Name.

http://www.google.com/search?hl=en&q=data+standards+no+middle+name+NMN&btnG=Search

The hazard with doing stuff like that is some joker could name their
kid Billy NMN Simpson.  Or this

http://www.snopes.com/autos/law/noplate.asp

If the the "None" identifier can't be guaranteed to not conflict with
data, the best thing is a boolean for "None".


NULL usually means "unknown" or "not applicable", so I believe we have to
use the empty string here. It makes sense to be able to concatenate the
three parts of the name, without having to put COALESCE() everywhere.



Null always means unknown.  N/A usually means Not Applicable.  I use
COALESCE once in a view and never again.


Now consider this form :

City:
State   :
Country :

If the user doesn't live in the US, "State" makes no sense, so it should
be NULL, not the empty string. There is no unnamed state. Also, if the
user does not enter his city name, this does not mean he lives in a city
whose name is "". So NULL should be used, too.



There are states in other countries, but I get your meaning.  But if
someone doesn't enter their middle name, that doesn't mean their
parents named them Billy "" Simpson either, right?

I think there is an argument for filling fields with empty strings
where they are _known_ not to exist but they are _applicable_  but I
don't do it.  I prefer the consistency of NULL for absent data versus
WHERE (mname = '' OR mname IS NULL).  Again, the user failing to enter
it when presented an opportunity does not meet the "known not to
exist" test for me.


It is very context-dependent.



Yeah, unless you are a stubborn old null zealot like me!

- Ian

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] so that your
  message can get through to the mailing list cleanly


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-04 Thread Andrew Sullivan
On Mon, Jun 04, 2007 at 12:37:42AM +0200, PFC wrote:
> NULL usually means "unknown" or "not applicable"

Aaaargh!  No, it doesn't.  It means NULL.  Nothing else.  

If it meant unknown or not applicable or anything else, then 

SELECT * FROM nulltbl a, othernulltbl b
WHERE a.nullcol = b.nullcol

would return rows where a.nullcol contained NULL and b.nullcol
contained NULL.  But it doesn't, because !(NULL = NULL).  

It's too bad indeed that the originators of SQL used three-value
rather than five-value logic, but this is what we have.  If you
happen to want to use NULL to mean something specific in some
context, go ahead, but you shouldn't generalise that to "usually
means" anything.

A

-- 
Andrew Sullivan  | [EMAIL PROTECTED]
Everything that happens in the world happens at some place.
--Jane Jacobs 

---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-03 Thread PFC



Yeah, it is awful ;^)  However the existing system is equally awful
because there is no way to enter NULL!


Consider this form :

First name :Edgar
Middle name :   J.
Last name : Hoover

Now, if someone has no middle name, like "John Smith", should we use NULL  
or "" for the middle name ?
NULL usually means "unknown" or "not applicable", so I believe we have to  
use the empty string here. It makes sense to be able to concatenate the  
three parts of the name, without having to put COALESCE() everywhere.


Now consider this form :

City:   
State   :
Country :

If the user doesn't live in the US, "State" makes no sense, so it should  
be NULL, not the empty string. There is no unnamed state. Also, if the  
user does not enter his city name, this does not mean he lives in a city  
whose name is "". So NULL should be used, too.


It is very context-dependent.

---(end of broadcast)---
TIP 4: Have you searched our list archives?

  http://archives.postgresql.org/


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-03 Thread Alexander Staubo

On 6/3/07, Ian Harding <[EMAIL PROTECTED]> wrote:

On 6/3/07, Alexander Staubo <[EMAIL PROTECTED]> wrote:
> Your patch is awful because it would mean there was no way to enter an
> empty string in the database. A one-character string containing a
> single space is not an empty string.

Yeah, it is awful ;^)  However the existing system is equally awful
because there is no way to enter NULL!


But there is. One could, quite convincingly, I think, argue that the
parsing of '' (empty string) into nil/null is data model-specific. One
solution, then, is to add this rule to the model:

class User < ActiveRecord::Base
 ...

 def description=(value)
   value = nil if value.blank?
   self.write_attribute(:description, value)
 end

end

You can easily refactor this into a plugin, which you could then invoke thus:

class User < ActiveRecord::Base
 null_when_empty :description
 ...
end

This is getting very Rails-specific, so I'll stop here. I would be
happy to send you the code (it's probably around 15 lines) for such a
plugin privately if you like.


Properly implemented, the rails model would allow you to indicate
nullability and use null if no data is provided.


The preferred approach nowadays is not to clutter the Rails (or in
this case, ActiveRecord) core unduly with all sorts of app-specific
solutions, and instead move code out into plugins. Plugins that, over
time, prove to be universally useful, would be considered for
inclusion into the core. So a plugin is a start.

Alexander.

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
  choose an index scan if your joining column's datatypes do not
  match


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-03 Thread Ian Harding

On 6/3/07, Alexander Staubo <[EMAIL PROTECTED]> wrote:

On 6/3/07, Ian Harding <[EMAIL PROTECTED]> wrote:
> > An empty string is not null! Null means the value is missing, which is
> > clearly not the case here. I would say Rails is exactly in the right
> > here. When an HTML form is posted, empty input boxes are declared as
> > empty strings, which what the user entered. The problem is not with
> > Rails/ActiveRecord but with your form handling. If you want empty
> > boxes to become null, add some client-side JavaScript logic that sets
> > the "disabled" attribute on empty input elements before form is
> > submitted; this will prevent the client from sending the value.
>
> The user was presented an _opportunity_ to enter data and did not.
> The data is unknown.  I don't know how you can say "...The user
> entered" an empty string.  There is no empty string key on the
> keyboard.

Not at all. If the input box already contained a string, and the user
erased the contents of the input box, then the user has, in effect,
entered an empty string. Not a "null". This is a UI layer issue, not a
database issue.

> I have no idea why I got such hard pushback on this.  This is the
> EXACT same behaviour other types use.  If a number field is presented
> to the user and submitted with no value, NULL Is inserted.  Not zero,
> which is the numeric equivalent of the empty string, but NULL.   Same
> with date types.  Why not say they entered '1/1/1970' by default if
> they entered nothing?

Ah, no. An empty string is not a valid number -- in fact, it is the
absence of a number; the same goes for dates. An empty string,
however, is a valid string, since a string is (in this context)
defined as a sequence of 0 to n characters.)

Your patch is awful because it would mean there was no way to enter an
empty string in the database. A one-character string containing a
single space is not an empty string.


Yeah, it is awful ;^)  However the existing system is equally awful
because there is no way to enter NULL!

Properly implemented, the rails model would allow you to indicate
nullability and use null if no data is provided.

- Ian



Alexander.



---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-03 Thread Alexander Staubo

On 6/3/07, Ian Harding <[EMAIL PROTECTED]> wrote:

> An empty string is not null! Null means the value is missing, which is
> clearly not the case here. I would say Rails is exactly in the right
> here. When an HTML form is posted, empty input boxes are declared as
> empty strings, which what the user entered. The problem is not with
> Rails/ActiveRecord but with your form handling. If you want empty
> boxes to become null, add some client-side JavaScript logic that sets
> the "disabled" attribute on empty input elements before form is
> submitted; this will prevent the client from sending the value.

The user was presented an _opportunity_ to enter data and did not.
The data is unknown.  I don't know how you can say "...The user
entered" an empty string.  There is no empty string key on the
keyboard.


Not at all. If the input box already contained a string, and the user
erased the contents of the input box, then the user has, in effect,
entered an empty string. Not a "null". This is a UI layer issue, not a
database issue.


I have no idea why I got such hard pushback on this.  This is the
EXACT same behaviour other types use.  If a number field is presented
to the user and submitted with no value, NULL Is inserted.  Not zero,
which is the numeric equivalent of the empty string, but NULL.   Same
with date types.  Why not say they entered '1/1/1970' by default if
they entered nothing?


Ah, no. An empty string is not a valid number -- in fact, it is the
absence of a number; the same goes for dates. An empty string,
however, is a valid string, since a string is (in this context)
defined as a sequence of 0 to n characters.)

Your patch is awful because it would mean there was no way to enter an
empty string in the database. A one-character string containing a
single space is not an empty string.

Alexander.

---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


NULLS and User Input WAS Re: [GENERAL] multimaster

2007-06-03 Thread Ian Harding


An empty string is not null! Null means the value is missing, which is
clearly not the case here. I would say Rails is exactly in the right
here. When an HTML form is posted, empty input boxes are declared as
empty strings, which what the user entered. The problem is not with
Rails/ActiveRecord but with your form handling. If you want empty
boxes to become null, add some client-side JavaScript logic that sets
the "disabled" attribute on empty input elements before form is
submitted; this will prevent the client from sending the value.


The user was presented an _opportunity_ to enter data and did not.
The data is unknown.  I don't know how you can say "...The user
entered" an empty string.  There is no empty string key on the
keyboard.

I have no idea why I got such hard pushback on this.  This is the
EXACT same behaviour other types use.  If a number field is presented
to the user and submitted with no value, NULL Is inserted.  Not zero,
which is the numeric equivalent of the empty string, but NULL.   Same
with date types.  Why not say they entered '1/1/1970' by default if
they entered nothing?

http://dev.rubyonrails.org/ticket/3301

- Ian



Alexander.



---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings