Thread: Null function parameters

Null function parameters

From
"Graham Vickrage"
Date:
Hi All,

I am trying to create a function that takes an int as its param and insert
the value into a table. The problem occurs when the value passed is NULL,
the error message returned is
- Execute failed ERROR: ExecAppend: Fail to add null value in not null
attribute type

However my understanding was that if the default value is SQL NULL then any
values passed into the function that are null would be treated as 'NULL'.

This doesn't seem to be the case. Chances are I am overlooking something,
could any one point me in the right direction?

Cheers

Graham




Re: Null function parameters

From
Tom Lane
Date:
"Graham Vickrage" <graham@digitalplanit.com> writes:
> However my understanding was that if the default value is SQL NULL then any
> values passed into the function that are null would be treated as 'NULL'.

Not sure what you think you meant by that, but a null is a null.  If you
declared the table column as NOT NULL then Postgres is doing exactly
what it should.  You may wish to code the insert along the lines of
   INSERT INTO table VALUES (..., COALESCE($1, suitable-default), ...)

COALESCE is a handy notation for "value1 unless it's NULL, in which case
value2".
        regards, tom lane


Re: Null function parameters

From
tolik@aaanet.ru (Anatoly K. Lasareff)
Date:
>>>>> "TL" == Tom Lane <tgl@sss.pgh.pa.us> writes:
TL> "Graham Vickrage" <graham@digitalplanit.com> writes:>> However my understanding was that if the default value is
SQLNULL then any>> values passed into the function that are null would be treated as 'NULL'.
 
TL> Not sure what you think you meant by that, but a null is a null.  If youTL> declared the table column as NOT NULL
thenPostgres is doing exactlyTL> what it should.  You may wish to code the insert along the lines of
 
TL> INSERT INTO table VALUES (..., COALESCE($1, suitable-default), ...)
TL> COALESCE is a handy notation for "value1 unless it's NULL, in which caseTL> value2".
TL> regards, tom lane

But unfortunately we have no answer for primary question:

| Why if we pass to function ONLY ONE null agument all the oters    |
| argumenta in function's boby are null too?                        |
| Or: is it possible to pass null arguments into plpgsql functions? |

Example.

create function a(int, int) returns int as '
begin raise notice ''1: % 2: %'', $1, $2;
 if $1 is null then   return $2; end if;
 return $1;
end;
' language 'plpgsql';

tolik=# select a(1,2);
NOTICE:  1: 1 2: 2a 
---1
(1 row)

tolik=# select a(null,2);
NOTICE:  1: <NULL> 2: <NULL>a 
--- 
(1 row)


-- 
Anatoly K. Lasareff              Email:       tolik@aaanet.ru 


RE: Null function parameters

From
"Graham Vickrage"
Date:
Thanks Anatoly

So if I understand you correctly you can't pass more than one NULL int into
a function?

Therefore Newbe DBA type question: -
Is this a shortcoming in postgres or is it to be expected when dealing with
transactions?
If it is a shotcoming are there any plans to include it in future releases?

Regards

Graham

-----Original Message-----
From: tolik@tolikus.hq.aaanet.ru [mailto:tolik@tolikus.hq.aaanet.ru]On
Behalf Of Anatoly K. Lasareff
Sent: 23 August 2000 12:46
To: Tom Lane
Cc: Graham Vickrage; postgresql
Subject: Re: [SQL] Null function parameters


>>>>> "TL" == Tom Lane <tgl@sss.pgh.pa.us> writes:
TL> "Graham Vickrage" <graham@digitalplanit.com> writes:>> However my understanding was that if the default value is
SQLNULL then
 
any>> values passed into the function that are null would be treated as
'NULL'.
TL> Not sure what you think you meant by that, but a null is a null.  If
youTL> declared the table column as NOT NULL then Postgres is doing exactlyTL> what it should.  You may wish to code
theinsert along the lines of
 
TL> INSERT INTO table VALUES (..., COALESCE($1, suitable-default), ...)
TL> COALESCE is a handy notation for "value1 unless it's NULL, in which
caseTL> value2".
TL> regards, tom lane

But unfortunately we have no answer for primary question:

| Why if we pass to function ONLY ONE null agument all the oters    |
| argumenta in function's boby are null too?                        |
| Or: is it possible to pass null arguments into plpgsql functions? |

Example.

