string || NULL ambiguity

Started by Oleg Bartunovalmost 23 years ago10 messages
#1Oleg Bartunov
oleg@sai.msu.su

Hi there,

we have a little problem in new version of tsearch we're currently
working. We've implemented concatenation operation for txtidx type
and treat concatenation with NULL as NULL (as it should be).
But people get confused with such behaivour. Do we obliged to
follow NULL rule ? It seems more natural in case of text searching to treat
stringA||NULL as stringA.

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83

#2Alvaro Herrera
alvherre@dcc.uchile.cl
In reply to: Oleg Bartunov (#1)
Re: string || NULL ambiguity

On Wed, Mar 19, 2003 at 10:26:05PM +0300, Oleg Bartunov wrote:

we have a little problem in new version of tsearch we're currently
working. We've implemented concatenation operation for txtidx type
and treat concatenation with NULL as NULL (as it should be).
But people get confused with such behaivour. Do we obliged to
follow NULL rule ? It seems more natural in case of text searching to treat
stringA||NULL as stringA.

Why don't you just enclose the possibly NULL fields in COALESCE?

stringA||COALESCE(NULL, '')

--
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Para tener mas hay que desear menos"

#3Oleg Bartunov
oleg@sai.msu.su
In reply to: Alvaro Herrera (#2)
Re: string || NULL ambiguity

On Wed, 19 Mar 2003, Alvaro Herrera wrote:

On Wed, Mar 19, 2003 at 10:26:05PM +0300, Oleg Bartunov wrote:

we have a little problem in new version of tsearch we're currently
working. We've implemented concatenation operation for txtidx type
and treat concatenation with NULL as NULL (as it should be).
But people get confused with such behaivour. Do we obliged to
follow NULL rule ? It seems more natural in case of text searching to treat
stringA||NULL as stringA.

Why don't you just enclose the possibly NULL fields in COALESCE?

stringA||COALESCE(NULL, '')

we don't know in advance if it's NULL or not.

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83

#4Thomas T. Thai
tom@minnesota.com
In reply to: Oleg Bartunov (#3)
Re: string || NULL ambiguity

On Wed, 19 Mar 2003, Alvaro Herrera wrote:

On Wed, Mar 19, 2003 at 10:26:05PM +0300, Oleg Bartunov wrote:

we have a little problem in new version of tsearch we're currently

working. We've implemented concatenation operation for txtidx type
and treat concatenation with NULL as NULL (as it should be).

But people get confused with such behaivour. Do we obliged to
follow NULL rule ? It seems more natural in case of text searching

to treat stringA||NULL as stringA.

Why don't you just enclose the possibly NULL fields in COALESCE?

stringA||COALESCE(NULL, '')

we don't know in advance if it's NULL or not.

I'm the user who reported this on the OpenFTS list. May I suggest allowing
'' in txtidx column type as we do with datatype text, char, and varchar.
That way concat will work as expected for text searching.

--
Thomnas

#5Neil Conway
neilc@samurai.com
In reply to: Oleg Bartunov (#3)
Re: string || NULL ambiguity

On Wed, 2003-03-19 at 20:32, Oleg Bartunov wrote:

On Wed, 19 Mar 2003, Alvaro Herrera wrote:

stringA||COALESCE(NULL, '')

we don't know in advance if it's NULL or not.

Right, that's the point of COALESCE: the first non-NULL argument is
returned -- so if the first argument to COALESCE happens to be non-NULL,
COALESCE has no effect.

Cheers,

Neil

#6Tom Lane
tgl@sss.pgh.pa.us
In reply to: Oleg Bartunov (#1)
Re: string || NULL ambiguity

Oleg Bartunov <oleg@sai.msu.su> writes:

we have a little problem in new version of tsearch we're currently
working. We've implemented concatenation operation for txtidx type
and treat concatenation with NULL as NULL (as it should be).
But people get confused with such behaivour. Do we obliged to
follow NULL rule ? It seems more natural in case of text searching to treat
stringA||NULL as stringA.

This seems a very bad idea. If you think people are confused by NULLs
now, it'll be ten times worse if some datatypes handle them differently
from others.

regards, tom lane

#7Thomas T. Thai
tom@minnesota.com
In reply to: Neil Conway (#5)
Re: string || NULL ambiguity

On Wed, 2003-03-19 at 20:32, Oleg Bartunov wrote:

On Wed, 19 Mar 2003, Alvaro Herrera wrote:

stringA||COALESCE(NULL, '')

we don't know in advance if it's NULL or not.

Right, that's the point of COALESCE: the first non-NULL argument is
returned -- so if the first argument to COALESCE happens to be non-NULL,
COALESCE has no effect.

I tried this with a txtidx column type:

tsearch=# select coalesce(NULL,'');
case
------

(1 row)

tsearch=# select coalesce(NULL,'hi');
case
------
hi
(1 row)

tsearch=# select title_fts from article;
title_fts
----------------------------------
'2':3A 'tsearch':1A 'version':2A
'easi':1A 'implement':2A

(3 rows)

tsearch=# select coalesce('',title_fts) from article;
ERROR: Void value
tsearch=# select coalesce('hi',title_fts) from article;
case
------
'hi'
'hi'
'hi'
(3 rows)

---

Note the error: "ERROR: Void value" above. Why is that happening?

--
Thomas

#8Thomas T. Thai
tom@minnesota.com
In reply to: Thomas T. Thai (#7)
Re: string || NULL ambiguity

On Wed, 2003-03-19 at 20:32, Oleg Bartunov wrote:

On Wed, 19 Mar 2003, Alvaro Herrera wrote:

stringA||COALESCE(NULL, '')

we don't know in advance if it's NULL or not.

Right, that's the point of COALESCE: the first non-NULL argument is
returned -- so if the first argument to COALESCE happens to be
non-NULL, COALESCE has no effect.

I tried this with a txtidx column type:

tsearch=# select coalesce(NULL,'');
case
------

(1 row)

tsearch=# select coalesce(NULL,'hi');
case
------
hi
(1 row)

tsearch=# select title_fts from article;
title_fts
----------------------------------
'2':3A 'tsearch':1A 'version':2A
'easi':1A 'implement':2A

(3 rows)

tsearch=# select coalesce('',title_fts) from article;
ERROR: Void value
tsearch=# select coalesce('hi',title_fts) from article;
case
------
'hi'
'hi'
'hi'
(3 rows)

---

Sorry the above should have been:

tsearch=# select coalesce(title_fts, '') from article;
ERROR: Void value
tsearch=# select coalesce(title_fts, 'hi') from article;
case
----------------------------------
'2':3A 'tsearch':1A 'version':2A
'easi':1A 'implement':2A
'hi'
(3 rows)

Show quoted text

Note the error: "ERROR: Void value" above. Why is that happening?

--
Thomas

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org

#9Oleg Bartunov
oleg@sai.msu.su
In reply to: Thomas T. Thai (#7)
Re: string || NULL ambiguity

On Thu, 20 Mar 2003, Thomas T. Thai wrote:

On Wed, 2003-03-19 at 20:32, Oleg Bartunov wrote:

On Wed, 19 Mar 2003, Alvaro Herrera wrote:

stringA||COALESCE(NULL, '')

we don't know in advance if it's NULL or not.

Right, that's the point of COALESCE: the first non-NULL argument is
returned -- so if the first argument to COALESCE happens to be non-NULL,
COALESCE has no effect.

I tried this with a txtidx column type:

tsearch=# select coalesce(NULL,'');
case
------

(1 row)

tsearch=# select coalesce(NULL,'hi');
case
------
hi
(1 row)

tsearch=# select title_fts from article;
title_fts
----------------------------------
'2':3A 'tsearch':1A 'version':2A
'easi':1A 'implement':2A

(3 rows)

tsearch=# select coalesce('',title_fts) from article;
ERROR: Void value
tsearch=# select coalesce('hi',title_fts) from article;
case
------
'hi'
'hi'
'hi'
(3 rows)

---

Note the error: "ERROR: Void value" above. Why is that happening?

That's because NULL is forbidden for txtidx. We'll fix that.

--
Thomas

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Oleg Bartunov (#9)
Re: string || NULL ambiguity

Oleg Bartunov <oleg@sai.msu.su> writes:

On Thu, 20 Mar 2003, Thomas T. Thai wrote:

Note the error: "ERROR: Void value" above. Why is that happening?

That's because NULL is forbidden for txtidx. We'll fix that.

Please note that an empty string is not the same as NULL. The error
message in txtidx_in appears to be griping about an empty string,
not NULL.

regards, tom lane