diff options
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/opr_sanity.out | 8 | ||||
| -rw-r--r-- | src/test/regress/expected/polymorphism.out | 187 | ||||
| -rw-r--r-- | src/test/regress/sql/opr_sanity.sql | 5 | ||||
| -rw-r--r-- | src/test/regress/sql/polymorphism.sql | 114 |
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); |