create function a(int, int) returns int as '
begin raise notice ''1: % 2: %'', $1, $2;
 if $1 is null then   return $2; end if;
 return $1;
end;
' language 'plpgsql';

tolik=# select a(1,2);
NOTICE:  1: 1 2: 2a
---1
(1 row)

tolik=# select a(null,2);
NOTICE:  1: <NULL> 2: <NULL>a
---

(1 row)


--
Anatoly K. Lasareff              Email:       tolik@aaanet.ru



Re: Null function parameters

From
tolik@aaanet.ru (Anatoly K. Lasareff)
Date:
>>>>> "GV" == Graham Vickrage <graham@digitalplanit.com> writes:
GV> Thanks AnatolyGV> So if I understand you correctly you can't pass more than one NULL int intoGV> a function?

I'afraid no. My question is: if I pass one null argument into function
then all
other argumens, which are not null, became null inside function body.







GV> Therefore Newbe DBA type question: -GV> Is this a shortcoming in postgres or is it to be expected when dealing
withGV>transactions?GV> If it is a shotcoming are there any plans to include it in future releases?
 
GV> Regards
GV> Graham
GV> -----Original Message-----GV> From: tolik@tolikus.hq.aaanet.ru [mailto:tolik@tolikus.hq.aaanet.ru]OnGV> Behalf Of
AnatolyK. LasareffGV> Sent: 23 August 2000 12:46GV> To: Tom LaneGV> Cc: Graham Vickrage; postgresqlGV> Subject: Re:
[SQL]Null function parameters
 


>>>>> "TL" == Tom Lane <tgl@sss.pgh.pa.us> writes:
TL> "Graham Vickrage" <graham@digitalplanit.com> writes:>>> However my understanding was that if the default value is
SQLNULL thenGV> any>>> values passed into the function that are null would be treated asGV> 'NULL'.
 
TL> Not sure what you think you meant by that, but a null is a null.  IfGV> youTL> declared the table column as NOT
NULLthen Postgres is doing exactlyTL> what it should.  You may wish to code the insert along the lines of
 
TL> INSERT INTO table VALUES (..., COALESCE($1, suitable-default), ...)
TL> COALESCE is a handy notation for "value1 unless it's NULL, in whichGV> caseTL> value2".
TL> regards, tom lane
GV> But unfortunately we have no answer for primary question:
GV> | Why if we pass to function ONLY ONE null agument all the oters    |GV> | argumenta in function's boby are null
too?                       |GV> | Or: is it possible to pass null arguments into plpgsql functions? |
 
GV> Example.
GV> create function a(int, int) returns int as 'GV> beginGV> raise notice ''1: % 2: %'', $1, $2;
GV> if $1 is null thenGV> return $2;GV> end if;
GV> return $1;GV> end;GV> ' language 'plpgsql';
GV> tolik=# select a(1,2);GV> NOTICE:  1: 1 2: 2GV> aGV> ---GV> 1GV> (1 row)
GV> tolik=# select a(null,2);GV> NOTICE:  1: <NULL> 2: <NULL>GV> aGV> ---
GV> (1 row)

-- 
Anatoly K. Lasareff              Email:       tolik@aaanet.ru 


Re: Null function parameters

From
Tom Lane
Date:
tolik@aaanet.ru (Anatoly K. Lasareff) writes:
> I'afraid no. My question is: if I pass one null argument into function
> then all other argumens, which are not null, became null inside
> function body.

Yes --- and not only that, but the function's result will be taken to be
null whether you want it to be or not.  This has been gone over *many*
times before on this mail list, so I didn't think I needed to repeat it.

This will be fixed in 7.1 (is already fixed in current sources).
        regards, tom lane


Re: Null function parameters

From
tolik@aaanet.ru (Anatoly K. Lasareff)
Date:
>>>>> "TL" == Tom Lane <tgl@sss.pgh.pa.us> writes:
TL> tolik@aaanet.ru (Anatoly K. Lasareff) writes:>> I'afraid no. My question is: if I pass one null argument into
function>>then all other argumens, which are not null, became null inside>> function body.
 
TL> Yes --- and not only that, but the function's result will be taken to beTL> null whether you want it to be or not.
Thishas been gone over *many*TL> times before on this mail list, so I didn't think I needed to repeat it.
 
TL> This will be fixed in 7.1 (is already fixed in current sources).

Thank you. I'll be waiting :)

-- 
Anatoly K. Lasareff              Email:       tolik@aaanet.ru