Argumento opcional en la función PL / pgSQL

Estoy tratando de escribir una función PL / pgSQL con argumentos opcionales. Realiza una consulta basada en un conjunto de registros filtrados (si se especifica), de lo contrario realiza una consulta en todo el conjunto de datos en una tabla.

Por ejemplo(CÓDIGO DE PSEUDO):

CREATE OR REPLACE FUNCTION foofunc(param1 integer, param2 date, param2 date, optional_list_of_ids=[]) RETURNS SETOF RECORD AS $
    IF len(optional_list_of_ids) > 0 THEN
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2 AND id in optional_list_of_ids);
    ELSE
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2);
    ENDIF
$ LANGUAGE SQL;

¿Cuál sería la forma correcta de implementar esta función?

Dejando de lado, me gustaría saber cómo podría llamar a esa función en otra función externa. Así es como lo haría, ¿es correcto o hay una mejor manera?

CREATE FUNCTION foofuncwrapper(param1 integer, param2 date, param2 date) RETURNS SETOF RECORD AS $
BEGIN
   CREATE TABLE ids AS SELECT id from foobar where id < 100;
   RETURN QUERY (SELECT * FROM foofunc(param1, param2, ids));
END
$ LANGUAGE SQL

Respuestas a la pregunta(3)

Su respuesta a la pregunta