summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/regress/expected/opr_sanity.out8
-rw-r--r--src/test/regress/expected/polymorphism.out187
-rw-r--r--src/test/regress/sql/opr_sanity.sql5
-rw-r--r--src/test/regress/sql/polymorphism.sql114
4 files changed, 314 insertions, 0 deletions
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 87464ec9cf..f1143fe16d 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -61,6 +61,14 @@ WHERE prosrc IS NULL OR prosrc = '' OR prosrc = '-';
-----+---------
(0 rows)
+-- pronargdefaults should be 0 iff proargdefaults is null
+SELECT p.oid, p.proname
+FROM pg_proc AS p
+WHERE pronargdefaults <> 0 OR proargdefaults IS NOT NULL;
+ oid | proname
+-----+---------
+(0 rows)
+
-- probin should be non-empty for C functions, null everywhere else
SELECT p1.oid, p1.proname
FROM pg_proc as p1
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);
diff --git a/src/test/regress/sql/opr_sanity.sql b/src/test/regress/sql/opr_sanity.sql
index c254a8b6cb..2eb56a2230 100644
--- a/src/test/regress/sql/opr_sanity.sql
+++ b/src/test/regress/sql/opr_sanity.sql
@@ -62,6 +62,11 @@ SELECT p1.oid, p1.proname
FROM pg_proc as p1
WHERE prosrc IS NULL OR prosrc = '' OR prosrc = '-';
+-- pronargdefaults should be 0 iff proargdefaults is null
+SELECT p.oid, p.proname
+FROM pg_proc AS p
+WHERE pronargdefaults <> 0 OR proargdefaults IS NOT NULL;
+
-- probin should be non-empty for C functions, null everywhere else
SELECT p1.oid, p1.proname
FROM pg_proc as p1
diff --git a/src/test/regress/sql/polymorphism.sql b/src/test/regress/sql/polymorphism.sql
index 7237705353..56f90c597a 100644
--- a/src/test/regress/sql/polymorphism.sql
+++ b/src/test/regress/sql/polymorphism.sql
@@ -480,3 +480,117 @@ select pg_typeof('' || ''); -- text
select pg_typeof(pg_typeof(0)); -- regtype
select pg_typeof(array[1.2,55.5]); -- numeric[]
select pg_typeof(myleast(10, 1, 20, 33)); -- polymorphic input
+
+-- 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();
+select dfunc(10);
+select dfunc(10, 20);
+
+drop function dfunc(); -- fail
+drop function dfunc(int); -- fail
+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;
+
+-- check implicit coercion
+create function dfunc(a int DEFAULT 1.0, int DEFAULT '-1') returns int as $$
+ select $1 + $2;
+$$ language sql;
+select dfunc();
+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
+select dfunc('Hi'); -- ok
+select dfunc('Hi', 'City'); -- ok
+select dfunc(0); -- ok
+select dfunc(10, 20); -- ok
+
+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
+select dfunc(1); -- fail
+select dfunc(1, 2); -- ok
+select dfunc(1, 2, 3); -- ok
+select dfunc(1, 2, 3, 4); -- ok
+
+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;
+
+-- polymorphic parameter test
+create function dfunc(anyelement = 'World'::text) returns text as $$
+ select 'Hello, ' || $1::text;
+$$ language sql;
+
+select dfunc();
+select dfunc(0);
+select dfunc(to_date('20081215','YYYYMMDD'));
+select dfunc('City'::text);
+
+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);
+select dfunc(1, 2);
+select dfunc(1, 2, 3);
+
+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
+
+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');
+
+drop function dfunc(int, int, int);
+drop function dfunc(int, int);
+drop function dfunc(text);