From eb3adab5685ce5a60bcf96628244f1e2a8e0ab3b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 21 Sep 2002 18:39:26 +0000 Subject: Provide an upgrade strategy for dump files containing functions declared with OPAQUE. CREATE LANGUAGE, CREATE TRIGGER, and CREATE TYPE will all accept references to functions declared with OPAQUE --- but they will issue a NOTICE, and will modify the function entries in pg_proc to have the preferred type-safe argument or result types instead of OPAQUE. Per recent pghackers discussions. --- src/backend/commands/proclang.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'src/backend/commands/proclang.c') diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index 0d282e8f85c..03d022f1f4f 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.42 2002/09/04 20:31:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.43 2002/09/21 18:39:25 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -43,6 +43,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt) char languageName[NAMEDATALEN]; Oid procOid, valProcOid; + Oid funcrettype; Oid typev[FUNC_MAX_ARGS]; char nulls[Natts_pg_language]; Datum values[Natts_pg_language]; @@ -80,10 +81,24 @@ CreateProceduralLanguage(CreatePLangStmt *stmt) if (!OidIsValid(procOid)) elog(ERROR, "function %s() doesn't exist", NameListToString(stmt->plhandler)); - if (get_func_rettype(procOid) != LANGUAGE_HANDLEROID) - elog(ERROR, "function %s() does not return type %s", - NameListToString(stmt->plhandler), - format_type_be(LANGUAGE_HANDLEROID)); + funcrettype = get_func_rettype(procOid); + if (funcrettype != LANGUAGE_HANDLEROID) + { + /* + * We allow OPAQUE just so we can load old dump files. When we + * see a handler function declared OPAQUE, change it to + * LANGUAGE_HANDLER. + */ + if (funcrettype == OPAQUEOID) + { + elog(NOTICE, "CreateProceduralLanguage: changing return type of function %s() from OPAQUE to LANGUAGE_HANDLER", + NameListToString(stmt->plhandler)); + SetFunctionReturnType(procOid, LANGUAGE_HANDLEROID); + } + else + elog(ERROR, "CreateProceduralLanguage: function %s() must return LANGUAGE_HANDLER", + NameListToString(stmt->plhandler)); + } /* validate the validator function */ if (stmt->plvalidator) -- cgit v1.2.3