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

Reply via email to