Hello,
I find default values confusing when a function is overloaded, below is an example.
CREATE OR REPLACE FUNCTION default_test (a INT DEFAULT 1, b INT DEFAULT 1, C INT DEFAULT 1) RETURNS INT AS
$$
BEGIN
RETURN a+b+c;
END;
$$
LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION default_test (a INT DEFAULT 1, b INT DEFAULT 1) RETURNS INT AS
$$
BEGIN
RETURN a+b;
END;
$$
LANGUAGE 'plpgsql';
-- this will fail
--SELECT default_test(1,3);
--SELECT default_test(1);
test=# \df default_test
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+--------------+------------------+---------------------------------------------------------------+--------
public | default_test | integer | a integer DEFAULT 1, b integer DEFAULT 1 | normal
public | default_test | integer | a integer DEFAULT 1, b integer DEFAULT 1, c integer DEFAULT 1 | normal
(2 rows)
I think, there is a difference between optional parameters and default parameter values. So, my suggestion would be something like this.
SELECT default_test(1,3, DEFAULT); -- match function number 1
SELECT default_test(1,3); -- match the function number 2
SELECT default_test(1); -- ERROR
Regards