diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-09-21 18:39:26 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-09-21 18:39:26 +0000 |
commit | eb3adab5685ce5a60bcf96628244f1e2a8e0ab3b (patch) | |
tree | 55ba25cb13ec6a414c7faf86a6d8da8357cfbfe7 /src/backend/commands/proclang.c | |
parent | bc499687641a021e0dac3e146611b5a553cf0c5b (diff) | |
download | postgresql-eb3adab5685ce5a60bcf96628244f1e2a8e0ab3b.tar.gz postgresql-eb3adab5685ce5a60bcf96628244f1e2a8e0ab3b.zip |
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.
Diffstat (limited to 'src/backend/commands/proclang.c')
-rw-r--r-- | src/backend/commands/proclang.c | 25 |
1 files changed, 20 insertions, 5 deletions
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) |