summaryrefslogtreecommitdiff
path: root/src/test/regress/expected/polymorphism.out
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/regress/expected/polymorphism.out')
-rw-r--r--src/test/regress/expected/polymorphism.out187
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);