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