diff options
Diffstat (limited to 'src/test/regress/expected/polymorphism.out')
| -rw-r--r-- | src/test/regress/expected/polymorphism.out | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/test/regress/expected/polymorphism.out b/src/test/regress/expected/polymorphism.out index 6ddd3410ca..340b7c0f97 100644 --- a/src/test/regress/expected/polymorphism.out +++ b/src/test/regress/expected/polymorphism.out @@ -776,3 +776,190 @@ select pg_typeof(myleast(10, 1, 20, 33)); -- polymorphic input integer (1 row) +-- test functions with parameter defaults +-- test basic functionality +create function dfunc(a int = 1, int = 2) returns int as $$ + select $1 + $2; +$$ language sql; +select dfunc(); + dfunc +------- + 3 +(1 row) + +select dfunc(10); + dfunc +------- + 12 +(1 row) + +select dfunc(10, 20); + dfunc +------- + 30 +(1 row) + +drop function dfunc(); -- fail +ERROR: function dfunc() does not exist +drop function dfunc(int); -- fail +ERROR: function dfunc(integer) does not exist +drop function dfunc(int, int); -- ok +-- fail, gap in arguments with defaults +create function dfunc(a int = 1, b int) returns int as $$ + select $1 + $2; +$$ language sql; +ERROR: parameter without default value specified after parameter with default value +-- check implicit coercion +create function dfunc(a int DEFAULT 1.0, int DEFAULT '-1') returns int as $$ + select $1 + $2; +$$ language sql; +select dfunc(); + dfunc +------- + 0 +(1 row) + +create function dfunc(a text DEFAULT 'Hello', b text DEFAULT 'World') returns text as $$ + select $1 || ', ' || $2; +$$ language sql; +select dfunc(); -- fail; which dfunc should be called? int or text +ERROR: functions with parameter defaults dfunc(text, text) and dfunc(integer, integer) are ambiguous +select dfunc('Hi'); -- ok + dfunc +----------- + Hi, World +(1 row) + +select dfunc('Hi', 'City'); -- ok + dfunc +---------- + Hi, City +(1 row) + +select dfunc(0); -- ok + dfunc +------- + -1 +(1 row) + +select dfunc(10, 20); -- ok + dfunc +------- + 30 +(1 row) + +drop function dfunc(int, int); +drop function dfunc(text, text); +create function dfunc(int = 1, int = 2) returns int as $$ + select 2; +$$ language sql; +create function dfunc(int = 1, int = 2, int = 3, int = 4) returns int as $$ + select 4; +$$ language sql; +-- Now, dfunc(nargs = 2) and dfunc(nargs = 4) are ambiguous when called +-- with 0 or 1 arguments. For 2 arguments, a normall call of +-- dfunc(nargs = 2) takes place. +select dfunc(); -- fail +ERROR: functions with parameter defaults dfunc(integer, integer, integer, integer) and dfunc(integer, integer) are ambiguous +select dfunc(1); -- fail +ERROR: functions with parameter defaults dfunc(integer, integer, integer, integer) and dfunc(integer, integer) are ambiguous +select dfunc(1, 2); -- ok + dfunc +------- + 2 +(1 row) + +select dfunc(1, 2, 3); -- ok + dfunc +------- + 4 +(1 row) + +select dfunc(1, 2, 3, 4); -- ok + dfunc +------- + 4 +(1 row) + +drop function dfunc(int, int); +drop function dfunc(int, int, int, int); +-- default values are not allowed for output parameters +create function dfunc(out int = 20) returns int as $$ + select 1; +$$ language sql; +ERROR: only IN and INOUT parameters can have default values +-- polymorphic parameter test +create function dfunc(anyelement = 'World'::text) returns text as $$ + select 'Hello, ' || $1::text; +$$ language sql; +select dfunc(); + dfunc +-------------- + Hello, World +(1 row) + +select dfunc(0); + dfunc +---------- + Hello, 0 +(1 row) + +select dfunc(to_date('20081215','YYYYMMDD')); + dfunc +------------------- + Hello, 12-15-2008 +(1 row) + +select dfunc('City'::text); + dfunc +------------- + Hello, City +(1 row) + +drop function dfunc(anyelement); +-- check null values +create function dfunc(int = null, int = null, int = null) returns int[] as $$ + select array[$1, $2, $3]; +$$ language sql; +select dfunc(1); + dfunc +--------------- + {1,NULL,NULL} +(1 row) + +select dfunc(1, 2); + dfunc +------------ + {1,2,NULL} +(1 row) + +select dfunc(1, 2, 3); + dfunc +--------- + {1,2,3} +(1 row) + +drop function dfunc(int, int, int); +-- The conflict detection algorithm doesn't consider the actual parameter +-- types. It detects any possible conflict for n arguments for some +-- function. This is unwanted behavior, but solving it needs a move of +-- coercion routines. +create function dfunc(int = 1, int = 2, int = 3) returns int as $$ + select 3; +$$ language sql; +create function dfunc(int = 1, int = 2) returns int as $$ + select 2; +$$ language sql; +-- for n = 1 dfunc(narg=2) and dfunc(narg=3) are ambiguous +select dfunc(1); -- fail +ERROR: functions with parameter defaults dfunc(integer, integer, integer) and dfunc(integer, integer) are ambiguous +create function dfunc(text) returns text as $$ + select $1; +$$ language sql; +-- Will fail, it detects ambiguity between dfunc(int, int, int) and +-- dfunc(int, int), but dfunc(text) isn't in conflict with either. +select dfunc('Hi'); +ERROR: functions with parameter defaults dfunc(integer, integer, integer) and dfunc(integer, integer) are ambiguous +drop function dfunc(int, int, int); +drop function dfunc(int, int); +drop function dfunc(text); |
