Commit 0caa0d04 authored by Robert Haas's avatar Robert Haas

Make DROP FUNCTION hint more informative.

If you decide you want to take the hint, this gives you something you
can paste right back to the server.

Dean Rasheed
parent 76837c15
...@@ -404,7 +404,8 @@ ProcedureCreate(const char *procedureName, ...@@ -404,7 +404,8 @@ ProcedureCreate(const char *procedureName,
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
errmsg("cannot change return type of existing function"), errmsg("cannot change return type of existing function"),
errhint("Use DROP FUNCTION first."))); errhint("Use DROP FUNCTION %s first.",
format_procedure(HeapTupleGetOid(oldtup)))));
/* /*
* If it returns RECORD, check for possible change of record type * If it returns RECORD, check for possible change of record type
...@@ -427,7 +428,8 @@ ProcedureCreate(const char *procedureName, ...@@ -427,7 +428,8 @@ ProcedureCreate(const char *procedureName,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
errmsg("cannot change return type of existing function"), errmsg("cannot change return type of existing function"),
errdetail("Row type defined by OUT parameters is different."), errdetail("Row type defined by OUT parameters is different."),
errhint("Use DROP FUNCTION first."))); errhint("Use DROP FUNCTION %s first.",
format_procedure(HeapTupleGetOid(oldtup)))));
} }
/* /*
...@@ -469,7 +471,8 @@ ProcedureCreate(const char *procedureName, ...@@ -469,7 +471,8 @@ ProcedureCreate(const char *procedureName,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
errmsg("cannot change name of input parameter \"%s\"", errmsg("cannot change name of input parameter \"%s\"",
old_arg_names[j]), old_arg_names[j]),
errhint("Use DROP FUNCTION first."))); errhint("Use DROP FUNCTION %s first.",
format_procedure(HeapTupleGetOid(oldtup)))));
} }
} }
...@@ -492,7 +495,8 @@ ProcedureCreate(const char *procedureName, ...@@ -492,7 +495,8 @@ ProcedureCreate(const char *procedureName,
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
errmsg("cannot remove parameter defaults from existing function"), errmsg("cannot remove parameter defaults from existing function"),
errhint("Use DROP FUNCTION first."))); errhint("Use DROP FUNCTION %s first.",
format_procedure(HeapTupleGetOid(oldtup)))));
proargdefaults = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup, proargdefaults = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup,
Anum_pg_proc_proargdefaults, Anum_pg_proc_proargdefaults,
...@@ -518,7 +522,8 @@ ProcedureCreate(const char *procedureName, ...@@ -518,7 +522,8 @@ ProcedureCreate(const char *procedureName,
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
errmsg("cannot change data type of existing parameter default value"), errmsg("cannot change data type of existing parameter default value"),
errhint("Use DROP FUNCTION first."))); errhint("Use DROP FUNCTION %s first.",
format_procedure(HeapTupleGetOid(oldtup)))));
newlc = lnext(newlc); newlc = lnext(newlc);
} }
} }
......
...@@ -1026,7 +1026,7 @@ select dfunc(10,20); ...@@ -1026,7 +1026,7 @@ select dfunc(10,20);
create or replace function dfunc(a variadic int[]) returns int as create or replace function dfunc(a variadic int[]) returns int as
$$ select array_upper($1, 1) $$ language sql; $$ select array_upper($1, 1) $$ language sql;
ERROR: cannot remove parameter defaults from existing function ERROR: cannot remove parameter defaults from existing function
HINT: Use DROP FUNCTION first. HINT: Use DROP FUNCTION dfunc(integer[]) first.
\df dfunc \df dfunc
List of functions List of functions
Schema | Name | Result data type | Argument data types | Type Schema | Name | Result data type | Argument data types | Type
...@@ -1239,13 +1239,13 @@ returns record as $$ ...@@ -1239,13 +1239,13 @@ returns record as $$
select $1, $2; select $1, $2;
$$ language sql; $$ language sql;
ERROR: cannot change name of input parameter "c" ERROR: cannot change name of input parameter "c"
HINT: Use DROP FUNCTION first. HINT: Use DROP FUNCTION dfunc(character varying,numeric) first.
create or replace function dfunc(a varchar = 'def a', out _a varchar, numeric = NULL, out _c numeric) create or replace function dfunc(a varchar = 'def a', out _a varchar, numeric = NULL, out _c numeric)
returns record as $$ returns record as $$
select $1, $2; select $1, $2;
$$ language sql; $$ language sql;
ERROR: cannot change name of input parameter "c" ERROR: cannot change name of input parameter "c"
HINT: Use DROP FUNCTION first. HINT: Use DROP FUNCTION dfunc(character varying,numeric) first.
drop function dfunc(varchar, numeric); drop function dfunc(varchar, numeric);
--fail, named parameters are not unique --fail, named parameters are not unique
create function testfoo(a int, a int) returns int as $$ select 1;$$ language sql; create function testfoo(a int, a int) returns int as $$ select 1;$$ language sql;
......
...@@ -439,7 +439,7 @@ CREATE OR REPLACE FUNCTION foo(in f1 int, out f2 int, out f3 text) ...@@ -439,7 +439,7 @@ CREATE OR REPLACE FUNCTION foo(in f1 int, out f2 int, out f3 text)
RETURNS record RETURNS record
AS 'select $1+1' LANGUAGE sql; AS 'select $1+1' LANGUAGE sql;
ERROR: cannot change return type of existing function ERROR: cannot change return type of existing function
HINT: Use DROP FUNCTION first. HINT: Use DROP FUNCTION foo(integer) first.
CREATE OR REPLACE FUNCTION foor(in f1 int, out f2 int, out text) CREATE OR REPLACE FUNCTION foor(in f1 int, out f2 int, out text)
AS $$select $1-1, $1::text || 'z'$$ LANGUAGE sql; AS $$select $1-1, $1::text || 'z'$$ LANGUAGE sql;
SELECT f1, foor(f1) FROM int4_tbl; SELECT f1, foor(f1) FROM int4_tbl;
...@@ -521,7 +521,7 @@ SELECT * FROM dup('xyz'::text); ...@@ -521,7 +521,7 @@ SELECT * FROM dup('xyz'::text);
CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray) CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray)
AS 'select $1, array[$1,$1]' LANGUAGE sql; AS 'select $1, array[$1,$1]' LANGUAGE sql;
ERROR: cannot change name of input parameter "f1" ERROR: cannot change name of input parameter "f1"
HINT: Use DROP FUNCTION first. HINT: Use DROP FUNCTION dup(anyelement) first.
DROP FUNCTION dup(anyelement); DROP FUNCTION dup(anyelement);
-- equivalent behavior, though different name exposed for input arg -- equivalent behavior, though different name exposed for input arg
CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray) CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment