Обсуждение: STRICT function returning a composite type

Поиск
Список
Период
Сортировка

STRICT function returning a composite type

От
"Alexander M. Pravking"
Дата:
I noted that such a function returns an empty rowset if a NULL value is
passed as an argument. Is it a bug or feature? I wish it was a feature,
because I probably want to use this behavour.

Here's an example:

CREATE TYPE ts_bounds AS (       sdate   timestamptz,       edate   timestamptz
);

CREATE OR REPLACE FUNCTION overlap_bounds(timestamptz, timestamptz, timestamptz, timestamptz)
RETURNS ts_bounds AS '
DECLARE       sdate1  ALIAS FOR $1;       edate1  ALIAS FOR $2;       sdate2  ALIAS FOR $3;       edate2  ALIAS FOR $4;
     res     ts_bounds%rowtype;
 
BEGIN       res.sdate := CASE WHEN sdate1 > sdate2 THEN sdate1 ELSE sdate2 END;       res.edate := CASE WHEN edate1 <
edate2THEN edate1 ELSE edate2 END;       IF res.sdate > res.edate THEN               res.sdate := NULL;
res.edate:= NULL;       END IF;       RETURN res;
 
END' LANGUAGE 'plPgSQL' STRICT;


fduch=# SELECT * from overlap_bounds('-infinity', 'today', 'yesterday', 'infinity');        sdate          |
edate
------------------------+------------------------2003-11-12 00:00:00+03 | 2003-11-13 00:00:00+03
(1 row)

fduch=# SELECT * from overlap_bounds('-infinity', 'today', 'yesterday', null);sdate | edate
-------+-------
(0 rows)


What I want is to get no rows if given intervals don't overlap instead of:
fduch=# SELECT * from overlap_bounds('-infinity', 'yesterday', 'today', 'infinity');sdate | edate
-------+-------      |
(1 row)

Is it possible without returning SETOF ts_bounds?


fduch=# SELECT version();                              version
---------------------------------------------------------------------PostgreSQL 7.3.4 on i386-portbld-freebsd4.8,
compiledby GCC 2.95.4
 


-- 
Fduch M. Pravking


Re: STRICT function returning a composite type

От
Richard Huxton
Дата:
On Thursday 13 November 2003 16:08, Alexander M. Pravking wrote:
> I noted that such a function returns an empty rowset if a NULL value is
> passed as an argument. Is it a bug or feature? I wish it was a feature,
> because I probably want to use this behavour.

From the SQL commands section of the manual:

RETURNS NULL ON NULL INPUT or STRICT indicates that the function always 
returns NULL whenever any of its arguments are NULL. If this parameter is 
specified, the function is not executed when there are NULL arguments; 
instead a NULL result is assumed automatically.

--  Richard Huxton Archonet Ltd


Re: STRICT function returning a composite type

От
"Alexander M. Pravking"
Дата:
On Thu, Nov 13, 2003 at 05:14:27PM +0000, Richard Huxton wrote:
> RETURNS NULL ON NULL INPUT or STRICT indicates that the function always 
> returns NULL whenever any of its arguments are NULL. If this parameter is 
> specified, the function is not executed when there are NULL arguments; 
> instead a NULL result is assumed automatically.

Does "NULL result" mean an empty rowset if the function returns a record?

-- 
Fduch M. Pravking


Re: STRICT function returning a composite type

От
Tom Lane
Дата:
"Alexander M. Pravking" <fduch@antar.bryansk.ru> writes:
> On Thu, Nov 13, 2003 at 05:14:27PM +0000, Richard Huxton wrote:
>> RETURNS NULL ON NULL INPUT or STRICT indicates that the function always 
>> returns NULL whenever any of its arguments are NULL.

> Does "NULL result" mean an empty rowset if the function returns a record?

No, it means a null record.  "Empty rowset" would apply to a function
declared to return SETOF something.   (I believe that is how we
interpret the concept of strictness for functions returning sets.)
        regards, tom lane


Re: STRICT function returning a composite type

От
"Alexander M. Pravking"
Дата:
On Thu, Nov 13, 2003 at 12:27:58PM -0500, Tom Lane wrote:
> "Alexander M. Pravking" <fduch@antar.bryansk.ru> writes:
> > Does "NULL result" mean an empty rowset if the function returns a record?
> 
> No, it means a null record.  "Empty rowset" would apply to a function
> declared to return SETOF something.   (I believe that is how we
> interpret the concept of strictness for functions returning sets.)

Very well then... Can I return a null record from such function
explicitly? Sorry, I could't find it anywhere in docs or examples.


-- 
Fduch M. Pravking


Re: STRICT function returning a composite type

От
Tom Lane
Дата:
"Alexander M. Pravking" <fduch@antar.bryansk.ru> writes:
> Very well then... Can I return a null record from such function
> explicitly? Sorry, I could't find it anywhere in docs or examples.

Not sure.  Seems like you should be able to, but I've never tried it.
        regards, tom lane


Re: STRICT function returning a composite type

От
"Alexander M. Pravking"
Дата:
On Thu, Nov 13, 2003 at 12:35:41PM -0500, Tom Lane wrote:
> "Alexander M. Pravking" <fduch@antar.bryansk.ru> writes:
> > Very well then... Can I return a null record from such function
> > explicitly? Sorry, I could't find it anywhere in docs or examples.
> 
> Not sure.  Seems like you should be able to, but I've never tried it.

Thanks for a quick response, guys. I'll try to find it myself and
will let you know if I did ;)

-- 
Fduch M. Pravking