Thread: BUG #1839: insert into table (column) values (nullif('',''));

BUG #1839: insert into table (column) values (nullif('',''));

From
"Matt"
Date:
The following bug has been logged online:

Bug reference:      1839
Logged by:          Matt
Email address:      survivedsushi@yahoo.com
PostgreSQL version: 8.0.3
Operating system:   linux
Description:        insert into table (column) values (nullif('',''));
Details:

insert into table (column) values (nullif('',''));
ERROR: column "column" is of type boolean but
expression is of type text.

inserting NULL works. nullif('','') should return NULL
if both values are equal? It works in MSSQL.

Is there different function to accomplish a insert
nullif('','') test.

Thanks
Matt

Re: BUG #1839: insert into table (column) values (nullif('',''));

From
Stephan Szabo
Date:
On Sun, 21 Aug 2005, Matt wrote:

>
> The following bug has been logged online:
>
> Bug reference:      1839
> Logged by:          Matt
> Email address:      survivedsushi@yahoo.com
> PostgreSQL version: 8.0.3
> Operating system:   linux
> Description:        insert into table (column) values (nullif('',''));
> Details:
>
> insert into table (column) values (nullif('',''));
> ERROR: column "column" is of type boolean but
> expression is of type text.
>
> inserting NULL works. nullif('','') should return NULL
> if both values are equal? It works in MSSQL.

It does return a NULL AFAICS, however it looks like it returns a NULL cast
to a textual type (since if they were different, it would return its first
argument according to the docs).

Re: BUG #1839: insert into table (column) values (nullif('',''));

From
Michael Fuhr
Date:
On Sun, Aug 21, 2005 at 06:17:28PM +0100, Matt wrote:
>
> insert into table (column) values (nullif('',''));
> ERROR: column "column" is of type boolean but
> expression is of type text.
>
> inserting NULL works. nullif('','') should return NULL
> if both values are equal? It works in MSSQL.

NULLIF's return type is derived from the argument types; for more
information see "UNION, CASE, and ARRAY Constructs" in the "Type
Conversion" chapter of the documentation (NULLIF is a CASE construct):

http://www.postgresql.org/docs/8.0/static/typeconv-union-case.html

The type resolution behavior is defined in the SQL standard (9.3
"Set operation result data types" in SQL92; 9.3 "Data types of
results of aggregations" in SQL:1999).

> Is there different function to accomplish a insert
> nullif('','') test.

What are the possible values of NULLIF's arguments?  It's not
clear what should happen if they're *not* equal.  What value
should the boolean column receive in the following case?

INSERT INTO table (column) VALUES (NULLIF('abc', ''));

Can you tell us more about what the NULLIF is trying to achieve?

--
Michael Fuhr

Re: BUG #1839: insert into table (column) values (nullif('',''));

From
Tom Lane
Date:
"Matt" <survivedsushi@yahoo.com> writes:
> insert into table (column) values (nullif('',''));
> ERROR: column "column" is of type boolean but
> expression is of type text.

Seems reasonable to me.  What type would you expect '' to be?

> It works in MSSQL.

If you think silent conversions from text to boolean are a good idea,
use MSSQL.  (Or create a cast to make PG do it ... but implicit
conversions across datatype categories are generally a bad idea in
my experience.  They tend to fire in cases where you didn't expect it.)

            regards, tom lane